Most of the pep8 changes finished. Be careful, things may be horribly broken.

This commit is contained in:
Storm Dragon
2025-07-03 13:22:00 -04:00
parent 7408951152
commit 21bb9c6083
344 changed files with 6374 additions and 6083 deletions

View File

@ -12,7 +12,7 @@ import re
import difflib
class screenManager():
class ScreenManager():
def __init__(self):
self.differ = difflib.Differ()
self.currScreenIgnored = False
@ -24,133 +24,133 @@ class screenManager():
# Compile regex once for better performance
self._space_normalize_regex = re.compile(' +')
def getRows(self):
def get_rows(self):
return self.rows
def getColumns(self):
def get_columns(self):
return self.colums
def initialize(self, environment):
self.env = environment
self.env['runtime']['settingsManager'].loadDriver(
self.env['runtime']['settingsManager'].getSetting(
'screen', 'driver'), 'screenDriver')
self.getCurrScreen()
self.getCurrScreen()
self.getSessionInformation()
self.updateScreenIgnored()
self.updateScreenIgnored()
self.env['runtime']['SettingsManager'].load_driver(
self.env['runtime']['SettingsManager'].get_setting(
'screen', 'driver'), 'ScreenDriver')
self.get_curr_screen()
self.get_curr_screen()
self.get_session_information()
self.update_screen_ignored()
self.update_screen_ignored()
def resetScreenText(self, screenText):
def reset_screen_text(self, screen_text):
self.prevScreenText = ''
self.currScreenText = screenText
self.currScreenText = screen_text
def setScreenText(self, screenText):
def set_screen_text(self, screen_text):
self.prevScreenText = self.currScreenText
self.currScreenText = screenText
self.currScreenText = screen_text
def getScreenText(self):
def get_screen_text(self):
return self.currScreenText
def getCurrScreen(self):
def get_curr_screen(self):
try:
self.env['runtime']['screenDriver'].getCurrScreen()
self.env['runtime']['ScreenDriver'].get_curr_screen()
except Exception as e:
self.env['runtime']['debug'].writeDebugOut(
'screenManager getCurrScreen: Error getting current screen: ' + str(e),
debug.debugLevel.ERROR)
self.env['runtime']['DebugManager'].write_debug_out(
'ScreenManager get_curr_screen: Error getting current screen: ' + str(e),
debug.DebugLevel.ERROR)
def getSessionInformation(self):
def get_session_information(self):
try:
self.env['runtime']['screenDriver'].getSessionInformation()
self.env['runtime']['ScreenDriver'].get_session_information()
except Exception as e:
self.env['runtime']['debug'].writeDebugOut(
'screenManager getSessionInformation: Error getting session info: ' + str(e),
debug.debugLevel.ERROR)
self.env['runtime']['DebugManager'].write_debug_out(
'ScreenManager get_session_information: Error getting session info: ' + str(e),
debug.DebugLevel.ERROR)
def shutdown(self):
self.env['runtime']['settingsManager'].shutdownDriver('screenDriver')
self.env['runtime']['SettingsManager'].shutdown_driver('ScreenDriver')
def isCurrScreenIgnoredChanged(self):
return self.getCurrScreenIgnored() != self.getPrevScreenIgnored()
def is_curr_screen_ignored_changed(self):
return self.get_curr_screen_ignored() != self.get_prev_screen_ignored()
def handleScreenChange(self, eventData):
self.getCurrScreen()
self.getSessionInformation()
self.updateScreenIgnored()
if self.isCurrScreenIgnoredChanged():
self.env['runtime']['inputManager'].setExecuteDeviceGrab()
self.env['runtime']['inputManager'].handleDeviceGrab()
if not self.isIgnoredScreen(self.env['screen']['newTTY']):
self.update(eventData, 'onScreenChange')
def handle_screen_change(self, event_data):
self.get_curr_screen()
self.get_session_information()
self.update_screen_ignored()
if self.is_curr_screen_ignored_changed():
self.env['runtime']['InputManager'].set_execute_device_grab()
self.env['runtime']['InputManager'].handle_device_grab()
if not self.is_ignored_screen(self.env['screen']['newTTY']):
self.update(event_data, 'onScreenChange')
self.env['screen']['lastScreenUpdate'] = time.time()
else:
self.env['runtime']['outputManager'].interruptOutput()
self.env['runtime']['OutputManager'].interrupt_output()
def handleScreenUpdate(self, eventData):
self.env['screen']['oldApplication'] = self.env['screen']['newApplication']
self.updateScreenIgnored()
if self.isCurrScreenIgnoredChanged():
self.env['runtime']['inputManager'].setExecuteDeviceGrab()
self.env['runtime']['inputManager'].handleDeviceGrab()
if not self.getCurrScreenIgnored():
self.update(eventData, 'onScreenUpdate')
def handle_screen_update(self, event_data):
self.env['screen']['oldApplication'] = self.env['screen']['new_application']
self.update_screen_ignored()
if self.is_curr_screen_ignored_changed():
self.env['runtime']['InputManager'].set_execute_device_grab()
self.env['runtime']['InputManager'].handle_device_grab()
if not self.get_curr_screen_ignored():
self.update(event_data, 'onScreenUpdate')
self.env['screen']['lastScreenUpdate'] = time.time()
elif self.isCurrScreenIgnoredChanged():
self.env['runtime']['outputManager'].interruptOutput()
elif self.is_curr_screen_ignored_changed():
self.env['runtime']['OutputManager'].interrupt_output()
def getCurrScreenIgnored(self):
def get_curr_screen_ignored(self):
return self.currScreenIgnored
def getPrevScreenIgnored(self):
def get_prev_screen_ignored(self):
return self.prevScreenIgnored
def updateScreenIgnored(self):
def update_screen_ignored(self):
self.prevScreenIgnored = self.currScreenIgnored
self.currScreenIgnored = self.isIgnoredScreen(
self.currScreenIgnored = self.is_ignored_screen(
self.env['screen']['newTTY'])
def update(self, eventData, trigger='onUpdate'):
def update(self, event_data, trigger='onUpdate'):
# set new "old" values
self.env['screen']['oldContentBytes'] = self.env['screen']['newContentBytes']
self.env['screen']['oldContentText'] = self.env['screen']['newContentText']
self.env['screen']['oldCursor'] = self.env['screen']['newCursor'].copy()
self.env['screen']['oldDelta'] = self.env['screen']['newDelta']
self.env['screen']['old_content_text'] = self.env['screen']['new_content_text']
self.env['screen']['old_cursor'] = self.env['screen']['new_cursor'].copy()
self.env['screen']['oldDelta'] = self.env['screen']['new_delta']
self.env['screen']['oldNegativeDelta'] = self.env['screen']['newNegativeDelta']
self.env['screen']['newContentBytes'] = eventData['bytes']
self.env['screen']['newContentBytes'] = event_data['bytes']
# get metadata like cursor or screensize
self.env['screen']['lines'] = int(eventData['lines'])
self.env['screen']['columns'] = int(eventData['columns'])
self.colums = int(eventData['columns'])
self.rows = int(eventData['lines'])
self.env['screen']['newCursor']['x'] = int(
eventData['textCursor']['x'])
self.env['screen']['newCursor']['y'] = int(
eventData['textCursor']['y'])
self.env['screen']['newTTY'] = eventData['screen']
self.env['screen']['newContentText'] = eventData['text']
self.env['screen']['lines'] = int(event_data['lines'])
self.env['screen']['columns'] = int(event_data['columns'])
self.colums = int(event_data['columns'])
self.rows = int(event_data['lines'])
self.env['screen']['new_cursor']['x'] = int(
event_data['textCursor']['x'])
self.env['screen']['new_cursor']['y'] = int(
event_data['textCursor']['y'])
self.env['screen']['newTTY'] = event_data['screen']
self.env['screen']['new_content_text'] = event_data['text']
# screen change
if self.isScreenChange():
if self.is_screen_change():
self.env['screen']['oldContentBytes'] = b''
self.resetScreenText(eventData['text'])
self.env['runtime']['attributeManager'].resetAttributes(
eventData['attributes'])
self.env['runtime']['attributeManager'].resetAttributeCursor()
self.env['screen']['oldContentText'] = ''
self.env['screen']['oldCursor']['x'] = 0
self.env['screen']['oldCursor']['y'] = 0
self.reset_screen_text(event_data['text'])
self.env['runtime']['AttributeManager'].reset_attributes(
event_data['attributes'])
self.env['runtime']['AttributeManager'].reset_attribute_cursor()
self.env['screen']['old_content_text'] = ''
self.env['screen']['old_cursor']['x'] = 0
self.env['screen']['old_cursor']['y'] = 0
self.env['screen']['oldDelta'] = ''
self.env['screen']['oldNegativeDelta'] = ''
else:
self.setScreenText(eventData['text'])
self.env['runtime']['attributeManager'].setAttributes(
eventData['attributes'])
self.set_screen_text(event_data['text'])
self.env['runtime']['AttributeManager'].set_attributes(
event_data['attributes'])
# initialize current deltas
self.env['screen']['newNegativeDelta'] = ''
self.env['screen']['newDelta'] = ''
self.env['runtime']['attributeManager'].resetAttributeDelta()
self.env['screen']['new_delta'] = ''
self.env['runtime']['AttributeManager'].reset_attribute_delta()
# Diff generation - critical for screen reader functionality
# This code detects and categorizes screen content changes to provide appropriate
@ -159,40 +159,40 @@ class screenManager():
# Track whether this appears to be typing (user input) vs other screen
# changes
typing = False
diffList = []
diff_list = []
if (self.env['screen']['oldContentText'] !=
self.env['screen']['newContentText']):
if (self.env['screen']['old_content_text'] !=
self.env['screen']['new_content_text']):
# Special case: Initial screen content (going from empty to populated)
# This handles first screen load or TTY switch scenarios
if self.env['screen']['newContentText'] != '' and self.env['screen']['oldContentText'] == '':
if self.env['screen']['new_content_text'] != '' and self.env['screen']['old_content_text'] == '':
# Pre-process screen text for comparison - collapse multiple spaces to single space
# This normalization prevents spurious diffs from spacing
# inconsistencies
oldScreenText = self._space_normalize_regex.sub(
' ', self.env['runtime']['screenManager'].getWindowAreaInText(
self.env['screen']['oldContentText']))
newScreenText = self._space_normalize_regex.sub(
' ', self.env['runtime']['screenManager'].getWindowAreaInText(
self.env['screen']['newContentText']))
if oldScreenText == '' and\
newScreenText != '':
self.env['screen']['newDelta'] = newScreenText
old_screen_text = self._space_normalize_regex.sub(
' ', self.env['runtime']['ScreenManager'].get_window_area_in_text(
self.env['screen']['old_content_text']))
new_screen_text = self._space_normalize_regex.sub(
' ', self.env['runtime']['ScreenManager'].get_window_area_in_text(
self.env['screen']['new_content_text']))
if old_screen_text == '' and\
new_screen_text != '':
self.env['screen']['new_delta'] = new_screen_text
else:
# Calculate byte positions for the current cursor's line in the flat text buffer
# Formula: (line_number * columns) + line_number accounts for newlines
# Each line contributes 'columns' chars + 1 newline char
cursorLineStart = self.env['screen']['newCursor']['y'] * \
self.env['screen']['columns'] + self.env['screen']['newCursor']['y']
cursorLineEnd = cursorLineStart + self.env['screen']['columns']
cursor_line_start = self.env['screen']['new_cursor']['y'] * \
self.env['screen']['columns'] + self.env['screen']['new_cursor']['y']
cursor_line_end = cursor_line_start + self.env['screen']['columns']
# TYPING DETECTION ALGORITHM
# Determines if this screen change is likely user typing vs other content changes
# All conditions must be met for typing detection:
if abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) >= 1 and \
self.env['screen']['oldCursor']['y'] == self.env['screen']['newCursor']['y'] and \
self.env['screen']['newContentText'][:cursorLineStart] == self.env['screen']['oldContentText'][:cursorLineStart] and \
self.env['screen']['newContentText'][cursorLineEnd:] == self.env['screen']['oldContentText'][cursorLineEnd:]:
if abs(self.env['screen']['old_cursor']['x'] - self.env['screen']['new_cursor']['x']) >= 1 and \
self.env['screen']['old_cursor']['y'] == self.env['screen']['new_cursor']['y'] and \
self.env['screen']['new_content_text'][:cursor_line_start] == self.env['screen']['old_content_text'][:cursor_line_start] and \
self.env['screen']['new_content_text'][cursor_line_end:] == self.env['screen']['old_content_text'][cursor_line_end:]:
# Condition 1: Cursor moved horizontally by at least 1 position (typical of typing)
# Condition 2: Cursor stayed on same line (typing doesn't usually change lines)
# Condition 3: Content BEFORE cursor line is unchanged (text above typing area)
@ -202,47 +202,47 @@ class screenManager():
# Optimize diff calculation for typing by focusing on a
# small window around cursor
cursorLineStartOffset = cursorLineStart
cursorLineEndOffset = cursorLineEnd
cursor_line_start_offset = cursor_line_start
cursor_line_end_offset = cursor_line_end
# Limit analysis window to avoid processing entire long lines
# +3 provides safety buffer beyond cursor position to catch edge cases
if cursorLineEnd > cursorLineStart + \
self.env['screen']['newCursor']['x'] + 3:
cursorLineEndOffset = cursorLineStart + \
self.env['screen']['newCursor']['x'] + 3
if cursor_line_end > cursor_line_start + \
self.env['screen']['new_cursor']['x'] + 3:
cursor_line_end_offset = cursor_line_start + \
self.env['screen']['new_cursor']['x'] + 3
# Extract just the relevant text sections for
# character-level diff
oldScreenText = self.env['screen']['oldContentText'][cursorLineStartOffset:cursorLineEndOffset]
newScreenText = self.env['screen']['newContentText'][cursorLineStartOffset:cursorLineEndOffset]
old_screen_text = self.env['screen']['old_content_text'][cursor_line_start_offset:cursor_line_end_offset]
new_screen_text = self.env['screen']['new_content_text'][cursor_line_start_offset:cursor_line_end_offset]
# Character-level diff for typing detection (not
# line-level)
diff = self.differ.compare(oldScreenText, newScreenText)
diffList = list(diff)
diff = self.differ.compare(old_screen_text, new_screen_text)
diff_list = list(diff)
typing = True
# Validate typing assumption by checking if detected
# changes match cursor movement
tempNewDelta = ''.join(x[2:]
for x in diffList if x[0] == '+')
if tempNewDelta.strip() != '':
temp_new_delta = ''.join(x[2:]
for x in diff_list if x[0] == '+')
if temp_new_delta.strip() != '':
# Compare diff result against expected typing pattern
# Expected: characters between old and new cursor
# positions
expectedTyping = ''.join(
newScreenText[self.env['screen']['oldCursor']['x']:self.env['screen']['newCursor']['x']].rstrip())
expected_typing = ''.join(
new_screen_text[self.env['screen']['old_cursor']['x']:self.env['screen']['new_cursor']['x']].rstrip())
# If diff doesn't match expected typing pattern, treat
# as general screen change
if tempNewDelta != expectedTyping:
if temp_new_delta != expected_typing:
# Fallback: treat entire current line as new
# content
diffList = [
diff_list = [
'+ ' +
self.env['screen']['newContentText'].split('\n')[
self.env['screen']['newCursor']['y']] +
self.env['screen']['new_content_text'].split('\n')[
self.env['screen']['new_cursor']['y']] +
'\n']
typing = False
else:
@ -254,16 +254,16 @@ class screenManager():
# Pre-process screen text for comparison - collapse multiple spaces to single space
# This normalization prevents spurious diffs from spacing
# inconsistencies
oldScreenText = self._space_normalize_regex.sub(
' ', self.env['runtime']['screenManager'].getWindowAreaInText(
self.env['screen']['oldContentText']))
newScreenText = self._space_normalize_regex.sub(
' ', self.env['runtime']['screenManager'].getWindowAreaInText(
self.env['screen']['newContentText']))
old_screen_text = self._space_normalize_regex.sub(
' ', self.env['runtime']['ScreenManager'].get_window_area_in_text(
self.env['screen']['old_content_text']))
new_screen_text = self._space_normalize_regex.sub(
' ', self.env['runtime']['ScreenManager'].get_window_area_in_text(
self.env['screen']['new_content_text']))
diff = self.differ.compare(oldScreenText.split('\n'),
newScreenText.split('\n'))
diffList = list(diff)
diff = self.differ.compare(old_screen_text.split('\n'),
new_screen_text.split('\n'))
diff_list = list(diff)
# Extract added and removed content from diff results
# Output format depends on whether this was detected as typing
@ -271,88 +271,88 @@ class screenManager():
if not typing:
# Line-based changes: join with newlines for proper speech
# cadence
self.env['screen']['newDelta'] = '\n'.join(
x[2:] for x in diffList if x[0] == '+')
self.env['screen']['new_delta'] = '\n'.join(
x[2:] for x in diff_list if x[0] == '+')
else:
# Character-based changes: no newlines for smooth typing
# echo
self.env['screen']['newDelta'] = ''.join(
x[2:] for x in diffList if x[0] == '+')
self.env['screen']['new_delta'] = ''.join(
x[2:] for x in diff_list if x[0] == '+')
# Negative delta (removed content) - used for backspace/delete
# detection
self.env['screen']['newNegativeDelta'] = ''.join(
x[2:] for x in diffList if x[0] == '-')
x[2:] for x in diff_list if x[0] == '-')
# track highlighted
try:
if self.env['runtime']['attributeManager'].isAttributeChange():
if self.env['runtime']['settingsManager'].getSettingAsBool(
if self.env['runtime']['AttributeManager'].is_attribute_change():
if self.env['runtime']['SettingsManager'].get_setting_as_bool(
'focus', 'highlight'):
attributeDelta, attributeCursor = self.env['runtime']['attributeManager'].trackHighlights(
attribute_delta, attributeCursor = self.env['runtime']['AttributeManager'].track_highlights(
)
if attributeCursor:
self.env['runtime']['attributeManager'].setAttributeCursor(
self.env['runtime']['AttributeManager'].set_attribute_cursor(
attributeCursor)
self.env['runtime']['attributeManager'].setAttributeDelta(
attributeDelta)
self.env['runtime']['AttributeManager'].set_attribute_delta(
attribute_delta)
except Exception as e:
self.env['runtime']['debug'].writeDebugOut(
'screenManager:update:highlight: ' + str(e), debug.debugLevel.ERROR)
self.env['runtime']['DebugManager'].write_debug_out(
'ScreenManager:update:highlight: ' + str(e), debug.DebugLevel.ERROR)
def isIgnoredScreen(self, screen=None):
def is_ignored_screen(self, screen=None):
if screen is None:
screen = self.env['screen']['newTTY']
# Check if force all screens flag is set
if self.env['runtime'].get('force_all_screens', False):
return False
ignoreScreens = []
fixIgnoreScreens = self.env['runtime']['settingsManager'].getSetting(
ignore_screens = []
fix_ignore_screens = self.env['runtime']['SettingsManager'].get_setting(
'screen', 'ignoreScreen')
if fixIgnoreScreens != '':
ignoreScreens.extend(fixIgnoreScreens.split(','))
if self.env['runtime']['settingsManager'].getSettingAsBool(
if fix_ignore_screens != '':
ignore_screens.extend(fix_ignore_screens.split(','))
if self.env['runtime']['SettingsManager'].get_setting_as_bool(
'screen', 'autodetectIgnoreScreen'):
ignoreScreens.extend(self.env['screen']['autoIgnoreScreens'])
self.env['runtime']['debug'].writeDebugOut(
'screenManager:isIgnoredScreen ignore:' +
str(ignoreScreens) +
ignore_screens.extend(self.env['screen']['autoIgnoreScreens'])
self.env['runtime']['DebugManager'].write_debug_out(
'ScreenManager:is_ignored_screen ignore:' +
str(ignore_screens) +
' current:' +
str(screen),
debug.debugLevel.INFO)
return (screen in ignoreScreens)
debug.DebugLevel.INFO)
return (screen in ignore_screens)
def isScreenChange(self):
def is_screen_change(self):
if not self.env['screen']['oldTTY']:
return False
return self.env['screen']['newTTY'] != self.env['screen']['oldTTY']
def isDelta(self, ignoreSpace=False):
newDelta = self.env['screen']['newDelta']
def is_delta(self, ignoreSpace=False):
new_delta = self.env['screen']['new_delta']
if ignoreSpace:
newDelta = newDelta.strip()
return newDelta != ''
new_delta = new_delta.strip()
return new_delta != ''
def isNegativeDelta(self):
def is_negative_delta(self):
return self.env['screen']['newNegativeDelta'] != ''
def getWindowAreaInText(self, text):
if not self.env['runtime']['cursorManager'].isApplicationWindowSet():
def get_window_area_in_text(self, text):
if not self.env['runtime']['CursorManager'].is_application_window_set():
return text
windowText = ''
windowList = text.split('\n')
currApp = self.env['runtime']['applicationManager'].getCurrentApplication()
windowList = windowList[self.env['commandBuffer']['windowArea'][currApp][
'1']['y']:self.env['commandBuffer']['windowArea'][currApp]['2']['y'] + 1]
for line in windowList:
windowText += line[self.env['commandBuffer']['windowArea'][currApp]['1']['x']
:self.env['commandBuffer']['windowArea'][currApp]['2']['x'] + 1] + '\n'
return windowText
window_text = ''
window_list = text.split('\n')
curr_app = self.env['runtime']['ApplicationManager'].get_current_application()
window_list = window_list[self.env['commandBuffer']['windowArea'][curr_app][
'1']['y']:self.env['commandBuffer']['windowArea'][curr_app]['2']['y'] + 1]
for line in window_list:
window_text += line[self.env['commandBuffer']['windowArea'][curr_app]['1']['x']
:self.env['commandBuffer']['windowArea'][curr_app]['2']['x'] + 1] + '\n'
return window_text
def injectTextToScreen(self, text, screen=None):
def inject_text_to_screen(self, text, screen=None):
try:
self.env['runtime']['screenDriver'].injectTextToScreen(
self.env['runtime']['ScreenDriver'].inject_text_to_screen(
text, screen)
except Exception as e:
self.env['runtime']['debug'].writeDebugOut(
'screenManager:injectTextToScreen ' + str(e), debug.debugLevel.ERROR)
self.env['runtime']['DebugManager'].write_debug_out(
'ScreenManager:inject_text_to_screen ' + str(e), debug.DebugLevel.ERROR)