Code and documentation cleanup.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# Welcome to I38 - Accessible i3 Window Manager
|
# Welcome to I38 - Accessible i3 Window Manager
|
||||||
|
|
||||||
> **Note:** This help guide has been tailored to your specific configuration. You've chosen **BROWSER** as your web browser, **MODKEY** as your mod key, and you're using the **SCREENREADER** screen reader.
|
> **Note:** This help guide has been tailored to your specific configuration. You've chosen **@WEBBROWSER@** as your web browser, **@MODKEY@** as your mod key, and you're using the **@SCREENREADER@** screen reader.
|
||||||
|
|
||||||
## Introduction to I38
|
## Introduction to I38
|
||||||
|
|
||||||
@@ -36,10 +36,10 @@ Workspaces act like virtual desktops, allowing you to organize applications. You
|
|||||||
Windows in I38 are arranged in a tabbed layout by default, which means windows take up the entire screen and you can switch between them like browser tabs.
|
Windows in I38 are arranged in a tabbed layout by default, which means windows take up the entire screen and you can switch between them like browser tabs.
|
||||||
|
|
||||||
- Switch between windows: `Alt` + `Tab` (next) or `Alt` + `Shift` + `Tab` (previous)
|
- Switch between windows: `Alt` + `Tab` (next) or `Alt` + `Shift` + `Tab` (previous)
|
||||||
- Launch terminal: `MODKEY` + `Return`
|
- Launch terminal: `@MODKEY@` + `Return`
|
||||||
- Close window: `MODKEY` + `F4`
|
- Close window: `@MODKEY@` + `F4`
|
||||||
- Toggle fullscreen: `MODKEY` + `BackSpace`
|
- Toggle fullscreen: `@MODKEY@` + `BackSpace`
|
||||||
- List windows in current workspace: `RATPOISONKEY` then `'` (apostrophe)
|
- List windows in current workspace: `@RATPOISONKEY@` then `'` (apostrophe)
|
||||||
|
|
||||||
*GNOME/MATE comparison:* Alt+Tab works similarly to GNOME/MATE, but window placement is automatic rather than manual.
|
*GNOME/MATE comparison:* Alt+Tab works similarly to GNOME/MATE, but window placement is automatic rather than manual.
|
||||||
|
|
||||||
@@ -48,22 +48,22 @@ Windows in I38 are arranged in a tabbed layout by default, which means windows t
|
|||||||
|
|
||||||
### Default Mode
|
### Default Mode
|
||||||
|
|
||||||
This is the standard mode for working with applications. Most commands start with your mod key (`MODKEY`).
|
This is the standard mode for working with applications. Most commands start with your mod key (`@MODKEY@`).
|
||||||
|
|
||||||
TOPLEVELKEYBINDINGS
|
TOPLEVELKEYBINDINGS
|
||||||
|
|
||||||
### Ratpoison Mode
|
### Ratpoison Mode
|
||||||
|
|
||||||
Ratpoison mode allows quick access to common actions using shorter key combinations. To enter Ratpoison mode, press `RATPOISONKEY`. After pressing this key, you can execute commands with single keystrokes.
|
Ratpoison mode allows quick access to common actions using shorter key combinations. To enter Ratpoison mode, press `@RATPOISONKEY@`. After pressing this key, you can execute commands with single keystrokes.
|
||||||
|
|
||||||
Common Ratpoison mode commands:
|
Common Ratpoison mode commands:
|
||||||
|
|
||||||
| Key | Action |
|
| Key | Action |
|
||||||
|-----|--------|
|
|-----|--------|
|
||||||
| `c` | Launch a terminal |
|
| `c` | Launch a terminal |
|
||||||
| `e` | Open text editor (TEXTEDITOR) |
|
| `e` | Open text editor (@TEXTEDITOR@) |
|
||||||
| `i` | Launch IRC client |
|
| `i` | Launch IRC client |
|
||||||
| `w` | Launch web browser (BROWSER) |
|
| `w` | Launch web browser (@WEBBROWSER@) |
|
||||||
| `k` | Kill (close) the current window |
|
| `k` | Kill (close) the current window |
|
||||||
| `F1` | Show ratpoison mode keybindings |
|
| `F1` | Show ratpoison mode keybindings |
|
||||||
| `Escape` or `Control` + `g` | Exit Ratpoison mode without taking action |
|
| `Escape` or `Control` + `g` | Exit Ratpoison mode without taking action |
|
||||||
@@ -80,7 +80,7 @@ Common Ratpoison mode commands:
|
|||||||
|
|
||||||
### Bypass Mode
|
### Bypass Mode
|
||||||
|
|
||||||
Bypass mode passes all keys directly to the application, which is useful for applications that need many keyboard shortcuts. To enter bypass mode, press `MODKEY` + `Shift` + `BackSpace`. Use the same key combination to exit bypass mode.
|
Bypass mode passes all keys directly to the application, which is useful for applications that need many keyboard shortcuts. To enter bypass mode, press `@MODKEY@` + `Shift` + `BackSpace`. Use the same key combination to exit bypass mode.
|
||||||
|
|
||||||
*GNOME/MATE comparison:* In GNOME/MATE, applications always receive keyboard input directly. Bypass mode simulates this behavior within i3.
|
*GNOME/MATE comparison:* In GNOME/MATE, applications always receive keyboard input directly. Bypass mode simulates this behavior within i3.
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ In Panel Mode, single keypresses launch different information panels:
|
|||||||
| `Shift` + `b` | Show detailed battery information |
|
| `Shift` + `b` | Show detailed battery information |
|
||||||
| `m` | Launch password manager |
|
| `m` | Launch password manager |
|
||||||
| `p` | Show power options |
|
| `p` | Show power options |
|
||||||
| `Control` + `MODKEY` + `l` | Lock screen *(if screen lock PIN is configured)* |
|
| `Control` + `@MODKEY@` + `l` | Lock screen *(if screen lock PIN is configured)* |
|
||||||
| `Escape` or `Control` + `g` | Exit Panel Mode without taking action |
|
| `Escape` or `Control` + `g` | Exit Panel Mode without taking action |
|
||||||
|
|
||||||
Just like Ratpoison Mode, Panel Mode automatically returns you to Default Mode after a selection is made or when you press Escape/Control+g to cancel.
|
Just like Ratpoison Mode, Panel Mode automatically returns you to Default Mode after a selection is made or when you press Escape/Control+g to cancel.
|
||||||
@@ -200,11 +200,11 @@ waytray is an optional dependency. If installed, I38 will automatically configur
|
|||||||
|
|
||||||
### Screen Reader
|
### Screen Reader
|
||||||
|
|
||||||
I38 is configured to work with your screen reader (SCREENREADER). The screen reader will provide spoken feedback about what's happening on screen so long as there is a window. If you don't have a window open and need to change something SCREENREADER related, press Control+Alt+d to bring up the desktop, then screen reader keys should work.
|
I38 is configured to work with your screen reader (@SCREENREADER@). The screen reader will provide spoken feedback about what's happening on screen so long as there is a window. If you don't have a window open and need to change something @SCREENREADER@ related, press Control+Alt+d to bring up the desktop, then screen reader keys should work.
|
||||||
|
|
||||||
- Toggle screen reader: `RATPOISONKEY` then `Shift` + `t`
|
- Toggle screen reader: `@RATPOISONKEY@` then `Shift` + `t`
|
||||||
- Restart screen reader: `RATPOISONKEY` then `Shift` + `o` (for Orca) or `Shift` + `c` (for Cthulhu)
|
- Restart screen reader: `@RATPOISONKEY@` then `Shift` + `o` (for Orca) or `Shift` + `c` (for Cthulhu)
|
||||||
- Interrupt speech: `MODKEY` + `Shift` + `F5`
|
- Interrupt speech: `@MODKEY@` + `Shift` + `F5`
|
||||||
|
|
||||||
*GNOME/MATE comparison:* GNOME uses Orca by default with its own keyboard shortcuts. I38 integrates screen readers more deeply with the window manager.
|
*GNOME/MATE comparison:* GNOME uses Orca by default with its own keyboard shortcuts. I38 integrates screen readers more deeply with the window manager.
|
||||||
|
|
||||||
@@ -216,14 +216,14 @@ If you've enabled braille display support during setup, I38 will start XBrlAPI a
|
|||||||
|
|
||||||
If required dependencies are installed, you can use OCR to read text from images or inaccessible applications:
|
If required dependencies are installed, you can use OCR to read text from images or inaccessible applications:
|
||||||
|
|
||||||
- `MODKEY` + `F5`: Perform OCR on the entire screen and speak the content
|
- `@MODKEY@` + `F5`: Perform OCR on the entire screen and speak the content
|
||||||
- In Ratpoison mode: `Print` or `MODKEY` + `r`: Perform OCR and save to clipboard
|
- In Ratpoison mode: `Print` or `@MODKEY@` + `r`: Perform OCR and save to clipboard
|
||||||
|
|
||||||
*GNOME/MATE comparison:* OCR features are typically not integrated into GNOME/MATE by default.
|
*GNOME/MATE comparison:* OCR features are typically not integrated into GNOME/MATE by default.
|
||||||
|
|
||||||
### Screen Lock
|
### Screen Lock
|
||||||
|
|
||||||
If you enabled the I38 privacy screen lock during setup, press `Control` + `Alt` + `Tab` to enter panel mode, then press `Control` + `MODKEY` + `l` to lock the screen. This is a privacy screen for I38, not a secure system lock.
|
If you enabled the I38 privacy screen lock during setup, press `Control` + `Alt` + `Tab` to enter panel mode, then press `Control` + `@MODKEY@` + `l` to lock the screen. This is a privacy screen for I38, not a secure system lock.
|
||||||
|
|
||||||
When a screen lock PIN is configured, I38 can also autolock after an idle timeout. The default is never. Autolock is X11/i3-only and requires `xprintidle`; if `playerctl` is installed, I38 will avoid autolocking during likely video playback.
|
When a screen lock PIN is configured, I38 can also autolock after an idle timeout. The default is never. Autolock is X11/i3-only and requires `xprintidle`; if `playerctl` is installed, I38 will avoid autolocking during likely video playback.
|
||||||
|
|
||||||
@@ -244,8 +244,8 @@ This audio feedback provides non-visual confirmation of actions and state change
|
|||||||
|
|
||||||
Access applications in multiple ways:
|
Access applications in multiple ways:
|
||||||
|
|
||||||
- Applications menu: `MODKEY` + `F1`
|
- Applications menu: `@MODKEY@` + `F1`
|
||||||
- Run dialog (enter a command): `MODKEY` + `F2` or in Ratpoison mode, `!` (exclamation mark)
|
- Run dialog (enter a command): `@MODKEY@` + `F2` or in Ratpoison mode, `!` (exclamation mark)
|
||||||
- Common applications have dedicated shortcuts in Ratpoison mode (see table above)
|
- Common applications have dedicated shortcuts in Ratpoison mode (see table above)
|
||||||
|
|
||||||
The applications menu is organized by categories similar to traditional desktop environments.
|
The applications menu is organized by categories similar to traditional desktop environments.
|
||||||
@@ -276,9 +276,9 @@ The reminder tool provides the following features:
|
|||||||
|
|
||||||
### System Volume
|
### System Volume
|
||||||
|
|
||||||
- Increase volume: `MODKEY` + `XF86AudioRaiseVolume`
|
- Increase volume: `@MODKEY@` + `XF86AudioRaiseVolume`
|
||||||
- Decrease volume: `MODKEY` + `XF86AudioLowerVolume`
|
- Decrease volume: `@MODKEY@` + `XF86AudioLowerVolume`
|
||||||
- Mute/unmute: `MODKEY` + `XF86AudioMute`
|
- Mute/unmute: `@MODKEY@` + `XF86AudioMute`
|
||||||
|
|
||||||
### Media Player Controls
|
### Media Player Controls
|
||||||
|
|
||||||
@@ -286,7 +286,7 @@ The reminder tool provides the following features:
|
|||||||
- Next track: `XF86AudioNext`
|
- Next track: `XF86AudioNext`
|
||||||
- Previous track: `XF86AudioPrev`
|
- Previous track: `XF86AudioPrev`
|
||||||
- Stop: `XF86AudioStop`
|
- Stop: `XF86AudioStop`
|
||||||
- Media info: `MODKEY` + `XF86AudioPlay`
|
- Media info: `@MODKEY@` + `XF86AudioPlay`
|
||||||
|
|
||||||
In Ratpoison mode, these are also available with Alt+Shift combinations:
|
In Ratpoison mode, these are also available with Alt+Shift combinations:
|
||||||
|
|
||||||
@@ -304,7 +304,7 @@ In Ratpoison mode, these are also available with Alt+Shift combinations:
|
|||||||
|
|
||||||
## File Management
|
## File Management
|
||||||
|
|
||||||
I38 uses FILEBROWSER for file management. Launch it in Ratpoison mode with the `f` key.
|
@FILEBROWSERHELP@
|
||||||
|
|
||||||
*GNOME/MATE comparison:* Similar functionality to Nautilus (GNOME) or Caja (MATE), but launched via keyboard shortcut rather than from a desktop icon or menu.
|
*GNOME/MATE comparison:* Similar functionality to Nautilus (GNOME) or Caja (MATE), but launched via keyboard shortcut rather than from a desktop icon or menu.
|
||||||
|
|
||||||
@@ -333,26 +333,26 @@ This is only available if you chose multiple keyboard layouts during setup.
|
|||||||
|
|
||||||
Unlike GNOME or MATE, i3 uses minimal window decorations. Windows don't have title bars with minimize/maximize buttons. Instead, windows fill their available space automatically, and interactions are performed through keyboard shortcuts.
|
Unlike GNOME or MATE, i3 uses minimal window decorations. Windows don't have title bars with minimize/maximize buttons. Instead, windows fill their available space automatically, and interactions are performed through keyboard shortcuts.
|
||||||
|
|
||||||
- Show desktop icons: `MODKEY` + `Control` + `d`
|
- Show desktop icons: `@MODKEY@` + `Control` + `d`
|
||||||
|
|
||||||
## Clipboard Management
|
## Clipboard Management
|
||||||
|
|
||||||
I38 includes clipboard management features:
|
I38 includes clipboard management features:
|
||||||
|
|
||||||
- Access clipboard history: `MODKEY` + `Control` + `c`
|
- Access clipboard history: `@MODKEY@` + `Control` + `c`
|
||||||
|
|
||||||
## Bookmark Management
|
## Bookmark Management
|
||||||
|
|
||||||
- Access bookmarks: `MODKEY` + `Control` + `b`
|
- Access bookmarks: `@MODKEY@` + `Control` + `b`
|
||||||
|
|
||||||
*GNOME/MATE comparison:* Bookmarks are typically managed within applications in GNOME/MATE. I38 provides a system-wide bookmark manager.
|
*GNOME/MATE comparison:* Bookmarks are typically managed within applications in GNOME/MATE. I38 provides a system-wide bookmark manager.
|
||||||
|
|
||||||
## Tips for New Users
|
## Tips for New Users
|
||||||
|
|
||||||
- **Use the window list**: When you're lost, use `RATPOISONKEY` then `'` to show all windows in the current workspace.
|
- **Use the window list**: When you're lost, use `@RATPOISONKEY@` then `'` to show all windows in the current workspace.
|
||||||
- **Bookmark important websites**: Use `MODKEY` + `Control` + `b` to access bookmarks.
|
- **Bookmark important websites**: Use `@MODKEY@` + `Control` + `b` to access bookmarks.
|
||||||
- **Remember the help shortcuts**:
|
- **Remember the help shortcuts**:
|
||||||
- `MODKEY` + `Shift` + `F1` opens the complete I38 HTML guide
|
- `@MODKEY@` + `Shift` + `F1` opens the complete I38 HTML guide
|
||||||
- Press `F1` in ratpoison or panel mode for quick keybinding reference specific to that mode
|
- Press `F1` in ratpoison or panel mode for quick keybinding reference specific to that mode
|
||||||
- **Let the sound effects guide you**: Pay attention to the audio cues to understand what's happening.
|
- **Let the sound effects guide you**: Pay attention to the audio cues to understand what's happening.
|
||||||
- **Take advantage of OCR**: If an application isn't accessible, try the OCR function.
|
- **Take advantage of OCR**: If an application isn't accessible, try the OCR function.
|
||||||
@@ -388,8 +388,8 @@ I38 checks for updates in the background during your desktop session. If a newer
|
|||||||
|
|
||||||
To update I38 on this system:
|
To update I38 on this system:
|
||||||
|
|
||||||
1. Open a terminal with `MODKEY` + `Return`.
|
1. Open a terminal with `@MODKEY@` + `Return`.
|
||||||
2. Type `cd "I38CHECKOUTPATH"` and press Enter.
|
2. Type `cd "@I38CHECKOUTPATH@"` and press Enter.
|
||||||
3. Type `git pull` and press Enter.
|
3. Type `git pull` and press Enter.
|
||||||
4. Type `./i38.sh` and press Enter.
|
4. Type `./i38.sh` and press Enter.
|
||||||
|
|
||||||
@@ -401,7 +401,7 @@ If you only need to copy the latest scripts and do not want to regenerate the fu
|
|||||||
|
|
||||||
If you need assistance with I38, you can:
|
If you need assistance with I38, you can:
|
||||||
|
|
||||||
- Press `MODKEY` + `Shift` + `F1` to view the help documentation
|
- Press `@MODKEY@` + `Shift` + `F1` to view the help documentation
|
||||||
- Visit the Stormux website at [stormux.org](https://stormux.org)
|
- Visit the Stormux website at [stormux.org](https://stormux.org)
|
||||||
- Join the Stormux irc at irc.stormux.org #stormux or #a11y
|
- Join the Stormux irc at irc.stormux.org #stormux or #a11y
|
||||||
- Check the i3 documentation at [i3wm.org/docs/userguide.html](https://i3wm.org/docs/userguide.html)
|
- Check the i3 documentation at [i3wm.org/docs/userguide.html](https://i3wm.org/docs/userguide.html)
|
||||||
|
|||||||
@@ -14,24 +14,32 @@ An uppercase I looks like a 1, 3 from i3, and 8 because the song [We Are 138](ht
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
|
Required for the setup script and generated I38 configuration:
|
||||||
|
|
||||||
|
- dialog: For terminal setup prompts.
|
||||||
|
- i3-wm: The i3 window manager.
|
||||||
|
- jq: For reading i3 state.
|
||||||
|
- pandoc or markdown: To generate html files.
|
||||||
|
- python-i3ipc: For i3 integration scripts.
|
||||||
|
- yad: For screen reader accessible dialogs.
|
||||||
|
- xdotool: For X11 window interaction.
|
||||||
|
|
||||||
|
Optional features use these packages when installed:
|
||||||
|
|
||||||
- acpi: [optional] for battery status. It will still work even without this package, but uses it if it is installed. Required for the battery monitor with sound alerts.
|
- acpi: [optional] for battery status. It will still work even without this package, but uses it if it is installed. Required for the battery monitor with sound alerts.
|
||||||
- bc: For the information panel.
|
- bc: For the information panel.
|
||||||
- dex: [optional] Alternative method for auto starting applications.
|
- dex: [optional] Alternative method for auto starting applications.
|
||||||
- i3-wm: The i3 window manager.
|
|
||||||
- jq: for getting the current workspace
|
|
||||||
- libnotify: For sending notifications
|
- libnotify: For sending notifications
|
||||||
- magic-wormhole: [optional] for file sharing with magic-wormhole GUI
|
- magic-wormhole: [optional] for file sharing with magic-wormhole GUI
|
||||||
- notification-daemon: To handle notifications
|
- notification-daemon: To handle notifications
|
||||||
- pamixer: for the mute-unmute script
|
- pamixer: for the mute-unmute script
|
||||||
- pandoc or markdown: To generate html files.
|
|
||||||
- pcmanfm: [optional] Graphical file manager.
|
- pcmanfm: [optional] Graphical file manager.
|
||||||
- playerctl: music controls
|
- playerctl: music controls
|
||||||
- python-gobject: for applications menu.
|
- python-gobject: for applications menu.
|
||||||
- python-i3ipc: for sounds etc.
|
|
||||||
- python-pillow: For OCR
|
- python-pillow: For OCR
|
||||||
- python-pytesseract: For OCR
|
- python-pytesseract: For OCR
|
||||||
- remind: [optional] For reminder notifications, Requires notify-daemon and notify-send for automatic reminders.
|
- remind: [optional] For reminder notifications, Requires notify-daemon and notify-send for automatic reminders.
|
||||||
scrot: For OCR
|
- scrot: For OCR
|
||||||
- sox: for sounds.
|
- sox: for sounds.
|
||||||
- tesseract: For OCR
|
- tesseract: For OCR
|
||||||
- xprintidle: [optional] For screen lock autolock on X11/i3
|
- xprintidle: [optional] For screen lock autolock on X11/i3
|
||||||
@@ -42,31 +50,6 @@ scrot: For OCR
|
|||||||
- xclip: Clipboard support
|
- xclip: Clipboard support
|
||||||
- xfce4-notifyd: For sending notifications. Replaces notification-daemon
|
- xfce4-notifyd: For sending notifications. Replaces notification-daemon
|
||||||
- xorg-setxkbmap: [optional] for multiple keyboard layouts
|
- xorg-setxkbmap: [optional] for multiple keyboard layouts
|
||||||
- yad: For screen reader accessible dialogs
|
|
||||||
|
|
||||||
### Sway/Wayland Specific Dependencies
|
|
||||||
|
|
||||||
When using I38 with Sway instead of i3, the following Wayland-native alternatives are recommended for optimal compatibility. I38 will automatically detect and use these when running with the `-s` flag:
|
|
||||||
|
|
||||||
- **Recommended (Wayland-native)**:
|
|
||||||
- mako: Wayland-native notification daemon (preferred over xfce4-notifyd)
|
|
||||||
- wl-clipboard: Wayland clipboard utilities (provides wl-copy and wl-paste)
|
|
||||||
- clipman: Wayland clipboard manager (works with wl-clipboard)
|
|
||||||
- wlr-randr: [optional] Wayland display configuration tool for screen brightness control
|
|
||||||
- brightnessctl: [optional] Alternative brightness control tool for Sway
|
|
||||||
|
|
||||||
- **Not needed on Sway/Wayland** (these are X11-only):
|
|
||||||
- xbrlapi: X11 braille helper - not needed on Wayland, BRLTTY works directly
|
|
||||||
- x11bell: X11 bell support - Wayland has native alternatives
|
|
||||||
- xdotool: X11 window manipulation - Sway uses native IPC instead
|
|
||||||
- xprop: X11 window properties - Sway uses native IPC instead
|
|
||||||
- xrandr: X11 display configuration - use wlr-randr or brightnessctl instead
|
|
||||||
- setxkbmap: X11 keyboard layout - Sway uses native input configuration
|
|
||||||
|
|
||||||
- **Works on both** (via XWayland fallback if Wayland-native not available):
|
|
||||||
- xfce4-notifyd: Works via XWayland, but mako is preferred for native Wayland support
|
|
||||||
|
|
||||||
**Note**: On Sway, keyboard layouts must be configured in the Sway config file (`~/.config/sway/config`) using the `input` block. The keyboard.sh script will cycle through configured layouts but cannot set layouts directly like on X11.
|
|
||||||
|
|
||||||
### AI Assistant (Optional)
|
### AI Assistant (Optional)
|
||||||
- python-requests: For Ollama integration
|
- python-requests: For Ollama integration
|
||||||
|
|||||||
@@ -406,15 +406,25 @@ chmod +x ~/.xinitrc
|
|||||||
}
|
}
|
||||||
|
|
||||||
write_xprofile() {
|
write_xprofile() {
|
||||||
if [[ -f "$HOME/.xprofile" ]]; then
|
local xprofilePath="$HOME/.xprofile"
|
||||||
if ! yesno "Would you like to add accessibility variables to your $HOME/.xprofile? Without these, accessibility will be limited or may not work at all. Do you want to continue?"; then
|
|
||||||
exit 0
|
if [[ -f "$xprofilePath" ]]; then
|
||||||
|
if ! yesno "Would you like to add accessibility variables to your $xprofilePath? Without these, accessibility will be limited or may not work at all. Do you want to continue?"; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
cat << 'EOF' > ~/.xprofile
|
I38_XPROFILE_PATH="$xprofilePath" python3 - << 'PY'
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
xprofile_path = Path(os.environ["I38_XPROFILE_PATH"])
|
||||||
|
start_marker = "# I38 accessibility variables start"
|
||||||
|
end_marker = "# I38 accessibility variables end"
|
||||||
|
block = """\
|
||||||
|
{start}
|
||||||
export XDG_CURRENT_DESKTOP=i3
|
export XDG_CURRENT_DESKTOP=i3
|
||||||
export XDG_SESSION_DESKTOP=i3
|
export XDG_SESSION_DESKTOP=i3
|
||||||
# Accessibility variables
|
|
||||||
export ACCESSIBILITY_ENABLED=1
|
export ACCESSIBILITY_ENABLED=1
|
||||||
export CHROME_FLAGS="--force-renderer-accessibility"
|
export CHROME_FLAGS="--force-renderer-accessibility"
|
||||||
export GTK_MODULES=gail:atk-bridge
|
export GTK_MODULES=gail:atk-bridge
|
||||||
@@ -422,7 +432,32 @@ export GNOME_ACCESSIBILITY=1
|
|||||||
export QT_ACCESSIBILITY=1
|
export QT_ACCESSIBILITY=1
|
||||||
export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
|
export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
|
||||||
export SAL_USE_VCLPLUGIN=gtk3
|
export SAL_USE_VCLPLUGIN=gtk3
|
||||||
EOF
|
{end}
|
||||||
|
""".format(start=start_marker, end=end_marker)
|
||||||
|
|
||||||
|
content = ""
|
||||||
|
if xprofile_path.exists():
|
||||||
|
content = xprofile_path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
lines = content.splitlines()
|
||||||
|
output = []
|
||||||
|
in_i38_block = False
|
||||||
|
for line in lines:
|
||||||
|
if line == start_marker:
|
||||||
|
in_i38_block = True
|
||||||
|
continue
|
||||||
|
if line == end_marker:
|
||||||
|
in_i38_block = False
|
||||||
|
continue
|
||||||
|
if not in_i38_block:
|
||||||
|
output.append(line)
|
||||||
|
|
||||||
|
new_content = "\n".join(output).rstrip()
|
||||||
|
if new_content:
|
||||||
|
new_content += "\n\n"
|
||||||
|
new_content += block
|
||||||
|
xprofile_path.write_text(new_content, encoding="utf-8")
|
||||||
|
PY
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1331,6 +1366,14 @@ screenReader="${screenReader##*/}"
|
|||||||
textEditor="${textEditor##*/}"
|
textEditor="${textEditor##*/}"
|
||||||
fileBrowser="${fileBrowser##*/}"
|
fileBrowser="${fileBrowser##*/}"
|
||||||
ircClient="${ircClient##*/}"
|
ircClient="${ircClient##*/}"
|
||||||
|
webBrowserHelp="${webBrowser:-no web browser was configured}"
|
||||||
|
screenReaderHelp="${screenReader:-no screen reader was configured}"
|
||||||
|
textEditorHelp="${textEditor:-no text editor was configured}"
|
||||||
|
if [[ -n "$fileBrowser" ]]; then
|
||||||
|
fileBrowserHelp="I38 uses ${fileBrowser} for file management. Launch it in Ratpoison mode with the \`f\` key."
|
||||||
|
else
|
||||||
|
fileBrowserHelp="No file manager was configured when this help file was generated."
|
||||||
|
fi
|
||||||
|
|
||||||
# Extract and categorize top-level keybindings for documentation
|
# Extract and categorize top-level keybindings for documentation
|
||||||
# Generate HTML directly since we're inserting into an already-converted HTML file
|
# Generate HTML directly since we're inserting into an already-converted HTML file
|
||||||
@@ -1490,13 +1533,34 @@ awk '
|
|||||||
rm -f "${i3Path}/toplevel_temp.txt"
|
rm -f "${i3Path}/toplevel_temp.txt"
|
||||||
|
|
||||||
# Customize the html file to the user's choices.
|
# Customize the html file to the user's choices.
|
||||||
sed -i -e "s|BROWSER|${webBrowser}|g" \
|
I38_HELP_WEBBROWSER="$webBrowserHelp" \
|
||||||
-e "s|MODKEY|${mod}|g" \
|
I38_HELP_MODKEY="$mod" \
|
||||||
-e "s|SCREENREADER|${screenReader}|g" \
|
I38_HELP_SCREENREADER="$screenReaderHelp" \
|
||||||
-e "s|RATPOISONKEY|${escapeKey}|g" \
|
I38_HELP_RATPOISONKEY="$escapeKey" \
|
||||||
-e "s|TEXTEDITOR|${textEditor}|g" \
|
I38_HELP_TEXTEDITOR="$textEditorHelp" \
|
||||||
-e "s|FILEBROWSER|${fileBrowser}|g" \
|
I38_HELP_FILEBROWSERHELP="$fileBrowserHelp" \
|
||||||
-e "s|I38CHECKOUTPATH|${i38CheckoutPath}|g" "${i3Path}/I38.html"
|
I38_HELP_CHECKOUTPATH="$i38CheckoutPath" \
|
||||||
|
python3 - "${i3Path}/I38.html" << 'PY'
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
html_path = Path(sys.argv[1])
|
||||||
|
replacements = {
|
||||||
|
"@WEBBROWSER@": os.environ["I38_HELP_WEBBROWSER"],
|
||||||
|
"@MODKEY@": os.environ["I38_HELP_MODKEY"],
|
||||||
|
"@SCREENREADER@": os.environ["I38_HELP_SCREENREADER"],
|
||||||
|
"@RATPOISONKEY@": os.environ["I38_HELP_RATPOISONKEY"],
|
||||||
|
"@TEXTEDITOR@": os.environ["I38_HELP_TEXTEDITOR"],
|
||||||
|
"@FILEBROWSERHELP@": os.environ["I38_HELP_FILEBROWSERHELP"],
|
||||||
|
"@I38CHECKOUTPATH@": os.environ["I38_HELP_CHECKOUTPATH"],
|
||||||
|
}
|
||||||
|
|
||||||
|
content = html_path.read_text(encoding="utf-8")
|
||||||
|
for placeholder, value in replacements.items():
|
||||||
|
content = content.replace(placeholder, value)
|
||||||
|
html_path.write_text(content, encoding="utf-8")
|
||||||
|
PY
|
||||||
|
|
||||||
# Create the firstrun file
|
# Create the firstrun file
|
||||||
touch "${i3Path}/firstrun"
|
touch "${i3Path}/firstrun"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This file is part of I38.
|
# This file is part of I38.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This file is part of I38.
|
# This file is part of I38.
|
||||||
|
|
||||||
@@ -23,7 +23,9 @@ if [[ "$batteryName" == "" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# If there's no file, we don't check it.
|
# If there's no file, we don't check it.
|
||||||
if [[ ! -f "/sys/class/power_supply/${batteryName}/capacity" ]]; then
|
batteryCapacityPath="/sys/class/power_supply/${batteryName}/capacity"
|
||||||
|
batteryStatusPath="/sys/class/power_supply/${batteryName}/status"
|
||||||
|
if [[ ! -f "$batteryCapacityPath" ]]; then
|
||||||
spd-say -P important -Cw "Battery not found."
|
spd-say -P important -Cw "Battery not found."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -31,8 +33,8 @@ fi
|
|||||||
oldPercent="$(tail -1 "$0" | tr -cd '[:digit:]')"
|
oldPercent="$(tail -1 "$0" | tr -cd '[:digit:]')"
|
||||||
oldPercent="${oldPercent:-0}"
|
oldPercent="${oldPercent:-0}"
|
||||||
|
|
||||||
percent=$(cat "/sys/class/power_supply/${batteryName}/capacity" | tr -cd '[:digit:]')
|
percent=$(tr -cd '[:digit:]' < "$batteryCapacityPath")
|
||||||
status="$(cat "/sys/class/power_supply/${batteryName}/status")"
|
status="$(cat "$batteryStatusPath")"
|
||||||
|
|
||||||
# If status is requested, give it and exit.
|
# If status is requested, give it and exit.
|
||||||
if [[ "$1" == "-s" || "$1" == "--status" ]]; then
|
if [[ "$1" == "-s" || "$1" == "--status" ]]; then
|
||||||
@@ -41,24 +43,25 @@ if [[ "$1" == "-s" || "$1" == "--status" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $percent -ne $oldPercent && $percent -gt 10 ]]; then
|
if [[ $percent -ne $oldPercent && $percent -gt 10 ]]; then
|
||||||
spd-say "Battery $(</sys/class/power_supply/${batteryName}/capacity) percent."
|
spd-say "Battery $(<"$batteryCapacityPath") percent."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $percent -le 10 ]]; then
|
if [[ $percent -le 10 ]]; then
|
||||||
spd-say "Battery $(</sys/class/power_supply/${batteryName}/capacity) percent."
|
spd-say "Battery $(<"$batteryCapacityPath") percent."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$status" == "Full" ]]; then
|
if [[ "$status" == "Full" ]]; then
|
||||||
spd-say "Battery $(</sys/class/power_supply/${batteryName}/capacity) percent, ${status,,}."
|
spd-say "Battery $(<"$batteryCapacityPath") percent, ${status,,}."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# remove the last line of the file and update it with the new percentage.
|
# remove the last line of the file and update it with the new percentage.
|
||||||
lastLine="$(grep -n '^exit 0' $0)"
|
lastLine="$(grep -n '^exit 0' "$0")"
|
||||||
# Convert lastLine to a number andd increment it by 1.
|
# Convert lastLine to a number andd increment it by 1.
|
||||||
lastLine=${lastLine%%:*}
|
lastLine=${lastLine%%:*}
|
||||||
lastLine=$((lastLine + 1))
|
lastLine=$((lastLine + 1))
|
||||||
sed -i "${lastLine}"',$d' $0
|
sed -i "${lastLine}"',$d' "$0"
|
||||||
echo "$percent" >> "$0"
|
echo "$percent" >> "$0"
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
# shellcheck disable=SC2317
|
||||||
50
|
50
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ configPath="$(readlink -f "$0")"
|
|||||||
configPath="${configPath%/*/*}"
|
configPath="${configPath%/*/*}"
|
||||||
|
|
||||||
if [[ -f "${configPath}/config" ]]; then
|
if [[ -f "${configPath}/config" ]]; then
|
||||||
|
# shellcheck disable=SC2016
|
||||||
mod="$(grep 'set $mod ' "${configPath}/config" | cut -d ' ' -f3)"
|
mod="$(grep 'set $mod ' "${configPath}/config" | cut -d ' ' -f3)"
|
||||||
mod="${mod//Mod1/Alt}"
|
mod="${mod//Mod1/Alt}"
|
||||||
mod="${mod//Mod4/Super}"
|
mod="${mod//Mod4/Super}"
|
||||||
@@ -30,9 +31,9 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
for i in "${!helpText[@]}" ; do
|
for i in "${!helpText[@]}" ; do
|
||||||
helpText[$i]="${helpText[$i]//${configPath}\/scripts\//}"
|
helpText[i]="${helpText[i]//${configPath}\/scripts\//}"
|
||||||
helpText[$i]="${helpText[$i]/.sh/}"
|
helpText[i]="${helpText[i]/.sh/}"
|
||||||
helpText[$i]="${helpText[$i]/.py/}"
|
helpText[i]="${helpText[i]/.py/}"
|
||||||
done
|
done
|
||||||
|
|
||||||
header="Panel Mode Keybindings\n\nPress Control+Alt+Tab to enter panel mode, then use these shortcuts:\n\n"
|
header="Panel Mode Keybindings\n\nPress Control+Alt+Tab to enter panel mode, then use these shortcuts:\n\n"
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ configPath="$(readlink -f "$0")"
|
|||||||
configPath="${configPath%/*/*}"
|
configPath="${configPath%/*/*}"
|
||||||
|
|
||||||
if [[ -f "${configPath}/config" ]]; then
|
if [[ -f "${configPath}/config" ]]; then
|
||||||
|
# shellcheck disable=SC2016
|
||||||
mod="$(grep 'set $mod ' "${configPath}/config" | cut -d ' ' -f3)"
|
mod="$(grep 'set $mod ' "${configPath}/config" | cut -d ' ' -f3)"
|
||||||
mod="${mod//Mod1/Alt}"
|
mod="${mod//Mod1/Alt}"
|
||||||
mod="${mod//Mod4/Super}"
|
mod="${mod//Mod4/Super}"
|
||||||
@@ -31,10 +32,10 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
for i in "${!helpText[@]}" ; do
|
for i in "${!helpText[@]}" ; do
|
||||||
helpText[$i]="${helpText[$i]//${configPath}\/scripts\//}"
|
helpText[i]="${helpText[i]//${configPath}\/scripts\//}"
|
||||||
helpText[$i]="${helpText[$i]/.sh/}"
|
helpText[i]="${helpText[i]/.sh/}"
|
||||||
helpText[$i]="${helpText[$i]/, exec announce*/$'\n'}"
|
helpText[i]="${helpText[i]/, exec announce*/$'\n'}"
|
||||||
helpText[$i]="${helpText[$i]/, exec spd-say*/$'\n'}"
|
helpText[i]="${helpText[i]/, exec spd-say*/$'\n'}"
|
||||||
done
|
done
|
||||||
|
|
||||||
header="Ratpoison Mode Keybindings\n\nEnter ratpoison mode with your configured escape key, then use these shortcuts:\n\n"
|
header="Ratpoison Mode Keybindings\n\nEnter ratpoison mode with your configured escape key, then use these shortcuts:\n\n"
|
||||||
|
|||||||
+6
-4
@@ -15,9 +15,11 @@ configPath="$(readlink -f "$0")"
|
|||||||
configPath="${configPath%/*/*}"
|
configPath="${configPath%/*/*}"
|
||||||
|
|
||||||
if [[ -f "${configPath}/config" ]]; then
|
if [[ -f "${configPath}/config" ]]; then
|
||||||
|
# shellcheck disable=SC2016
|
||||||
mod="$(grep 'set $mod ' "${configPath}/config" | cut -d ' ' -f3)"
|
mod="$(grep 'set $mod ' "${configPath}/config" | cut -d ' ' -f3)"
|
||||||
mod="${mod//Mod1/Alt}"
|
mod="${mod//Mod1/Alt}"
|
||||||
mod="${mod//Mod4/Super}"
|
mod="${mod//Mod4/Super}"
|
||||||
|
# shellcheck disable=SC2016
|
||||||
mapfile helpText < <(sed -e '/set \($mod\|mod\)/d' \
|
mapfile helpText < <(sed -e '/set \($mod\|mod\)/d' \
|
||||||
-e '/set $ws/d' \
|
-e '/set $ws/d' \
|
||||||
-e 's/bindsym/Key:/g' \
|
-e 's/bindsym/Key:/g' \
|
||||||
@@ -31,10 +33,10 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
for i in "${!helpText[@]}" ; do
|
for i in "${!helpText[@]}" ; do
|
||||||
helpText[$i]="${helpText[$i]//${configPath}\/scripts\//}"
|
helpText[i]="${helpText[i]//${configPath}\/scripts\//}"
|
||||||
helpText[$i]="${helpText[$i]/.sh/}"
|
helpText[i]="${helpText[i]/.sh/}"
|
||||||
helpText[$i]="${helpText[$i]/, exec announce*/$'\n'}"
|
helpText[i]="${helpText[i]/, exec announce*/$'\n'}"
|
||||||
helpText[$i]="${helpText[$i]/, exec spd-say*/$'\n'}"
|
helpText[i]="${helpText[i]/, exec spd-say*/$'\n'}"
|
||||||
done
|
done
|
||||||
helpText+=("End of text. Please press Control+Home to jump to the beginning of this document.")
|
helpText+=("End of text. Please press Control+Home to jump to the beginning of this document.")
|
||||||
echo -e "${helpText[@]}" | yad --text-info --show-cursor --title "I38 help" --button "Close:0" --listen
|
echo -e "${helpText[@]}" | yad --text-info --show-cursor --title "I38 help" --button "Close:0" --listen
|
||||||
|
|||||||
@@ -12,4 +12,4 @@
|
|||||||
|
|
||||||
|
|
||||||
pgrep remind > /dev/null 2>&1 && exit 0
|
pgrep remind > /dev/null 2>&1 && exit 0
|
||||||
command remind -z '-k:${HOME}/.config/i3/scripts/reminder.sh %s &' ${HOME}/.reminders < /dev/null > /dev/null 2>&1 &
|
command remind -z "-k:${HOME}/.config/i3/scripts/reminder.sh %s &" "${HOME}/.reminders" < /dev/null > /dev/null 2>&1 &
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This file is part of I38.
|
# This file is part of I38.
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
|
|
||||||
run_command() {
|
run_command() {
|
||||||
playerctl -p '%any,chromium,firefox' $1
|
playerctl -p '%any,chromium,firefox' "$1"
|
||||||
sleep 0.25
|
sleep 0.25
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License along with I38. If not, see <https://www.gnu.org/licenses/>.
|
# You should have received a copy of the GNU General Public License along with I38. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
if [ $(pamixer --get-mute) = false ]; then
|
if [ "$(pamixer --get-mute)" = false ]; then
|
||||||
spd-say -P important -Cw 'Muting!'
|
spd-say -P important -Cw 'Muting!'
|
||||||
pamixer -t
|
pamixer -t
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -12,12 +12,12 @@
|
|||||||
|
|
||||||
|
|
||||||
write_history(){
|
write_history(){
|
||||||
oldHistory="$(grep -v "$txt" "${historyPath}/.history" | head -n 49)"
|
oldHistory="$(grep -Fvx -- "$txt" "${historyPath}/.history" | head -n 49)"
|
||||||
echo -e "$txt\n$oldHistory" | sed 's/^$//g' > "${historyPath}/.history"
|
printf '%s\n%s\n' "$txt" "$oldHistory" | sed 's/^$//g' > "${historyPath}/.history"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
historyPath="$(readlink -f $0)"
|
historyPath="$(readlink -f "$0")"
|
||||||
historyPath="${historyPath%/*}"
|
historyPath="${historyPath%/*}"
|
||||||
if ! [[ -d "$historyPath" ]]; then
|
if ! [[ -d "$historyPath" ]]; then
|
||||||
mkdir -p "$historyPath"
|
mkdir -p "$historyPath"
|
||||||
@@ -32,12 +32,12 @@ if [[ -z "$txt" ]]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
if [[ "$txt" =~ ^ftp://|^http://|^https://|^www.* ]]; then
|
if [[ "$txt" =~ ^ftp://|^http://|^https://|^www.* ]]; then
|
||||||
xdg-open $txt
|
xdg-open "$txt"
|
||||||
write_history
|
write_history
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
if [[ "$txt" =~ ^mailto://.* ]]; then
|
if [[ "$txt" =~ ^mailto://.* ]]; then
|
||||||
xdg-email $txt
|
xdg-email "$txt"
|
||||||
write_history
|
write_history
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -47,9 +47,9 @@ if [[ "$txt" =~ ^man://.* ]]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
if command -v "$(echo "$txt" | cut -d " " -f1)" &> /dev/null ; then
|
if command -v "$(echo "$txt" | cut -d " " -f1)" &> /dev/null ; then
|
||||||
eval $txt&
|
eval "$txt" &
|
||||||
else
|
else
|
||||||
xdg-open $txt&
|
xdg-open "$txt" &
|
||||||
fi
|
fi
|
||||||
write_history
|
write_history
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ lockDir="/tmp/i38SlideshowRecord.lock"
|
|||||||
audioPrefix="/tmp/i38SlideshowRecord"
|
audioPrefix="/tmp/i38SlideshowRecord"
|
||||||
videosDir="${HOME}/Videos"
|
videosDir="${HOME}/Videos"
|
||||||
progressTitle="I38"
|
progressTitle="I38"
|
||||||
audioServer=""
|
|
||||||
defaultSink=""
|
defaultSink=""
|
||||||
sourceMonitor=""
|
sourceMonitor=""
|
||||||
micSource=""
|
micSource=""
|
||||||
@@ -67,11 +66,7 @@ verify_pulse_monitor() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
serverName="$(pactl info 2>/dev/null | awk -F': ' '/Server Name/ {print $2; exit}')"
|
serverName="$(pactl info 2>/dev/null | awk -F': ' '/Server Name/ {print $2; exit}')"
|
||||||
if [[ "$serverName" =~ [Pp]ipe[Ww]ire ]]; then
|
if [[ ! "$serverName" =~ [Pp]ipe[Ww]ire ]] && [[ ! "$serverName" =~ [Pp]ulse[Aa]udio ]]; then
|
||||||
audioServer="pipewire"
|
|
||||||
elif [[ "$serverName" =~ [Pp]ulse[Aa]udio ]]; then
|
|
||||||
audioServer="pulseaudio"
|
|
||||||
else
|
|
||||||
show_error_dialog "Unsupported audio server: ${serverName:-unknown}"
|
show_error_dialog "Unsupported audio server: ${serverName:-unknown}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user