5 Commits

134 changed files with 1055 additions and 411 deletions
@@ -67,4 +67,4 @@ class command:
def set_callback(self, callback): def set_callback(self, callback):
pass pass
@@ -62,4 +62,4 @@ class command:
def set_callback(self, callback): def set_callback(self, callback):
pass pass
@@ -4,7 +4,7 @@
# Fenrir TTY screen reader # Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributors. # By Chrys, Storm Dragon, and contributors.
import time
from fenrirscreenreader.core.i18n import _ from fenrirscreenreader.core.i18n import _
@@ -14,55 +14,150 @@ class command:
def initialize(self, environment): def initialize(self, environment):
self.env = environment self.env = environment
# Initialize tab completion state tracking
if "tabCompletion" not in self.env["commandBuffer"]:
self.env["commandBuffer"]["tabCompletion"] = {
"lastTabTime": 0,
"pendingCompletion": None,
"retryCount": 0
}
def shutdown(self): def shutdown(self):
pass pass
def get_description(self): def get_description(self):
return "No Description found" return _("Announces tab completions when detected")
def _is_recent_tab_input(self):
"""Check if TAB was pressed recently (within 200ms window)"""
current_time = time.time()
tab_detected = False
# Check KEY mode
if self.env["runtime"]["InputManager"].get_shortcut_type() in ["KEY"]:
if (self.env["runtime"]["InputManager"].get_last_deepest_input()
in [["KEY_TAB"]]):
tab_detected = True
self.env["commandBuffer"]["tabCompletion"]["lastTabTime"] = current_time
# Check BYTE mode
elif self.env["runtime"]["InputManager"].get_shortcut_type() in ["BYTE"]:
for currByte in self.env["runtime"]["ByteManager"].get_last_byte_key():
if currByte == 9: # Tab character
tab_detected = True
self.env["commandBuffer"]["tabCompletion"]["lastTabTime"] = current_time
# Check if tab was pressed recently (200ms window)
if not tab_detected:
time_since_tab = current_time - self.env["commandBuffer"]["tabCompletion"]["lastTabTime"]
if time_since_tab <= 0.2: # 200ms window
tab_detected = True
return tab_detected
def _is_flexible_completion_match(self, x_move, delta_text):
"""Use flexible matching instead of strict equality"""
if not delta_text:
return False
delta_len = len(delta_text)
# Exact match (preserve original behavior)
if x_move == delta_len:
return True
# Flexible range: allow ±2 characters difference
# Handles spacing adjustments and unicode width variations
if abs(x_move - delta_len) <= 2 and delta_len > 0:
return True
# For longer completions, allow proportional variance
if delta_len > 10 and abs(x_move - delta_len) <= (delta_len * 0.2):
return True
return False
def _detect_completion_patterns(self, delta_text):
"""Detect common tab completion patterns for improved accuracy"""
if not delta_text:
return False
delta_stripped = delta_text.strip()
# File extension completion
if '.' in delta_stripped and delta_stripped.count('.') <= 2:
return True
# Path completion (contains / or \)
if '/' in delta_stripped or '\\' in delta_stripped:
return True
# Command parameter completion (starts with -)
if delta_stripped.startswith('-') and len(delta_stripped) > 1:
return True
# Word boundary completion (alphanumeric content)
if delta_stripped.isalnum() and len(delta_stripped) >= 2:
return True
return False
def run(self): def run(self):
# try to detect the tab completion by cursor change """Enhanced tab completion detection with improved reliability"""
# Basic cursor movement check (preserve original logic)
x_move = ( x_move = (
self.env["screen"]["new_cursor"]["x"] self.env["screen"]["new_cursor"]["x"]
- self.env["screen"]["old_cursor"]["x"] - self.env["screen"]["old_cursor"]["x"]
) )
if x_move <= 0: if x_move <= 0:
return return
if self.env["runtime"]["InputManager"].get_shortcut_type() in ["KEY"]:
if not ( # Enhanced tab input detection with persistence
self.env["runtime"]["InputManager"].get_last_deepest_input() tab_detected = self._is_recent_tab_input()
in [["KEY_TAB"]]
): # Fallback for non-tab movements (preserve original thresholds)
if x_move < 5: if not tab_detected:
return if x_move < 5:
elif self.env["runtime"]["InputManager"].get_shortcut_type() in [ return
"BYTE"
]: # Screen delta availability check
found = False
for currByte in self.env["runtime"][
"ByteManager"
].get_last_byte_key():
if currByte == 9:
found = True
if not found:
if x_move < 5:
return
# is there any change?
if not self.env["runtime"]["ScreenManager"].is_delta(): if not self.env["runtime"]["ScreenManager"].is_delta():
# If tab was detected but no delta yet, store for potential retry
if tab_detected and self.env["commandBuffer"]["tabCompletion"]["retryCount"] < 2:
self.env["commandBuffer"]["tabCompletion"]["pendingCompletion"] = {
"x_move": x_move,
"timestamp": time.time()
}
self.env["commandBuffer"]["tabCompletion"]["retryCount"] += 1
return return
if not x_move == len(self.env["screen"]["new_delta"]):
return delta_text = self.env["screen"]["new_delta"]
# filter unneded space on word begin
curr_delta = self.env["screen"]["new_delta"] # Enhanced correlation checking with flexible matching
if ( if not self._is_flexible_completion_match(x_move, delta_text):
len(curr_delta.strip()) != len(curr_delta) # Additional pattern-based validation for edge cases
and curr_delta.strip() != "" if not (tab_detected and self._detect_completion_patterns(delta_text)):
): return
# Reset retry counter on successful detection
self.env["commandBuffer"]["tabCompletion"]["retryCount"] = 0
self.env["commandBuffer"]["tabCompletion"]["pendingCompletion"] = None
# Mark that we've handled this delta to prevent duplicate announcements
# This prevents the incoming text handler from also announcing the same content
self.env["commandBuffer"]["tabCompletion"]["lastProcessedDelta"] = delta_text
self.env["commandBuffer"]["tabCompletion"]["lastProcessedTime"] = time.time()
# Text filtering and announcement (preserve original behavior)
curr_delta = delta_text
if (len(curr_delta.strip()) != len(curr_delta) and curr_delta.strip() != ""):
curr_delta = curr_delta.strip() curr_delta = curr_delta.strip()
self.env["runtime"]["OutputManager"].present_text(
curr_delta, interrupt=True, announce_capital=True, flush=False # Enhanced announcement with better handling of empty completions
) if curr_delta:
self.env["runtime"]["OutputManager"].present_text(
curr_delta, interrupt=True, announce_capital=True, flush=False
)
def set_callback(self, callback): def set_callback(self, callback):
pass pass
@@ -0,0 +1,128 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributors.
import time
from fenrirscreenreader.core.i18n import _
class command:
def __init__(self):
pass
def initialize(self, environment):
self.env = environment
def shutdown(self):
pass
def get_description(self):
return _("Handles delayed retry for tab completion detection")
def run(self):
"""Check for and process pending tab completions with slight delay"""
# Only process if we have tab completion state
if "tabCompletion" not in self.env["commandBuffer"]:
return
tab_state = self.env["commandBuffer"]["tabCompletion"]
pending = tab_state.get("pendingCompletion")
if not pending:
return
current_time = time.time()
# Process pending completion after 50ms delay
if current_time - pending["timestamp"] < 0.05:
return
# Check if screen delta is now available
if not self.env["runtime"]["ScreenManager"].is_delta():
# Give up after 200ms total
if current_time - pending["timestamp"] > 0.2:
tab_state["pendingCompletion"] = None
tab_state["retryCount"] = 0
return
# Process the delayed completion
delta_text = self.env["screen"]["new_delta"]
x_move = pending["x_move"]
# Use the same flexible matching logic as main tab completion
match_found = self._is_flexible_completion_match(x_move, delta_text)
if not match_found:
# Try pattern-based detection as final fallback
match_found = self._detect_completion_patterns(delta_text)
if match_found and delta_text:
# Mark that we've handled this delta to prevent duplicate announcements
tab_state["lastProcessedDelta"] = delta_text
tab_state["lastProcessedTime"] = current_time
# Filter and announce the completion
curr_delta = delta_text
if (len(curr_delta.strip()) != len(curr_delta) and
curr_delta.strip() != ""):
curr_delta = curr_delta.strip()
if curr_delta:
self.env["runtime"]["OutputManager"].present_text(
curr_delta, interrupt=True, announce_capital=True, flush=False
)
# Clear pending completion
tab_state["pendingCompletion"] = None
tab_state["retryCount"] = 0
def _is_flexible_completion_match(self, x_move, delta_text):
"""Use flexible matching (duplicated from main command for heartbeat use)"""
if not delta_text:
return False
delta_len = len(delta_text)
# Exact match
if x_move == delta_len:
return True
# Flexible range: allow ±2 characters difference
if abs(x_move - delta_len) <= 2 and delta_len > 0:
return True
# For longer completions, allow proportional variance
if delta_len > 10 and abs(x_move - delta_len) <= (delta_len * 0.2):
return True
return False
def _detect_completion_patterns(self, delta_text):
"""Detect common tab completion patterns (duplicated from main command)"""
if not delta_text:
return False
delta_stripped = delta_text.strip()
# File extension completion
if '.' in delta_stripped and delta_stripped.count('.') <= 2:
return True
# Path completion
if '/' in delta_stripped or '\\' in delta_stripped:
return True
# Command parameter completion
if delta_stripped.startswith('-') and len(delta_stripped) > 1:
return True
# Word boundary completion
if delta_stripped.isalnum() and len(delta_stripped) >= 2:
return True
return False
def set_callback(self, callback):
pass
@@ -24,11 +24,22 @@ 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
# Only announce numlock changes if an actual numlock key was pressed # Only announce numlock changes if an actual numlock key was pressed
# This prevents spurious announcements from external numpad automatic state changes # AND the LED state actually changed (some numpads send spurious NUMLOCK events)
current_input = self.env["input"]["currInput"] current_input = self.env["input"]["currInput"]
if current_input and "KEY_NUMLOCK" in current_input:
# Check if this is a genuine numlock key press by verifying:
# 1. KEY_NUMLOCK is in the current input sequence
# 2. The LED state has actually changed
# 3. This isn't just a side effect from a KP_ key (which some buggy numpads do)
is_genuine_numlock = (
current_input and
"KEY_NUMLOCK" in current_input and
not any(key.startswith("KEY_KP") for key in current_input if isinstance(key, str))
)
if is_genuine_numlock:
if self.env["input"]["newNumLock"]: if self.env["input"]["newNumLock"]:
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
_("Numlock on"), interrupt=True _("Numlock on"), interrupt=True
@@ -279,7 +279,7 @@ class command:
return return
# Pattern 6: Claude Code progress indicators # Pattern 6: Claude Code progress indicators
claude_progress_match = re.search(r'^[·✶✢✻*]\s+[^(]+[…\.]*\s*\(esc to interrupt[^)]*\)\s*$', text) claude_progress_match = re.search(r'[·✶✢✻*]\s+[^(]+[…\.]*\s*\(esc to interrupt[^)]*\)', text)
if claude_progress_match: if claude_progress_match:
if current_time - self.env["commandBuffer"]["lastProgressTime"] >= 1.0: if current_time - self.env["commandBuffer"]["lastProgressTime"] >= 1.0:
self.play_activity_beep() self.play_activity_beep()
@@ -301,6 +301,25 @@ class command:
self.env["commandBuffer"]["lastProgressValue"] = percentage self.env["commandBuffer"]["lastProgressValue"] = percentage
return return
# Pattern 8: Thinking/processing with timing (🔄 Thinking... 23s)
thinking_match = re.search(r'🔄[^\w]*(?:thinking|processing|working|analyzing)[^\d]*(\d+)s?\b', text, re.IGNORECASE)
if thinking_match:
# Extract timing value for activity beep frequency adjustment
seconds = int(thinking_match.group(1))
# Use slightly longer interval for thinking patterns to avoid spam
thinking_interval = 1.5 if seconds < 10 else 2.0
if (
current_time - self.env["commandBuffer"]["lastProgressTime"]
>= thinking_interval
):
self.env["runtime"]["DebugManager"].write_debug_out(
f"Playing thinking activity beep (timing: {seconds}s)",
debug.DebugLevel.INFO,
)
self.play_activity_beep()
self.env["commandBuffer"]["lastProgressTime"] = current_time
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
frequency = 400 + (percentage * 8) frequency = 400 + (percentage * 8)
@@ -4,7 +4,7 @@
# Fenrir TTY screen reader # Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributors. # By Chrys, Storm Dragon, and contributors.
import time
from fenrirscreenreader.core.i18n import _ from fenrirscreenreader.core.i18n import _
@@ -19,7 +19,25 @@ class command:
pass pass
def get_description(self): def get_description(self):
return "No Description found" return _("Announces incoming text changes")
def _was_handled_by_tab_completion(self, delta_text):
"""Check if this delta was already handled by tab completion to avoid duplicates"""
if "tabCompletion" not in self.env["commandBuffer"]:
return False
tab_state = self.env["commandBuffer"]["tabCompletion"]
# Check if this exact delta was processed recently by tab completion
if (tab_state.get("lastProcessedDelta") == delta_text and
tab_state.get("lastProcessedTime")):
# Only suppress if processed within the last 100ms to avoid stale suppression
time_since_processed = time.time() - tab_state["lastProcessedTime"]
if time_since_processed <= 0.1:
return True
return False
def run(self): def run(self):
if not self.env["runtime"]["SettingsManager"].get_setting_as_bool( if not self.env["runtime"]["SettingsManager"].get_setting_as_bool(
@@ -30,6 +48,12 @@ class command:
if not self.env["runtime"]["ScreenManager"].is_delta(ignoreSpace=True): if not self.env["runtime"]["ScreenManager"].is_delta(ignoreSpace=True):
return return
delta_text = self.env["screen"]["new_delta"]
# Skip if tab completion already handled this delta
if self._was_handled_by_tab_completion(delta_text):
return
# this must be a keyecho or something # this must be a keyecho or something
# if len(self.env['screen']['new_delta'].strip(' \n\t')) <= 1: # if len(self.env['screen']['new_delta'].strip(' \n\t')) <= 1:
x_move = abs( x_move = abs(
@@ -41,14 +65,14 @@ class command:
- self.env["screen"]["old_cursor"]["y"] - self.env["screen"]["old_cursor"]["y"]
) )
if (x_move >= 1) and x_move == len(self.env["screen"]["new_delta"]): if (x_move >= 1) and x_move == len(delta_text):
# if len(self.env['screen']['new_delta'].strip(' \n\t0123456789')) # if len(self.env['screen']['new_delta'].strip(' \n\t0123456789'))
# <= 2: # <= 2:
if "\n" not in self.env["screen"]["new_delta"]: if "\n" not in delta_text:
return return
# print(x_move, y_move, len(self.env['screen']['new_delta']), len(self.env['screen']['newNegativeDelta'])) # print(x_move, y_move, len(self.env['screen']['new_delta']), len(self.env['screen']['newNegativeDelta']))
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
self.env["screen"]["new_delta"], interrupt=False, flush=False delta_text, interrupt=False, flush=False
) )
def set_callback(self, callback): def set_callback(self, callback):
@@ -1 +1 @@
# Emoji VMenu category # Emoji VMenu category
@@ -1 +1 @@
# Flags emoji subcategory # Flags emoji subcategory
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added Canada flag to clipboard", "Added Canada flag to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added UK flag to clipboard", "Added UK flag to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added USA flag to clipboard", "Added USA flag to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -1 +1 @@
# Food emoji subcategory # Food emoji subcategory
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added red apple to clipboard", "Added red apple to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added avocado to clipboard", "Added avocado to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added beer to clipboard", "Added beer to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added birthday cake to clipboard", "Added birthday cake to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added coffee to clipboard", "Added coffee to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added donut to clipboard", "Added donut to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added hamburger to clipboard", "Added hamburger to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added pizza to clipboard", "Added pizza to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added strawberry to clipboard", "Added strawberry to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added taco to clipboard", "Added taco to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -1 +1 @@
# Holidays emoji subcategory # Holidays emoji subcategory
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added alien monster to clipboard", "Added alien monster to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added bat to clipboard", "Added bat to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added black cat to clipboard", "Added black cat to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added bunny to clipboard", "Added bunny to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added mage to clipboard", "Added mage to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added Christmas tree to clipboard", "Added Christmas tree to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added coffin to clipboard", "Added coffin to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added Easter egg to clipboard", "Added Easter egg to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added fireworks to clipboard", "Added fireworks to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added ghost to clipboard", "Added ghost to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added gift to clipboard", "Added gift to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added jack o'lantern to clipboard", "Added jack o'lantern to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added mummy to clipboard", "Added mummy to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added Santa to clipboard", "Added Santa to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added shamrock to clipboard", "Added shamrock to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added skull to clipboard", "Added skull to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added snowman to clipboard", "Added snowman to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added spider to clipboard", "Added spider to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added turkey to clipboard", "Added turkey to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added vampire to clipboard", "Added vampire to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added spider web to clipboard", "Added spider web to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added witch to clipboard", "Added witch to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added zombie to clipboard", "Added zombie to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -1 +1 @@
# Nature emoji subcategory # Nature emoji subcategory
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added butterfly to clipboard", "Added butterfly to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added cat to clipboard", "Added cat to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added cherry blossom to clipboard", "Added cherry blossom to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added dog to clipboard", "Added dog to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added moon to clipboard", "Added moon to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added rainbow to clipboard", "Added rainbow to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added rose to clipboard", "Added rose to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added sun to clipboard", "Added sun to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added sunflower to clipboard", "Added sunflower to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added tree to clipboard", "Added tree to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added the mighty wolf Fenrir to clipboard", "Added the mighty wolf Fenrir to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -1 +1 @@
# People emoji subcategory # People emoji subcategory
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added grinning face to clipboard", "Added grinning face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added angry face to clipboard", "Added angry face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added beaming face to clipboard", "Added beaming face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added face blowing kiss to clipboard", "Added face blowing kiss to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added cool face to clipboard", "Added cool face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added crying face to clipboard", "Added crying face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added devil face to clipboard", "Added devil face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added dizzy face to clipboard", "Added dizzy face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added exploding head to clipboard", "Added exploding head to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added face with symbols to clipboard", "Added face with symbols to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added grinning face with sweat to clipboard", "Added grinning face with sweat to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added heart-eyes face to clipboard", "Added heart-eyes face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added smiling face with hearts to clipboard", "Added smiling face with hearts to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added angry face with horns to clipboard", "Added angry face with horns to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added laughing face to clipboard", "Added laughing face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added nauseated face to clipboard", "Added nauseated face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added pleading face to clipboard", "Added pleading face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added poop to clipboard", "Added poop to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added rolling on floor laughing to clipboard", "Added rolling on floor laughing to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added sad face to clipboard", "Added sad face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added face savoring food to clipboard", "Added face savoring food to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added screaming face to clipboard", "Added screaming face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added shocked face to clipboard", "Added shocked face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added smiling face to clipboard", "Added smiling face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added smirking face to clipboard", "Added smirking face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added thumbs up to clipboard", "Added thumbs up to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added winking face to clipboard", "Added winking face to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -1 +1 @@
# Symbols emoji subcategory # Symbols emoji subcategory
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added chains to clipboard", "Added chains to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added checkmark to clipboard", "Added checkmark to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added bone to clipboard", "Added bone to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added dagger to clipboard", "Added dagger to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added fire to clipboard", "Added fire to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added folded hands to clipboard", "Added folded hands to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added heart to clipboard", "Added heart to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added high voltage lightning bolt to clipboard", "Added high voltage lightning bolt to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added hundred points to clipboard", "Added hundred points to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added lightning to clipboard", "Added lightning to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added peace sign to clipboard", "Added peace sign to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )
@@ -19,4 +19,4 @@ class command():
self.env["runtime"]["OutputManager"].present_text( self.env["runtime"]["OutputManager"].present_text(
"Added sign of the horns to clipboard", "Added sign of the horns to clipboard",
interrupt=False, flush=False interrupt=False, flush=False
) )

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