Files
fenrir/src/fenrirscreenreader/core/cursorManager.py
2025-07-05 09:29:32 -04:00

163 lines
6.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributers.
from fenrirscreenreader.core import debug
class CursorManager():
def __init__(self):
pass
def initialize(self, environment):
self.env = environment
def should_process_numpad_commands(self):
"""
Check if numpad commands should be processed based on numlock state
Return True if numlock is OFF (commands should work)
Return False if numlock is ON (let keys type numbers)
"""
# Return False if numlock is ON
return not self.env['input']['newNumLock']
def shutdown(self):
pass
def clear_marks(self):
self.env['commandBuffer']['Marks']['1'] = None
self.env['commandBuffer']['Marks']['2'] = None
def is_mark_set(self):
return self.env['commandBuffer']['Marks']['1'] is not None
def is_single_mark(self):
return self.env['commandBuffer']['Marks']['1'] is not None and \
self.env['commandBuffer']['Marks']['2'] is None
def is_multible_mark(self):
return self.env['commandBuffer']['Marks']['1'] is not None and \
self.env['commandBuffer']['Marks']['2'] is not None
def set_mark(self):
curr_cursor = None
if self.env['screen']['newCursorReview']:
curr_cursor = self.env['screen']['newCursorReview'].copy()
else:
curr_cursor = self.env['screen']['new_cursor'].copy()
if not self.env['commandBuffer']['Marks']['1']:
self.env['commandBuffer']['Marks']['1'] = curr_cursor.copy()
return 1
else:
self.env['commandBuffer']['Marks']['2'] = curr_cursor.copy()
return 2
return 0
def get_review_or_text_cursor(self):
if self.env['screen']['newCursorReview']:
return self.env['screen']['newCursorReview'].copy()
else:
return self.env['screen']['new_cursor'].copy()
def clear_review_cursor(self):
if not self.is_review_mode():
return
self.env['screen']['oldCursorReview'] = None
self.env['screen']['newCursorReview'] = None
def is_cursor_horizontal_move(self):
return self.env['screen']['new_cursor']['x'] != self.env['screen']['old_cursor']['x']
def is_cursor_vertical_move(self):
return self.env['screen']['new_cursor']['y'] != self.env['screen']['old_cursor']['y']
def is_review_mode(self):
return self.env['screen']['newCursorReview'] is not None
def enter_review_mode_curr_text_cursor(self, overwrite=False):
if self.is_review_mode() and not overwrite:
return
self.env['screen']['oldCursorReview'] = self.env['screen']['newCursorReview']
if not self.env['screen']['newCursorReview']:
self.env['screen']['newCursorReview'] = self.env['screen']['new_cursor'].copy()
if self.env['runtime']['SettingsManager'].get_setting_as_bool(
'focus',
'highlight') and self.env['runtime']['AttributeManager'].is_attribute_cursor_active():
self.env['screen']['newCursorReview'] = self.env['runtime']['AttributeManager'].get_curr_attribute_cursor(
).copy()
def set_review_cursor_position(self, x, y):
if not self.is_review_mode():
self.enter_review_mode_curr_text_cursor()
self.env['screen']['oldCursorReview'] = self.env['screen']['newCursorReview']
self.env['screen']['newCursorReview']['x'] = x
self.env['screen']['newCursorReview']['y'] = y
def is_application_window_set(self):
try:
curr_app = self.env['runtime']['ApplicationManager'].get_current_application(
)
if curr_app in self.env['commandBuffer']['windowArea'] and \
'1' in self.env['commandBuffer']['windowArea'][curr_app] and \
self.env['commandBuffer']['windowArea'][curr_app]['1'] is not None:
return True
except Exception as e:
self.env['runtime']['DebugManager'].write_debug_out(
'CursorManager is_application_window_set: Error checking window area: ' + str(e),
debug.DebugLevel.ERROR)
return False
def set_window_for_application(self, start=None, end=None):
x1 = 0
x2 = 0
y1 = 0
y2 = 0
if start is None:
if not self.env['commandBuffer']['Marks']['1']:
return False
else:
x1 = self.env['commandBuffer']['Marks']['1']['x']
y1 = self.env['commandBuffer']['Marks']['1']['y']
else:
x1 = start['x']
y1 = start['y']
if end is None:
if not self.env['commandBuffer']['Marks']['2']:
return False
else:
x2 = self.env['commandBuffer']['Marks']['2']['x']
y2 = self.env['commandBuffer']['Marks']['2']['y']
else:
x2 = end['x']
y2 = end['y']
curr_app = self.env['runtime']['ApplicationManager'].get_current_application()
self.env['commandBuffer']['windowArea'][curr_app] = {}
if x1 * y1 <= \
x2 * y2:
self.env['commandBuffer']['windowArea'][curr_app]['1'] = {
'x': x1, 'y': y1}
self.env['commandBuffer']['windowArea'][curr_app]['2'] = {
'x': x2, 'y': y2}
else:
self.env['commandBuffer']['windowArea'][curr_app]['1'] = {
'x': x2, 'y': y2}
self.env['commandBuffer']['windowArea'][curr_app]['2'] = {
'x': x1, 'y': y1}
return True
def clear_window_for_application(self):
curr_app = self.env['runtime']['ApplicationManager'].get_current_application()
try:
del self.env['commandBuffer']['windowArea'][curr_app]
except Exception as e:
self.env['runtime']['DebugManager'].write_debug_out(
'CursorManager clear_window_for_application: Error clearing window area: ' +
str(e),
debug.DebugLevel.ERROR)
return False
return True