Merge goodies from master.
This commit is contained in:
commit
7e7a83d5c5
12 files changed
+134
-9
No files matched your search
@@ -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
@@ -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
|
||||||
@@ -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" {
|
||||||
@@ -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{
|
||||||
|
|||||||
@@ -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" {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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'),
|
||||||
):
|
):
|
||||||
|
|||||||
Reference in new issue
Block a user