Build an AppImage and a disk image, and publish them

Installing meant cloning the repository and running a shell script, which
is a fair ask of somebody who already has a terminal open and no ask at
all of anybody else. The releases page now carries an AppImage and a disk
image per Mac architecture: a push to master rebuilds a rolling "latest",
a v* tag publishes a version and leaves it there, and the Run button in
the Actions tab raises the number by running scripts/release.sh, which is
the same script and not a second copy of what it does.

Two things in the application had to give for that. A build has no
__main__.py on disk, and an AppImage is mounted somewhere new every run,
so the command a shortcut is registered with cannot go on being this
interpreter and this file; ipc.launcher() answers with the AppImage or
the bundle instead. And a build carries its own libstdc++, which every
process it starts inherits through LD_LIBRARY_PATH and none of them can
live with: ffmpeg, ydotool and wl-copy are the distribution's binaries
built against the distribution's libraries, and AppImageLauncher, which
is what starting the AppImage again goes through, refuses outright.
integrate.py puts that variable back before anything else runs.

Nothing installs itself over an installation that is already there.
install.sh's menu entry, install-mac.sh's login item and the desktop file
AppImageLauncher writes are each recognised and left alone, so trying a
download once does not quietly move the machine onto it. `dikte
integrate` is how you ask for it outright, and --remove takes it back.

The disk image carries an ffmpeg, pinned and checksummed, because macOS
records through one and ships nothing like it. It is signed ad-hoc and
not with an Apple certificate, so a first launch is refused until Open
Anyway and the permissions are asked for again after each update; both
READMEs and the release notes say so.
This commit is contained in:
2026-08-16 15:03:44 +03:00
parent 061dc5451b
commit 7e510f8b35
17 changed files with 1508 additions and 8 deletions
+15 -2
View File
@@ -23,6 +23,16 @@ paketleri dışında bağımlılığı yok: sadece Python standart kütüphanesi
## Kurulum
[Sürümler sayfasında](../../releases) bir AppImage, bir de her Mac mimarisi
için birer disk imajı var. İkisi de ilk çalıştıklarında kendi menü girdisini,
oturum açılışını ve `dikte` komutunu yazar, makinede zaten duran bir kuruluma
dokunmazlar; `dikte integrate --remove` yazdıklarını geri alır. AppImage yine
de aşağıdaki sistem paketlerini ister: ses sunucusu, pano ve klavye onlardan
gelir. Disk imajı bir Apple sertifikasıyla imzalı değil, bu yüzden ilk açılış
reddedilir, Sistem Ayarları → Gizlilik ve Güvenlik altından **Yine de Aç**
demek gerekir; macOS her güncellemeden sonra mikrofonu ve Erişilebilirliği
yeniden sorar, checkout'tan kurmak bundan kurtarır.
```sh
sudo pacman -S --needed pipewire-audio wl-clipboard ydotool ffmpeg python-pyqt6
systemctl --user enable --now ydotool # otomatik yapıştırma için
@@ -200,8 +210,10 @@ Kısayollar sekmesi bağlanacak komutu gösterir.
Aşağıdakilerin hepsi `dikte` paketinin içinde: `python3 -m dikte` bunu çalıştırır,
içindeki `__main__.py` de her başlatıcının ve kısayolun adlandırdığı dosyadır.
`scripts/` altında install-mac.sh, update.sh ve uninstall.sh var; install.sh en
üstte kalır, `tests/` içinde de her modülün bir dosyası.
`scripts/` altında install-mac.sh, update.sh, uninstall.sh ve release.sh var;
`packaging/` release.sh'ın attığı etiketin yayımladığı AppImage ile disk
imajını derler; install.sh en üstte kalır, `tests/` içinde de her modülün bir
dosyası.
```
app.py giriş noktası, tepsi simgesi, durum makinesi
@@ -222,6 +234,7 @@ settings_ui.py ayarlar penceresi
hotkey.py masaüstünün kısayol kaydı, evdev dinleyici, Mac'te Carbon
paste.py wl-clipboard ve ydotool sarmalayıcıları, pbcopy ve CoreGraphics
trayicon.py tepsi simgeleri, ikon teması olmayan yerler için çizilmiş
integrate.py indirilen bir yapının indiği masaüstüne yazdıkları
i18n.py metin tablosu
```