163 lines
6.1 KiB
Python
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
|