Commits at 9ed3f8f96039763eb67b056ee843f3aa5e50f2cb
9ed3f8f9gtk-adwaita: Access GTK only from main thread
App was flaky due to off-thread accesses.
Shota FUJI
authored at
Shota FUJI
comitted at
1aa6eb97core: Disarm function should take context/user data too
Since functions are static and what makes "function for this context" is
a context pointer, disarm functions too have to take that.
Shota FUJI
authored at
Shota FUJI
comitted at
4b14946cDo not use swift-format@5.8
I thought it works okay even for Swift 6 source code given Swift 6
announcement post and various posts do not list syntax changes. They
seem to be "docs does not matter, we have migration tool!" people.
Somehow swift-format@5.8 rejects valid function call (in my case, it was
struct initializer) and if I commented the relavant section, it messed
code so badly that I had to "fix" every unnecessary stupid newlines.
Until nixpkgs or Swift team fixes build pipeline, I have to manually
invoke the latest swift-format via XCode. fuck.
Shota FUJI
authored at
Shota FUJI
comitted at
8a172f02gtk-adwaita: Save and restore connection
It's extremely flaky due to thread unsafety... I have to organize
callbacks sure.
Shota FUJI
authored at
Shota FUJI
comitted at
9435612bcore: Save connection state to a file
Previously I thought each apps having platform specific save logic would
be better than implementing it in the core. However, Vala has no simple
way to do that (had to import various GLib things). Apparently every
platform I plan to implement uses file system for state files, thus
implementing in the core is safe as long as it takes full file path.
Shota FUJI
authored at
Shota FUJI
comitted at
5dc2caa9core: Comment on why `scan_result` is not deinit-ed
I thought it's confusing during refactoring.
Shota FUJI
authored at
Shota FUJI
comitted at
6755b30bcore: Adhere init/deinit to guideline
This makes "who manages this memory" more obvious.
Shota FUJI
authored at
Shota FUJI
comitted at
8b399348core: Docs for code style
This is solo development project but I'm already confused due to
inconsistency. As there is no general Zig guidelines, I had to make a
one for this project.
For brevity, this commit does not touch Zig source code. This merely
creates a guideline.
Shota FUJI
authored at
Shota FUJI
comitted at
96637ddbgtk-adwaita: Migrate to the new Core API
This commit includes changes to Core: debug logging and fixing array of
structure to array of pointer for structure.
Although client code got simpler, I'm not sure accessing GTK from
callback function is okay. For now, every callbacks are invoked from
spawned thread and this means accessing GTK from non-UI thread.
Additional async-ing in Vala side might be necessary?
Shota FUJI
authored at
Shota FUJI
comitted at
43a74204core: Migrate to callback design
Forcing callers to take care of threads turned out a bad idea. That
requires core to be extremely simple, durable, and thread-safe. By
making majority of core's functionality threaded, clients do not have to
take a look inside to see whether a field is thread-safe or not.
Shota FUJI
authored at
Shota FUJI
comitted at
ebb7ce2egtk-adwaita: Fix runtime library error on macOS
libadwaita depends on gtk4 but devbox cannot resolve to same package as
the root one, so there are duplicated "gtk4" package therefore symbol
duplication error happens. I have no idea why this is not a problem on
Linux, though.
Shota FUJI
authored at
Shota FUJI
comitted at
ed3b9ab8gtk-adwaita: Init core app
I have no idea what to do next.
Flux-like state-action API? Simple struct with state properties and
callback functions like GObject? Completely lost.
Shota FUJI
authored at
Shota FUJI
comitted at
4f914150core/cli: Register extension to Roon
Code is messy. Logs should be proper logs not debug one.
Few places leaks memory. WebSocket read timeout should be configurable.
CLI should also store IP address and TCP port. Error handling is
nonexistent.
However, it works (TM). And if I optimize or tidy I/F up at this point,
there is high chance of the resulted code would be difficult to use.
Tidying I/F by seeing only one implementation (in this case, CLI) brings
other client hard time integrating. This project's main focus is native
GUI clients, not CLI. Thus, I should refactor/optimize at the time of
writing GTK or SwiftUI code. Let it evolve from worse state.
Shota FUJI
authored at
Shota FUJI
comitted at
190d510dcore: Move server discovery code to "server/" dir
I could not put playback related functionality to "lib.h" safely.
Shota FUJI
authored at
Shota FUJI
comitted at
dc5a9a93gtk-adwaita: Server discovery error handling
Loading is still work-in-progress, but error handling is okay.
There must be better way to disconnect a signal (error_detail_hid)
though.
Shota FUJI
authored at
Shota FUJI
comitted at
9423b7c4gtk-adwaita: Rename from "gtk"
I'm not going to do "pure GTK", as the primary reason to use GTK is
creating native looking GUI. If I freely build styles using GTK
components, it would then look alien due to web-by styles.
Shota FUJI
authored at
Shota FUJI
comitted at
fdd1d11acore: Find Roon Server by unique ID
Except the very initial setup, clients have previously connected
Server's unique ID. There is virtually no reason to perform enumerate
servers on a network in that case.
Shota FUJI
authored at
Shota FUJI
comitted at
488e6c8ccore/cli: Drop Zig API
The primary purpose of cli is to test C API. However, Zig's ideal API
design and one of C API is drastically different (esp. allocation), and
that makes designing C API difficult. This simplifies the process and
hopefully brings better C API with less memory mis-managements.
Shota FUJI
authored at
Shota FUJI
comitted at
38f47e6ccore: Fix memory access violation on macos app
I forgot C enum is platform int. No idea why this wasn't a problem on
Vala, though.
Shota FUJI
authored at
Shota FUJI
comitted at
627429dacore/macos: Import core from macos
https://mitchellh.com/writing/zig-and-swiftui
This blog post hugely helped me writing build scripts... I could not do
this without that blog post.
Shota FUJI
authored at
Shota FUJI
comitted at
e92280edRemove vala-language-server from tool installation
It requires Meson (no way) or Clang's `compile_commands.json` to
understand dependencies. While the latter looks simple, I'm not willing
to maintain duplicated compile command. If bug or unconvenience or
frustration or whatever reaches certain threshold, I'll reconsider
re-introducing the LS.
Shota FUJI
authored at
Shota FUJI
comitted at
7a323e0egtk: Display scanned Roon Servers
No empty state, no error handling, though.
Shota FUJI
authored at
Shota FUJI
comitted at
ff30d4c7core: Fix build fails on macOS
Interestingly, Zig smartly assigns `u31` as the type of `usec`.
```zig
@compileLog(@typeName(@TypeOf(usec)));
```
yields,
```
@as(*const [3:0]u8, "u31")
```
Shota FUJI
authored at
Shota FUJI
comitted at
647bb5b2Don't install Valgrind on macOS
It's marked as broken on darwin, despite search.nixos.org lists darwin
platforms at "Platforms" section.
Shota FUJI
authored at
Shota FUJI
comitted at
a079c8cdcore: Simpler memory management for "Server"
Although this increases memory allocation, API is simple and easier to
build C API.
Shota FUJI
authored at
Shota FUJI
comitted at
eefc813dgtk: Build GTK app using Zig build system
It's convenient, consistent, and reliable.
Goodbye, system CC's bullshit warnings.
Shota FUJI
authored at
Shota FUJI
comitted at
62d9a8b8cli: JSONL output for "server ls"
```
./zig-out/bin/plac server ls -f jsonl | jq
```
Shota FUJI
authored at
Shota FUJI
comitted at
9fc8db70core: Set HTTP port to ip_addr field
Having separate HTTP port and keeping UDP source port is wasteful and
not user friendly.
Shota FUJI
authored at
Shota FUJI
comitted at
9498d876cli: Improve memory debuggability
Now DebugAllocator can detect memory leaks.
Shota FUJI
authored at
Shota FUJI
comitted at
995d035ecore: Fix server list not deduped due to double free
```
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --num-callers=15 -s ./zig-out/bin/plac server ls -c 10
```
When a same Roon Server responds more than one time, servers hashmap
gets corrupted entry due to having a free-d key.
Shota FUJI
authored at
Shota FUJI
comitted at
ce738568cli: Replace "calloc" build option with "memcheck" option
For more enriched debugging. Valgrind is super useful but Zig's
DebugAllocator displays more friendly message. It does not catch all
errors so Valgrind is still necessary.
Shota FUJI
authored at
Shota FUJI
comitted at
621870cdgtk: Fix build error on macOS
```
error: Failed to execute child process “pkg-config” (No such file or directory)
```
Shota FUJI
authored at
Shota FUJI
comitted at
5260c3begtk: GTK4 application project setup
I still have no idea how "libadwaita" alone supplies required
dependencies such as pango and glib. Without that, even adding those to
"packages" section, ld complains files are missing.
Ghostty has "libadwaita" and "gtk4" as dependencies for GTK4 so I
simply did the same.
Shota FUJI
authored at
Shota FUJI
comitted at
f11a7f77Manage tools using Devbox rather than mise-en-place/asdf
Vala, a programming language often(?) used in GTK world, is missing from
mise/asdf registries. I've been feeling itches while using mise/asdf due
to lack of packages. For example, REUSE tool, which I use for most of my
recent projects, does not exist in their registries.
I choose Devbox among the three options:
* devenv
* Nix Flake (without helper tools)
* Devbox
## devenv
This is the first tool I tried. Their website looks good, features
sounds good, and sample Nix file looks okay. Their getting started guide
starts with "devenv init", which creates not only their config file but
touches other toolings' files (`.gitignore` and `.envrc`). "init"
command without manual setup step, especially touching others' files is
big sign of shitty tooling design, but I continued hoping other parts
would be "okay". Unfortunately they weren't.
CLI "search" command emits hundres of warnings, and outputs table does not
check terminal width so it badly wraps and border characters gets in a way
that the output is nearly unreadable.
When I ran its shell command, it paused the execution with a warning
message about binary cache. So devenv by default uses creator's own paid
SaaS? I don't think just using devenv requires paid subscription, but
unclear writing and CLI tries to push Cachix service into users' Nix
config is no-no for me.
The tool seems to be a thin wrapper around Nix: it inherits some of
upstream's bad designs (e.g. absolutely worst error trace, "nix develop"
invokes "bash" regardless of the current shell).
Their website advertise "Version support." but very few selected
packages have that. Everything else relies on Nix's "use latest or die"
versioning schema. Considering devenv's "Language support" is just
import helpers for nixpkgs, this "Version support." feels like a false
advertising.
Half-baked YAML/Nix architecture prevents users from using overlays or
other flakes with "follows" input to reduce duplications. And using
Flake requires running Flake command ("nix develop --no-pure-eval")
instead of their CLI, which completely dismissed the value of their tool
for me. Also reading their docs are uncomfortable given the tool is not
good quality one:
> Many experienced Nix users prefer to use Nix flakes, although devenv
> is considered a superior interface since it's way simpler, but lacks
> integration with existing tooling.
Superior, huh?
There are still features not present in bare Nix/Flake, but I find those
scripts/tasks/tests not useful. If every developer has access to same
toolchains, why not simply write script? (JS or Python or Go or whatever)
Overall, I see no benefits over bare Nix/Flake or mise/asdf.
## Nix Flake
Nix the language is ugly and readability is mediocre (I maintain my
machines using Home Manager and still hard time *parsing* program.)
It's not good at handling toolchain versions and I don't believe people
not using Nix regularly can understand/write even *okay* quality code.
Combined with its worst of the worst debuggability, I mean error trace,
this is not something I'd like to maintain alongside application
development.
But most importantly, they still runs "bash" on "nix develop" even a
user uses zsh or fish. Hard pass.
## Devbox
Actually this was not in my radar initially, but found during figuring
best way to write Flake for monorepo.
It's not a kind of software I like: docs are next to a cloud offering,
docs site hosted on Vercel, corporate site calling nonsense-text-
generators-having-high-chance-of-makes-sense-response "AI" without
defining intelligence or artifical one, allowing JSONC for ".json" file
extension (fuck you M$ for starting this fucking tradition) and not
supporting ".jsonc" file extension.
But the tool itself is good actually.
* Config file is JSON rather than YAML.
* Config schema is concise and straightforward.
* CLI works great. No wrapping tables.
* CLI is fast.
* Structure of their docs website is *great*. I should steal from that.
* Supports versions, really.
It's hard to describe... UX for Devbox is similar to or better than
mise-en-place. Simplicity? No bullshit API design? I don't know.
I find this tool to be simpler to use and easier to understand compared
to other tools, even including non-Nix ones such as asdf, nvm, and mise.
I may encounter problems rooted to Devbox in a future. I may get
frustrated due to mistyping "debvoc" or something. But for now, I
believe Devbox is the best suited for this project (and my other
projects too.)
Shota FUJI
authored at
Shota FUJI
comitted at
4b704338Create a license file
I don't care someone using this for profit or whatever.
This project started because the status quo is terrible.
Shota FUJI
authored at
Shota FUJI
comitted at