Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a8950c42e2 | |||
| 91edf64a72 | |||
| 296c47be36 | |||
| 5779444d4b | |||
| c072f903db | |||
| 64ad1ab3e0 | |||
| 20e61d6259 | |||
| a750761f61 | |||
| 03b3880622 | |||
| f4af54228a | |||
| 518d2b3bb6 | |||
| 7043f08dab | |||
| d0bc7d8a3a | |||
| 438fae4fef | |||
| a7cd1d033a | |||
| c4890f31af | |||
| c44245189a | |||
| c7b8e4a30d | |||
| 20fe1a7e30 | |||
| 25931758f7 | |||
| daf57ef22c | |||
| 1d2d727fa2 | |||
| 11bd7107d2 | |||
| 95d33047fa | |||
| 523b896053 | |||
| 9152455227 | |||
| c0fdaca4d0 | |||
| 8312a842c1 | |||
| 07138197cb | |||
| ed78ffc248 | |||
| 4add36f5ca | |||
| 40e63150a6 | |||
| 4dba0ec0cd | |||
| e6f780c38b | |||
| 0f7f73a6a0 | |||
| aa71d02036 | |||
| f873fcee11 | |||
| 51ef3de672 | |||
| 13976b7235 |
@@ -14,6 +14,16 @@ This repository is a screen reader. Prioritize accessibility, correctness, and s
|
||||
- `meson compile -C _build`
|
||||
- `meson install -C _build`
|
||||
|
||||
## Runtime target and testing rules
|
||||
- Make source changes in this repo, not in `~/.local/lib/python*/site-packages/cthulhu/`, unless the user explicitly asks for an installed-package hotfix.
|
||||
- If you confirm the active import comes from `~/.local/...`, that does **not** mean you should edit there. It means you should update the repo and then run `./build-local.sh` to replace the installed copy for testing.
|
||||
- Default test/apply workflow for local Cthulhu fixes:
|
||||
- edit repo files
|
||||
- run `./build-local.sh`
|
||||
- reproduce/test against the refreshed `~/.local` install
|
||||
- If repo and installed behavior differ, prefer rebuilding with `./build-local.sh` over patching the installed package directly.
|
||||
- Treat direct edits under `~/.local/.../cthulhu/` as an exception path that requires explicit user approval.
|
||||
|
||||
## Coding guidelines
|
||||
- **When modifying existing code:** follow the surrounding code’s conventions.
|
||||
- **When writing new code from scratch:** prefer
|
||||
@@ -55,3 +65,8 @@ This repository is a screen reader. Prioritize accessibility, correctness, and s
|
||||
## Meson install reminder (important)
|
||||
- If you add new Python modules under `src/cthulhu/`, update `src/cthulhu/meson.build` so they get installed (otherwise imports can fail after install).
|
||||
- If you add a new plugin directory, update `src/cthulhu/plugins/meson.build` and add a `meson.build` in the plugin directory.
|
||||
|
||||
## Common Cthulhu agent mistakes
|
||||
- Checking the import origin, seeing `~/.local/...`, and then editing the installed package instead of the repo.
|
||||
- Forgetting that `./build-local.sh` is the normal way to apply repo changes into the installed copy for testing.
|
||||
- Making repo fixes and then diagnosing the old installed copy without rebuilding.
|
||||
|
||||
@@ -1,182 +0,0 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Cthulhu is a fork of the Orca screen reader, designed as a desktop-agnostic screen reader for Linux. It works with applications supporting AT-SPI (Assistive Technology Service Provider Interface) including GTK+, Qt, Java Swing, LibreOffice, Gecko, and WebKitGtk.
|
||||
|
||||
**Key differentiators from Orca:**
|
||||
- Desktop-agnostic: Works on KDE, XFCE, i3, Sway, and other environments (not just GNOME)
|
||||
- Extensible plugin architecture using pluggy framework
|
||||
- D-Bus remote control interface for external automation
|
||||
- Enhanced support for tiling window managers
|
||||
|
||||
## Build Commands
|
||||
|
||||
```bash
|
||||
# Local development build (installs to ~/.local)
|
||||
./build-local.sh
|
||||
|
||||
# Test local installation
|
||||
./test-local.sh
|
||||
|
||||
# Run local version
|
||||
~/.local/bin/cthulhu
|
||||
|
||||
# Clean build artifacts and local installation
|
||||
./clean-local.sh
|
||||
./clean-local.sh --build-only # Clean only build artifacts
|
||||
./clean-local.sh --install-only # Remove only local installation
|
||||
|
||||
# Manual Meson build
|
||||
meson setup _build --prefix=$HOME/.local
|
||||
meson compile -C _build
|
||||
meson install -C _build
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
Manual testing is recommended. The legacy keystroke-driven test harness has been removed.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
### Core Components (`src/cthulhu/`)
|
||||
|
||||
**Event & Input Processing:**
|
||||
- `event_manager.py` - Central AT-SPI event handling and routing
|
||||
- `input_event_manager.py` - Keyboard/mouse input processing
|
||||
- `input_event.py` - Input event data structures
|
||||
- `focus_manager.py` - Focus tracking across applications
|
||||
|
||||
**Accessibility Layer (ax_* files):**
|
||||
- `ax_object.py` - Core accessible object abstraction
|
||||
- `ax_utilities.py` - Common accessibility utilities
|
||||
- `ax_utilities_role.py` - Role-based accessibility helpers
|
||||
- `ax_utilities_collection.py` - Collection traversal utilities
|
||||
- `ax_text.py`, `ax_table.py`, `ax_component.py` - Specialized interfaces
|
||||
|
||||
**Output Systems:**
|
||||
- `speech.py`, `speechdispatcherfactory.py` - Speech synthesis
|
||||
- `braille.py`, `braille_generator.py` - Braille display support
|
||||
- `speech_generator.py` - Generate speech from accessible objects
|
||||
- `sound.py`, `sound_generator.py` - Audio cue generation
|
||||
|
||||
**Script System:**
|
||||
- `script_manager.py` - Loads/manages application-specific scripts
|
||||
- `script.py` - Base script class
|
||||
- `scripts/default.py` - Default behavior for all applications
|
||||
- `scripts/apps/` - Application-specific customizations (Firefox, LibreOffice, etc.)
|
||||
- `scripts/toolkits/` - Toolkit-specific scripts (GTK, Qt, WebKitGtk)
|
||||
- `scripts/web/` - Web content handling
|
||||
|
||||
**Plugin System:**
|
||||
- `plugin.py` - Base plugin class with `cthulhu_hookimpl` decorator
|
||||
- `plugin_system_manager.py` - Plugin discovery and lifecycle
|
||||
- `plugins/` - Built-in plugins (OCR, Clipboard, SpeechHistory, etc.)
|
||||
|
||||
**D-Bus Remote Control:**
|
||||
- `dbus_service.py` - D-Bus service implementation
|
||||
- Service: `org.stormux.Cthulhu.Service`
|
||||
- Path: `/org/stormux/Cthulhu/Service`
|
||||
|
||||
**Settings & State:**
|
||||
- `settings_manager.py` - User preferences persistence
|
||||
- `settings.py` - Default settings values
|
||||
- `cthulhu_state.py` - Runtime state (active script, focus, etc.)
|
||||
|
||||
### Key Design Patterns
|
||||
|
||||
**Script Inheritance:** Application scripts extend `default.Script`, overriding methods for custom behavior. The script manager selects scripts based on the focused application.
|
||||
|
||||
**Event Flow:** AT-SPI events → `event_manager` → active script's event handler → generators → output systems (speech/braille)
|
||||
|
||||
**Plugin Hooks:** Plugins implement hooks via `@cthulhu_hookimpl` decorator. Use `registerGestureByString()` for keybindings.
|
||||
|
||||
## Adding New Modules
|
||||
|
||||
When adding new Python modules under `src/cthulhu/`:
|
||||
|
||||
1. **Update `src/cthulhu/meson.build`** - Add the `.py` file to `cthulhu_python_sources`
|
||||
|
||||
2. **For new script modules** (e.g., `scripts/newmodule/`):
|
||||
- Create the directory with `__init__.py` and `script.py`
|
||||
- Add `meson.build` in the new directory
|
||||
- Add subdirectory to `src/cthulhu/scripts/meson.build`
|
||||
|
||||
3. **For new plugins**:
|
||||
- Create directory under `src/cthulhu/plugins/` with:
|
||||
- `__init__.py`, `plugin.py`, `plugin.info`, `meson.build`
|
||||
- Add subdirectory to `src/cthulhu/plugins/meson.build`
|
||||
|
||||
## Plugin Structure
|
||||
|
||||
```
|
||||
src/cthulhu/plugins/MyPlugin/
|
||||
├── __init__.py # from .plugin import *
|
||||
├── plugin.py # Main implementation extending Plugin
|
||||
├── plugin.info # Metadata (name, version, description, etc.)
|
||||
└── meson.build # install_data for .py and .info files
|
||||
```
|
||||
|
||||
Example plugin.py:
|
||||
```python
|
||||
from cthulhu.plugin import Plugin, cthulhu_hookimpl
|
||||
|
||||
class MyPlugin(Plugin):
|
||||
@cthulhu_hookimpl
|
||||
def activate(self, plugin=None):
|
||||
if plugin is not None and plugin is not self:
|
||||
return
|
||||
self.registerGestureByString(self.myHandler, "description", "kb:cthulhu+key")
|
||||
|
||||
def myHandler(self, script=None, inputEvent=None):
|
||||
self.app.getDynamicApiManager().getAPI('CthulhuState').activeScript.presentMessage('Message')
|
||||
return True
|
||||
```
|
||||
|
||||
## D-Bus Testing
|
||||
|
||||
```bash
|
||||
# Check service availability
|
||||
busctl --user list | grep Cthulhu
|
||||
|
||||
# Get version
|
||||
busctl --user call org.stormux.Cthulhu.Service /org/stormux/Cthulhu/Service \
|
||||
org.stormux.Cthulhu.Service GetVersion
|
||||
|
||||
# Present message
|
||||
busctl --user call org.stormux.Cthulhu.Service /org/stormux/Cthulhu/Service \
|
||||
org.stormux.Cthulhu.Service PresentMessage s "Hello"
|
||||
|
||||
# Introspect available methods
|
||||
busctl --user introspect org.stormux.Cthulhu.Service /org/stormux/Cthulhu/Service
|
||||
```
|
||||
|
||||
## Key Keybindings
|
||||
|
||||
- `Cthulhu+Space` - Open preferences
|
||||
- `Cthulhu+H` - Enter learn mode
|
||||
- `Cthulhu+Ctrl+Alt+Shift+Q` - Toggle sleep mode for current application
|
||||
- `Cthulhu+Q` - Quit Cthulhu
|
||||
|
||||
## Self-Voicing Interface
|
||||
|
||||
External applications can speak through Cthulhu via Unix socket:
|
||||
```bash
|
||||
echo "Hello world" | socat - UNIX-CLIENT:/tmp/cthulhu.sock
|
||||
echo "<!#APPEND#!>Without interrupt" | socat - UNIX-CLIENT:/tmp/cthulhu.sock
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
**Core:** Python 3.9+, pygobject-3.0, gtk+-3.0, AT-SPI2, ATK
|
||||
**Speech:** python-speechd, gstreamer-1.0
|
||||
**Plugins:** pluggy, python-dasbus (optional, for D-Bus)
|
||||
**Braille:** BrlTTY, BrlAPI, liblouis (optional)
|
||||
|
||||
## Repository
|
||||
|
||||
- **Main repo:** https://git.stormux.org/storm/cthulhu
|
||||
- **Community:** IRC #stormux on irc.stormux.org
|
||||
- **Email patches:** storm_dragon@stormux.org
|
||||
@@ -98,11 +98,11 @@ git status
|
||||
|
||||
## Dependencies
|
||||
|
||||
- **Runtime**: python3, pygobject-3.0, pluggy, AT-SPI2
|
||||
- **Runtime**: python3, pygobject-3.0, pluggy, tomlkit, AT-SPI2
|
||||
- **Build**: meson, ninja, gettext
|
||||
- **Optional**: dasbus (for D-Bus service), BrlTTY, speech-dispatcher, piper-tts
|
||||
|
||||
Install build dependencies on Arch Linux:
|
||||
```bash
|
||||
sudo pacman -S meson ninja gettext python-dasbus
|
||||
sudo pacman -S meson ninja gettext python-dasbus python-tomlkit
|
||||
```
|
||||
|
||||
@@ -179,6 +179,7 @@ Ensure you have the development dependencies installed:
|
||||
```bash
|
||||
sudo pacman -S python python-gobject gtk3 at-spi2-core at-spi2-atk \
|
||||
python-speechd gstreamer python-pluggy python-dasbus \
|
||||
python-tomlkit \
|
||||
meson ninja pkgconf intltool gettext
|
||||
```
|
||||
|
||||
@@ -187,6 +188,7 @@ sudo pacman -S python python-gobject gtk3 at-spi2-core at-spi2-atk \
|
||||
sudo apt install python3 python3-gi python3-gi-cairo gir1.2-gtk-3.0 \
|
||||
at-spi2-core libatk-adaptor python3-speechd \
|
||||
gstreamer1.0-plugins-base python3-pluggy python3-dasbus \
|
||||
python3-tomlkit \
|
||||
meson ninja-build pkg-config intltool gettext
|
||||
```
|
||||
|
||||
|
||||
@@ -26,6 +26,12 @@ for cmd in meson ninja python3; do
|
||||
fi
|
||||
done
|
||||
|
||||
if ! python3 -c "import tomlkit" 2>/dev/null; then
|
||||
echo "Error: Python module tomlkit is not installed"
|
||||
echo "Please install: python-tomlkit"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for optional dependencies
|
||||
missingOptional=()
|
||||
if ! python3 -c "import gi" 2>/dev/null; then
|
||||
|
||||
@@ -8,13 +8,11 @@ set -e # Exit on error
|
||||
|
||||
# Colors for output (only if stdout is a terminal)
|
||||
if [[ -t 1 ]]; then
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
else
|
||||
RED=''
|
||||
GREEN=''
|
||||
YELLOW=''
|
||||
BLUE=''
|
||||
@@ -56,12 +54,6 @@ if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
|
||||
# Remove data files
|
||||
|
||||
# Remove desktop files
|
||||
if [[ -f "$HOME/.local/share/applications/cthulhu-autostart.desktop" ]]; then
|
||||
rm -f "$HOME/.local/share/applications/cthulhu-autostart.desktop"
|
||||
echo " Removed: ~/.local/share/applications/cthulhu-autostart.desktop"
|
||||
fi
|
||||
|
||||
# Remove icons
|
||||
for size in 16x16 22x22 24x24 32x32 48x48 256x256 scalable symbolic; do
|
||||
icon_path="$HOME/.local/share/icons/hicolor/$size/apps"
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Cthulhu Screen Reader
|
||||
Exec=cthulhu
|
||||
NoDisplay=true
|
||||
# Desktop-neutral autostart - no GNOME-specific conditions
|
||||
# Users can enable/disable via their desktop environment's accessibility settings
|
||||
# or by adding/removing this file from ~/.config/autostart/
|
||||
X-GNOME-AutoRestart=true
|
||||
Categories=Accessibility;
|
||||
Keywords=screen;reader;accessibility;speech;braille;
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Storm Dragon <storm_dragon@stormux.org>
|
||||
|
||||
pkgname=cthulhu
|
||||
pkgver=2026.01.26
|
||||
pkgver=2026.03.02
|
||||
pkgrel=1
|
||||
pkgdesc="Desktop-agnostic screen reader with plugin system, forked from Orca"
|
||||
url="https://git.stormux.org/storm/cthulhu"
|
||||
@@ -27,6 +27,7 @@ depends=(
|
||||
|
||||
# Plugin system and D-Bus remote control
|
||||
python-pluggy
|
||||
python-tomlkit
|
||||
python-dasbus
|
||||
|
||||
# AI Assistant dependencies (for screenshots, HTTP requests, and actions)
|
||||
@@ -83,7 +84,7 @@ makedepends=(
|
||||
)
|
||||
install=cthulhu.install
|
||||
source=(
|
||||
"git+https://git.stormux.org/storm/cthulhu.git"
|
||||
"git+https://git.stormux.org/storm/cthulhu.git#tag=${pkgver}"
|
||||
"cthulhu.install"
|
||||
)
|
||||
b2sums=(
|
||||
@@ -91,11 +92,6 @@ b2sums=(
|
||||
'SKIP'
|
||||
)
|
||||
|
||||
pkgver() {
|
||||
cd cthulhu
|
||||
grep "^version = " src/cthulhu/cthulhuVersion.py | sed 's/version = "\(.*\)"/\1/'
|
||||
}
|
||||
|
||||
build() {
|
||||
cd cthulhu
|
||||
arch-meson _build
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# Cthulhu Logging Guidelines
|
||||
|
||||
This document defines the preferred format for debug logging in Cthulhu.
|
||||
The goal is to keep logs consistent, searchable, and easy to scan.
|
||||
|
||||
## Helpers
|
||||
|
||||
Use the helpers in `cthulhu.debug` for new logs:
|
||||
|
||||
- `debug.print_log(level, prefix, message, reason=None, timestamp=False, stack=False)`
|
||||
- `debug.print_log_tokens(level, prefix, tokens, reason=None, timestamp=False, stack=False)`
|
||||
|
||||
These helpers ensure the prefix and optional reason tag are formatted consistently.
|
||||
Timestamps are appended at the end of the message when enabled.
|
||||
|
||||
## Prefixes
|
||||
|
||||
Use short, uppercase prefixes that identify the subsystem:
|
||||
|
||||
- `EVENT MANAGER`
|
||||
- `FOCUS MANAGER`
|
||||
- `INPUT EVENT`
|
||||
- `SCRIPT MANAGER`
|
||||
- `WEB`
|
||||
|
||||
## Messages
|
||||
|
||||
- Keep messages short and action-focused.
|
||||
- Do not include the prefix in the message.
|
||||
- Prefer consistent verbs (e.g., "Not using …", "Setting …", "Ignoring …").
|
||||
|
||||
## Reason Tags
|
||||
|
||||
Use reason tags to explain decisions or early exits.
|
||||
|
||||
- Lowercase with hyphens (e.g., `focus-mode`, `no-active-script`).
|
||||
- Use a short phrase rather than a full sentence.
|
||||
- If a human-readable reason is already available, it can be used directly.
|
||||
|
||||
## Examples
|
||||
|
||||
```text
|
||||
WEB: Not using caret navigation (reason=disabled)
|
||||
FOCUS MANAGER: Setting locus of focus to existing locus of focus (reason=no-change)
|
||||
SCRIPT MANAGER: Setting active script to [script] (reason=focus: active-window)
|
||||
```
|
||||
+1
-1
@@ -290,7 +290,7 @@ toggle the reading of tables, either by single cell or whole row.
|
||||
.B Cthulhu
|
||||
user preferences directory
|
||||
.TP
|
||||
.BI ~/.local/share/cthulhu/user-settings.conf
|
||||
.BI ~/.local/share/cthulhu/user-settings.toml
|
||||
.B Cthulhu
|
||||
user preferences configuration file.
|
||||
.TP
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
# Sounds Tab Design
|
||||
|
||||
Date: 2026-04-05
|
||||
|
||||
## Context
|
||||
|
||||
Cthulhu currently stores several non-speech sound settings in the general settings file, but the preferences dialog does not present them coherently:
|
||||
|
||||
- The General tab contains an inline Sound section for backend, theme, and role-sound presentation.
|
||||
- The progress-bar beep checkbox lives in the General tab's progress-bar section.
|
||||
- `soundVolume` exists in settings and the user's active profile, but there is no UI control for it.
|
||||
- `enableSound`, `playSoundForRole`, `playSoundForState`, `playSoundForPositionInSet`, and `playSoundForValue` exist as persisted settings but are not currently exposed in the dialog.
|
||||
- `progressBarBeepInterval` exists in runtime defaults but is not part of the normal persisted general-settings key list.
|
||||
|
||||
The result is that sound-related behavior is split across the dialog and some active settings cannot be inspected or changed from the UI.
|
||||
|
||||
## Goals
|
||||
|
||||
- Add a dedicated `Sounds` preferences tab.
|
||||
- Move currently exposed sound-related controls out of `General` and into `Sounds`.
|
||||
- Move the progress-bar beep option into `Sounds` while leaving the rest of the progress-bar section in `General`.
|
||||
- Expose currently hidden sound-related settings in the UI.
|
||||
- Add a UI control for `soundVolume`.
|
||||
- Expose and persist `progressBarBeepInterval`.
|
||||
- Preserve the existing settings model and save format.
|
||||
- Avoid clobbering unrelated settings when saving preferences.
|
||||
|
||||
## Non-Goals
|
||||
|
||||
- No refactor of the broader preferences architecture.
|
||||
- No changes to sound playback implementation outside what is needed to load and save settings correctly.
|
||||
- No new settings schema beyond persisting the existing hidden `progressBarBeepInterval`.
|
||||
- No dynamic enable/disable logic for sound controls in this pass.
|
||||
|
||||
## Design Summary
|
||||
|
||||
Add a new notebook page labeled `Sounds` and make it the single home for non-speech sound configuration. Remove the inline Sound frame from `General`. Keep the existing progress-bar speech/braille controls and shared progress-bar behavior controls in `General`, but move beep-specific controls into `Sounds`.
|
||||
|
||||
The new tab will use existing settings keys wherever possible and will save through the existing `prefsDict` and settings-manager flow.
|
||||
|
||||
## Sounds Tab Layout
|
||||
|
||||
The `Sounds` tab will contain three sections.
|
||||
|
||||
### Output
|
||||
|
||||
- `enableSound` checkbox
|
||||
- `soundVolume` slider
|
||||
- `soundSink` combo box
|
||||
|
||||
`soundVolume` should be represented by a native `GtkScale` and persisted back to the existing floating-point `soundVolume` setting. The control should initialize from `prefsDict.get("soundVolume", settings.soundVolume)`.
|
||||
|
||||
For this implementation, the slider should match the stored setting directly rather than introducing a new percentage representation. That keeps the implementation small and avoids conversion-only complexity in a settings path that already exists.
|
||||
|
||||
### Presentation
|
||||
|
||||
- `soundTheme` combo box
|
||||
- `roleSoundPresentation` combo box
|
||||
- `playSoundForRole` checkbox
|
||||
- `playSoundForState` checkbox
|
||||
- `playSoundForPositionInSet` checkbox
|
||||
- `playSoundForValue` checkbox
|
||||
|
||||
These controls will expose already-existing settings and use the same `prefsDict` update pattern already used by the current dialog.
|
||||
|
||||
### Alerts
|
||||
|
||||
- `beepProgressBarUpdates` checkbox
|
||||
- `progressBarBeepInterval` spin button
|
||||
|
||||
This section controls only beep-based progress-bar alerts. The label should make it clear that the interval is beep-specific, not the general progress-bar announcement interval.
|
||||
|
||||
## General Tab Changes
|
||||
|
||||
Keep these controls in `General`:
|
||||
|
||||
- `speakProgressBarUpdates`
|
||||
- `brailleProgressBarUpdates`
|
||||
- `progressBarUpdateInterval`
|
||||
- `progressBarVerbosity`
|
||||
- `ignoreStatusBarProgressBars`
|
||||
|
||||
Remove these from `General`:
|
||||
|
||||
- the inline Sound frame
|
||||
- `beepProgressBarUpdates`
|
||||
|
||||
This preserves the current organization for general progress-bar announcement behavior while moving sound-only concerns into the new tab.
|
||||
|
||||
## Settings and Persistence
|
||||
|
||||
### Existing Keys Reused
|
||||
|
||||
The new UI will continue to use the existing settings keys:
|
||||
|
||||
- `enableSound`
|
||||
- `soundVolume`
|
||||
- `soundSink`
|
||||
- `soundTheme`
|
||||
- `roleSoundPresentation`
|
||||
- `playSoundForRole`
|
||||
- `playSoundForState`
|
||||
- `playSoundForPositionInSet`
|
||||
- `playSoundForValue`
|
||||
- `beepProgressBarUpdates`
|
||||
|
||||
### Persisted Hidden Key
|
||||
|
||||
Add `progressBarBeepInterval` to the persisted general-settings key list so it round-trips through:
|
||||
|
||||
- defaults in `settings.py`
|
||||
- settings-manager general settings
|
||||
- TOML backend save/load
|
||||
- `prefsDict` in the preferences dialog
|
||||
|
||||
This avoids the current mismatch where beep interval exists as a runtime default but is not part of the normal persisted general-settings path.
|
||||
|
||||
### Save Behavior
|
||||
|
||||
The implementation should continue to update individual keys in `prefsDict` and then rely on the existing general-settings save flow. No bulk replacement of the whole settings structure should be introduced.
|
||||
|
||||
This is specifically intended to avoid accidental overwrites of unrelated settings already present in `user-settings.toml`.
|
||||
|
||||
## Default Values
|
||||
|
||||
- Keep `progressBarUpdateInterval = 10` as the default for speech and braille progress-bar updates.
|
||||
- Keep `progressBarBeepInterval = 0` as the default for beep-based progress-bar updates.
|
||||
- Keep `soundVolume = 0.5` as the existing default unless the user explicitly changes it.
|
||||
|
||||
The new UI should reflect these values accurately on load.
|
||||
|
||||
## Accessibility
|
||||
|
||||
Use native GTK controls and follow the existing preferences-dialog patterns:
|
||||
|
||||
- every label must be associated with its control via `mnemonic_widget`
|
||||
- checkboxes should use the existing `checkButtonToggled` convention when possible
|
||||
- combo boxes should keep proper `label-for` / `labelled-by` relationships
|
||||
- no custom-drawn controls
|
||||
- no keyboard traps
|
||||
|
||||
The new tab should be fully reachable with standard tab navigation.
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
Expected files to change:
|
||||
|
||||
- `src/cthulhu/cthulhu-setup.ui`
|
||||
- `src/cthulhu/cthulhu_gui_prefs.py`
|
||||
- `src/cthulhu/settings.py`
|
||||
|
||||
Implementation should:
|
||||
|
||||
- add the new notebook page and move or recreate the relevant widgets there
|
||||
- initialize and save the new sound controls using existing dialog patterns
|
||||
- add explicit handling for `soundVolume`
|
||||
- add explicit handling for `progressBarBeepInterval`
|
||||
- keep all unrelated preference behavior unchanged
|
||||
|
||||
## Verification
|
||||
|
||||
The implementation should be considered complete only after all of the following are checked:
|
||||
|
||||
1. The preferences dialog opens and the new `Sounds` tab is present.
|
||||
2. Existing sound settings load into the correct controls.
|
||||
3. Changing sound settings updates `prefsDict` without breaking unrelated settings.
|
||||
4. Saving preferences preserves unrelated keys in `user-settings.toml`.
|
||||
5. `progressBarBeepInterval` is written and reloaded correctly.
|
||||
6. The General tab still handles speech/braille progress-bar settings correctly.
|
||||
7. Touched Python files pass compile checks.
|
||||
8. Manual verification confirms keyboard navigation and label association remain intact.
|
||||
+1
-11
@@ -1,5 +1,5 @@
|
||||
project('cthulhu',
|
||||
version: '2026.01.26-master',
|
||||
version: '2026.03.02-master',
|
||||
meson_version: '>= 1.0.0',
|
||||
)
|
||||
|
||||
@@ -93,16 +93,6 @@ else
|
||||
summary += {'sound support': 'no (missing gstreamer)'}
|
||||
endif
|
||||
|
||||
# Integration with session startup
|
||||
i18n.merge_file(
|
||||
input: 'cthulhu-autostart.desktop.in',
|
||||
output: '@BASENAME@',
|
||||
type: 'desktop',
|
||||
po_dir: meson.project_source_root() / 'po',
|
||||
install: true,
|
||||
install_dir: get_option('sysconfdir') / 'xdg' / 'autostart',
|
||||
)
|
||||
|
||||
# Update icon cache manually (desktop-neutral) - optional, ignore failures
|
||||
gtk_update_icon_cache = find_program('gtk4-update-icon-cache', required: false)
|
||||
if gtk_update_icon_cache.found()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# List of source files containing translatable strings.
|
||||
# Please keep this file sorted alphabetically.
|
||||
cthulhu-autostart.desktop.in
|
||||
src/cthulhu/braille_rolenames.py
|
||||
src/cthulhu/brltablenames.py
|
||||
src/cthulhu/chnames.py
|
||||
|
||||
@@ -13,11 +13,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-DamnedLies-Scope: partial\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr ""
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 1.6.10\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lector de pantalla Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "lector de pantalla; fabla; braille;"
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
"X-Poedit-Language: Arabic\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "قارئ الشاشة Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "شاشة;قارئ;إمكانية الوصول;كلام;برايل;"
|
||||
|
||||
|
||||
@@ -19,11 +19,9 @@ msgstr ""
|
||||
"X-Poedit-Language: Asturian\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Llector de pantalla d'Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -17,11 +17,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Чытач з экрана Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "чытач з экрана;экран;голас;маўленне;Брайль;"
|
||||
|
||||
@@ -23,11 +23,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu — екранен четец"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "екран;четец;достъпност;говор;брайл;"
|
||||
|
||||
|
||||
@@ -21,12 +21,10 @@ msgstr ""
|
||||
"X-Generator: KBabel 1.9.1\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "অর্কা স্ক্রীন রিডার / বিবর্ধন"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,12 +18,10 @@ msgstr ""
|
||||
"X-Generator: KBabel 1.9.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu'র বৈশিষ্ট্য"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -15,11 +15,9 @@ msgstr ""
|
||||
"X-Launchpad-Export-Date: 2015-02-05 06:46+0000\n"
|
||||
"X-Generator: Poedit 1.7.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu čitač ekrana"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "čitač ekrana;govor;brailleovo pismo;"
|
||||
|
||||
|
||||
@@ -27,11 +27,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lector de pantalla Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "pantalla;lector;accessibilitat;veu;braille;"
|
||||
|
||||
|
||||
@@ -27,11 +27,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lector de pantalla Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "lector de pantalla;pronunciació;braille;"
|
||||
|
||||
|
||||
@@ -19,12 +19,10 @@ msgstr ""
|
||||
"X-Launchpad-Export-Date: 2020-05-04 21:32+0000\n"
|
||||
"X-Generator: Poedit 2.3\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "خوێنەری پەردەی ئۆرکا"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Čtečka obrazovky Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "obrazovka;čtečka;přístupnost;řeč;braille;"
|
||||
|
||||
|
||||
@@ -17,12 +17,10 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
|
||||
"11) ? 2 : 3;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Hoffterau Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -32,11 +32,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Skærmlæseren Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "skærm;læser;tilgængelighed;tale;braille;"
|
||||
|
||||
|
||||
@@ -37,11 +37,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu-Bildschirmleser"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "bildschirm;leser;barrierefreiheit;sprache;braille;"
|
||||
|
||||
|
||||
@@ -20,12 +20,10 @@ msgstr ""
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1)\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ཨོར་ཀ་གསལ་གཞི་ལྷག་བྱེད་/ཆེ་ཤེལ་"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -28,11 +28,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.3\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Αναγνώστης οθόνης Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "οθόνη;αναγνώστης;προσβασιμότητα;ομιλία;μπράιγ;"
|
||||
|
||||
|
||||
@@ -17,11 +17,9 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr ""
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -21,11 +21,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Gtranslator 45.3\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu Screen Reader"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "screen reader;speech;braille;"
|
||||
|
||||
|
||||
@@ -21,11 +21,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 3.2.2\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Ekranlegilo Orko"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "ekranlegilo;parolo;brajlo;"
|
||||
|
||||
@@ -28,11 +28,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
"X-Generator: Gtranslator 45.alpha0\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lector de pantalla Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "lector;pantalla;accesibilidad;voz;braille;"
|
||||
|
||||
|
||||
@@ -20,12 +20,10 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu ekraanilugeja ja luup"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu pantaila-irakurlea"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "pantaila;irakurlea;irisgarritasuna;mintzamena;braillea;"
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "صفحهخوان اورکا"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -27,11 +27,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
"X-Poedit-Bookmarks: 814,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu-näytönlukija"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "näyttö;lukija;saavutettavuus;puhe;pistekirjoitus;"
|
||||
|
||||
|
||||
@@ -31,11 +31,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lecteur d’écran Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "lecteur;écran;accessibilité;parole;braille;"
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr ""
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,12 +18,10 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : (n%10==1 || n%10==2) ? 1 : "
|
||||
"(n%10>=3 && n%10<= 6) ? 2 : ((n%10>=7 && n%10<=9) || n==10) ? 3 : 4;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Léitheoir Scáileáin agus Formhéadaitheoir Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -34,11 +34,9 @@ msgstr ""
|
||||
"X-DL-Domain: po\n"
|
||||
"X-DL-State: Translating\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lector da pantalla Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "pantalla;lector;accesibilidade;fala;braille;"
|
||||
|
||||
|
||||
@@ -33,12 +33,10 @@ msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu સ્ક્રીન વાંચક અને વિસ્તૃતકારક"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -14,11 +14,9 @@ msgstr ""
|
||||
"2 : 3);\n"
|
||||
"X-Generator: Poedit 3.4.1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "מקריא המסך Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "מסך;קורא;נגישות;דיבור;ברייל;"
|
||||
|
||||
|
||||
@@ -22,11 +22,9 @@ msgstr ""
|
||||
"\n"
|
||||
"X-Generator: Lokalize 1.5\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu स्क्रीन वाचक"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "स्क्रीन रीडर;भाषण;ब्रेल;"
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"X-Launchpad-Export-Date: 2016-09-15 12:40+0000\n"
|
||||
"X-Generator: Poedit 1.6.10\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu čitač zaslona"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "čitač zaslona;govor;brajica;"
|
||||
|
||||
|
||||
@@ -22,11 +22,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.3\n"
|
||||
|
||||
# Megjegyzés: Mivel mindenhol régóta Gáborral egyeztetve az Cthulhu nevet magyarosan Orkaként írjuk a fordításban, így a fordítást megváltoztattam Orka képernyőolvasóra az Cthulhu képernyőolvasó helyett.
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Orka képernyőolvasó"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "képernyő;olvasó;akadálymentesítés;beszéd;braille;"
|
||||
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Pembaca Layar Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "layar;pembaca;aksesibilitas;ucapan;braille;"
|
||||
|
||||
|
||||
@@ -17,11 +17,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 1.5\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu skjálestur"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -39,11 +39,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
"X-Generator: Gtranslator 42.0\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lettore schermo Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "lettore;schermo;accessibilità;voce;braille;"
|
||||
|
||||
|
||||
@@ -25,11 +25,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu スクリーンリーダー"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "スクリーン;リーダー;アクセシビリティ;音声;点字;"
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu - ეკრანის მკითხველი"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "ეკრანი;მკითხველი;ხელმისაწვდომობა;მეტყველება;ბრაილი;"
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr ""
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu экраннан оқитын қолданбасы"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,12 +18,10 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ಆದ್ಯತೆಗಳು"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -15,11 +15,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu 화면 낭독기"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "화면;리더;접근성;음성;점자;"
|
||||
|
||||
|
||||
@@ -25,11 +25,9 @@ msgstr ""
|
||||
"(n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu ekrano skaityklė"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "ekrano skaityklė;kalba;brailio raštas;"
|
||||
|
||||
|
||||
@@ -23,11 +23,9 @@ msgstr ""
|
||||
"2);\n"
|
||||
"X-Generator: Lokalize 21.12.3\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu ekrāna lasītājs"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "ekrāna lasītājs;runa;Brails;"
|
||||
|
||||
|
||||
@@ -19,12 +19,10 @@ msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu स्क्रीन पाठक / आवर्द्धक"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural= n==1 || n%10==1 ? 0 : 1\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu читач на екранот"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -22,12 +22,10 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.0.1\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "സ്ക്രീന് വായന അവസാനിപ്പിക്കാം."
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,12 +18,10 @@ msgstr ""
|
||||
"X-Generator: KBabel 1.9.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "वर्धक भिंग"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Pembaca skrin Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "skrin;pembaca;kebolehcapaian;pertuturan;braille;"
|
||||
|
||||
|
||||
@@ -19,11 +19,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu skjermleser"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "skjerm;leser;tilgjengelighet;tale;blindeskrift;"
|
||||
|
||||
|
||||
@@ -13,11 +13,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ओर्का दृष्टि वाचक"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "दृष्टि वाचक; वाचन;ब्रेल;"
|
||||
|
||||
|
||||
@@ -31,11 +31,9 @@ msgstr ""
|
||||
"X-Generator: Poedit 3.2.2\n"
|
||||
|
||||
# vergrootglas/loep
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu schermlezer"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "scherm;lezer;toegankelijkheid;spraak;braille;"
|
||||
|
||||
|
||||
@@ -18,12 +18,10 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu skjermlesar og forstørringsglas"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -23,11 +23,9 @@ msgstr ""
|
||||
"X-Launchpad-Export-Date: 2015-05-21 18:05+0000\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Lector d'ecran Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
"lector d'ecran;oral;braille;votz;sintèsi vocala;sintesi vocala;lector "
|
||||
|
||||
@@ -22,12 +22,10 @@ msgstr ""
|
||||
"\n"
|
||||
"\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ଓର୍କା ସ୍କ୍ରିନ ପାଠକ /ଛୋଟକୁ ବଡ ଦେଖଉଥିବା ଉପକରଣ "
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-Bookmarks: 589,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ਓਰਕਾ ਸਕਰੀਨ ਰੀਡਰ"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Czytnik ekranowy Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "czytnik;ekran;dostępność;mowa;braille;"
|
||||
|
||||
|
||||
@@ -28,11 +28,9 @@ msgstr ""
|
||||
"X-Source-Language: C\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Leitor de ecrã Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "leitor;ecrã;acessibilidade;voz;braille;"
|
||||
|
||||
|
||||
@@ -49,11 +49,9 @@ msgstr ""
|
||||
"X-DL-Domain: po\n"
|
||||
"X-DL-State: Translating\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Leitor de tela Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "leitor;tela;acessibilidade;voz;braille;"
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"X-Project-Style: gnome\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cititorul de ecran Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "ecran;cititor;accesibilitate;vorbire;braille;"
|
||||
|
||||
|
||||
@@ -22,11 +22,9 @@ msgstr ""
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Экранный диктор Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "экран;чтец;доступность;речь;брайль;"
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr ""
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr ""
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -19,11 +19,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
|
||||
"X-Generator: Gtranslator 2.91.7\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Ukončí čítačku obrazovky"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -22,11 +22,9 @@ msgstr ""
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Zaslonski bralnik Orka"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "govor;zaslonski bralnik;Braillova pisava;brajica;povečevalnik"
|
||||
|
||||
|
||||
@@ -17,12 +17,10 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
#, fuzzy
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Ekrani Zmadhues (Lupë)"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -21,11 +21,9 @@ msgstr ""
|
||||
"X-Project-Style: gnome\n"
|
||||
"X-Generator: Poedit 3.1.1\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Читач екрана Орка"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "читач екрана;говор;брајева азбука;"
|
||||
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"X-Project-Style: gnome\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Čitač ekrana Orka"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "čitač ekrana;govor;brajeva azbuka;"
|
||||
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu skärmläsare"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "skärm;läsare;tillgänglighet;tal;punktskrift;"
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n"
|
||||
"\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ஆர்கா திரை படிப்பி "
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "திரைபடிப்பான்;பேசுதல்;ப்ரெய்ல்;"
|
||||
|
||||
@@ -23,11 +23,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "ఓర్కా తెరచదువరి"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 1.6.3\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Хонандаи экрани Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "хонандаи экран;нутқ;брайл;"
|
||||
|
||||
@@ -19,11 +19,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "โปรแกรมอ่านหน้าจอ Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "หน้าจอ;อ่าน;การเข้าถึง;เสียงพูด;อักษรเบรลล์;"
|
||||
|
||||
|
||||
@@ -27,11 +27,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.4\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu Ekran Okuyucu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "ekran;okuyucu;erişilebilirlik;konuşma;braille;"
|
||||
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu ئېكران ئوقۇغۇ"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "screen reader;speech;braille;ئېكران ئوقۇغۇچ;تاۋۇش;ئەمالار ئېلىپبەسى;"
|
||||
|
||||
@@ -26,11 +26,9 @@ msgstr ""
|
||||
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Lokalize 20.12.0\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Інструмент читання з екрана «Cthulhu»"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "екран;читач;доступність;мовлення;брайль;"
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: LocFactoryEditor 1.8\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Trình đọc màn hình Cthulhu"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "màn hình;đọc;trợ năng;giọng nói;chữ nổi;"
|
||||
|
||||
|
||||
@@ -29,11 +29,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu 屏幕阅读器"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "屏幕;阅读器;无障碍;语音;盲文;"
|
||||
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 1.6.5\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu 螢幕閱讀器"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
#, fuzzy
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "screen reader;speech;braille;螢幕閱讀器;語音;點字;"
|
||||
|
||||
@@ -20,11 +20,9 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 1.8.12\n"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:3
|
||||
msgid "Cthulhu Screen Reader"
|
||||
msgstr "Cthulhu 螢幕閱讀器"
|
||||
|
||||
#: cthulhu-autostart.desktop.in:11
|
||||
msgid "screen;reader;accessibility;speech;braille;"
|
||||
msgstr "螢幕;閱讀器;無障礙;語音;點字;"
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ license = { text = "LGPL-2.1-or-later" }
|
||||
dependencies = [
|
||||
"pygobject>=3.18",
|
||||
"pluggy",
|
||||
"tomlkit",
|
||||
"brlapi; extra == 'braille'",
|
||||
"python-speechd; extra == 'speech'",
|
||||
"piper-tts; extra == 'piper'",
|
||||
|
||||
@@ -204,10 +204,21 @@ class AXHypertext:
|
||||
|
||||
@staticmethod
|
||||
def find_child_at_offset(obj: Atspi.Accessible, offset: int) -> Optional[Atspi.Accessible]:
|
||||
"""Attempts to correct for off-by-one brokenness in implementations"""
|
||||
"""Returns the child at offset, correcting for broken hypertext offset mappings."""
|
||||
|
||||
if child := AXHypertext.get_child_at_offset(obj, offset):
|
||||
return child
|
||||
offset_in_parent = AXHypertext.get_character_offset_in_parent(child)
|
||||
if offset_in_parent == offset:
|
||||
return child
|
||||
|
||||
tokens = [
|
||||
f"AXHypertext: Child at offset {offset} in",
|
||||
obj,
|
||||
"is",
|
||||
child,
|
||||
f"but reports offset {offset_in_parent}",
|
||||
]
|
||||
debug.print_tokens(debug.LEVEL_INFO, tokens, True)
|
||||
|
||||
if child_before := AXHypertext.get_child_at_offset(obj, offset - 1):
|
||||
offset_in_parent = AXHypertext.get_character_offset_in_parent(child_before)
|
||||
@@ -225,6 +236,30 @@ class AXHypertext:
|
||||
debug.print_tokens(debug.LEVEL_INFO, tokens, True)
|
||||
return child_after
|
||||
|
||||
for i in range(AXHypertext._get_link_count(obj)):
|
||||
link = AXHypertext._get_link_at_index(obj, i)
|
||||
if link is None or AXHypertext.get_link_start_offset(link) != offset:
|
||||
continue
|
||||
|
||||
try:
|
||||
child = Atspi.Hyperlink.get_object(link, 0)
|
||||
except GLib.GError as error:
|
||||
msg = f"AXHypertext: Exception in find_child_at_offset: {error}"
|
||||
debug.print_message(debug.LEVEL_INFO, msg, True)
|
||||
continue
|
||||
|
||||
if child is None:
|
||||
continue
|
||||
|
||||
tokens = [
|
||||
f"AXHypertext: Child at offset {offset} in",
|
||||
obj,
|
||||
"found via link enumeration:",
|
||||
child,
|
||||
]
|
||||
debug.print_tokens(debug.LEVEL_INFO, tokens, True)
|
||||
return child
|
||||
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
backends_python_sources = files([
|
||||
'__init__.py',
|
||||
'json_backend.py',
|
||||
'toml_backend.py',
|
||||
])
|
||||
|
||||
python3.install_sources(
|
||||
backends_python_sources,
|
||||
subdir: 'cthulhu/backends'
|
||||
)
|
||||
)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
# Forked from Orca screen reader.
|
||||
# Cthulhu project: https://git.stormux.org/storm/cthulhu
|
||||
|
||||
"""JSON backend for Cthulhu settings"""
|
||||
"""TOML backend for Cthulhu settings"""
|
||||
|
||||
__id__ = "$Id$"
|
||||
__version__ = "$Revision$"
|
||||
@@ -31,20 +31,22 @@ __date__ = "$Date$"
|
||||
__copyright__ = "Copyright (c) 2010-2011 Consorcio Fernando de los Rios."
|
||||
__license__ = "LGPL"
|
||||
|
||||
from json import load, dump
|
||||
import os
|
||||
|
||||
from tomlkit import parse, dumps, document
|
||||
|
||||
from cthulhu import settings, acss
|
||||
|
||||
class Backend:
|
||||
|
||||
def __init__(self, prefsDir):
|
||||
""" Initialize the JSON Backend.
|
||||
"""
|
||||
""" Initialize the TOML Backend.
|
||||
"""
|
||||
self.general = {}
|
||||
self.pronunciations = {}
|
||||
self.keybindings = {}
|
||||
self.profiles = {}
|
||||
self.settingsFile = os.path.join(prefsDir, "user-settings.conf")
|
||||
self.settingsFile = os.path.join(prefsDir, "user-settings.toml")
|
||||
self.appPrefsDir = os.path.join(prefsDir, "app-settings")
|
||||
|
||||
self._defaultProfiles = {'default': { 'profile': settings.profile,
|
||||
@@ -53,75 +55,146 @@ class Backend:
|
||||
}
|
||||
}
|
||||
|
||||
def _stripNone(self, value):
|
||||
if isinstance(value, dict):
|
||||
cleaned = {}
|
||||
for key, item in value.items():
|
||||
if item is None:
|
||||
continue
|
||||
cleanedItem = self._stripNone(item)
|
||||
if cleanedItem is None:
|
||||
continue
|
||||
cleaned[key] = cleanedItem
|
||||
return cleaned
|
||||
if isinstance(value, list):
|
||||
cleanedList = []
|
||||
for item in value:
|
||||
if item is None:
|
||||
continue
|
||||
cleanedList.append(self._stripNone(item))
|
||||
return cleanedList
|
||||
return value
|
||||
|
||||
def _readDocument(self, fileName):
|
||||
if os.path.exists(fileName):
|
||||
with open(fileName, 'r', encoding='utf-8') as settingsFile:
|
||||
return parse(settingsFile.read())
|
||||
return document()
|
||||
|
||||
def _writeDocument(self, fileName, prefsDoc):
|
||||
with open(fileName, 'w', encoding='utf-8') as settingsFile:
|
||||
settingsFile.write(dumps(prefsDoc))
|
||||
|
||||
def _updateTable(self, targetTable, newValues, preserveMissingKeys=None):
|
||||
if not isinstance(newValues, dict):
|
||||
return
|
||||
|
||||
preserveMissingKeys = set(preserveMissingKeys or [])
|
||||
|
||||
for key in list(targetTable.keys()):
|
||||
if key not in newValues:
|
||||
if key in preserveMissingKeys:
|
||||
continue
|
||||
del targetTable[key]
|
||||
continue
|
||||
newValue = newValues[key]
|
||||
existingValue = targetTable.get(key)
|
||||
if isinstance(newValue, dict) and isinstance(existingValue, dict):
|
||||
self._updateTable(existingValue, newValue)
|
||||
continue
|
||||
if existingValue != newValue:
|
||||
targetTable[key] = newValue
|
||||
|
||||
for key, newValue in newValues.items():
|
||||
if key not in targetTable:
|
||||
targetTable[key] = newValue
|
||||
|
||||
def saveDefaultSettings(self, general, pronunciations, keybindings):
|
||||
""" Save default settings for all the properties from
|
||||
cthulhu.settings. """
|
||||
prefs = {'general': general,
|
||||
'profiles': self._defaultProfiles,
|
||||
'pronunciations': pronunciations,
|
||||
'keybindings': keybindings}
|
||||
prefs = {'general': self._stripNone(general),
|
||||
'profiles': self._stripNone(self._defaultProfiles),
|
||||
'pronunciations': self._stripNone(pronunciations),
|
||||
'keybindings': self._stripNone(keybindings)}
|
||||
|
||||
self.general = general
|
||||
self.profiles = self._defaultProfiles
|
||||
self.pronunciations = pronunciations
|
||||
self.keybindings = keybindings
|
||||
|
||||
settingsFile = open(self.settingsFile, 'w')
|
||||
dump(prefs, settingsFile, indent=4)
|
||||
settingsFile.close()
|
||||
prefsDoc = document()
|
||||
prefsDoc['general'] = prefs['general']
|
||||
prefsDoc['profiles'] = prefs['profiles']
|
||||
prefsDoc['pronunciations'] = prefs['pronunciations']
|
||||
prefsDoc['keybindings'] = prefs['keybindings']
|
||||
|
||||
self._writeDocument(self.settingsFile, prefsDoc)
|
||||
|
||||
def getAppSettings(self, appName):
|
||||
fileName = os.path.join(self.appPrefsDir, f"{appName}.conf")
|
||||
if os.path.exists(fileName):
|
||||
settingsFile = open(fileName, 'r')
|
||||
prefs = load(settingsFile)
|
||||
settingsFile.close()
|
||||
else:
|
||||
prefs = {}
|
||||
|
||||
return prefs
|
||||
fileName = os.path.join(self.appPrefsDir, f"{appName}.toml")
|
||||
return self._readDocument(fileName)
|
||||
|
||||
def saveAppSettings(self, appName, profile, general, pronunciations, keybindings):
|
||||
prefs = self.getAppSettings(appName)
|
||||
profiles = prefs.get('profiles', {})
|
||||
profiles[profile] = {'general': general,
|
||||
'pronunciations': pronunciations,
|
||||
'keybindings': keybindings}
|
||||
prefs['profiles'] = profiles
|
||||
prefsDoc = self.getAppSettings(appName)
|
||||
profiles = prefsDoc.get('profiles')
|
||||
if profiles is None or not isinstance(profiles, dict):
|
||||
prefsDoc['profiles'] = {}
|
||||
profiles = prefsDoc['profiles']
|
||||
|
||||
fileName = os.path.join(self.appPrefsDir, f"{appName}.conf")
|
||||
settingsFile = open(fileName, 'w')
|
||||
dump(prefs, settingsFile, indent=4)
|
||||
settingsFile.close()
|
||||
profileTable = profiles.get(profile)
|
||||
if profileTable is None or not isinstance(profileTable, dict):
|
||||
profiles[profile] = {}
|
||||
profileTable = profiles[profile]
|
||||
|
||||
self._updateTable(profileTable, {
|
||||
'general': self._stripNone(general),
|
||||
'pronunciations': self._stripNone(pronunciations),
|
||||
'keybindings': self._stripNone(keybindings),
|
||||
})
|
||||
|
||||
fileName = os.path.join(self.appPrefsDir, f"{appName}.toml")
|
||||
self._writeDocument(fileName, prefsDoc)
|
||||
|
||||
def saveProfileSettings(self, profile, general,
|
||||
pronunciations, keybindings):
|
||||
""" Save minimal subset defined in the profile against current
|
||||
""" Save minimal subset defined in the profile against current
|
||||
defaults. """
|
||||
if profile is None:
|
||||
profile = 'default'
|
||||
|
||||
general['pronunciations'] = pronunciations
|
||||
general['keybindings'] = keybindings
|
||||
general = self._stripNone(general)
|
||||
|
||||
with open(self.settingsFile, 'r+') as settingsFile:
|
||||
prefs = load(settingsFile)
|
||||
prefs['profiles'][profile] = general
|
||||
settingsFile.seek(0)
|
||||
settingsFile.truncate()
|
||||
dump(prefs, settingsFile, indent=4)
|
||||
prefsDoc = self._readDocument(self.settingsFile)
|
||||
profiles = prefsDoc.get('profiles')
|
||||
if profiles is None or not isinstance(profiles, dict):
|
||||
prefsDoc['profiles'] = {}
|
||||
profiles = prefsDoc['profiles']
|
||||
|
||||
profileTable = profiles.get(profile)
|
||||
if profileTable is None or not isinstance(profileTable, dict):
|
||||
profiles[profile] = {}
|
||||
profileTable = profiles[profile]
|
||||
|
||||
# Keep plugin persistence keys when callers provide partial updates.
|
||||
self._updateTable(
|
||||
profileTable,
|
||||
general,
|
||||
preserveMissingKeys={"activePlugins", "pluginSources"},
|
||||
)
|
||||
self._writeDocument(self.settingsFile, prefsDoc)
|
||||
|
||||
def _getSettings(self):
|
||||
""" Load from config file all settings """
|
||||
settingsFile = open(self.settingsFile)
|
||||
prefsDoc = self._readDocument(self.settingsFile)
|
||||
try:
|
||||
prefs = load(settingsFile)
|
||||
except ValueError:
|
||||
self.general = dict(prefsDoc.get('general', {}))
|
||||
self.pronunciations = dict(prefsDoc.get('pronunciations', {}))
|
||||
self.keybindings = dict(prefsDoc.get('keybindings', {}))
|
||||
self.profiles = dict(prefsDoc.get('profiles', {}))
|
||||
except Exception:
|
||||
return
|
||||
self.general = prefs['general'].copy()
|
||||
self.pronunciations = prefs['pronunciations']
|
||||
self.keybindings = prefs['keybindings']
|
||||
self.profiles = prefs['profiles'].copy()
|
||||
|
||||
def _migrateSettings(self, settingsDict):
|
||||
"""Migrate old setting names to new ones."""
|
||||
@@ -149,12 +222,33 @@ class Backend:
|
||||
|
||||
return settingsDict
|
||||
|
||||
def _hasLikelyCustomEchoVoice(self, echoVoice, defaultVoice):
|
||||
"""Return True when echoVoice appears intentionally customized."""
|
||||
|
||||
if not echoVoice:
|
||||
return False
|
||||
|
||||
echoEstablished = bool(echoVoice.get('established', False))
|
||||
if not defaultVoice:
|
||||
return echoEstablished or bool(echoVoice.get(acss.ACSS.FAMILY))
|
||||
|
||||
for key in [acss.ACSS.RATE, acss.ACSS.AVERAGE_PITCH, acss.ACSS.GAIN, acss.ACSS.FAMILY]:
|
||||
echoValue = echoVoice.get(key)
|
||||
defaultValue = defaultVoice.get(key)
|
||||
if echoValue is not None and echoValue != defaultValue:
|
||||
return True
|
||||
|
||||
return echoEstablished and bool(echoVoice.get(acss.ACSS.FAMILY))
|
||||
|
||||
def getGeneral(self, profile=None):
|
||||
""" Get general settings from default settings and
|
||||
override with profile values. """
|
||||
self._getSettings()
|
||||
generalSettings = self.general.copy()
|
||||
generalSettings = self._migrateSettings(generalSettings)
|
||||
# Plugin state is profile-scoped; ignore legacy/global values.
|
||||
generalSettings.pop('activePlugins', None)
|
||||
generalSettings.pop('pluginSources', None)
|
||||
defaultProfile = generalSettings.get('startingProfile',
|
||||
['Default', 'default'])
|
||||
if profile is None:
|
||||
@@ -165,8 +259,24 @@ class Backend:
|
||||
if key == 'voices':
|
||||
for voiceType, voiceDef in value.items():
|
||||
value[voiceType] = acss.ACSS(voiceDef)
|
||||
if key == 'echoVoice' and isinstance(value, dict):
|
||||
value = acss.ACSS(value)
|
||||
if key not in ['startingProfile', 'activeProfile']:
|
||||
generalSettings[key] = value
|
||||
|
||||
# Backward compatibility: recover custom echo behavior when legacy
|
||||
# profiles have echoVoice but are missing custom-echo toggle keys.
|
||||
if 'useCustomEchoVoice' not in profileSettings:
|
||||
voices = generalSettings.get('voices') or {}
|
||||
defaultVoice = voices.get(settings.DEFAULT_VOICE)
|
||||
echoVoice = generalSettings.get('echoVoice')
|
||||
if self._hasLikelyCustomEchoVoice(echoVoice, defaultVoice):
|
||||
generalSettings['useCustomEchoVoice'] = True
|
||||
if 'useCustomEchoForKey' not in profileSettings:
|
||||
generalSettings['useCustomEchoForKey'] = True
|
||||
if 'useCustomEchoForCharacter' not in profileSettings:
|
||||
generalSettings['useCustomEchoForCharacter'] = True
|
||||
|
||||
try:
|
||||
generalSettings['activeProfile'] = profileSettings['profile']
|
||||
except KeyError:
|
||||
@@ -195,18 +305,24 @@ class Backend:
|
||||
|
||||
def isFirstStart(self):
|
||||
""" Check if we're in first start. """
|
||||
|
||||
|
||||
return not os.path.exists(self.settingsFile)
|
||||
|
||||
def _setProfileKey(self, key, value):
|
||||
self.general[key] = value
|
||||
|
||||
with open(self.settingsFile, 'r+') as settingsFile:
|
||||
prefs = load(settingsFile)
|
||||
prefs['general'][key] = value
|
||||
settingsFile.seek(0)
|
||||
settingsFile.truncate()
|
||||
dump(prefs, settingsFile, indent=4)
|
||||
prefsDoc = self._readDocument(self.settingsFile)
|
||||
general = prefsDoc.get('general')
|
||||
if general is None or not isinstance(general, dict):
|
||||
prefsDoc['general'] = {}
|
||||
general = prefsDoc['general']
|
||||
|
||||
if value is None:
|
||||
if key in general:
|
||||
del general[key]
|
||||
else:
|
||||
general[key] = value
|
||||
self._writeDocument(self.settingsFile, prefsDoc)
|
||||
|
||||
def setFirstStart(self, value=False):
|
||||
"""Set firstStart. This user-configurable setting is primarily
|
||||
@@ -238,10 +354,8 @@ class Backend:
|
||||
if profile in self.profiles:
|
||||
removeProfileFrom(self.profiles)
|
||||
|
||||
with open(self.settingsFile, 'r+') as settingsFile:
|
||||
prefs = load(settingsFile)
|
||||
if profile in prefs['profiles']:
|
||||
removeProfileFrom(prefs['profiles'])
|
||||
settingsFile.seek(0)
|
||||
settingsFile.truncate()
|
||||
dump(prefs, settingsFile, indent=4)
|
||||
prefsDoc = self._readDocument(self.settingsFile)
|
||||
profiles = prefsDoc.get('profiles')
|
||||
if isinstance(profiles, dict) and profile in profiles:
|
||||
removeProfileFrom(profiles)
|
||||
self._writeDocument(self.settingsFile, prefsDoc)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user