Merge goodies from master.

This commit is contained in:
hjozwiak committed 2026-10-31 15:28:10 -04:00
commit 7e7a83d5c5
12 files changed
+134 -9

No files matched your search

+1
View File
@@ -2,6 +2,7 @@
Cthulhu is a Linux screen reader written in Go. Cthulhu is a Linux screen reader written in Go.
- [2026.10.31 release notes](docs/releases/2026.10.31.md): upgrading from Python, building, packaging, and release verification.
- [Repository Guidelines](AGENTS.md): layout, commands, and working safeguards. - [Repository Guidelines](AGENTS.md): layout, commands, and working safeguards.
- [Contributing](CONTRIBUTING.md): development, accessibility verification, licensing, and the AI-assisted contribution policy. - [Contributing](CONTRIBUTING.md): development, accessibility verification, licensing, and the AI-assisted contribution policy.
- [LibreOffice support](LIBREOFFICE_SUPPORT.md): integration boundaries, initial Calc behavior, remaining work, and verification. - [LibreOffice support](LIBREOFFICE_SUPPORT.md): integration boundaries, initial Calc behavior, remaining work, and verification.
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eu pipefail set -euo pipefail
go build -o cthulhu ./cmd/cthulhu go build -o cthulhu ./cmd/cthulhu
@@ -4,7 +4,7 @@
pkgbase=cthulhu-git pkgbase=cthulhu-git
pkgname=cthulhu-git pkgname=cthulhu-git
_pkgname=cthulhu _pkgname=cthulhu
pkgver=2026.10.29.r579.g74afa42 pkgver=2026.10.29.r581.g44581c4
pkgrel=1 pkgrel=1
pkgdesc="Desktop-agnostic screen reader with speech, Braille, and Tentacle support" pkgdesc="Desktop-agnostic screen reader with speech, Braille, and Tentacle support"
url="https://git.stormux.org/storm/cthulhu" url="https://git.stormux.org/storm/cthulhu"
@@ -0,0 +1,45 @@
pkgbase = cthulhu
pkgdesc = Desktop-agnostic screen reader with speech, Braille, and Tentacle support
pkgver = 2026.10.31
pkgrel = 3
url = https://git.stormux.org/storm/cthulhu
arch = x86_64
arch = aarch64
arch = armv7h
license = GPL-3.0-or-later
makedepends = git
makedepends = go
makedepends = pkgconf
depends = glibc
depends = at-spi2-core
depends = glib2
depends = gdk-pixbuf2
depends = gtk3
depends = speech-dispatcher
depends = gstreamer
depends = gst-plugins-base
depends = gst-plugins-good
depends = brltty
depends = liblouis
depends = libx11
depends = libxres
depends = libxtst
depends = libxfixes
depends = libxkbcommon
depends = xclip
depends = dbus
optdepends = git: Discover and update Tentacle repositories
optdepends = tesseract: OCR engine for text recognition
optdepends = tesseract-data-eng: English OCR language data
conflicts = cthulhu-git
options = !debug
options = !lto
source = cthulhu::git+https://git.stormux.org/storm/cthulhu.git#tag=2026.10.31
source = helper-environment-test.patch
source = tentacle-marker-tests.patch
sha512sums = SKIP
sha512sums = 219debca6195ff9cc79f464beed67baa7847bb84075ee3796401f2be9cfb34fac437ac3065e16fdaa30d2456f6d04da93a84f24e4dd27338463e166e445ec4a1
sha512sums = 6391976a7cf27a61218f49cff3f7c02064a70287cb5d4f1b62457721caf146385a5e8b0555ac73729a03bf4fe9ee74989a5c05aecdbd8f07ee07bd2549720699
optdepends_x86_64 = wine-access: Wine, Proton, NVDA Controller, and Tolk integration
pkgname = cthulhu
+13 -3
View File
@@ -3,7 +3,7 @@
pkgname=cthulhu pkgname=cthulhu
pkgver=2026.10.31 pkgver=2026.10.31
pkgrel=1 pkgrel=3
pkgdesc="Desktop-agnostic screen reader with speech, Braille, and Tentacle support" pkgdesc="Desktop-agnostic screen reader with speech, Braille, and Tentacle support"
url="https://git.stormux.org/storm/cthulhu" url="https://git.stormux.org/storm/cthulhu"
arch=(x86_64 aarch64 armv7h) arch=(x86_64 aarch64 armv7h)
@@ -53,8 +53,18 @@ makedepends=(
) )
options=(!debug !lto) options=(!debug !lto)
# The release tag must exist upstream before makepkg can fetch this source. # The release tag must exist upstream before makepkg can fetch this source.
source=("${pkgname}::git+https://git.stormux.org/storm/${pkgname}.git#tag=${pkgver}") source=("${pkgname}::git+https://git.stormux.org/storm/${pkgname}.git#tag=${pkgver}"
sha512sums=('SKIP') "helper-environment-test.patch"
"tentacle-marker-tests.patch")
sha512sums=('SKIP'
'219debca6195ff9cc79f464beed67baa7847bb84075ee3796401f2be9cfb34fac437ac3065e16fdaa30d2456f6d04da93a84f24e4dd27338463e166e445ec4a1'
'6391976a7cf27a61218f49cff3f7c02064a70287cb5d4f1b62457721caf146385a5e8b0555ac73729a03bf4fe9ee74989a5c05aecdbd8f07ee07bd2549720699')
prepare() {
cd "${pkgname}"
patch -Np1 -i "${srcdir}/helper-environment-test.patch"
patch -Np1 -i "${srcdir}/tentacle-marker-tests.patch"
}
build() { build() {
cd "${pkgname}" cd "${pkgname}"
@@ -0,0 +1,14 @@
diff --git a/internal/wine/manager_test.go b/internal/wine/manager_test.go
index 438fe26..0a5a0bb 100644
--- a/internal/wine/manager_test.go
+++ b/internal/wine/manager_test.go
@@ -226,7 +226,8 @@ func TestManagerLaunchesAndStopsHelperForActivePrefix(t *testing.T) {
t.Setenv("CTHULHU_TEST_WINE_OUTPUT", output)
t.Setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/reader-bus")
helper := filepath.Join(root, "helper")
- script := "#!/bin/sh\nprintf '%s\\n' \"$WINEPREFIX\" \"$CTHULHU_WINE_ACCESS_MANAGED\" \"$DBUS_SESSION_BUS_ADDRESS\" \"$DISPLAY\" > \"$CTHULHU_TEST_WINE_OUTPUT\"\nexec sleep 30\n"
+ // Publish the complete environment atomically; printf can issue multiple writes.
+ script := "#!/bin/sh\nprintf '%s\\n' \"$WINEPREFIX\" \"$CTHULHU_WINE_ACCESS_MANAGED\" \"$DBUS_SESSION_BUS_ADDRESS\" \"$DISPLAY\" > \"$CTHULHU_TEST_WINE_OUTPUT.tmp\"\nmv \"$CTHULHU_TEST_WINE_OUTPUT.tmp\" \"$CTHULHU_TEST_WINE_OUTPUT\"\nexec sleep 30\n"
if err := os.WriteFile(helper, []byte(script), 0700); err != nil {
t.Fatal(err)
}
@@ -0,0 +1,43 @@
diff --git a/internal/app/tentacle_interaction_test.go b/internal/app/tentacle_interaction_test.go
index db03ab2..52307f0 100644
--- a/internal/app/tentacle_interaction_test.go
+++ b/internal/app/tentacle_interaction_test.go
@@ -32,7 +32,9 @@ func TestTentacleInteractionPeer(t *testing.T) {
return sdk.Interaction{Form: &sdk.Form{Title: "Wormhole menu", Elements: []sdk.Element{{ID: "code", Label: "Wormhole code", Kind: sdk.Entry, Required: true, MaxLength: 256}}}, Next: next}, nil
}
submit := func(_ context.Context, raw json.RawMessage) (any, error) {
- os.WriteFile(marker, raw, 0600)
+ if err := write_tentacle_fixture_marker(marker, raw); err != nil {
+ return nil, err
+ }
return sdk.Interaction{Presentation: sdk.Presentation{Speech: "Submitted", Braille: "Submitted"}}, nil
}
commands := []sdk.Command{
diff --git a/internal/app/tentacles_test.go b/internal/app/tentacles_test.go
index 8b862fd..36ee001 100644
--- a/internal/app/tentacles_test.go
+++ b/internal/app/tentacles_test.go
@@ -19,6 +19,14 @@ import (
sdk "git.stormux.org/storm/cthulhu/sdk/go/tentacle"
)
+// Publish complete fixture data before readers can observe the marker.
+func write_tentacle_fixture_marker(markerPath string, data []byte) error {
+ if err := os.WriteFile(markerPath+".tmp", data, 0600); err != nil {
+ return err
+ }
+ return os.Rename(markerPath+".tmp", markerPath)
+}
+
// Subprocess fixture: no reader backend, network, or desktop access.
func TestTentacleReaderPeer(t *testing.T) {
if len(os.Args) < 3 || os.Args[len(os.Args)-2] != "reader-peer" {
@@ -41,7 +49,7 @@ func TestTentacleReaderPeer(t *testing.T) {
os.Exit(3)
}
group, _ := os.ReadFile("/proc/self/cgroup")
- if err := os.WriteFile(marker, group, 0600); err != nil {
+ if err := write_tentacle_fixture_marker(marker, group); err != nil {
return nil, err
}
if filepath.Base(marker) == "present-delay" {
+3 -1
View File
@@ -32,7 +32,9 @@ func TestTentacleInteractionPeer(t *testing.T) {
return sdk.Interaction{Form: &sdk.Form{Title: "Wormhole menu", Elements: []sdk.Element{{ID: "code", Label: "Wormhole code", Kind: sdk.Entry, Required: true, MaxLength: 256}}}, Next: next}, nil return sdk.Interaction{Form: &sdk.Form{Title: "Wormhole menu", Elements: []sdk.Element{{ID: "code", Label: "Wormhole code", Kind: sdk.Entry, Required: true, MaxLength: 256}}}, Next: next}, nil
} }
submit := func(_ context.Context, raw json.RawMessage) (any, error) { submit := func(_ context.Context, raw json.RawMessage) (any, error) {
os.WriteFile(marker, raw, 0600) if err := write_tentacle_fixture_marker(marker, raw); err != nil {
return nil, err
}
return sdk.Interaction{Presentation: sdk.Presentation{Speech: "Submitted", Braille: "Submitted"}}, nil return sdk.Interaction{Presentation: sdk.Presentation{Speech: "Submitted", Braille: "Submitted"}}, nil
} }
commands := []sdk.Command{ commands := []sdk.Command{
+9 -1
View File
@@ -19,6 +19,14 @@ import (
sdk "git.stormux.org/storm/cthulhu/sdk/go/tentacle" sdk "git.stormux.org/storm/cthulhu/sdk/go/tentacle"
) )
// Publish complete fixture data before readers can observe the marker.
func write_tentacle_fixture_marker(markerPath string, data []byte) error {
if err := os.WriteFile(markerPath+".tmp", data, 0600); err != nil {
return err
}
return os.Rename(markerPath+".tmp", markerPath)
}
// Subprocess fixture: no reader backend, network, or desktop access. // Subprocess fixture: no reader backend, network, or desktop access.
func TestTentacleReaderPeer(t *testing.T) { func TestTentacleReaderPeer(t *testing.T) {
if len(os.Args) < 3 || os.Args[len(os.Args)-2] != "reader-peer" { if len(os.Args) < 3 || os.Args[len(os.Args)-2] != "reader-peer" {
@@ -41,7 +49,7 @@ func TestTentacleReaderPeer(t *testing.T) {
os.Exit(3) os.Exit(3)
} }
group, _ := os.ReadFile("/proc/self/cgroup") group, _ := os.ReadFile("/proc/self/cgroup")
if err := os.WriteFile(marker, group, 0600); err != nil { if err := write_tentacle_fixture_marker(marker, group); err != nil {
return nil, err return nil, err
} }
if filepath.Base(marker) == "present-delay" { if filepath.Base(marker) == "present-delay" {
+1 -1
View File
@@ -22,7 +22,7 @@ import "strings"
const Name = "Cthulhu" const Name = "Cthulhu"
const Version = "2026.10.31" const Version = "2026.10.31"
const Channel = "testing" const Channel = "master"
var Build = Version var Build = Version
+2 -1
View File
@@ -226,7 +226,8 @@ func TestManagerLaunchesAndStopsHelperForActivePrefix(t *testing.T) {
t.Setenv("CTHULHU_TEST_WINE_OUTPUT", output) t.Setenv("CTHULHU_TEST_WINE_OUTPUT", output)
t.Setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/reader-bus") t.Setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/reader-bus")
helper := filepath.Join(root, "helper") helper := filepath.Join(root, "helper")
script := "#!/bin/sh\nprintf '%s\\n' \"$WINEPREFIX\" \"$CTHULHU_WINE_ACCESS_MANAGED\" \"$DBUS_SESSION_BUS_ADDRESS\" \"$DISPLAY\" > \"$CTHULHU_TEST_WINE_OUTPUT\"\nexec sleep 30\n" // Publish the complete environment atomically; printf can issue multiple writes.
script := "#!/bin/sh\nprintf '%s\\n' \"$WINEPREFIX\" \"$CTHULHU_WINE_ACCESS_MANAGED\" \"$DBUS_SESSION_BUS_ADDRESS\" \"$DISPLAY\" > \"$CTHULHU_TEST_WINE_OUTPUT.tmp\"\nmv \"$CTHULHU_TEST_WINE_OUTPUT.tmp\" \"$CTHULHU_TEST_WINE_OUTPUT\"\nexec sleep 30\n"
if err := os.WriteFile(helper, []byte(script), 0700); err != nil { if err := os.WriteFile(helper, []byte(script), 0700); err != nil {
t.Fatal(err) t.Fatal(err)
} }
+1
View File
@@ -444,6 +444,7 @@ def run_inside(directory):
for controlName, expectedRole in ( for controlName, expectedRole in (
('Time format', 'combo box'), ('Time format', 'combo box'),
('Date format', 'combo box'), ('Date format', 'combo box'),
('Automatic focus mode during structural navigation', 'check box'),
('Progress bar output', 'combo box'), ('Progress bar output', 'combo box'),
('Report background progress bars', 'check box'), ('Report background progress bars', 'check box'),
): ):