19 Commits

Author SHA1 Message Date
Storm Dragon d274fe78f3 Rebind the keyboard layout switcher to fenrir+control+f4. 2025-08-31 14:37:48 -04:00
Storm Dragon f5344a7227 removing keyboard layouts that are no longer used 2025-08-23 18:30:35 -04:00
Storm Dragon 7f473b72a7 Minor updates to progress bar detection. 2025-08-23 12:16:10 -04:00
Storm Dragon b3d73102fc Fenrir will now read dots in the middle of or at the beginning of words regardless of punctuation settings. 2025-08-21 23:29:45 -04:00
Storm Dragon 78c1cbbb6b Improved progress bar detection for curl. Experimental flood protection for updates. 2025-08-21 19:59:40 -04:00
Storm Dragon 8c26d93001 Progress bar monitoring updates. Hopefully fixed some false positives, and updated claude-code progress monitoring. 2025-08-20 14:33:22 -04:00
Storm Dragon 0a2c8472c0 Fixed errors in README. Moved the audio configuration script stuff nearer the top. 2025-08-04 14:36:06 -04:00
Storm Dragon 69eade3327 Updated documentation for stand-alone pipewire or pulse configuration scripts. 2025-08-04 14:24:41 -04:00
Storm Dragon 73f67c2a04 Multiple fixes to indentation beep code, including volume for lower ranged beeps using the gstreamer driver. 2025-08-04 12:38:14 -04:00
Storm Dragon 9ef9d762f4 A few emoji updates. 2025-07-31 03:16:02 -04:00
Storm Dragon 84293db6dc Another shot at fixing multiple numpads. 2025-07-25 14:17:17 -04:00
Storm Dragon 94a1acbaca A few improvements to validation. 2025-07-24 14:05:51 -04:00
Storm Dragon 8c233e0385 Some syntax errors fixed. Syntax checking added. Release checklist created. 2025-07-24 13:52:10 -04:00
Storm Dragon b6a9e1a692 Hopefully fixed problems with connection external numpads. 2025-07-23 00:01:46 -04:00
Storm Dragon d41ea8388f Fixed url exclusion detection for progress bars. 2025-07-21 06:58:49 -04:00
Storm Dragon b68a28e857 Added more emojis. 2025-07-17 11:11:35 -04:00
Storm Dragon 8c668cc0cc Final batch of pty driver fixes... For now. 2025-07-16 19:48:48 -04:00
Storm Dragon 579bf0f0f0 More work on the pty driver. 2025-07-16 19:43:07 -04:00
Storm Dragon d1bad818cd initial improvements to pty driver. Improved clipboard handling of multibyte characters. Added emoji menu to vmenu. It places the emoji to the clipboard to be used wherever. 2025-07-16 19:35:26 -04:00
157 changed files with 5812 additions and 498 deletions
+52 -25
View File
@@ -134,6 +134,58 @@ By default Fenrir uses:
- **Input driver**: evdevDriver (Linux) or ptyDriver (other platforms) - **Input driver**: evdevDriver (Linux) or ptyDriver (other platforms)
- **Screen driver**: vcsaDriver (Linux TTY) or ptyDriver (terminal emulation) - **Screen driver**: vcsaDriver (Linux TTY) or ptyDriver (terminal emulation)
## Audio Configuration
Both PulseAudio and PipeWire require special configuration to allow console applications running as root (like Fenrir) to route audio to your regular user session. This is normal audio system behavior, not a Fenrir issue.
### Quick Setup - Direct Script Download
For non-Fenrir users or quick setup, download and run these scripts directly:
#### PulseAudio Configuration
```bash
# Download the script
wget https://git.stormux.org/storm/fenrir/raw/branch/master/tools/configure_pulse.sh
chmod +x configure_pulse.sh
# Run twice: once as user, once as root
./configure_pulse.sh
sudo ./configure_pulse.sh
```
#### PipeWire Configuration
```bash
# Download the script
wget https://git.stormux.org/storm/fenrir/raw/branch/master/tools/configure_pipewire.sh
chmod +x configure_pipewire.sh
# Run twice: once as user, once as root
./configure_pipewire.sh
sudo ./configure_pipewire.sh
```
**Direct links:**
- [configure_pulse.sh](https://git.stormux.org/storm/fenrir/raw/branch/master/tools/configure_pulse.sh)
- [configure_pipewire.sh](https://git.stormux.org/storm/fenrir/raw/branch/master/tools/configure_pipewire.sh)
### Using Installed Scripts
If you have Fenrir installed, the scripts are available at:
**PulseAudio:**
```bash
/usr/share/fenrirscreenreader/tools/configure_pulse.sh
sudo /usr/share/fenrirscreenreader/tools/configure_pulse.sh
```
**PipeWire:**
```bash
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
sudo /usr/share/fenrirscreenreader/tools/configure_pipewire.sh
```
**Note:** These scripts work for any console application that needs root audio access, not just Fenrir.
## Getting Started ## Getting Started
### Basic Usage ### Basic Usage
@@ -640,31 +692,6 @@ send_fenrir_command("setting set speech#rate=0.9")
- Check Fenrir debug logs: `/var/log/fenrir.log` - Check Fenrir debug logs: `/var/log/fenrir.log`
- Test with simple command: `echo "command interrupt" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock` - Test with simple command: `echo "command interrupt" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock`
## Configure pulseaudio
Pulseaudio by default only plays sound for the user its currently running for. As fenrir is running as root, your local user does not hear the sound and speech produced by fenrir.
for this fenrir provides a script to configure pulseaudio to stream the sound played as root to your local user. This is not a issue of fenrir but this is how pulseaudio works.
just run the configuration script twice (once as user, once as root):
/usr/share/fenrirscreenreader/tools/configure_pulse.sh
sudo /usr/share/fenrirscreenreader/tools/configure_pulse.sh
The script is also located in the tools directory in git
## Configure pipewire
Pipewire by default only plays sound for the user its currently running for. As fenrir is running as root, your local user does not hear the sound and speech produced by fenrir.
for this fenrir provides a script to configure pipewire to stream the sound played as root to your local user. This is not a issue of fenrir but this is how pipewire works.
just run the configuration script twice (once as user, once as root):
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
sudo /usr/share/fenrirscreenreader/tools/configure_pipewire.sh
The script is also located in the tools directory in git
## Command Line Options ## Command Line Options
Fenrir supports several command-line options for different use cases: Fenrir supports several command-line options for different use cases:
+192
View File
@@ -0,0 +1,192 @@
# Fenrir Release Validation Checklist
This checklist ensures thorough validation before releasing Fenrir packages.
## 🔧 Setup Tools (One-time setup)
### Install Pre-commit Hook
```bash
# Safely install composite hook (preserves existing version management)
./tools/install_validation_hook.sh
# Test the hook
./.git/hooks/pre-commit
```
### Validation Scripts
- `tools/validate_syntax.py` - Python syntax validation
- `tools/validate_pep8.py` - PEP8 compliance checking with safe auto-fix
- `tools/validate_release.py` - Comprehensive release validation
- `tools/cleanup_cache.py` - Remove Python cache files and directories
- `tools/pre-commit-hook` - Git pre-commit validation
## 📋 Pre-Release Checklist
### 1. Code Quality Validation ✅
```bash
# Comprehensive release validation (includes syntax, imports, structure)
python3 tools/validate_release.py
# If issues found, try auto-fix
python3 tools/validate_release.py --fix
# Quick validation (skips slow dependency checks)
python3 tools/validate_release.py --quick
```
**Expected Result**: All tests pass, no syntax errors
### 2. Dependency Validation ✅
```bash
# Validate all dependencies are available
python3 check-dependencies.py
```
**Expected Result**: All required dependencies reported as available
### 3. Core Functionality Test ✅
```bash
# Test core imports (safe to run without sudo)
cd src
python3 -c "
import fenrirscreenreader.core.fenrirManager
import fenrirscreenreader.core.commandManager
import fenrirscreenreader.core.eventManager
print('Core imports successful')
"
cd ..
```
**Expected Result**: No import errors
### 4. Installation Script Validation ✅
```bash
# Validate setup.py syntax
python3 -m py_compile setup.py
# Check setup.py can be parsed
python3 setup.py --help-commands >/dev/null
```
**Expected Result**: No syntax errors, setup.py functional
### 5. Configuration Validation ✅
```bash
# Verify config files exist and are parseable
ls -la config/settings/settings.conf
ls -la config/keyboard/desktop.conf
ls -la config/punctuation/default.conf
```
**Expected Result**: All core config files present
### 6. Manual Testing (User/Package Maintainer) ⚠️
**Important**: These require user interaction as they need sudo access or specific hardware.
```bash
# Test basic functionality (ask user to run)
sudo ./src/fenrir --help
# Test in emulation mode (safer for desktop environments)
sudo ./src/fenrir -e --version
# Quick functionality test (3-5 seconds)
sudo timeout 5 ./src/fenrir -e -f || echo "Timeout reached (expected)"
```
**Expected Result**: No immediate crashes, basic help/version output works
### 7. Package-Specific Validation ✅
```bash
# Test the same compilation process used by package managers
python3 -m compileall src/fenrirscreenreader/ -q
# Verify no __pycache__ permission issues
find src/ -name "*.pyc" -delete
find src/ -name "__pycache__" -delete
```
**Expected Result**: Clean compilation, no permission errors
## 🚨 Known Issue Categories
### Critical Issues (Block Release)
- **Python syntax errors** (SyntaxError, unterminated strings)
- **Missing core dependencies** (dbus-python, evdev, etc.)
- **Import failures in core modules** (fenrirManager, commandManager)
- **Missing critical config files** (settings.conf, desktop.conf)
### Warning Issues (Address if Possible)
- **PEP8 violations** (cosmetic, don't block release)
- **Missing optional dependencies** (for specific features)
- **Command structure issues** (missing methods in command files)
- **Very long lines** (>120 characters)
## 🔍 Root Cause Analysis
### Why These Errors Weren't Caught Previously
1. **No automated syntax validation** - The codebase relied on manual testing
2. **No pre-commit hooks** - Syntax errors could be committed
3. **No CI/CD pipeline** - Package compilation happens only during release
4. **Manual PEP8 cleanup** - F-string refactoring introduced syntax errors during batch cleanup
## 📖 Usage Instructions
### For Developers
```bash
# Before committing changes
git add .
git commit # Pre-commit hook will run automatically
# Before creating tags/releases
python3 tools/validate_release.py
```
### For Package Maintainers
```bash
# Before packaging
python3 tools/validate_release.py
# If validation fails
python3 tools/validate_release.py --fix
# Quick check (if dependencies are known good)
python3 tools/validate_release.py --quick
```
### For Release Managers
```bash
# Complete validation before tagging
python3 tools/validate_release.py
# Manual verification (requires sudo)
sudo ./src/fenrir --version
# Tag release only after all validations pass
git tag -a v2.x.x -m "Release v2.x.x"
```
## 🎯 Future Improvements
### Recommended Additions
1. **GitHub Actions CI/CD** - Automated validation on every push
2. **Automated testing** - Unit tests for core functionality
3. **Integration testing** - Test driver interactions
4. **Package testing** - Validate actual package installation
### Modern Python Packaging
- Consider migrating to `pyproject.toml` (PEP 621)
- Use `build` instead of `setup.py` directly
- Add `tox.ini` for multi-environment testing
## 📞 Support
If validation fails and auto-fix doesn't resolve issues:
1. **Check the specific error messages** in validation output
2. **Review recent commits** that might have introduced issues
3. **Run individual validation steps** to isolate problems
Remember: **Working code is better than perfect code** - especially for accessibility software where reliability is critical.
+1 -1
View File
@@ -129,4 +129,4 @@ KEY_FENRIR,KEY_F8=export_clipboard_to_x
KEY_FENRIR,KEY_CTRL,KEY_UP=inc_alsa_volume KEY_FENRIR,KEY_CTRL,KEY_UP=inc_alsa_volume
KEY_FENRIR,KEY_CTRL,KEY_DOWN=dec_alsa_volume KEY_FENRIR,KEY_CTRL,KEY_DOWN=dec_alsa_volume
KEY_FENRIR,KEY_SHIFT,KEY_V=announce_fenrir_version KEY_FENRIR,KEY_SHIFT,KEY_V=announce_fenrir_version
KEY_F4=cycle_keyboard_layout KEY_FENRIR,KEY_LEFTCTRL,KEY_F4=cycle_keyboard_layout
+1 -1
View File
@@ -129,4 +129,4 @@ KEY_FENRIR,KEY_F8=export_clipboard_to_x
KEY_FENRIR,KEY_CTRL,KEY_UP=inc_alsa_volume KEY_FENRIR,KEY_CTRL,KEY_UP=inc_alsa_volume
KEY_FENRIR,KEY_CTRL,KEY_DOWN=dec_alsa_volume KEY_FENRIR,KEY_CTRL,KEY_DOWN=dec_alsa_volume
KEY_FENRIR,KEY_SHIFT,KEY_V=announce_fenrir_version KEY_FENRIR,KEY_SHIFT,KEY_V=announce_fenrir_version
KEY_F4=cycle_keyboard_layout KEY_FENRIR,KEY_LEFTCTRL,KEY_F4=cycle_keyboard_layout
-130
View File
@@ -1,130 +0,0 @@
KEY_FENRIR,KEY_F1=toggle_tutorial_mode
KEY_FENRIR,KEY_H=toggle_tutorial_mode
KEY_CTRL=shut_up
KEY_SHIFT,KEY_KP9=review_bottom
KEY_SHIFT,KEY_KP7=review_top
KEY_KP8=review_curr_line
KEY_KP7=review_prev_line
KEY_KP9=review_next_line
KEY_SHIFT,KEY_KP1=review_line_begin
KEY_SHIFT,KEY_KP3=review_line_end
KEY_FENRIR,KEY_KP1=review_line_first_char
KEY_FENRIR,KEY_KP3=review_line_last_char
KEY_FENRIR,KEY_ALT,KEY_1=present_first_line
KEY_FENRIR,KEY_ALT,KEY_2=present_last_line
KEY_KP5=review_curr_word
KEY_KP4=review_prev_word
KEY_KP6=review_next_word
2,KEY_KP5=review_curr_word_phonetic
2,KEY_KP4=review_prev_word_phonetic
2,KEY_KP6=review_next_word_phonetic
KEY_KP2=review_curr_char
KEY_KP1=review_prev_char
KEY_KP3=review_next_char
2,KEY_KP2=review_curr_char_phonetic
2,KEY_KP1=review_prev_char_phonetic
2,KEY_KP3=review_next_char_phonetic
KEY_FENRIR,KEY_CTRL,KEY_KP8=review_up
KEY_FENRIR,KEY_CTRL,KEY_KP2=review_down
KEY_FENRIR,KEY_KPDOT=exit_review
KEY_KPDOT=cursor_position
KEY_FENRIR,KEY_I=indent_curr_line
KEY_FENRIR,KEY_B=curr_screen
KEY_FENRIR,KEY_KP8=curr_screen_before_cursor
KEY_FENRIR,KEY_KP2=curr_screen_after_cursor
KEY_FENRIR,KEY_SHIFT,KEY_PAGEDOWN=cursor_read_to_end_of_line
#=cursor_column
#=cursor_lineno
#=braille_flush
KEY_FENRIR,KEY_CTRL,KEY_T=braille_return_to_cursor
#=braille_pan_left
#=braille_pan_right
KEY_FENRIR,KEY_CTRL,KEY_1=clear_bookmark_1
KEY_FENRIR,KEY_SHIFT,KEY_1=set_bookmark_1
KEY_FENRIR,KEY_1=bookmark_1
KEY_FENRIR,KEY_K=bookmark_1
KEY_FENRIR,KEY_CTRL,KEY_2=clear_bookmark_2
KEY_FENRIR,KEY_SHIFT,KEY_2=set_bookmark_2
KEY_FENRIR,KEY_2=bookmark_2
KEY_FENRIR,KEY_CTRL,KEY_3=clear_bookmark_3
KEY_FENRIR,KEY_SHIFT,KEY_3=set_bookmark_3
KEY_FENRIR,KEY_3=bookmark_3
KEY_FENRIR,KEY_CTRL,KEY_4=clear_bookmark_4
KEY_FENRIR,KEY_SHIFT,KEY_4=set_bookmark_4
KEY_FENRIR,KEY_4=bookmark_4
KEY_FENRIR,KEY_CTRL,KEY_5=clear_bookmark_5
KEY_FENRIR,KEY_SHIFT,KEY_5=set_bookmark_5
KEY_FENRIR,KEY_5=bookmark_5
KEY_FENRIR,KEY_CTRL,KEY_6=clear_bookmark_6
KEY_FENRIR,KEY_SHIFT,KEY_6=set_bookmark_6
KEY_FENRIR,KEY_6=bookmark_6
KEY_FENRIR,KEY_CTRL,KEY_7=clear_bookmark_7
KEY_FENRIR,KEY_SHIFT,KEY_7=set_bookmark_7
KEY_FENRIR,KEY_7=bookmark_7
KEY_FENRIR,KEY_CTRL,KEY_8=clear_bookmark_8
KEY_FENRIR,KEY_SHIFT,KEY_8=set_bookmark_8
KEY_FENRIR,KEY_8=bookmark_8
KEY_FENRIR,KEY_CTRL,KEY_9=clear_bookmark_9
KEY_FENRIR,KEY_SHIFT,KEY_9=set_bookmark_9
KEY_FENRIR,KEY_9=bookmark_9
KEY_FENRIR,KEY_CTRL,KEY_0=clear_bookmark_10
KEY_FENRIR,KEY_SHIFT,KEY_0=set_bookmark_10
KEY_FENRIR,KEY_0=bookmark_10
KEY_FENRIR,KEY_KPSLASH=set_window_application
2,KEY_FENRIR,KEY_KPSLASH=clear_window_application
KEY_KPPLUS=progress_bar_monitor
KEY_FENRIR,KEY_KPPLUS=silence_until_prompt
#=toggle_braille
KEY_FENRIR,KEY_F3=toggle_sound
KEY_FENRIR,KEY_F4=toggle_speech
KEY_KPENTER=temp_disable_speech
KEY_FENRIR,KEY_P=toggle_punctuation_level
KEY_FENRIR,KEY_RIGHTBRACE=toggle_auto_spell_check
KEY_FENRIR,KEY_S=toggle_output
KEY_FENRIR,KEY_CTRL,KEY_E=toggle_emoticons
key_FENRIR,KEY_5=toggle_auto_read
KEY_FENRIR,KEY_CTRL,KEY_T=toggle_auto_time
KEY_FENRIR,KEY_KPASTERISK=toggle_highlight_tracking
KEY_FENRIR,KEY_KPMINUS=toggle_barrier
KEY_FENRIR,KEY_Q=quit_fenrir
KEY_FENRIR,KEY_T=time
KEY_FENRIR,KEY_F12=time
2,KEY_FENRIR,KEY_T=date
2,KEY_FENRIR,KEY_F12=date
KEY_KPSLASH=toggle_auto_indent
KEY_FENRIR,KEY_F=attribute_cursor
#=toggle_has_attribute
KEY_FENRIR,KEY_F7=spell_check
2,KEY_FENRIR,KEY_S=add_word_to_spell_check
KEY_FENRIR,KEY_SHIFT,KEY_S=remove_word_from_spell_check
KEY_FENRIR,KEY_F2=forward_keypress
KEY_FENRIR,KEY_ALT,KEY_UP=inc_sound_volume
KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_sound_volume
#=clear_clipboard
KEY_FENRIR,KEY_HOME=first_clipboard
KEY_FENRIR,KEY_END=last_clipboard
KEY_FENRIR,KEY_PAGEUP=prev_clipboard
KEY_FENRIR,KEY_PAGEDOWN=next_clipboard
KEY_FENRIR,KEY_SHIFT,KEY_C=curr_clipboard
KEY_FENRIR,KEY_C=copy_marked_to_clipboard
KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_C=copy_last_echo_to_clipboard
KEY_FENRIR,KEY_V=paste_clipboard
KEY_FENRIR,KEY_F5=import_clipboard_from_file
KEY_FENRIR,KEY_F6=export_clipboard_to_file
KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks
KEY_FENRIR,KEY_F9=set_mark
KEY_FENRIR,KEY_F10=marked_text
KEY_FENRIR,KEY_F10=toggle_vmenu_mode
KEY_FENRIR,KEY_SPACE=current_quick_menu_entry
KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value
KEY_FENRIR,KEY_CTRL,KEY_RIGHT=next_quick_menu_entry
KEY_FENRIR,KEY_CTRL,KEY_UP=next_quick_menu_value
KEY_FENRIR,KEY_CTRL,KEY_LEFT=prev_quick_menu_entry
KEY_FENRIR,KEY_CTRL,KEY_DOWN=prev_quick_menu_value
KEY_FENRIR,KEY_CTRL,KEY_C=save_settings
# linux specific
#=import_clipboard_from_x
KEY_FENRIR,KEY_F8=export_clipboard_to_x
KEY_FENRIR,KEY_ALT,KEY_UP=inc_alsa_volume
KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_alsa_volume
KEY_F4=cycle_keyboard_layout
-129
View File
@@ -1,129 +0,0 @@
KEY_FENRIR,KEY_F1=toggle_tutorial_mode
KEY_FENRIR,KEY_H=toggle_tutorial_mode
KEY_CTRL=shut_up
KEY_FENRIR,KEY_CTRL,KEY_END=review_bottom
KEY_FENRIR,KEY_CTRL,KEY_HOME=review_top
KEY_FENRIR,KEY_SHIFT,KEY_DOT=review_curr_line
KEY_FENRIR,KEY_U=review_prev_line
KEY_FENRIR,KEY_O=review_next_line
KEY_FENRIR,KEY_HOME=review_line_begin
KEY_FENRIR,KEY_END=review_line_end
KEY_FENRIR,KEY_CTRL,KEY_J=review_line_first_char
KEY_FENRIR,KEY_CTRL,KEY_L=review_line_last_char
KEY_FENRIR,KEY_ALT,KEY_1=present_first_line
KEY_FENRIR,KEY_ALT,KEY_2=present_last_line
KEY_FENRIR,KEY_CTRL,KEY_DOT=review_curr_word
KEY_FENRIR,KEY_J=review_prev_word
KEY_FENRIR,KEY_L=review_next_word
2,KEY_FENRIR,KEY_CTRL,KEY_DOT=review_curr_word_phonetic
2,KEY_FENRIR,KEY_J=review_prev_word_phonetic
2,KEY_FENRIR,KEY_L=review_next_word_phonetic
KEY_FENRIR,KEY_COMMA=review_curr_char
KEY_FENRIR,KEY_M=review_prev_char
KEY_FENRIR,KEY_DOT=review_next_char
2,KEY_FENRIR,KEY_COMMA=curr_char_phonetic
2,KEY_FENRIR,KEY_M=prev_char_phonetic
2,KEY_FENRIR,KEY_DOT=next_char_phonetic
KEY_FENRIR,KEY_CTRL,KEY_I=review_up
KEY_FENRIR,KEY_CTRL,KEY_COMMA=review_down
KEY_FENRIR,KEY_SLASH=exit_review
KEY_FENRIR,KEY_SHIFT,KEY_DOT=cursor_position
2,KEY_FENRIR,KEY_I=indent_curr_line
KEY_FENRIR,KEY_B=curr_screen
KEY_FENRIR,KEY_SHIFT,KEY_I=curr_screen_before_cursor
KEY_FENRIR,KEY_SHIFT,KEY_COMMA=curr_screen_after_cursor
KEY_FENRIR,KEY_SHIFT,KEY_PAGEDOWN=cursor_read_to_end_of_line
#=cursor_column
#=cursor_lineno
#=braille_flush
KEY_FENRIR,KEY_CTRL,KEY_T=braille_return_to_cursor
#=braille_pan_left
#=braille_pan_right
KEY_FENRIR,KEY_CTRL,KEY_1=clear_bookmark_1
KEY_FENRIR,KEY_SHIFT,KEY_1=set_bookmark_1
KEY_FENRIR,KEY_1=bookmark_1
KEY_FENRIR,KEY_K=bookmark_1
KEY_FENRIR,KEY_CTRL,KEY_2=clear_bookmark_2
KEY_FENRIR,KEY_SHIFT,KEY_2=set_bookmark_2
KEY_FENRIR,KEY_2=bookmark_2
KEY_FENRIR,KEY_CTRL,KEY_3=clear_bookmark_3
KEY_FENRIR,KEY_SHIFT,KEY_3=set_bookmark_3
KEY_FENRIR,KEY_3=bookmark_3
KEY_FENRIR,KEY_CTRL,KEY_4=clear_bookmark_4
KEY_FENRIR,KEY_SHIFT,KEY_4=set_bookmark_4
KEY_FENRIR,KEY_4=bookmark_4
KEY_FENRIR,KEY_CTRL,KEY_5=clear_bookmark_5
KEY_FENRIR,KEY_SHIFT,KEY_5=set_bookmark_5
KEY_FENRIR,KEY_5=bookmark_5
KEY_FENRIR,KEY_CTRL,KEY_6=clear_bookmark_6
KEY_FENRIR,KEY_SHIFT,KEY_6=set_bookmark_6
KEY_FENRIR,KEY_6=bookmark_6
KEY_FENRIR,KEY_CTRL,KEY_7=clear_bookmark_7
KEY_FENRIR,KEY_SHIFT,KEY_7=set_bookmark_7
KEY_FENRIR,KEY_7=bookmark_7
KEY_FENRIR,KEY_CTRL,KEY_8=clear_bookmark_8
KEY_FENRIR,KEY_SHIFT,KEY_8=set_bookmark_8
KEY_FENRIR,KEY_8=bookmark_8
KEY_FENRIR,KEY_CTRL,KEY_9=clear_bookmark_9
KEY_FENRIR,KEY_SHIFT,KEY_9=set_bookmark_9
KEY_FENRIR,KEY_9=bookmark_9
KEY_FENRIR,KEY_CTRL,KEY_0=clear_bookmark_10
KEY_FENRIR,KEY_SHIFT,KEY_0=set_bookmark_10
KEY_FENRIR,KEY_0=bookmark_10
KEY_FENRIR,KEY_CTRL,KEY_8=set_window_application
2,KEY_FENRIR,KEY_CTRL,KEY_8=clear_window_application
KEY_FENRIR,KEY_SEMICOLON=last_incoming
#=toggle_braille
KEY_FENRIR,KEY_F3=toggle_sound
KEY_FENRIR,KEY_F4=toggle_speech
KEY_FENRIR,KEY_ENTER=temp_disable_speech
KEY_FENRIR,KEY_P=toggle_punctuation_level
KEY_FENRIR,KEY_RIGHTBRACE=toggle_auto_spell_check
KEY_FENRIR,KEY_S=toggle_output
KEY_FENRIR,KEY_SHIFT,KEY_E=toggle_emoticons
KEY_FENRIR,KEY_5=toggle_auto_read
KEY_FENRIR,KEY_CTRL,KEY_T=toggle_auto_time
KEY_FENRIR,KEY_Y=toggle_highlight_tracking
#=toggle_barrier
KEY_FENRIR,KEY_Q=quit_fenrir
KEY_FENRIR,KEY_T=time
KEY_FENRIR,KEY_F12=time
2,KEY_FENRIR,KEY_T=date
2,KEY_FENRIR,KEY_F12=date
KEY_FENRIR,KEY_BACKSLASH=toggle_auto_indent
KEY_FENRIR,KEY_F=attribute_cursor
#=toggle_has_attribute
KEY_FENRIR,KEY_F7=spell_check
2,KEY_FENRIR,KEY_S=add_word_to_spell_check
KEY_FENRIR,KEY_SHIFT,KEY_S=remove_word_from_spell_check
KEY_FENRIR,KEY_F2=forward_keypress
KEY_FENRIR,KEY_ALT,KEY_UP=inc_sound_volume
KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_sound_volume
#=clear_clipboard
#=first_clipboard
#=last_clipboard
KEY_FENRIR,KEY_PAGEUP=prev_clipboard
KEY_FENRIR,KEY_PAGEDOWN=next_clipboard
KEY_FENRIR,KEY_SHIFT,KEY_C=curr_clipboard
KEY_FENRIR,KEY_C=copy_marked_to_clipboard
KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_C=copy_last_echo_to_clipboard
KEY_FENRIR,KEY_V=paste_clipboard
KEY_FENRIR,KEY_F5=import_clipboard_from_file
KEY_FENRIR,KEY_F6=export_clipboard_to_file
KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks
KEY_FENRIR,KEY_F9=set_mark
KEY_FENRIR,KEY_F10=marked_text
KEY_FENRIR,KEY_SHIFT,KEY_F10=toggle_vmenu_mode
KEY_FENRIR,KEY_SPACE=current_quick_menu_entry
KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value
KEY_FENRIR,KEY_CTRL,KEY_RIGHT=next_quick_menu_entry
KEY_FENRIR,KEY_CTRL,KEY_UP=next_quick_menu_value
KEY_FENRIR,KEY_CTRL,KEY_LEFT=prev_quick_menu_entry
KEY_FENRIR,KEY_CTRL,KEY_DOWN=prev_quick_menu_value
KEY_FENRIR,KEY_CTRL,KEY_C=save_settings
# linux specific
#=import_clipboard_from_x
KEY_FENRIR,KEY_F8=export_clipboard_to_x
KEY_FENRIR,KEY_ALT,KEY_UP=inc_alsa_volume
KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_alsa_volume
KEY_F4=cycle_keyboard_layout
@@ -24,9 +24,8 @@ class command:
def run(self): def run(self):
try: try:
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
f"Fenrir screen reader version { f"Fenrir screen reader version "
fenrirVersion.version}-{ f"{fenrirVersion.version}-{fenrirVersion.code_name}",
fenrirVersion.code_name}",
interrupt=True, interrupt=True,
) )
except Exception as e: except Exception as e:
@@ -60,9 +60,10 @@ class command:
if self.env["runtime"]["SettingsManager"].get_setting_as_int( if self.env["runtime"]["SettingsManager"].get_setting_as_int(
"general", "autoPresentIndentMode" "general", "autoPresentIndentMode"
) in [0, 1]: ) in [0, 1]:
self.env["runtime"]["OutputManager"].play_frequence( if self.lastIdent != curr_ident:
curr_ident * 50, 0.1, interrupt=do_interrupt self.env["runtime"]["OutputManager"].play_frequence(
) curr_ident * 50, 0.1, interrupt=do_interrupt
)
if self.env["runtime"]["SettingsManager"].get_setting_as_int( if self.env["runtime"]["SettingsManager"].get_setting_as_int(
"general", "autoPresentIndentMode" "general", "autoPresentIndentMode"
) in [0, 2]: ) in [0, 2]:
@@ -31,10 +31,9 @@ class command:
self.lastIdent = 0 self.lastIdent = 0
return return
# is a vertical change? # Skip if no cursor movement at all
if not self.env["runtime"][ if (not self.env["runtime"]["CursorManager"].is_cursor_horizontal_move() and
"CursorManager" not self.env["runtime"]["CursorManager"].is_cursor_vertical_move()):
].is_cursor_horizontal_move():
return return
x, y, curr_line = line_utils.get_current_line( x, y, curr_line = line_utils.get_current_line(
self.env["screen"]["new_cursor"]["x"], self.env["screen"]["new_cursor"]["x"],
@@ -43,27 +42,34 @@ class command:
) )
curr_ident = self.env["screen"]["new_cursor"]["x"] curr_ident = self.env["screen"]["new_cursor"]["x"]
if not curr_line.isspace(): if curr_line.isspace():
# ident # Don't beep for lines with only spaces - no meaningful indentation
lastIdent, lastY, last_line = line_utils.get_current_line( return
self.env["screen"]["new_cursor"]["x"],
self.env["screen"]["new_cursor"]["y"], # Lines with actual content - calculate proper indentation
self.env["screen"]["old_content_text"], lastIdent, lastY, last_line = line_utils.get_current_line(
) self.env["screen"]["new_cursor"]["x"],
if curr_line.strip() != last_line.strip(): self.env["screen"]["new_cursor"]["y"],
return self.env["screen"]["old_content_text"],
if len(curr_line.lstrip()) == len(last_line.lstrip()): )
return if curr_line.strip() != last_line.strip():
return
if len(curr_line.lstrip()) == len(last_line.lstrip()):
return
curr_ident = len(curr_line) - len(curr_line.lstrip()) curr_ident = len(curr_line) - len(curr_line.lstrip())
if self.lastIdent == -1: if curr_ident <= 0:
self.lastIdent = curr_ident return
if curr_ident <= 0:
return # Initialize lastIdent if needed
if self.lastIdent == -1:
self.lastIdent = curr_ident
# Only beep/announce if indentation level has changed
if self.env["runtime"]["SettingsManager"].get_setting_as_bool( if self.env["runtime"]["SettingsManager"].get_setting_as_bool(
"general", "autoPresentIndent" "general", "autoPresentIndent"
): ) and self.lastIdent != curr_ident:
if self.env["runtime"]["SettingsManager"].get_setting_as_int( if self.env["runtime"]["SettingsManager"].get_setting_as_int(
"general", "autoPresentIndentMode" "general", "autoPresentIndentMode"
) in [0, 1]: ) in [0, 1]:
@@ -71,14 +77,15 @@ class command:
curr_ident * 50, 0.1, interrupt=False curr_ident * 50, 0.1, interrupt=False
) )
if self.env["runtime"]["SettingsManager"].get_setting_as_int( if self.env["runtime"]["SettingsManager"].get_setting_as_int(
"general", "autoPresentIndentMode" "general", "autePresentIndentMode"
) in [0, 2]: ) in [0, 2]:
if self.lastIdent != curr_ident: self.env["runtime"]["OutputManager"].present_text(
self.env["runtime"]["OutputManager"].present_text( _("indented ") + str(curr_ident) + " ",
_("indented ") + str(curr_ident) + " ", interrupt=False,
interrupt=False, flush=False,
flush=False, )
)
# Always update lastIdent for next comparison
self.lastIdent = curr_ident self.lastIdent = curr_ident
def set_callback(self, callback): def set_callback(self, callback):
@@ -24,14 +24,19 @@ class command:
def run(self): def run(self):
if self.env["input"]["oldNumLock"] == self.env["input"]["newNumLock"]: if self.env["input"]["oldNumLock"] == self.env["input"]["newNumLock"]:
return return
if self.env["input"]["newNumLock"]:
self.env["runtime"]["OutputManager"].present_text( # Only announce numlock changes if an actual numlock key was pressed
_("Numlock on"), interrupt=True # This prevents spurious announcements from external numpad automatic state changes
) current_input = self.env["input"]["currInput"]
else: if current_input and "KEY_NUMLOCK" in current_input:
self.env["runtime"]["OutputManager"].present_text( if self.env["input"]["newNumLock"]:
_("Numlock off"), interrupt=True self.env["runtime"]["OutputManager"].present_text(
) _("Numlock on"), interrupt=True
)
else:
self.env["runtime"]["OutputManager"].present_text(
_("Numlock off"), interrupt=True
)
def set_callback(self, callback): def set_callback(self, callback):
pass pass
@@ -144,13 +144,43 @@ class command:
] = current_time ] = current_time
return return
# Pattern 1a2: Curl classic progress format (percentage without % symbol)
# Extract percentage from curl's classic format
curl_classic_match = re.search(
r"^\s*(\d+)\s+\d+[kMGT]?\s+(\d+)\s+\d+[kMGT]?\s+\d+\s+\d+\s+\d+[kMGT]?\s+\d+\s+\d+:\d+:\d+\s+\d+:\d+:\d+\s+\d+:\d+:\d+\s+\d+[kMGT]?\s*$", text
)
if curl_classic_match:
# Use the first percentage (total progress)
percentage = float(curl_classic_match.group(1))
if 0 <= percentage <= 100:
self.env["runtime"]["DebugManager"].write_debug_out(
"found curl classic percentage: " + str(percentage),
debug.DebugLevel.INFO,
)
if (
percentage
!= self.env["commandBuffer"]["lastProgressValue"]
):
self.env["runtime"]["DebugManager"].write_debug_out(
"Playing tone for curl: " + str(percentage),
debug.DebugLevel.INFO,
)
self.play_progress_tone(percentage)
self.env["commandBuffer"][
"lastProgressValue"
] = percentage
self.env["commandBuffer"][
"lastProgressTime"
] = current_time
return
# Pattern 1b: Time/token activity (not percentage-based, so use single # Pattern 1b: Time/token activity (not percentage-based, so use single
# beep) # beep)
time_match = re.search(r"(\d+)s\s", text) time_match = re.search(r"(?:(?:remaining|elapsed|left|ETA|eta)[:;\s]*(\d+)s|(\d+)s\s+(?:remaining|elapsed|left))", text, re.IGNORECASE)
token_match = re.search(r"(\d+)\s+tokens", text) token_match = re.search(r"(?:processing|generating|used|consumed)\s+(\d+)\s+tokens", text, re.IGNORECASE)
# Pattern 1c: dd command output (bytes copied with transfer rate) # Pattern 1c: dd command output (bytes copied with transfer rate)
dd_match = re.search(r"\d+\s+bytes.*copied.*\d+\s+s.*[kMGT]?B/s", text) dd_match = re.search(r"\d+\s+bytes.*copied.*\d+\s+s.*[kMGT]?B/s", text)
# Pattern 1d: Curl-style transfer data (bytes, speed indicators) # Pattern 1d: Curl-style transfer data (bytes, speed indicators - legacy)
curl_match = re.search( curl_match = re.search(
r"(\d+\s+\d+\s+\d+\s+\d+.*?(?:k|M|G)?.*?--:--:--|Speed)", text r"(\d+\s+\d+\s+\d+\s+\d+.*?(?:k|M|G)?.*?--:--:--|Speed)", text
) )
@@ -183,7 +213,10 @@ class command:
if fraction_match: if fraction_match:
current = int(fraction_match.group(1)) current = int(fraction_match.group(1))
total = int(fraction_match.group(2)) total = int(fraction_match.group(2))
if total > 0: # Filter out dates, page numbers, and other non-progress fractions
if (total > 0 and total <= 1000 and current <= total and
not re.search(r"\b(?:page|chapter|section|line|row|column|year|month|day)\b", text, re.IGNORECASE) and
not re.search(r"\d{1,2}/\d{1,2}/\d{2,4}", text)): # Date pattern
percentage = (current / total) * 100 percentage = (current / total) * 100
if ( if (
percentage percentage
@@ -235,6 +268,38 @@ class command:
): ):
self.play_activity_beep() self.play_activity_beep()
self.env["commandBuffer"]["lastProgressTime"] = current_time self.env["commandBuffer"]["lastProgressTime"] = current_time
return
# Pattern 5: Braille progress indicators
braille_match = re.search(r'[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⡿⣟⣯⣷⣾⣽⣻⢿]', text)
if braille_match:
if current_time - self.env["commandBuffer"]["lastProgressTime"] >= 1.0:
self.play_activity_beep()
self.env["commandBuffer"]["lastProgressTime"] = current_time
return
# Pattern 6: Claude Code progress indicators
claude_progress_match = re.search(r'^[·✶✢✻*]\s+[\w\s-]+[…\.]*\s*\(esc to interrupt\)\s*$', text)
if claude_progress_match:
if current_time - self.env["commandBuffer"]["lastProgressTime"] >= 1.0:
self.play_activity_beep()
self.env["commandBuffer"]["lastProgressTime"] = current_time
return
# Pattern 7: Moon phase progress indicators
moon_match = re.search(r'[🌑🌒🌓🌔🌕🌖🌗🌘]', text)
if moon_match:
moon_phases = {
'🌑': 0, '🌒': 12.5, '🌓': 25, '🌔': 37.5,
'🌕': 50, '🌖': 62.5, '🌗': 75, '🌘': 87.5
}
moon_char = moon_match.group(0)
if moon_char in moon_phases:
percentage = moon_phases[moon_char]
if percentage != self.env["commandBuffer"]["lastProgressValue"]:
self.play_progress_tone(percentage)
self.env["commandBuffer"]["lastProgressValue"] = percentage
return
def play_progress_tone(self, percentage): def play_progress_tone(self, percentage):
# Map 0-100% to 400-1200Hz frequency range # Map 0-100% to 400-1200Hz frequency range
@@ -250,9 +315,21 @@ class command:
self.play_quiet_tone(800, 0.08) self.play_quiet_tone(800, 0.08)
def play_quiet_tone(self, frequency, duration): def play_quiet_tone(self, frequency, duration):
"""Play a quiet tone using Sox directly""" """Play a quiet tone using Sox directly with flood protection"""
import shlex import shlex
import subprocess import subprocess
import time
# Flood protection: prevent beeps closer than 0.1 seconds apart
current_time = time.time()
if not hasattr(self, '_last_beep_time'):
self._last_beep_time = 0
if current_time - self._last_beep_time < 0.1:
# Skip this beep to prevent audio crackling on low-resource systems
return
self._last_beep_time = current_time
# Build the Sox command: play -qn synth <duration> tri <frequency> gain # Build the Sox command: play -qn synth <duration> tri <frequency> gain
# -8 # -8
@@ -369,12 +446,10 @@ class command:
"""Check if text contains URLs that might cause false progress detection""" """Check if text contains URLs that might cause false progress detection"""
import re import re
# Common URL patterns that might contain progress-like patterns # Specific URL patterns - only match actual URLs, not filenames
url_patterns = [ url_patterns = [
r"https?://[^\s]+", # http:// or https:// URLs r"\S+://\S+\.\S{2,}", # Any protocol:// with domain.ext
r"ftp://[^\s]+", # ftp:// URLs r"www\.[^\s]+\.[a-zA-Z]{2,}", # www.domain.ext patterns
r"www\.[^\s]+", # www. domains
r"[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}[/\w.-]*", # domain.com/path patterns
] ]
for pattern in url_patterns: for pattern in url_patterns:
@@ -0,0 +1 @@
# Emoji VMenu category
@@ -0,0 +1 @@
# Flags emoji subcategory
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇦🇷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Argentina flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Argentina flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇦🇺"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Australia flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Australia flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇧🇪"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Belgium flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Belgium flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇧🇷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Brazil flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Brazil flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇨🇦"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Canada flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Canada flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇨🇳"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add China flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added China flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇩🇰"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Denmark flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Denmark flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇫🇮"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Finland flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Finland flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇫🇷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add France flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added France flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇩🇪"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Germany flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Germany flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇬🇷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Greece flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Greece flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇮🇳"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add India flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added India flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇮🇪"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Ireland flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Ireland flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇮🇱"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Israel flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Israel flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇮🇹"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Italy flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Italy flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇯🇵"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Japan flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Japan flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇲🇽"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Mexico flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Mexico flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇳🇱"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Netherlands flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Netherlands flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇳🇴"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Norway flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Norway flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇵🇱"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Poland flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Poland flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇵🇹"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Portugal flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Portugal flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇷🇺"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Russia flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Russia flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇿🇦"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add South Africa flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added South Africa flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇰🇷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add South Korea flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added South Korea flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇪🇸"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Spain flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Spain flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇸🇪"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Sweden flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Sweden flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇨🇭"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Switzerland flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Switzerland flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇹🇷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Turkey flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Turkey flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇬🇧"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add UK flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added UK flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇺🇦"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Ukraine flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Ukraine flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🇺🇸"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add USA flag emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added USA flag to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1 @@
# Food emoji subcategory
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🍎"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Red apple emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added red apple to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🥑"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Avocado emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added avocado to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🍺"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Beer emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added beer to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🎂"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Birthday cake emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added birthday cake to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = ""
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add coffee emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added coffee to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🍩"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Donut emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added donut to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🍔"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add hamburger emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added hamburger to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🍕"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add pizza emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added pizza to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🍓"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Strawberry emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added strawberry to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌮"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Taco emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added taco to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1 @@
# Holidays emoji subcategory
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "👾"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Alien monster emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added alien monster to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🦇"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add bat emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added bat to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🐈‍⬛"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Black cat emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added black cat to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🐰"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add bunny emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added bunny to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🧙"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Mage emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added mage to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🎄"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Christmas tree emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Christmas tree to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "⚰️"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Coffin emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added coffin to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🥚"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Easter egg emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Easter egg to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🎆"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add fireworks emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added fireworks to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "👻"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add ghost emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added ghost to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🎁"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add gift emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added gift to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🎃"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add jack o'lantern emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added jack o'lantern to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🧟"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Mummy emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added mummy to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🎅"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add Santa emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added Santa to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "☘️"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add shamrock emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added shamrock to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "💀"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add skull emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added skull to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = ""
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add snowman emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added snowman to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🕷"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add spider emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added spider to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🦃"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add turkey emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added turkey to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🧛"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Vampire emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added vampire to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🕸️"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Spider web emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added spider web to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🧙‍♀️"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Witch emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added witch to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🧟"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Zombie emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added zombie to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1 @@
# Nature emoji subcategory
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🦋"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Butterfly emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added butterfly to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🐱"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Cat emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added cat to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌸"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Cherry blossom emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added cherry blossom to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🐶"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Dog emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added dog to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌙"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add moon emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added moon to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌈"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Rainbow emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added rainbow to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌹"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Rose emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added rose to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "☀️"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add sun emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added sun to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌻"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Sunflower emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added sunflower to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🌳"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Add tree emoji to clipboard"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added tree to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "🐺"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Wolf emoji - The mighty Fenrir!"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added the mighty wolf Fenrir to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1 @@
# People emoji subcategory
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😀"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Grinning face emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added grinning face to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😠"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Angry face emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added angry face to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😁"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Beaming face with smiling eyes emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added beaming face to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😘"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Face blowing a kiss emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added face blowing kiss to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😎"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Cool face emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added cool face to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😭"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Crying face emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added crying face to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😈"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Devil face emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added devil face to clipboard",
interrupt=False, flush=False
)
@@ -0,0 +1,22 @@
class command():
def initialize(self, environment):
self.env = environment
self.emoji = "😵"
def shutdown(self):
pass
def setCallback(self, callback):
pass
def getDescription(self):
return "Dizzy face emoji"
def run(self):
self.env["runtime"]["MemoryManager"].add_value_to_first_index(
"clipboardHistory", self.emoji
)
self.env["runtime"]["OutputManager"].present_text(
"Added dizzy face to clipboard",
interrupt=False, flush=False
)

Some files were not shown because too many files have changed in this diff Show More