Codebase list fenrir / 24417af
[ Samuel Thibault ] [ Debian Janitor ] New upstream release. Debian Janitor 2 years ago
222 changed file(s) with 8120 addition(s) and 2078 deletion(s). Raw diff Collapse all Expand all
33 fenrir_screenreader.egg-info/
44 dist/
55 build/
6 *.kate-swp
7 .directory
7070 # installation
7171 - Archlinux: PKGBUILD in AUR
7272 - PIP: sudo pip install fenrir-screenreader
73 - Manual: run install.sh and uninstall.sh as root
73 - Manual:
74 - install "espeak" and "sox" with your package manager
75 - sudo pip install -r requirements.txt
76 - run install.sh and uninstall.sh as root
7477 - you also can just run it from Git without installing:
7578 You can just run the following as root:
7679 if you are in Fenrir Git rootfolder:
8386 - speech driver: genericDriver (via espeak or espeak-ng, could configured in settings.conf)
8487 - braille driver: brlttyDriver (WIP)
8588 - input driver: evdevDriver
89 # Configure pulseaudio
90 Pulseaudio by default does only play 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.
91 for this fenrir provides a script to configure pulseaudio to stream the sound played as root to your local user. Last is playing the sound then. This is not a issue of fenrir but this is how pulseaudio works.
8692
93 just run the configuration scipt twice (once as user, once as root).
94
95 Run:
96 configure_pulse.sh
97 sudo configure_pulse.sh
98
99 The script could also be found at /tools/ in git
100
101 # localization
102 copy fenrir.mo translations file from fenrir/locale/your_language/LC_MESSAGES/fenrir.mo to /usr/share/locale/your_language/LC_MESSAGES/fenrir.mo
103
87104 # Documentation
88105 You can see all information on the Wiki:
89106 https://wiki.linux-a11y.org/doku.php?id=fenrir_user_manual
1919 [] replace lines by a list insteed of and \n seperated string. (currently we need to split to often) (Easy for contribution)
2020 General (Easy for contribution)
2121 [w] make fenrir runnable without root permissions
22 [] check pythran for performance
23 https://github.com/serge-sans-paille/pythran
2224 [] make fenrir runable without settingsfile. fallback to defaults
2325 [] Detect progressbars and just present percent
2426 |=============== |100%
55 # speech: speech-dispatcher
66 # sound: sox
77 # braille: brltty:
8 defaultInstallation = ['FenrirCore','vcsaDriver','brlapiDriver','evdevDriver','genericDriver (speech)', 'genericDriver (sound)']
8 defaultInstallation = ['FenrirCore','vcsaDriver','dummyDriver (braille)','evdevDriver','genericDriver (speech)', 'genericDriver (sound)']
99 currentInstallation = []
1010
1111 print('checking dependencys...')
3333 # SCREEN
3434 print('--------------------')
3535 print('screen driver')
36 # dummy and debug
37 print('dummyDriver (screen): OK')
38 currentInstallation.append('dummyDriver (screen)')
39
3640 # VCSA (screen driver)
3741 print('vcsaDriver')
3842 available = True
6569 # BRAILLE
6670 print('--------------------')
6771 print('braille driver')
72 # dummy and debug
73 print('dummyDriver (braille): OK')
74 currentInstallation.append('dummyDriver (braille)')
75 print('debugDriver (braille): OK')
76 currentInstallation.append('debugDriver (braille)')
6877 # brltty (braille driver)
6978 print('brlapiDriver')
7079 available = True
8089 # INPUT
8190 print('--------------------')
8291 print('input driver')
92 # dummy and debug
93 print('dummyDriver (input): OK')
94 currentInstallation.append('dummyDriver (input)')
95 print('debugDriver (input): OK')
96 currentInstallation.append('debugDriver (input)')
8397 # evdev (input driver)
8498 print('evdevDriver')
8599 available = True
89103 print('python3-evdev: OK')
90104 except:
91105 print('python3-evdev: FAIL')
92 available = available and False
106 available = available and False
93107 try:
94108 import pyudev
95109 print('python3-pyudev: OK')
96110 except:
97111 print('python3-pyudev: FAIL')
98 available = available and False
112 available = available and False
99113 if available:
100114 currentInstallation.append('evdevDriver')
101115 # pty emulation (input driver)
107121 print('pyte: OK')
108122 except:
109123 print('pyte: FAIL')
110 available = available and False
111 if available:
112 currentInstallation.append('ptyDriver (Input)')
124 available = available and False
125 if available:
126 currentInstallation.append('ptyDriver (Input)')
113127 # SOUND
114128 print('--------------------')
115129 print('sound driver')
130 # dummy and debug
131 print('dummyDriver (sound): OK')
132 currentInstallation.append('dummyDriver (sound)')
133 print('debugDriver (sound): OK')
134 currentInstallation.append('debugDriver (sound)')
116135 print('genericDriver (uses sox by default)')
117136 available = True
118137 if os.path.exists('/usr/bin/play') and os.path.exists('/usr/bin/sox'):
119138 print('sox: OK')
120139 else:
121140 print('sox: FAIL')
122 available = available and False
141 available = available and False
123142 if available:
124143 currentInstallation.append('genericDriver (sound)')
125144 print('')
131150 print('gi: OK')
132151 except:
133152 print('gi: FAIL')
134 available = available and False
153 available = available and False
135154 try:
136155 from gi.repository import GLib
137156 print('gi GLib: OK')
138157 except:
139158 print('gi GLib: FAIL')
140 available = available and False
159 available = available and False
141160 try:
142161 gi.require_version('Gst', '1.0')
143162 from gi.repository import Gst
144163 print('gi Gst: OK')
145164 except:
146 print('gi Gst: FAIL')
147 available = available and False
165 print('gi Gst: FAIL')
166 available = available and False
148167 if available:
149168 currentInstallation.append('gstreamerDriver')
150169
151170 # SPEECH
152171 print('--------------------')
153172 print('speech driver')
173 # dummy and debug
174 print('dummyDriver (speech): OK')
175 currentInstallation.append('dummyDriver (speech)')
176 print('debugDriver (speech): OK')
177 currentInstallation.append('debugDriver (speech)')
154178 # speechd (speech driver)
155179 print('speechdDriver')
156180 available = True
159183 print('python3-speechd: OK')
160184 except:
161185 print('python3-speechd: FAIL')
162 available = available and False
186 available = available and False
163187 if available:
164188 currentInstallation.append('speechdDriver')
165189 print('')
171195 print('python3-espeak: OK')
172196 except:
173197 print('python3-espeak: FAIL')
198 available = available and False
199 if available:
200 currentInstallation.append('espeakDriver')
201 print('genericDriver (uses espeak-ng by default)')
202 available = True
203 if os.path.exists('/usr/bin/espeak-ng') or os.path.exists('/bin/espeak-ng'):
204 print('espeak-ng: OK')
205 else:
206 print('espeak-ng: FAIL')
174207 available = available and False
175208 if available:
176 currentInstallation.append('espeakDriver')
177 print('genericDriver (uses espeak by default)')
178 available = True
179 if os.path.exists('/usr/bin/espeak') or os.path.exists('/bin/espeak'):
180 print('espeak: OK')
181 else:
182 print('espeak: FAIL')
183 available = available and False
184 if available:
185 currentInstallation.append('genericDriver (speech)')
209 currentInstallation.append('genericDriver (speech)')
186210
187211 # SUMMERY
188212 print('====================')
6060 KEY_FENRIR,KEY_7=bookmark_7
6161 KEY_FENRIR,KEY_CTRL,KEY_8=clear_bookmark_8
6262 KEY_FENRIR,KEY_SHIFT,KEY_8=set_bookmark_8
63 #KEY_FENRIR,KEY_8=bookmark_8
63 KEY_FENRIR,KEY_8=bookmark_8
6464 KEY_FENRIR,KEY_CTRL,KEY_9=clear_bookmark_9
6565 KEY_FENRIR,KEY_SHIFT,KEY_9=set_bookmark_9
6666 KEY_FENRIR,KEY_9=bookmark_9
9292 2,KEY_FENRIR,KEY_S=add_word_to_spell_check
9393 KEY_FENRIR,KEY_SHIFT,KEY_S=remove_word_from_spell_check
9494 KEY_FENRIR,KEY_BACKSPACE=forward_keypress
95 KEY_FENRIR,KEY_UP=inc_speech_volume
96 KEY_FENRIR,KEY_DOWN=dec_speech_volume
97 KEY_FENRIR,KEY_RIGHT=inc_speech_rate
98 KEY_FENRIR,KEY_LEFT=dec_speech_rate
99 KEY_FENRIR,KEY_ALT,KEY_RIGHT=inc_speech_pitch
100 KEY_FENRIR,KEY_ALT,KEY_LEFT=dec_speech_pitch
10195 KEY_FENRIR,KEY_ALT,KEY_UP=inc_sound_volume
10296 KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_sound_volume
10397 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_C=clear_clipboard
107101 KEY_FENRIR,KEY_PAGEDOWN=next_clipboard
108102 KEY_FENRIR,KEY_SHIFT,KEY_C=curr_clipboard
109103 KEY_FENRIR,KEY_C=copy_marked_to_clipboard
110 KEY_FENRIR,KEY_CTRL,KEY_U=copy_last_echo_to_clipboard
104 KEY_FENRIR,KEY_CTRL,KEY_C=copy_last_echo_to_clipboard
111105 KEY_FENRIR,KEY_V=paste_clipboard
112106 KEY_FENRIR,KEY_F5=import_clipboard_from_file
113107 KEY_FENRIR,KEY_F6=export_clipboard_to_file
114108 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks
115109 KEY_FENRIR,KEY_X=set_mark
116110 KEY_FENRIR,KEY_SHIFT,KEY_X=marked_text
111 KEY_FENRIR,KEY_F10=toggle_vmenu_mode
112 KEY_FENRIR,KEY_SPACE=current_quick_menu_entry
113 KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value
114 KEY_FENRIR,KEY_RIGHT=next_quick_menu_entry
115 KEY_FENRIR,KEY_UP=next_quick_menu_value
116 KEY_FENRIR,KEY_LEFT=prev_quick_menu_entry
117 KEY_FENRIR,KEY_DOWN=prev_quick_menu_value
118 KEY_FENRIR,KEY_CTRL,KEY_S=save_settings
117119 # linux specific
118120 KEY_FENRIR,KEY_F7=import_clipboard_from_x
119121 KEY_FENRIR,KEY_F8=export_clipboard_to_x
9292 2,KEY_FENRIR,KEY_S=add_word_to_spell_check
9393 KEY_FENRIR,KEY_SHIFT,KEY_S=remove_word_from_spell_check
9494 KEY_FENRIR,KEY_BACKSPACE=forward_keypress
95 KEY_FENRIR,KEY_UP=inc_speech_volume
96 KEY_FENRIR,KEY_DOWN=dec_speech_volume
97 KEY_FENRIR,KEY_RIGHT=inc_speech_rate
98 KEY_FENRIR,KEY_LEFT=dec_speech_rate
99 KEY_FENRIR,KEY_ALT,KEY_RIGHT=inc_speech_pitch
100 KEY_FENRIR,KEY_ALT,KEY_LEFT=dec_speech_pitch
10195 KEY_FENRIR,KEY_ALT,KEY_UP=inc_sound_volume
10296 KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_sound_volume
10397 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_C=clear_clipboard
114108 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks
115109 KEY_FENRIR,KEY_X=set_mark
116110 KEY_FENRIR,KEY_SHIFT,KEY_X=marked_text
111 KEY_FENRIR,KEY_F10=toggle_vmenu_mode
112 KEY_FENRIR,KEY_UP=inc_speech_volume
113 KEY_FENRIR,KEY_DOWN=dec_speech_volume
114 KEY_FENRIR,KEY_RIGHT=inc_speech_rate
115 KEY_FENRIR,KEY_LEFT=dec_speech_rate
116 KEY_FENRIR,KEY_ALT,KEY_RIGHT=inc_speech_pitch
117 KEY_FENRIR,KEY_ALT,KEY_LEFT=dec_speech_pitch
118 KEY_FENRIR,KEY_CTRL,KEY_S=save_settings
117119 # linux specific
118120 KEY_FENRIR,KEY_F7=import_clipboard_from_x
119121 KEY_FENRIR,KEY_F8=export_clipboard_to_x
0 KEY_FENRIR,KEY_F1=toggle_tutorial_mode
1 KEY_FENRIR,KEY_H=toggle_tutorial_mode
2 KEY_CTRL=shut_up
3 KEY_SHIFT,KEY_KP9=review_bottom
4 KEY_SHIFT,KEY_KP7=review_top
5 KEY_KP8=review_curr_line
6 KEY_KP7=review_prev_line
7 KEY_KP9=review_next_line
8 KEY_SHIFT,KEY_KP1=review_line_begin
9 KEY_SHIFT,KEY_KP3=review_line_end
10 KEY_FENRIR,KEY_KP1=review_line_first_char
11 KEY_FENRIR,KEY_KP3=review_line_last_char
12 KEY_FENRIR,KEY_ALT,KEY_1=present_first_line
13 KEY_FENRIR,KEY_ALT,KEY_2=present_last_line
14 KEY_KP5=review_curr_word
15 KEY_KP4=review_prev_word
16 KEY_KP6=review_next_word
17 2,KEY_KP5=review_curr_word_phonetic
18 2,KEY_KP4=review_prev_word_phonetic
19 2,KEY_KP6=review_next_word_phonetic
20 KEY_KP2=review_curr_char
21 KEY_KP1=review_prev_char
22 KEY_KP3=review_next_char
23 2,KEY_KP2=review_curr_char_phonetic
24 2,KEY_KP1=review_prev_char_phonetic
25 2,KEY_KP3=review_next_char_phonetic
26 KEY_FENRIR,KEY_CTRL,KEY_KP8=review_up
27 KEY_FENRIR,KEY_CTRL,KEY_KP2=review_down
28 KEY_FENRIR,KEY_KPDOT=exit_review
29 KEY_KPDOT=cursor_position
30 KEY_FENRIR,KEY_I=indent_curr_line
31 KEY_FENRIR,KEY_B=curr_screen
32 KEY_FENRIR,KEY_KP8=curr_screen_before_cursor
33 KEY_FENRIR,KEY_KP2=curr_screen_after_cursor
34 KEY_FENRIR,KEY_SHIFT,KEY_PAGEDOWN=cursor_read_to_end_of_line
35 #=cursor_column
36 #=cursor_lineno
37 #=braille_flush
38 KEY_FENRIR,KEY_CTRL,KEY_T=braille_return_to_cursor
39 #=braille_pan_left
40 #=braille_pan_right
41 KEY_FENRIR,KEY_CTRL,KEY_1=clear_bookmark_1
42 KEY_FENRIR,KEY_SHIFT,KEY_1=set_bookmark_1
43 KEY_FENRIR,KEY_1=bookmark_1
44 KEY_FENRIR,KEY_K=bookmark_1
45 KEY_FENRIR,KEY_CTRL,KEY_2=clear_bookmark_2
46 KEY_FENRIR,KEY_SHIFT,KEY_2=set_bookmark_2
47 KEY_FENRIR,KEY_2=bookmark_2
48 KEY_FENRIR,KEY_CTRL,KEY_3=clear_bookmark_3
49 KEY_FENRIR,KEY_SHIFT,KEY_3=set_bookmark_3
50 KEY_FENRIR,KEY_3=bookmark_3
51 KEY_FENRIR,KEY_CTRL,KEY_4=clear_bookmark_4
52 KEY_FENRIR,KEY_SHIFT,KEY_4=set_bookmark_4
53 KEY_FENRIR,KEY_4=bookmark_4
54 KEY_FENRIR,KEY_CTRL,KEY_5=clear_bookmark_5
55 KEY_FENRIR,KEY_SHIFT,KEY_5=set_bookmark_5
56 KEY_FENRIR,KEY_5=bookmark_5
57 KEY_FENRIR,KEY_CTRL,KEY_6=clear_bookmark_6
58 KEY_FENRIR,KEY_SHIFT,KEY_6=set_bookmark_6
59 KEY_FENRIR,KEY_6=bookmark_6
60 KEY_FENRIR,KEY_CTRL,KEY_7=clear_bookmark_7
61 KEY_FENRIR,KEY_SHIFT,KEY_7=set_bookmark_7
62 KEY_FENRIR,KEY_7=bookmark_7
63 KEY_FENRIR,KEY_CTRL,KEY_8=clear_bookmark_8
64 KEY_FENRIR,KEY_SHIFT,KEY_8=set_bookmark_8
65 KEY_FENRIR,KEY_8=bookmark_8
66 KEY_FENRIR,KEY_CTRL,KEY_9=clear_bookmark_9
67 KEY_FENRIR,KEY_SHIFT,KEY_9=set_bookmark_9
68 KEY_FENRIR,KEY_9=bookmark_9
69 KEY_FENRIR,KEY_CTRL,KEY_0=clear_bookmark_10
70 KEY_FENRIR,KEY_SHIFT,KEY_0=set_bookmark_10
71 KEY_FENRIR,KEY_0=bookmark_10
72 KEY_FENRIR,KEY_KPSLASH=set_window_application
73 2,KEY_FENRIR,KEY_KPSLASH=clear_window_application
74 KEY_KPPLUS=last_incoming
75 #=toggle_braille
76 KEY_FENRIR,KEY_F3=toggle_sound
77 KEY_FENRIR,KEY_F4=toggle_speech
78 KEY_KPENTER=temp_disable_speech
79 KEY_FENRIR,KEY_P=toggle_punctuation_level
80 KEY_FENRIR,KEY_RIGHTBRACE=toggle_auto_spell_check
81 KEY_FENRIR,KEY_S=toggle_output
82 KEY_FENRIR,KEY_CTRL,KEY_E=toggle_emoticons
83 key_FENRIR,KEY_5=toggle_auto_read
84 KEY_FENRIR,KEY_CTRL,KEY_T=toggle_auto_time
85 KEY_FENRIR,KEY_KPASTERISK=toggle_highlight_tracking
86 KEY_FENRIR,KEY_KPMINUS=toggle_barrier
87 KEY_FENRIR,KEY_Q=quit_fenrir
88 KEY_FENRIR,KEY_T=time
89 KEY_FENRIR,KEY_F12=time
90 2,KEY_FENRIR,KEY_T=date
91 2,KEY_FENRIR,KEY_F12=date
92 KEY_KPSLASH=toggle_auto_indent
93 KEY_FENRIR,KEY_F=attribute_cursor
94 #=toggle_has_attribute
95 KEY_FENRIR,KEY_F7=spell_check
96 2,KEY_FENRIR,KEY_S=add_word_to_spell_check
97 KEY_FENRIR,KEY_SHIFT,KEY_S=remove_word_from_spell_check
98 KEY_FENRIR,KEY_F2=forward_keypress
99 KEY_FENRIR,KEY_ALT,KEY_UP=inc_sound_volume
100 KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_sound_volume
101 #=clear_clipboard
102 KEY_FENRIR,KEY_HOME=first_clipboard
103 KEY_FENRIR,KEY_END=last_clipboard
104 KEY_FENRIR,KEY_PAGEUP=prev_clipboard
105 KEY_FENRIR,KEY_PAGEDOWN=next_clipboard
106 KEY_FENRIR,KEY_SHIFT,KEY_C=curr_clipboard
107 KEY_FENRIR,KEY_C=copy_marked_to_clipboard
108 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_C=copy_last_echo_to_clipboard
109 KEY_FENRIR,KEY_V=paste_clipboard
110 KEY_FENRIR,KEY_F5=import_clipboard_from_file
111 KEY_FENRIR,KEY_F6=export_clipboard_to_file
112 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks
113 KEY_FENRIR,KEY_F9=set_mark
114 KEY_FENRIR,KEY_F10=marked_text
115 KEY_FENRIR,KEY_F10=toggle_vmenu_mode
116 KEY_FENRIR,KEY_SPACE=current_quick_menu_entry
117 KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value
118 KEY_FENRIR,KEY_CTRL,KEY_RIGHT=next_quick_menu_entry
119 KEY_FENRIR,KEY_CTRL,KEY_UP=next_quick_menu_value
120 KEY_FENRIR,KEY_CTRL,KEY_LEFT=prev_quick_menu_entry
121 KEY_FENRIR,KEY_CTRL,KEY_DOWN=prev_quick_menu_value
122 KEY_FENRIR,KEY_CTRL,KEY_C=save_settings
123 # linux specific
124 #=import_clipboard_from_x
125 KEY_FENRIR,KEY_F8=export_clipboard_to_x
126 KEY_FENRIR,KEY_ALT,KEY_UP=inc_alsa_volume
127 KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_alsa_volume
0 KEY_FENRIR,KEY_F1=toggle_tutorial_mode
1 KEY_FENRIR,KEY_H=toggle_tutorial_mode
2 KEY_CTRL=shut_up
3 KEY_FENRIR,KEY_CTRL,KEY_END=review_bottom
4 KEY_FENRIR,KEY_CTRL,KEY_HOME=review_top
5 KEY_FENRIR,KEY_SHIFT,KEY_DOT=review_curr_line
6 KEY_FENRIR,KEY_U=review_prev_line
7 KEY_FENRIR,KEY_O=review_next_line
8 KEY_FENRIR,KEY_HOME=review_line_begin
9 KEY_FENRIR,KEY_END=review_line_end
10 KEY_FENRIR,KEY_CTRL,KEY_J=review_line_first_char
11 KEY_FENRIR,KEY_CTRL,KEY_L=review_line_last_char
12 KEY_FENRIR,KEY_ALT,KEY_1=present_first_line
13 KEY_FENRIR,KEY_ALT,KEY_2=present_last_line
14 KEY_FENRIR,KEY_CTRL,KEY_DOT=review_curr_word
15 KEY_FENRIR,KEY_J=review_prev_word
16 KEY_FENRIR,KEY_L=review_next_word
17 2,KEY_FENRIR,KEY_CTRL,KEY_DOT=review_curr_word_phonetic
18 2,KEY_FENRIR,KEY_J=review_prev_word_phonetic
19 2,KEY_FENRIR,KEY_L=review_next_word_phonetic
20 KEY_FENRIR,KEY_COMMA=review_curr_char
21 KEY_FENRIR,KEY_M=review_prev_char
22 KEY_FENRIR,KEY_DOT=review_next_char
23 2,KEY_FENRIR,KEY_COMMA=curr_char_phonetic
24 2,KEY_FENRIR,KEY_M=prev_char_phonetic
25 2,KEY_FENRIR,KEY_DOT=next_char_phonetic
26 KEY_FENRIR,KEY_CTRL,KEY_I=review_up
27 KEY_FENRIR,KEY_CTRL,KEY_COMMA=review_down
28 KEY_FENRIR,KEY_SLASH=exit_review
29 KEY_FENRIR,KEY_SHIFT,KEY_DOT=cursor_position
30 2,KEY_FENRIR,KEY_I=indent_curr_line
31 KEY_FENRIR,KEY_B=curr_screen
32 KEY_FENRIR,KEY_SHIFT,KEY_I=curr_screen_before_cursor
33 KEY_FENRIR,KEY_SHIFT,KEY_COMMA=curr_screen_after_cursor
34 KEY_FENRIR,KEY_SHIFT,KEY_PAGEDOWN=cursor_read_to_end_of_line
35 #=cursor_column
36 #=cursor_lineno
37 #=braille_flush
38 KEY_FENRIR,KEY_CTRL,KEY_T=braille_return_to_cursor
39 #=braille_pan_left
40 #=braille_pan_right
41 KEY_FENRIR,KEY_CTRL,KEY_1=clear_bookmark_1
42 KEY_FENRIR,KEY_SHIFT,KEY_1=set_bookmark_1
43 KEY_FENRIR,KEY_1=bookmark_1
44 KEY_FENRIR,KEY_K=bookmark_1
45 KEY_FENRIR,KEY_CTRL,KEY_2=clear_bookmark_2
46 KEY_FENRIR,KEY_SHIFT,KEY_2=set_bookmark_2
47 KEY_FENRIR,KEY_2=bookmark_2
48 KEY_FENRIR,KEY_CTRL,KEY_3=clear_bookmark_3
49 KEY_FENRIR,KEY_SHIFT,KEY_3=set_bookmark_3
50 KEY_FENRIR,KEY_3=bookmark_3
51 KEY_FENRIR,KEY_CTRL,KEY_4=clear_bookmark_4
52 KEY_FENRIR,KEY_SHIFT,KEY_4=set_bookmark_4
53 KEY_FENRIR,KEY_4=bookmark_4
54 KEY_FENRIR,KEY_CTRL,KEY_5=clear_bookmark_5
55 KEY_FENRIR,KEY_SHIFT,KEY_5=set_bookmark_5
56 KEY_FENRIR,KEY_5=bookmark_5
57 KEY_FENRIR,KEY_CTRL,KEY_6=clear_bookmark_6
58 KEY_FENRIR,KEY_SHIFT,KEY_6=set_bookmark_6
59 KEY_FENRIR,KEY_6=bookmark_6
60 KEY_FENRIR,KEY_CTRL,KEY_7=clear_bookmark_7
61 KEY_FENRIR,KEY_SHIFT,KEY_7=set_bookmark_7
62 KEY_FENRIR,KEY_7=bookmark_7
63 KEY_FENRIR,KEY_CTRL,KEY_8=clear_bookmark_8
64 KEY_FENRIR,KEY_SHIFT,KEY_8=set_bookmark_8
65 KEY_FENRIR,KEY_8=bookmark_8
66 KEY_FENRIR,KEY_CTRL,KEY_9=clear_bookmark_9
67 KEY_FENRIR,KEY_SHIFT,KEY_9=set_bookmark_9
68 KEY_FENRIR,KEY_9=bookmark_9
69 KEY_FENRIR,KEY_CTRL,KEY_0=clear_bookmark_10
70 KEY_FENRIR,KEY_SHIFT,KEY_0=set_bookmark_10
71 KEY_FENRIR,KEY_0=bookmark_10
72 KEY_FENRIR,KEY_CTRL,KEY_8=set_window_application
73 2,KEY_FENRIR,KEY_CTRL,KEY_8=clear_window_application
74 KEY_FENRIR,KEY_SEMICOLON=last_incoming
75 #=toggle_braille
76 KEY_FENRIR,KEY_F3=toggle_sound
77 KEY_FENRIR,KEY_F4=toggle_speech
78 KEY_FENRIR,KEY_ENTER=temp_disable_speech
79 KEY_FENRIR,KEY_P=toggle_punctuation_level
80 KEY_FENRIR,KEY_RIGHTBRACE=toggle_auto_spell_check
81 KEY_FENRIR,KEY_S=toggle_output
82 KEY_FENRIR,KEY_SHIFT,KEY_E=toggle_emoticons
83 KEY_FENRIR,KEY_5=toggle_auto_read
84 KEY_FENRIR,KEY_CTRL,KEY_T=toggle_auto_time
85 KEY_FENRIR,KEY_Y=toggle_highlight_tracking
86 #=toggle_barrier
87 KEY_FENRIR,KEY_Q=quit_fenrir
88 KEY_FENRIR,KEY_T=time
89 KEY_FENRIR,KEY_F12=time
90 2,KEY_FENRIR,KEY_T=date
91 2,KEY_FENRIR,KEY_F12=date
92 KEY_FENRIR,KEY_BACKSLASH=toggle_auto_indent
93 KEY_FENRIR,KEY_F=attribute_cursor
94 #=toggle_has_attribute
95 KEY_FENRIR,KEY_F7=spell_check
96 2,KEY_FENRIR,KEY_S=add_word_to_spell_check
97 KEY_FENRIR,KEY_SHIFT,KEY_S=remove_word_from_spell_check
98 KEY_FENRIR,KEY_F2=forward_keypress
99 KEY_FENRIR,KEY_ALT,KEY_UP=inc_sound_volume
100 KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_sound_volume
101 #=clear_clipboard
102 #=first_clipboard
103 #=last_clipboard
104 KEY_FENRIR,KEY_PAGEUP=prev_clipboard
105 KEY_FENRIR,KEY_PAGEDOWN=next_clipboard
106 KEY_FENRIR,KEY_SHIFT,KEY_C=curr_clipboard
107 KEY_FENRIR,KEY_C=copy_marked_to_clipboard
108 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_C=copy_last_echo_to_clipboard
109 KEY_FENRIR,KEY_V=paste_clipboard
110 KEY_FENRIR,KEY_F5=import_clipboard_from_file
111 KEY_FENRIR,KEY_F6=export_clipboard_to_file
112 KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks
113 KEY_FENRIR,KEY_F9=set_mark
114 KEY_FENRIR,KEY_F10=marked_text
115 KEY_FENRIR,KEY_SHIFT,KEY_F10=toggle_vmenu_mode
116 KEY_FENRIR,KEY_SPACE=current_quick_menu_entry
117 KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value
118 KEY_FENRIR,KEY_CTRL,KEY_RIGHT=next_quick_menu_entry
119 KEY_FENRIR,KEY_CTRL,KEY_UP=next_quick_menu_value
120 KEY_FENRIR,KEY_CTRL,KEY_LEFT=prev_quick_menu_entry
121 KEY_FENRIR,KEY_CTRL,KEY_DOWN=prev_quick_menu_value
122 KEY_FENRIR,KEY_CTRL,KEY_C=save_settings
123 # linux specific
124 #=import_clipboard_from_x
125 KEY_FENRIR,KEY_F8=export_clipboard_to_x
126 KEY_FENRIR,KEY_ALT,KEY_UP=inc_alsa_volume
127 KEY_FENRIR,KEY_ALT,KEY_DOWN=dec_alsa_volume
0 # This file contains terminal escape sequences as shortcut
1 # It is used for PTY screen / Input driver (Terminal emulation)
2 # ^[ is used as escape
3
04 # f1 - fenrir help
15 ^[OP=toggle_tutorial_mode
26 # double tap control+end read attributes
0 # This file contains terminal escape sequences as shortcut
1 # It is used for PTY screen / Input driver (Terminal emulation)
2 # ^[ is used as escape
3
04 ^[h=toggle_tutorial_mode
15 ^[/=shut_up
26 ^[[D=shut_up
4545 [customDict]
4646
4747 [emoticonDict]
48 :):===:Grins
49 ;):===:Zwinker
50 XD:===:loool
51 :D:===:Lach
52 <{-.-}>:===:Raves
48 # This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc.
49 regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves
50 regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses
51 regex;[\s*|'|"][\s*|'|"]:-/:===:confused
52 regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged
53 regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing
54 regex;[\s*|'|"][\s*|'|"]8-X:===:skull
55 regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile
56 regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile
57 regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray
58 regex;[\s*|'|"][\s*|'|"]:/:===:confused
59 regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses
60 regex;[\s*|'|"]:D[\s*|'|"]:===:laugh
61 regex;[\s*|'|"];\)[\s*|'|"]:===:wink
62 regex;[\s*|'|"]XD[\s*|'|"]:===:LOL
63 regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile
64 regex;[\s*|'|"]:\)[\s*|'|"]:===:smile
65 regex;[\s*|'|"]->[\s*|'|"]:===:arrow right
66 # example for arrow left
67 #(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left
68 # or
69 #([ |^])<-([ ,.!?$]):===:arrow left\2
70 regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left
71 regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF?
72 regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile
33 # the entrys are seperated with :===: in words colon tripple equal colon ( to not collide with substitutions)
44 [levelDict]
55 none:===:
6 some:===:-$~+*-/\@
6 some:===:-$~+*-/\@#
77 most:===:.,:-$~+*-/\@!#%^&*()[]}{<>;
88 all:===:!"#$%& \'()*+,-./:;<=>?@[\\]^_`{|}~
99
4545 [customDict]
4646
4747 [emoticonDict]
48 :):===:smile
49 ;):===:wink
50 XD:===:LOL
51 :D:===:laugh
52 <{-.-}>:===:Raves
53 \o/:===:Hurray
48 # This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc.
49 regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves
50 regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses
51 regex;[\s*|'|"][\s*|'|"]:-/:===:confused
52 regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged
53 regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing
54 regex;[\s*|'|"][\s*|'|"]8-X:===:skull
55 regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile
56 regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile
57 regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray
58 regex;[\s*|'|"][\s*|'|"]:/:===:confused
59 regex;[\s*|'|"]:D[\s*|'|"]:===:laugh
60 regex;[\s*|'|"];\)[\s*|'|"]:===:wink
61 regex;[\s*|'|"]XD[\s*|'|"]:===:LOL
62 regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile
63 regex;[\s*|'|"]:\)[\s*|'|"]:===:smile
64 regex;[\s*|'|"]->[\s*|'|"]:===:arrow right
65 # example for arrow left
66 #(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left
67 # or
68 #([ |^])<-([ ,.!?$]):===:arrow left\2
69 regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left
70 regex;[\s+|'|"](Oo)|(oO)[\s+|'|"]:===:WTF?
71 regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile
4545 [customDict]
4646
4747 [emoticonDict]
48 :):===:smile
49 ;):===:twinker
50 XD:===:loool
51 :D:===:lought
52 <{-.-}>:===:Raves
48 # This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc.
49 regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves
50 regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses
51 regex;[\s*|'|"][\s*|'|"]:-/:===:confused
52 regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged
53 regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing
54 regex;[\s*|'|"][\s*|'|"]8-X:===:skull
55 regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile
56 regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile
57 regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray
58 regex;[\s*|'|"][\s*|'|"]:/:===:confused
59 regex;[\s*|'|"]:D[\s*|'|"]:===:laugh
60 regex;[\s*|'|"];\)[\s*|'|"]:===:wink
61 regex;[\s*|'|"]XD[\s*|'|"]:===:LOL
62 regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile
63 regex;[\s*|'|"]:\)[\s*|'|"]:===:smile
64 regex;[\s*|'|"]->[\s*|'|"]:===:arrow right
65 # example for arrow left
66 #(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left
67 # or
68 #([ |^])<-([ ,.!?$]):===:arrow left\2
69 regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left
70 regex;[\s+|'|"][O|o][O|o][\s+|'|"]:===:WTF?
71 regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile
4545 [customDict]
4646
4747 [emoticonDict]
48 :):===:sonrisa
49 ;):===:twinker
50 XD:===:loool
51 :D:===:lought
52 <{-.-}>:===:Raves
48 # This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc.
49 regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves
50 regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses
51 regex;[\s*|'|"][\s*|'|"]:-/:===:confused
52 regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged
53 regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing
54 regex;[\s*|'|"][\s*|'|"]8-X:===:skull
55 regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile
56 regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile
57 regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray
58 regex;[\s*|'|"][\s*|'|"]:/:===:confused
59 regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses
60 regex;[\s*|'|"]:D[\s*|'|"]:===:laugh
61 regex;[\s*|'|"];\)[\s*|'|"]:===:wink
62 regex;[\s*|'|"]XD[\s*|'|"]:===:LOL
63 regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile
64 regex;[\s*|'|"]:\)[\s*|'|"]:===:smile
65 regex;[\s*|'|"]->[\s*|'|"]:===:arrow right
66 # example for arrow left
67 #(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left
68 # or
69 #([ |^])<-([ ,.!?$]):===:arrow left\2
70 regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left
71 regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF?
72 regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile
4545 [customDict]
4646
4747 [emoticonDict]
48 :):===:sourire
49 ;):===:clin d'oeil
50 XD:===:explosé de rire
51 :D:===:rire
52 <{-.-}>:===:Raves
48 # This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc.
49 regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves
50 regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses
51 regex;[\s*|'|"][\s*|'|"]:-/:===:confused
52 regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged
53 regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing
54 regex;[\s*|'|"][\s*|'|"]8-X:===:skull
55 regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile
56 regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile
57 regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray
58 regex;[\s*|'|"][\s*|'|"]:/:===:confused
59 regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses
60 regex;[\s*|'|"]:D[\s*|'|"]:===:laugh
61 regex;[\s*|'|"];\)[\s*|'|"]:===:wink
62 regex;[\s*|'|"]XD[\s*|'|"]:===:LOL
63 regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile
64 regex;[\s*|'|"]:\)[\s*|'|"]:===:smile
65 regex;[\s*|'|"]->[\s*|'|"]:===:arrow right
66 # example for arrow left
67 #(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left
68 # or
69 #([ |^])<-([ ,.!?$]):===:arrow left\2
70 regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left
71 regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF?
72 regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile
4545 [customDict]
4646
4747 [emoticonDict]
48 :):===:smile
49 ;):===:twinker
50 XD:===:loool
51 :D:===:lought
52 <{-.-}>:===:Raves
48 # This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc.
49 regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves
50 regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses
51 regex;[\s*|'|"][\s*|'|"]:-/:===:confused
52 regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged
53 regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing
54 regex;[\s*|'|"][\s*|'|"]8-X:===:skull
55 regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile
56 regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile
57 regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray
58 regex;[\s*|'|"][\s*|'|"]:/:===:confused
59 regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses
60 regex;[\s*|'|"]:D[\s*|'|"]:===:laugh
61 regex;[\s*|'|"];\)[\s*|'|"]:===:wink
62 regex;[\s*|'|"]XD[\s*|'|"]:===:LOL
63 regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile
64 regex;[\s*|'|"]:\)[\s*|'|"]:===:smile
65 regex;[\s*|'|"]->[\s*|'|"]:===:arrow right
66 # example for arrow left
67 #(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left
68 # or
69 #([ |^])<-([ ,.!?$]):===:arrow left\2
70 regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left
71 regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF?
72 regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile
147147
148148 [general]
149149 debugLevel=0
150 # debugMode sets where the debug output should send to:
151 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
152 # debugMode=Print just prints on the screen
150153 debugMode=File
151 debugFile=/var/log/fenrirscreenreader/fenrir.log
154 debugFile=
152155 punctuationProfile=default
153156 punctuationLevel=some
154157 respectPunctuationPause=True
160163 emoticons=True
161164 # define the current Fenrir key
162165 fenrirKeys=KEY_KP0,KEY_META
163 scriptKey=KEY_COMPOSE
166 scriptKeys=KEY_COMPOSE
164167 timeFormat=%H:%M:%P
165168 dateFormat=%A, %B %d, %Y
166169 autoSpellCheck=True
194197 # tcp port
195198 port=22447
196199 # socket filepath
197 socketpath=/tmp/
200 socketFile=
198201 # allow settings to overwrite
199202 enableSettingsRemote=True
200203 # allow commands to be executed
217220 enabled=True
218221 inactiveTimeoutSec=120
219222 list=
223
224 [menu]
225 vmenuPath=
226 quickMenu=speech#rate;speech#pitch;speech#volume
220227
221228 [time]
222229 enabled=False
150150 [general]
151151 debugLevel=0
152152 # debugMode sets where the debug output should send to:
153 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
153 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
154154 # debugMode=Print just prints on the screen
155155 debugMode=File
156 debugFile=/var/log/fenrirscreenreader/fenrir.log
156 debugFile=
157157 punctuationProfile=default
158158 punctuationLevel=some
159159 respectPunctuationPause=True
166166 emoticons=True
167167 # define the current Fenrir key
168168 fenrirKeys=KEY_KP0,KEY_META,KEY_INSERT
169 scriptKey=KEY_COMPOSE
169 scriptKeys=KEY_COMPOSE
170170 timeFormat=%H:%M:%P
171171 dateFormat=%A, %B %d, %Y
172172 autoSpellCheck=True
173173 spellCheckLanguage=en_US
174 # path for your scripts "scriptKey" functionality
174 # path for your scripts "scriptKeys" functionality
175175 scriptPath=/usr/share/fenrirscreenreader/scripts
176176 # overload commands, and create new one without changing Fenrir default
177177 commandPath=
204204 # tcp port
205205 port=22447
206206 # socket filepath
207 socketpath=/tmp/
207 socketFile=
208208 # allow settings to overwrite
209209 enableSettingsRemote=True
210210 # allow commands to be executed
227227 enabled=True
228228 inactiveTimeoutSec=120
229229 list=
230
231 [menu]
232 vmenuPath=
233 quickMenu=speech#rate;speech#pitch;speech#volume
230234
231235 [time]
232236 # automatic time anouncement
150150 [general]
151151 debugLevel=0
152152 # debugMode sets where the debug output should send to:
153 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
153 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
154154 # debugMode=Print just prints on the screen
155155 debugMode=File
156 debugFile=/var/log/fenrirscreenreader/fenrir.log
156 debugFile=
157157 punctuationProfile=default
158158 punctuationLevel=some
159159 respectPunctuationPause=True
166166 emoticons=True
167167 # define the current Fenrir key
168168 fenrirKeys=KEY_KP0,KEY_META,KEY_INSERT
169 scriptKey=KEY_COMPOSE
169 scriptKeys=KEY_COMPOSE
170170 timeFormat=%H:%M:%P
171171 dateFormat=%A, %B %d, %Y
172172 autoSpellCheck=True
173173 spellCheckLanguage=en_US
174 # path for your scripts "scriptKey" functionality
174 # path for your scripts "scriptKeys" functionality
175175 scriptPath=/usr/share/fenrirscreenreader/scripts
176176 # overload commands, and create new one without changing Fenrir default
177177 commandPath=
204204 # tcp port
205205 port=22447
206206 # socket filepath
207 socketpath=/tmp/
207 socketFile=
208208 # allow settings to overwrite
209209 enableSettingsRemote=True
210210 # allow commands to be executed
227227 enabled=True
228228 inactiveTimeoutSec=120
229229 list=
230
231 [menu]
232 vmenuPath=
233 quickMenu=speech#rate;speech#pitch;speech#volume
230234
231235 [time]
232236 # automatic time anouncement
5252
5353 # Module is used for Speech-dispatcher, to select the speech module you want to use.
5454 # Consult Speech-dispatcher's configuration and help Fenrir find out which modules are available.
55 # The default is espeak.
56 #module=espeak
57
58 # Voice selects the varient you want to use, for example, f5 will use the female voice #5 in Espeak,
59 # or if using the Espeak module in Speech-dispatcher. To find out which voices are available, consult the documentation provided with your selected synthesizer.
55 # The default is specified in speechd.conf.
56 #module=espeak-ng
57
58 # Voice selects the voice you want to use, for example, en-GB-scotland will use the Scotish English voice in Espeak,
59 # To find out which voices are available, consult the documentation provided with your selected synthesizer.
6060 # This also sets the voice used in the generic driver.
61 voice=en-us
61 # You can add a variant by adding +name onto the end.
62 # voice=en-us
6263
6364 # Select the language you want Fenrir to use.
64 #language=english-us
65 #language=en
6566
6667 # Read new text as it happens?
6768 autoReadIncoming=True
7778 # fenrirVolume = is replaced with the current volume
7879 # fenrirPitch = is replaced with the current pitch
7980 # fenrirRate = is replaced with the current speed (speech rate)
80 genericSpeechCommand=espeak -a fenrirVolume -s fenrirRate -p fenrirPitch -v fenrirVoice -- "fenrirText"
81 genericSpeechCommand=espeak-ng -a fenrirVolume -s fenrirRate -p fenrirPitch -v fenrirVoice -- "fenrirText"
8182
8283 # those are the min and max values of the TTS system that is used in genericSpeechCommand
8384 fenrirMinVolume=0
141142 # echo word after pressing space
142143 wordEcho=False
143144 # interrupt speech on any keypress
144 interruptOnKeyPress=False
145 interruptOnKeyPress=True
145146 # you can filter the keys on that the speech should interrupt (empty = all keys, otherwhise the given keys)
146147 interruptOnKeyPressFilter=
147148 # timeout for double tap in sec
150151 [general]
151152 debugLevel=0
152153 # debugMode sets where the debug output should send to:
153 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
154 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
154155 # debugMode=Print just prints on the screen
155156 debugMode=File
156 debugFile=/var/log/fenrirscreenreader/fenrir.log
157 debugFile=
157158 punctuationProfile=default
158159 punctuationLevel=some
159160 respectPunctuationPause=True
166167 emoticons=True
167168 # define the current Fenrir key
168169 fenrirKeys=KEY_KP0,KEY_META,KEY_INSERT
169 scriptKey=KEY_COMPOSE
170 scriptKeys=KEY_COMPOSE
170171 timeFormat=%H:%M:%P
171172 dateFormat=%A, %B %d, %Y
172173 autoSpellCheck=True
173174 spellCheckLanguage=en_US
174 # path for your scripts "scriptKey" functionality
175 # path for your scripts "scriptKeys" functionality
175176 scriptPath=/usr/share/fenrirscreenreader/scripts
176177 # overload commands, and create new one without changing Fenrir default
177178 commandPath=
204205 # tcp port
205206 port=22447
206207 # socket filepath
207 socketpath=/tmp/
208 socketFile=
208209 # allow settings to overwrite
209210 enableSettingsRemote=True
210211 # allow commands to be executed
227228 enabled=True
228229 inactiveTimeoutSec=120
229230 list=
231
232 [menu]
233 vmenuPath=
234 quickMenu=speech#rate;speech#pitch;speech#volume
230235
231236 [time]
232237 # automatic time anouncement
151151 [general]
152152 debugLevel=0
153153 # debugMode sets where the debug output should send to:
154 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
154 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
155155 # debugMode=Print just prints on the screen
156156 debugMode=File
157 debugFile=/var/log/fenrirscreenreader/fenrir.log
157 debugFile=
158158 punctuationProfile=default
159159 punctuationLevel=some
160160 respectPunctuationPause=True
205205 # tcp port
206206 port=22447
207207 # socket filepath
208 socketpath=/tmp/
208 socketFile=
209209 # allow settings to overwrite
210210 enableSettingsRemote=True
211211 # allow commands to be executed
228228 enabled=True
229229 inactiveTimeoutSec=120
230230 list=
231
232 [menu]
233 vmenuPath=
234 quickMenu=speech#rate;speech#pitch;speech#volume
231235
232236 [time]
233237 # automatic time anouncement
9797 doubleTapTimeout=0.2
9898
9999 [general]
100 debugLevel=1
100 debugLevel=0
101101 # debugMode sets where the debug output should send to:
102 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
102 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
103103 # debugMode=Print just prints on the screen
104104 debugMode=File
105 debugFile=/var/log/fenrirscreenreader/fenrir.log
105 debugFile=
106106 punctuationProfile=default
107107 punctuationLevel=some
108108 respectPunctuationPause=True
150150 # tcp port
151151 port=22447
152152 # socket filepath
153 socketpath=/tmp/
153 socketFile=
154154 # allow settings to overwrite
155155 enableSettingsRemote=True
156156 # allow commands to be executed
174174 inactiveTimeoutSec=120
175175 list=
176176
177 [menu]
178 vmenuPath=
179 quickMenu=speech#rate;speech#pitch;speech#volume
180
177181 [time]
178182 # automatic time anouncement
179183 enabled=False
150150 [general]
151151 debugLevel=0
152152 # debugMode sets where the debug output should send to:
153 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
153 # debugMode=File writes to debugFile (Default:/tmp/fenrir-PID.log)
154154 # debugMode=Print just prints on the screen
155155 debugMode=File
156 debugFile=/var/log/fenrirscreenreader/fenrir.log
156 debugFile=
157157 punctuationProfile=default
158158 punctuationLevel=some
159159 respectPunctuationPause=True
166166 emoticons=True
167167 # define the current Fenrir key
168168 fenrirKeys=KEY_KP0,KEY_META,KEY_INSERT
169 scriptKey=KEY_COMPOSE
169 scriptKeys=KEY_COMPOSE
170170 timeFormat=%H:%M:%P
171171 dateFormat=%A, %B %d, %Y
172172 autoSpellCheck=True
173173 spellCheckLanguage=en_US
174 # path for your scripts "scriptKey" functionality
174 # path for your scripts "scriptKeys" functionality
175175 scriptPath=/usr/share/fenrirscreenreader/scripts
176176 # overload commands, and create new one without changing Fenrir default
177177 commandPath=
204204 # tcp port
205205 port=22447
206206 # socket filepath
207 socketpath=/tmp/
207 socketFile=
208208 # allow settings to overwrite
209209 enableSettingsRemote=True
210210 # allow commands to be executed
227227 enabled=True
228228 inactiveTimeoutSec=120
229229 list=
230
231 [menu]
232 vmenuPath=
233 quickMenu=speech#rate;speech#pitch;speech#volume
230234
231235 [time]
232236 # automatic time anouncement
0 fenrir (1.9.5-3) UNRELEASED; urgency=medium
0 fenrir (1.9.7.1-1) UNRELEASED; urgency=medium
11
2 [ Samuel Thibault ]
23 * watch: Generalize pattern.
34 * control: Update alioth list domain.
45 * control: Bump Standards-Version to 4.5.0 (no change)
56 * Bump debhelper from 10 to 12.
67 * control: Set Rules-Requires-Root to no.
78
8 -- Samuel Thibault <sthibault@debian.org> Thu, 19 Sep 2019 01:53:53 +0200
9 [ Debian Janitor ]
10 * New upstream release.
11
12 -- Samuel Thibault <sthibault@debian.org> Sun, 22 Aug 2021 09:07:08 -0000
913
1014 fenrir (1.9.5-2) unstable; urgency=medium
1115
1616 cp -af "config/scripts/wlan__-__key_y.sh" /usr/share/fenrirscreenreader/scripts/
1717
1818 # keyboard
19 install -m644 -D "config/keyboard/desktop.conf" /etc/fenrirscreenreader/keyboard/desktop.conf
20 install -m644 -D "config/keyboard/laptop.conf" /etc/fenrirscreenreader/keyboard/laptop.conf
19 for i in "config/keyboard/"*.conf ; do
20 install -m644 -D "$i" "/etc/fenrirscreenreader/keyboard/${i##*/}"
21 done
2122
2223 # punctuation
2324 install -m755 -d /etc/fenrirscreenreader/punctuation
5051 install path:/opt/fenrirscreenreader
5152 settings path:/etc/fenrirscreenreader
5253
53 To test Fenrir
54 sudo systemctl start fenrir
55 To have Fenrir start on system boot:
54 To test Fenrir:
55 sudo fenrir
56
57 To have Fenrir start on system boot using systemd:
58 download service file: https://raw.githubusercontent.com/chrys87/fenrir/master/autostart/systemd/Arch/fenrir.service
59 move the service file to: /etc/systemd/system/fenrir.service
5660 sudo systemctl enable fenrir
5761
5862 Pulseaudio users may want to run
0 # SOME DESCRIPTIVE TITLE.
1 # Copyright (C) YEAR ORGANIZATION
2 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
3 #
4 msgid ""
5 msgstr ""
6 "Project-Id-Version: PACKAGE VERSION\n"
7 "POT-Creation-Date: 2020-04-19 09:11+0700\n"
8 "PO-Revision-Date: 2020-04-19 19:26+07\n"
9 "Last-Translator: denis rybin <mejdugorka@yandex.ru>\n"
10 "Language-Team: russian \n"
11 "MIME-Version: 1.0\n"
12 "Content-Type: text/plain; charset=UTF-8\n"
13 "Content-Transfer-Encoding: 8bit\n"
14 "Generated-By: pygettext.py 1.5\n"
15
16
17 #: ../src/fenrirscreenreader/commands/commands/add_word_to_spell_check.py:27
18 msgid "adds the current word to the exceptions dictionary"
19 msgstr "добавляет текущее слово в словарь исключение"
20
21 #: ../src/fenrirscreenreader/commands/commands/add_word_to_spell_check.py:34
22 #: ../src/fenrirscreenreader/commands/commands/remove_word_from_spell_check.py:34
23 #: ../src/fenrirscreenreader/commands/commands/spell_check.py:35
24 msgid "pyenchant is not installed"
25 msgstr "pyenchant не установлен"
26
27 #: ../src/fenrirscreenreader/commands/commands/add_word_to_spell_check.py:49
28 msgid "{0} is already in dictionary"
29 msgstr "{0} уже находится в словаре"
30
31 #: ../src/fenrirscreenreader/commands/commands/add_word_to_spell_check.py:52
32 msgid "{0} added to dictionary"
33 msgstr "{0} добавлено в словарь"
34
35 #: ../src/fenrirscreenreader/commands/commands/attribute_cursor.py:18
36 #: ../src/fenrirscreenreader/commands/onCursorChange/85000-has_attribute.py:18
37 msgid "Reads attributes of current cursor position"
38 msgstr "Читает атрибуты текущей позиции курсора"
39
40 #: ../src/fenrirscreenreader/commands/commands/bookmark_1.py:19
41 #: ../src/fenrirscreenreader/commands/commands/bookmark_10.py:19
42 #: ../src/fenrirscreenreader/commands/commands/bookmark_2.py:19
43 #: ../src/fenrirscreenreader/commands/commands/bookmark_3.py:19
44 #: ../src/fenrirscreenreader/commands/commands/bookmark_4.py:19
45 #: ../src/fenrirscreenreader/commands/commands/bookmark_5.py:19
46 #: ../src/fenrirscreenreader/commands/commands/bookmark_6.py:19
47 #: ../src/fenrirscreenreader/commands/commands/bookmark_7.py:19
48 #: ../src/fenrirscreenreader/commands/commands/bookmark_8.py:19
49 #: ../src/fenrirscreenreader/commands/commands/bookmark_9.py:19
50 msgid "read Bookmark {0}"
51 msgstr "чтение закладки {0}"
52
53 #: ../src/fenrirscreenreader/commands/commands/bookmark_1.py:24
54 #: ../src/fenrirscreenreader/commands/commands/bookmark_10.py:24
55 #: ../src/fenrirscreenreader/commands/commands/bookmark_2.py:24
56 #: ../src/fenrirscreenreader/commands/commands/bookmark_3.py:24
57 #: ../src/fenrirscreenreader/commands/commands/bookmark_4.py:24
58 #: ../src/fenrirscreenreader/commands/commands/bookmark_5.py:24
59 #: ../src/fenrirscreenreader/commands/commands/bookmark_6.py:24
60 #: ../src/fenrirscreenreader/commands/commands/bookmark_7.py:24
61 #: ../src/fenrirscreenreader/commands/commands/bookmark_8.py:24
62 #: ../src/fenrirscreenreader/commands/commands/bookmark_9.py:24
63 msgid "Bookmark {0} not set"
64 msgstr "Закладка {0} не установлена"
65
66 #: ../src/fenrirscreenreader/commands/commands/bookmark_1.py:27
67 #: ../src/fenrirscreenreader/commands/commands/bookmark_1.py:30
68 #: ../src/fenrirscreenreader/commands/commands/bookmark_10.py:27
69 #: ../src/fenrirscreenreader/commands/commands/bookmark_10.py:30
70 #: ../src/fenrirscreenreader/commands/commands/bookmark_2.py:27
71 #: ../src/fenrirscreenreader/commands/commands/bookmark_2.py:30
72 #: ../src/fenrirscreenreader/commands/commands/bookmark_3.py:27
73 #: ../src/fenrirscreenreader/commands/commands/bookmark_3.py:30
74 #: ../src/fenrirscreenreader/commands/commands/bookmark_4.py:27
75 #: ../src/fenrirscreenreader/commands/commands/bookmark_4.py:30
76 #: ../src/fenrirscreenreader/commands/commands/bookmark_5.py:27
77 #: ../src/fenrirscreenreader/commands/commands/bookmark_5.py:30
78 #: ../src/fenrirscreenreader/commands/commands/bookmark_6.py:27
79 #: ../src/fenrirscreenreader/commands/commands/bookmark_6.py:30
80 #: ../src/fenrirscreenreader/commands/commands/bookmark_7.py:27
81 #: ../src/fenrirscreenreader/commands/commands/bookmark_7.py:30
82 #: ../src/fenrirscreenreader/commands/commands/bookmark_8.py:27
83 #: ../src/fenrirscreenreader/commands/commands/bookmark_8.py:30
84 #: ../src/fenrirscreenreader/commands/commands/bookmark_9.py:27
85 #: ../src/fenrirscreenreader/commands/commands/bookmark_9.py:30
86 msgid "Bookmark for application {0} not set"
87 msgstr "Закладка для приложения {0} не установлена"
88
89 #: ../src/fenrirscreenreader/commands/commands/bookmark_1.py:43
90 #: ../src/fenrirscreenreader/commands/commands/bookmark_10.py:43
91 #: ../src/fenrirscreenreader/commands/commands/bookmark_2.py:43
92 #: ../src/fenrirscreenreader/commands/commands/bookmark_3.py:43
93 #: ../src/fenrirscreenreader/commands/commands/bookmark_4.py:43
94 #: ../src/fenrirscreenreader/commands/commands/bookmark_5.py:43
95 #: ../src/fenrirscreenreader/commands/commands/bookmark_6.py:43
96 #: ../src/fenrirscreenreader/commands/commands/bookmark_7.py:43
97 #: ../src/fenrirscreenreader/commands/commands/bookmark_8.py:43
98 #: ../src/fenrirscreenreader/commands/commands/bookmark_9.py:43
99 #: ../src/fenrirscreenreader/commands/commands/curr_screen_after_cursor.py:27
100 #: ../src/fenrirscreenreader/commands/commands/curr_screen_before_cursor.py:30
101 #: ../src/fenrirscreenreader/commands/commands/cursor_read_to_end_of_line.py:27
102 #: ../src/fenrirscreenreader/commands/commands/indent_curr_line.py:31
103 #: ../src/fenrirscreenreader/commands/commands/marked_text.py:33
104 #: ../src/fenrirscreenreader/commands/commands/present_first_line.py:25
105 #: ../src/fenrirscreenreader/commands/commands/present_last_line.py:25
106 #: ../src/fenrirscreenreader/commands/commands/review_curr_char_phonetic.py:27
107 #: ../src/fenrirscreenreader/commands/commands/review_curr_line.py:27
108 #: ../src/fenrirscreenreader/commands/commands/review_curr_word.py:27
109 #: ../src/fenrirscreenreader/commands/commands/review_curr_word_phonetic.py:27
110 #: ../src/fenrirscreenreader/commands/commands/review_line_begin.py:27
111 #: ../src/fenrirscreenreader/commands/commands/review_next_line.py:29
112 #: ../src/fenrirscreenreader/commands/commands/review_next_word.py:29
113 #: ../src/fenrirscreenreader/commands/commands/review_next_word_phonetic.py:27
114 #: ../src/fenrirscreenreader/commands/commands/review_prev_line.py:27
115 #: ../src/fenrirscreenreader/commands/commands/review_prev_word.py:27
116 #: ../src/fenrirscreenreader/commands/commands/review_prev_word_phonetic.py:27
117 #: ../src/fenrirscreenreader/commands/onCursorChange/65000-present_line_if_cursor_change_vertical.py:37
118 #: ../src/fenrirscreenreader/commands/onScreenUpdate/60000-history.py:59
119 msgid "blank"
120 msgstr "пусто"
121
122 #: ../src/fenrirscreenreader/commands/commands/braille_flush.py:17
123 msgid "Clear the Braille device if it is displaying a message"
124 msgstr "Очистить устройство Брайля, если оно отображает сообщение."
125
126 #: ../src/fenrirscreenreader/commands/commands/braille_pan_left.py:17
127 msgid "Move braille view to the left."
128 msgstr "Переместить брайлевский вид влево."
129
130 #: ../src/fenrirscreenreader/commands/commands/braille_pan_right.py:17
131 msgid "Move braille view to the right."
132 msgstr "Переместить брайлевский вид вправо."
133
134 #: ../src/fenrirscreenreader/commands/commands/braille_return_to_cursor.py:17
135 msgid "Set the braille view back to cursor."
136 msgstr "Установить брайлевский вид обратно на курсор."
137
138 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_1.py:17
139 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_10.py:17
140 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_2.py:17
141 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_3.py:17
142 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_4.py:17
143 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_5.py:17
144 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_6.py:17
145 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_7.py:17
146 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_8.py:17
147 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_9.py:17
148 msgid "remove Bookmark {0}"
149 msgstr "Удалить закладку {0}"
150
151 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_1.py:24
152 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_10.py:24
153 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_2.py:24
154 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_3.py:24
155 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_4.py:24
156 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_5.py:24
157 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_6.py:24
158 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_7.py:24
159 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_8.py:24
160 #: ../src/fenrirscreenreader/commands/commands/clear_bookmark_9.py:24
161 msgid "Bookmark {0} removed for application {1}"
162 msgstr "Закладка {0} удалена для приложения {1}"
163
164 #: ../src/fenrirscreenreader/commands/commands/clear_clipboard.py:17
165 msgid "clears the currently selected clipboard"
166 msgstr "Очищает текущий выбранный буфер обмена."
167
168 #: ../src/fenrirscreenreader/commands/commands/clear_clipboard.py:21
169 msgid "clipboard cleared"
170 msgstr "Буфер обмена очищен."
171
172 #: ../src/fenrirscreenreader/commands/commands/clear_window_application.py:17
173 msgid "Turn off window mode for application"
174 msgstr "Отключить режим окна для приложения."
175
176 #: ../src/fenrirscreenreader/commands/commands/clear_window_application.py:22
177 msgid "Window Mode off for application {0}"
178 msgstr "Режим окна выключен для приложения {0}"
179
180 #: ../src/fenrirscreenreader/commands/commands/clear_window_application.py:24
181 msgid "Not in window Mode"
182 msgstr "Не в режиме окна."
183
184 #:
185 #: ../src/fenrirscreenreader/commands/commands/copy_last_echo_to_clipboard.py:18
186 msgid "copies last presented text to the clipboard"
187 msgstr "Копирует последний представленный текст в буфер обмена."
188
189 #: ../src/fenrirscreenreader/commands/commands/copy_marked_to_clipboard.py:18
190 msgid "copies marked text to the currently selected clipboard"
191 msgstr "Копирует помеченный текст в выбранный буфер обмена."
192
193 #: ../src/fenrirscreenreader/commands/commands/copy_marked_to_clipboard.py:22
194 msgid "One or two marks are needed"
195 msgstr "Необходимы одна или две ментки."
196
197 #: ../src/fenrirscreenreader/commands/commands/curr_clipboard.py:17
198 msgid "speaks the contents of the currently selected clipboard"
199 msgstr "Говорит содержимое выбранного буфера обмена."
200
201 #: ../src/fenrirscreenreader/commands/commands/curr_clipboard.py:21
202 #: ../src/fenrirscreenreader/commands/commands/export_clipboard_to_file.py:28
203 #: ../src/fenrirscreenreader/commands/commands/export_clipboard_to_x.py:27
204 #: ../src/fenrirscreenreader/commands/commands/first_clipboard.py:21
205 #: ../src/fenrirscreenreader/commands/commands/last_clipboard.py:21
206 #: ../src/fenrirscreenreader/commands/commands/next_clipboard.py:21
207 #: ../src/fenrirscreenreader/commands/commands/paste_clipboard.py:23
208 #: ../src/fenrirscreenreader/commands/commands/prev_clipboard.py:21
209 msgid "clipboard empty"
210 msgstr "Буфер обмена пустой."
211
212 #: ../src/fenrirscreenreader/commands/commands/curr_screen.py:17
213 msgid "reads the contents of the current screen"
214 msgstr "Чтение содержимого текущего экрана."
215
216 #: ../src/fenrirscreenreader/commands/commands/curr_screen.py:21
217 msgid "screen is empty"
218 msgstr "Экран пустой."
219
220 #: ../src/fenrirscreenreader/commands/commands/curr_screen_after_cursor.py:18
221 msgid "reads from the cursor to the bottom of the screen"
222 msgstr "Чтение от курсора до конца экрана."
223
224 #: ../src/fenrirscreenreader/commands/commands/curr_screen_before_cursor.py:18
225 msgid "Reads from the top of the screen to the cursor position"
226 msgstr "Чтение сначала экрана до курсора."
227
228 #: ../src/fenrirscreenreader/commands/commands/current_quick_menu_entry.py:17
229 #: ../src/fenrirscreenreader/commands/quickMenu/current_quick_menu_entry.py:17
230 msgid "get current quick menu entry"
231 msgstr "Получить текущий быстрый пункт меню"
232
233 #: ../src/fenrirscreenreader/commands/commands/current_quick_menu_value.py:17
234 #: ../src/fenrirscreenreader/commands/quickMenu/current_quick_menu_value.py:17
235 msgid "get current quick menu value"
236 msgstr "Получить текущее значение быстрого меню."
237
238 #: ../src/fenrirscreenreader/commands/commands/cursor_column.py:17
239 msgid "Column number for cursor"
240 msgstr "Номер столбца для курсора."
241
242 #: ../src/fenrirscreenreader/commands/commands/cursor_lineno.py:17
243 msgid "Line number for cursor"
244 msgstr "Номер строки для курсора."
245
246 #: ../src/fenrirscreenreader/commands/commands/cursor_position.py:17
247 msgid "displays the position of the review cursor"
248 msgstr "Отображает положение курсора обзора."
249
250 #: ../src/fenrirscreenreader/commands/commands/cursor_position.py:23
251 msgid "line {0}, column {1}, Terminal {2}"
252 msgstr "Строка {0}, столбец {1}, терминал {2}"
253
254 #:
255 #: ../src/fenrirscreenreader/commands/commands/cursor_read_to_end_of_line.py:18
256 msgid "read to end of line, use review cursor if you are in review mode, otherwhise use text cursor"
257 msgstr "Чтение до конца строки, используйте курсор обзора, если вы находитесь в режиме просмотра, иначе используйте текстовый курсор."
258
259 #: ../src/fenrirscreenreader/commands/commands/date.py:18
260 msgid "presents the date"
261 msgstr "Сообщить дату."
262
263 #: ../src/fenrirscreenreader/commands/commands/dec_alsa_volume.py:24
264 msgid "Decrease system volume"
265 msgstr "Уменьшить громкость системы."
266
267 #: ../src/fenrirscreenreader/commands/commands/dec_alsa_volume.py:28
268 #: ../src/fenrirscreenreader/commands/commands/inc_alsa_volume.py:28
269 msgid "alsaaudio is not installed"
270 msgstr "alsaaudio не установлено"
271
272 #: ../src/fenrirscreenreader/commands/commands/dec_alsa_volume.py:36
273 #: ../src/fenrirscreenreader/commands/commands/inc_alsa_volume.py:36
274 msgid "{0} percent system volume"
275 msgstr "Громкость системы {0} процентов."
276
277 #: ../src/fenrirscreenreader/commands/commands/dec_sound_volume.py:18
278 msgid "decrease sound volume"
279 msgstr "Уменьшить громкость звука."
280
281 #: ../src/fenrirscreenreader/commands/commands/dec_sound_volume.py:29
282 #: ../src/fenrirscreenreader/commands/commands/inc_sound_volume.py:29
283 msgid "{0} percent sound volume"
284 msgstr "Громкость звука {0} процентов."
285
286 #: ../src/fenrirscreenreader/commands/commands/dec_speech_pitch.py:18
287 msgid "Decreases the pitch of the speech"
288 msgstr "Уменьшить тон речи."
289
290 #: ../src/fenrirscreenreader/commands/commands/dec_speech_pitch.py:26
291 #: ../src/fenrirscreenreader/commands/commands/inc_speech_pitch.py:27
292 msgid "{0} percent speech pitch"
293 msgstr "Тон речи {0} процентов."
294
295 #: ../src/fenrirscreenreader/commands/commands/dec_speech_rate.py:18
296 msgid "Decreases the rate of the speech"
297 msgstr "Уменьшить скорость речи."
298
299 #: ../src/fenrirscreenreader/commands/commands/dec_speech_rate.py:27
300 #: ../src/fenrirscreenreader/commands/commands/inc_speech_rate.py:27
301 msgid "{0} percent speech rate"
302 msgstr "Скорость речи {0} процентов."
303
304 #: ../src/fenrirscreenreader/commands/commands/dec_speech_volume.py:18
305 msgid "Decreases the volume of the speech"
306 msgstr "Уменьшить громкость речи."
307
308 #: ../src/fenrirscreenreader/commands/commands/dec_speech_volume.py:27
309 #: ../src/fenrirscreenreader/commands/commands/inc_speech_volume.py:27
310 msgid "{0} percent speech volume"
311 msgstr "Громкость речи {0} процентов."
312
313 #: ../src/fenrirscreenreader/commands/commands/exit_review.py:17
314 #: ../src/fenrirscreenreader/commands/onCursorChange/95000-exit_review_mode.py:17
315 msgid "exits review mode"
316 msgstr "Выход из режима просмотра."
317
318 #: ../src/fenrirscreenreader/commands/commands/exit_review.py:21
319 msgid "Not in Review Mode"
320 msgstr "Нет в режиме просмотра."
321
322 #: ../src/fenrirscreenreader/commands/commands/exit_review.py:25
323 msgid "Exiting Review Mode"
324 msgstr "Закрытие режима просмотра."
325
326 #: ../src/fenrirscreenreader/commands/commands/export_clipboard_to_file.py:19
327 msgid "export the current fenrir clipboard to a file"
328 msgstr "Экспортировать текущий буфер обмена Fenrir в файл."
329
330 #: ../src/fenrirscreenreader/commands/commands/export_clipboard_to_file.py:34
331 msgid "clipboard exported to file"
332 msgstr "Буфер обмена экспортирован в файл."
333
334 #: ../src/fenrirscreenreader/commands/commands/export_clipboard_to_x.py:20
335 msgid "Export current fenrir clipboard to X or GUI clipboard"
336 msgstr "Экспорт текущего буфера обмена fenrir в буфер обмена X или GUI"
337
338 #: ../src/fenrirscreenreader/commands/commands/first_clipboard.py:17
339 msgid "selects the first clipboard"
340 msgstr "Выбирает первый буфер обмена."
341
342 #: ../src/fenrirscreenreader/commands/commands/forward_keypress.py:17
343 msgid "sends the following keypress to the terminal or application"
344 msgstr "Отправляет следующее нажатие на терминал или приложение."
345
346 #: ../src/fenrirscreenreader/commands/commands/forward_keypress.py:21
347 msgid "Forward next keypress"
348 msgstr "Переслать следующую клавишу."
349
350 #:
351 #: ../src/fenrirscreenreader/commands/commands/import_clipboard_from_file.py:19
352 msgid "imports text from clipboard file to the clipboard"
353 msgstr "импортирует текст из буфера файла в буфер обмена"
354
355 #:
356 #: ../src/fenrirscreenreader/commands/commands/import_clipboard_from_file.py:27
357 msgid "File does not exist"
358 msgstr "Файл не существует."
359
360 #: ../src/fenrirscreenreader/commands/commands/import_clipboard_from_x.py:21
361 msgid "imports the graphical clipboard to Fenrir's clipboard"
362 msgstr "Импортирует графический буфер обмена в буфер обмена Фенрира."
363
364 #: ../src/fenrirscreenreader/commands/commands/inc_alsa_volume.py:24
365 msgid "Increase system volume"
366 msgstr "Увеличение громкости системы."
367
368 #: ../src/fenrirscreenreader/commands/commands/inc_sound_volume.py:18
369 msgid "adjusts the volume for in coming sounds"
370 msgstr "Регулирует громкость входящих звуков."
371
372 #: ../src/fenrirscreenreader/commands/commands/inc_speech_pitch.py:18
373 msgid "Increases the pitch of the speech"
374 msgstr "Увеличение тона речи."
375
376 #: ../src/fenrirscreenreader/commands/commands/inc_speech_rate.py:18
377 msgid "Increase the speech rate"
378 msgstr "Увеличение скорости речи."
379
380 #: ../src/fenrirscreenreader/commands/commands/inc_speech_volume.py:18
381 msgid "Increase the speech volume"
382 msgstr "Увеличение громкости речи."
383
384 #: ../src/fenrirscreenreader/commands/commands/indent_curr_line.py:18
385 msgid "Presents the indentation level for the current line"
386 msgstr "Сообщает уровень отступа для текущей строки."
387
388 #: ../src/fenrirscreenreader/commands/commands/indent_curr_line.py:33
389 msgid "indent {0}"
390 msgstr "Отступ {0}"
391
392 #: ../src/fenrirscreenreader/commands/commands/last_clipboard.py:17
393 msgid "selects the last clipboard"
394 msgstr "Выбирает последний буфер обмена."
395
396 #: ../src/fenrirscreenreader/commands/commands/last_incoming.py:17
397 msgid "Presents the text which was last received"
398 msgstr "Сообщать текст, который был получен последним."
399
400 #: ../src/fenrirscreenreader/commands/commands/marked_text.py:18
401 msgid "Presents the currently selected text that will be copied to the clipboard"
402 msgstr "Сообщает текущий выбранный текст, который будет скопирован в буфер обмена."
403
404 #: ../src/fenrirscreenreader/commands/commands/marked_text.py:23
405 msgid "please set begin and endmark"
406 msgstr "Пожалуйста, установите начало и конец."
407
408 #: ../src/fenrirscreenreader/commands/commands/next_clipboard.py:17
409 msgid "selects the next clipboard"
410 msgstr "Выбирает следующий буфер обмена."
411
412 #: ../src/fenrirscreenreader/commands/commands/next_clipboard.py:28
413 #: ../src/fenrirscreenreader/commands/commands/prev_clipboard.py:28
414 msgid "First clipboard "
415 msgstr "Первый буфер обмена."
416
417 #: ../src/fenrirscreenreader/commands/commands/next_clipboard.py:30
418 #: ../src/fenrirscreenreader/commands/commands/prev_clipboard.py:30
419 msgid "Last clipboard "
420 msgstr "Последний буфер обмена."
421
422 #: ../src/fenrirscreenreader/commands/commands/next_quick_menu_entry.py:17
423 #: ../src/fenrirscreenreader/commands/quickMenu/next_quick_menu_entry.py:17
424 msgid "get next quick menu entry"
425 msgstr "Получить следующий быстрый пункт меню."
426
427 #: ../src/fenrirscreenreader/commands/commands/next_quick_menu_entry.py:27
428 #: ../src/fenrirscreenreader/commands/commands/prev_quick_menu_entry.py:27
429 #: ../src/fenrirscreenreader/commands/quickMenu/next_quick_menu_entry.py:27
430 #: ../src/fenrirscreenreader/commands/quickMenu/prev_quick_menu_entry.py:27
431 msgid "Quick menu not available"
432 msgstr "Быстрое меню недоступно."
433
434 #: ../src/fenrirscreenreader/commands/commands/next_quick_menu_value.py:17
435 #: ../src/fenrirscreenreader/commands/quickMenu/next_quick_menu_value.py:17
436 msgid "get next quick menu value"
437 msgstr "Получить следующее значение быстрого меню."
438
439 #: ../src/fenrirscreenreader/commands/commands/paste_clipboard.py:19
440 msgid "pastes the text from the currently selected clipboard"
441 msgstr "Вставляет текст из текущего выбранного буфера обмена."
442
443 #: ../src/fenrirscreenreader/commands/commands/present_first_line.py:18
444 msgid "present first line"
445 msgstr "Сообщать первую строку."
446
447 #: ../src/fenrirscreenreader/commands/commands/present_last_line.py:18
448 #: ../src/fenrirscreenreader/commands/commands/review_curr_line.py:18
449 msgid "current line"
450 msgstr "Текущая строка."
451
452 #: ../src/fenrirscreenreader/commands/commands/prev_clipboard.py:17
453 msgid "selects the previous clipboard"
454 msgstr "Выбирает предыдущий буфер обмена."
455
456 #: ../src/fenrirscreenreader/commands/commands/prev_quick_menu_entry.py:17
457 #: ../src/fenrirscreenreader/commands/quickMenu/prev_quick_menu_entry.py:17
458 msgid "get previous quick menu entry"
459 msgstr "Получить предыдущий пункт быстрого меню."
460
461 #: ../src/fenrirscreenreader/commands/commands/prev_quick_menu_value.py:17
462 #: ../src/fenrirscreenreader/commands/quickMenu/prev_quick_menu_value.py:17
463 msgid "get previous quick menu value"
464 msgstr "Получить предыдущее значение быстрого меню."
465
466 #: ../src/fenrirscreenreader/commands/commands/quit_fenrir.py:17
467 msgid "exits Fenrir"
468 msgstr "Выход из fenrir."
469
470 #: ../src/fenrirscreenreader/commands/commands/remove_marks.py:17
471 msgid "Removes marks from selected text"
472 msgstr "Удалить метки из выбранного текста."
473
474 #: ../src/fenrirscreenreader/commands/commands/remove_marks.py:21
475 msgid "Remove marks"
476 msgstr "Удалить метки."
477
478 #:
479 #: ../src/fenrirscreenreader/commands/commands/remove_word_from_spell_check.py:27
480 msgid "removes the current word from the exceptions dictionary"
481 msgstr "Удаляет текущее слова из словаря исключений."
482
483 #:
484 #: ../src/fenrirscreenreader/commands/commands/remove_word_from_spell_check.py:50
485 msgid "{0} is not in the dictionary"
486 msgstr "{0} нет в словаре"
487
488 #:
489 #: ../src/fenrirscreenreader/commands/commands/remove_word_from_spell_check.py:53
490 msgid "{0} removed"
491 msgstr "{0} удалено"
492
493 #: ../src/fenrirscreenreader/commands/commands/review_bottom.py:17
494 msgid "Move review to the bottom of the screen"
495 msgstr "Переместить просмотр в конец экрана."
496
497 #: ../src/fenrirscreenreader/commands/commands/review_bottom.py:21
498 msgid "Bottom"
499 msgstr "Конец"
500
501 #: ../src/fenrirscreenreader/commands/commands/review_curr_char.py:18
502 msgid "presents the current character."
503 msgstr "Сообщать текущий символ."
504
505 #: ../src/fenrirscreenreader/commands/commands/review_curr_char_phonetic.py:18
506 msgid "set review and phonetically presents the current character"
507 msgstr "Установить обзор и фонетически представлять текущий символ."
508
509 #: ../src/fenrirscreenreader/commands/commands/review_curr_word.py:18
510 msgid "current word."
511 msgstr "Текущее слово."
512
513 #: ../src/fenrirscreenreader/commands/commands/review_curr_word.py:32
514 #: ../src/fenrirscreenreader/commands/commands/review_curr_word_phonetic.py:36
515 #: ../src/fenrirscreenreader/commands/commands/review_down.py:27
516 #: ../src/fenrirscreenreader/commands/commands/review_next_char.py:28
517 #: ../src/fenrirscreenreader/commands/commands/review_next_char_phonetic.py:30
518 #: ../src/fenrirscreenreader/commands/commands/review_next_line.py:34
519 #: ../src/fenrirscreenreader/commands/commands/review_next_word.py:34
520 #: ../src/fenrirscreenreader/commands/commands/review_next_word_phonetic.py:36
521 #: ../src/fenrirscreenreader/commands/commands/review_prev_char.py:31
522 #: ../src/fenrirscreenreader/commands/commands/review_prev_char_phonetic.py:30
523 #: ../src/fenrirscreenreader/commands/commands/review_prev_line.py:32
524 #: ../src/fenrirscreenreader/commands/commands/review_prev_word.py:32
525 #: ../src/fenrirscreenreader/commands/commands/review_prev_word_phonetic.py:36
526 #: ../src/fenrirscreenreader/commands/commands/review_up.py:27
527 msgid "end of screen"
528 msgstr "Конец экрана."
529
530 #: ../src/fenrirscreenreader/commands/commands/review_curr_word.py:35
531 #: ../src/fenrirscreenreader/commands/commands/review_curr_word_phonetic.py:39
532 #: ../src/fenrirscreenreader/commands/commands/review_next_char.py:31
533 #: ../src/fenrirscreenreader/commands/commands/review_next_char_phonetic.py:33
534 #: ../src/fenrirscreenreader/commands/commands/review_next_word.py:37
535 #: ../src/fenrirscreenreader/commands/commands/review_next_word_phonetic.py:39
536 #: ../src/fenrirscreenreader/commands/commands/review_prev_char.py:34
537 #: ../src/fenrirscreenreader/commands/commands/review_prev_char_phonetic.py:33
538 #: ../src/fenrirscreenreader/commands/commands/review_prev_word.py:35
539 #: ../src/fenrirscreenreader/commands/commands/review_prev_word_phonetic.py:39
540 #: ../src/fenrirscreenreader/commands/commands/review_up.py:30
541 msgid "line break"
542 msgstr "Разрыв строки"
543
544 #: ../src/fenrirscreenreader/commands/commands/review_curr_word_phonetic.py:19
545 msgid "Phonetically spells the current word"
546 msgstr "Представляет фонетически текущее слово"
547
548 #: ../src/fenrirscreenreader/commands/commands/review_down.py:18
549 msgid "Move review to the character below the current position"
550 msgstr "Переместить обзор на символ ниже текущей позиции."
551
552 #: ../src/fenrirscreenreader/commands/commands/review_line_begin.py:18
553 msgid "set review cursor to begin of current line and display the content"
554 msgstr "Установить курсор просмотра в начало текущей строки и отобразить содержимое."
555
556 #: ../src/fenrirscreenreader/commands/commands/review_line_begin.py:30
557 msgid "beginning of line"
558 msgstr "Начало строки"
559
560 #: ../src/fenrirscreenreader/commands/commands/review_line_end.py:18
561 msgid "Move Review to the end of current line and display the content"
562 msgstr "Установить курсор просмотра в конец текущей строки и отобразить содержимое."
563
564 #: ../src/fenrirscreenreader/commands/commands/review_line_end.py:27
565 msgid "end of line"
566 msgstr "Конец строки"
567
568 #: ../src/fenrirscreenreader/commands/commands/review_line_first_char.py:19
569 msgid "Move Review to the first character on the line"
570 msgstr "Переместить курсор просмотра к первому символу строки"
571
572 #: ../src/fenrirscreenreader/commands/commands/review_line_first_char.py:26
573 msgid "line is empty"
574 msgstr "Строка пустая"
575
576 #: ../src/fenrirscreenreader/commands/commands/review_line_first_char.py:33
577 msgid "first character in line indent {0}"
578 msgstr "Первый символ в строке {0}"
579
580 #: ../src/fenrirscreenreader/commands/commands/review_line_last_char.py:18
581 msgid "Move Review to the last character on the line"
582 msgstr "Переместить курсор к последнему символу на строке"
583
584 #: ../src/fenrirscreenreader/commands/commands/review_line_last_char.py:27
585 msgid "last character in line"
586 msgstr "Последний символ в строке"
587
588 #: ../src/fenrirscreenreader/commands/commands/review_next_char.py:18
589 msgid "Moves review to the next character "
590 msgstr "Переместить курсор просмотра к следующему символу "
591
592 #: ../src/fenrirscreenreader/commands/commands/review_next_char_phonetic.py:18
593 msgid "phonetically presents the next character and set review to it"
594 msgstr "Фонетически представляет следующий символ и устанавливает курсор обзора к нему."
595
596 #: ../src/fenrirscreenreader/commands/commands/review_next_line.py:18
597 msgid "moves review to the next line "
598 msgstr "Переместить курсор просмотра к следующей строке"
599
600 #: ../src/fenrirscreenreader/commands/commands/review_next_word.py:18
601 msgid "moves review to the next word "
602 msgstr "Переместить курсор просмотра к следующему слову"
603
604 #: ../src/fenrirscreenreader/commands/commands/review_next_word_phonetic.py:19
605 msgid "Phonetically spells the next word and moves review to it"
606 msgstr "Фонетически представляет следующее слово и перемещает курсор обзора к нему."
607
608 #: ../src/fenrirscreenreader/commands/commands/review_prev_char.py:18
609 msgid "moves review to the previous character "
610 msgstr "Переместить курсор просмотра к предыдущему символу"
611
612 #: ../src/fenrirscreenreader/commands/commands/review_prev_char_phonetic.py:18
613 msgid "phonetically presents the previous character and set review to it"
614 msgstr "Фонетически представляет предыдущий символ и устанавливает курсор обзора к нему."
615
616 #: ../src/fenrirscreenreader/commands/commands/review_prev_line.py:18
617 msgid "moves review to the previous line "
618 msgstr "Переместить курсор просмотра к предыдущей строке"
619
620 #: ../src/fenrirscreenreader/commands/commands/review_prev_word.py:18
621 msgid "moves review focus to the previous word "
622 msgstr "Переместить курсор просмотра к предыдущему слову"
623
624 #: ../src/fenrirscreenreader/commands/commands/review_prev_word_phonetic.py:19
625 msgid "Phonetically spells the previous word and moves review to it"
626 msgstr "Фонетически представляет предыдущее слово и перемещает курсор обзора к нему."
627
628 #: ../src/fenrirscreenreader/commands/commands/review_top.py:18
629 msgid "move review to top of screen"
630 msgstr "Переместить курсор просмотра в начало экрана"
631
632 #: ../src/fenrirscreenreader/commands/commands/review_top.py:22
633 msgid "Top"
634 msgstr "Начало"
635
636 #: ../src/fenrirscreenreader/commands/commands/review_up.py:18
637 msgid "Move review to the character in the line above the current position"
638 msgstr "Переместить курсор обзора на символ в строке выше текущей позиции."
639
640 #: ../src/fenrirscreenreader/commands/commands/save_settings.py:18
641 msgid "Saves your current Fenrir settings so they are the default."
642 msgstr "Сохранить текущие настройки fenrir как настройки по умолчанию."
643
644 #: ../src/fenrirscreenreader/commands/commands/save_settings.py:22
645 msgid "Settings saved."
646 msgstr "Настройки сохранены"
647
648 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_1.py:18
649 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_10.py:18
650 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_2.py:18
651 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_3.py:18
652 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_4.py:18
653 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_5.py:18
654 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_6.py:18
655 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_7.py:18
656 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_8.py:18
657 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_9.py:18
658 msgid "set Bookmark {0}"
659 msgstr "Установить закладку {0}"
660
661 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_1.py:22
662 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_10.py:22
663 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_2.py:22
664 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_3.py:22
665 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_4.py:22
666 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_5.py:22
667 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_6.py:22
668 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_7.py:22
669 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_8.py:22
670 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_9.py:22
671 msgid "No mark found"
672 msgstr "Метка не найдена."
673
674 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_1.py:32
675 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_10.py:32
676 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_2.py:32
677 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_3.py:32
678 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_4.py:32
679 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_5.py:32
680 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_6.py:32
681 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_7.py:32
682 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_8.py:32
683 #: ../src/fenrirscreenreader/commands/commands/set_bookmark_9.py:32
684 msgid "Bookmark {0} set for application {1}"
685 msgstr "Закладка {0} установлена для приложения {1}"
686
687 #: ../src/fenrirscreenreader/commands/commands/set_mark.py:17
688 msgid "places marks to select text to copy to the clipboard"
689 msgstr "Ставит метки для выбора текста для копирования в буфер обмена."
690
691 #: ../src/fenrirscreenreader/commands/commands/set_mark.py:21
692 msgid "no review cursor"
693 msgstr "Нет курсора просмотра"
694
695 #: ../src/fenrirscreenreader/commands/commands/set_mark.py:26
696 #: ../src/fenrirscreenreader/commands/commands/set_mark.py:28
697 msgid "set mark"
698 msgstr "Установка метки."
699
700 #: ../src/fenrirscreenreader/commands/commands/set_window_application.py:17
701 msgid "set Window Mode, needs 2 marks "
702 msgstr "Установка режима окна нуждается в двух метках"
703
704 #: ../src/fenrirscreenreader/commands/commands/set_window_application.py:22
705 msgid "Window Mode on for application {0}"
706 msgstr "Режим окна для приложения {0}"
707
708 #: ../src/fenrirscreenreader/commands/commands/set_window_application.py:25
709 msgid "Set window begin and end marks"
710 msgstr "Установка начала и конца окна"
711
712 #: ../src/fenrirscreenreader/commands/commands/shut_up.py:17
713 msgid "Interrupts the current presentation"
714 msgstr "Прерывать текущую речь."
715
716 #: ../src/fenrirscreenreader/commands/commands/spell_check.py:26
717 msgid "checks the spelling of the current word"
718 msgstr "Проверяет написание текущего слова."
719
720 #: ../src/fenrirscreenreader/commands/commands/spell_check.py:51
721 #: ../src/fenrirscreenreader/commands/onCursorChange/35000-spell_check.py:129
722 msgid "misspelled"
723 msgstr "Орфографическая ошибка"
724
725 #: ../src/fenrirscreenreader/commands/commands/spell_check.py:53
726 msgid "correct"
727 msgstr "Правильно"
728
729 #: ../src/fenrirscreenreader/commands/commands/subprocess.py:21
730 msgid "script: {0} fullpath: {1}"
731 msgstr "Скрипт; {0}, путь {1}"
732
733 #: ../src/fenrirscreenreader/commands/commands/subprocess.py:24
734 msgid "Script file not found"
735 msgstr "Скрипт не найден"
736
737 #: ../src/fenrirscreenreader/commands/commands/subprocess.py:27
738 msgid "Script source is not a valid file"
739 msgstr "Исходник скрипта неправильный файл"
740
741 #: ../src/fenrirscreenreader/commands/commands/subprocess.py:30
742 msgid "Script file is not executable"
743 msgstr "Файл скрипта не исполняемый"
744
745 #: ../src/fenrirscreenreader/commands/commands/temp_disable_speech.py:17
746 #: ../src/fenrirscreenreader/commands/onByteInput/15000-enable_temp_speech.py:17
747 #: ../src/fenrirscreenreader/commands/onKeyInput/15000-enable_temp_speech.py:17
748 msgid "disables speech until next keypress"
749 msgstr "Отключить речь пока не нажата следующая клавиша"
750
751 #: ../src/fenrirscreenreader/commands/commands/time.py:18
752 msgid "presents the time"
753 msgstr "Сообщить время"
754
755 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_indent.py:16
756 msgid "enables or disables automatic reading of indentation level changes"
757 msgstr "включить или отключить чтение изменения уровня отступов."
758
759 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_indent.py:21
760 msgid "autoindent enabled"
761 msgstr "чтение отступов включено"
762
763 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_indent.py:23
764 msgid "autoindent disabled"
765 msgstr "чтение отступов отключено"
766
767 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_read.py:16
768 msgid "enables or disables automatic reading of new text as it appears"
769 msgstr "включить или отключить чтения нового текста"
770
771 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_read.py:21
772 msgid "autoread enabled"
773 msgstr "Автоматическое чтение нового текста включено"
774
775 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_read.py:23
776 msgid "autoread disabled"
777 msgstr "Автоматическое чтение нового текста выключено"
778
779 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_spell_check.py:17
780 msgid "enables or disables automatic spell checking"
781 msgstr "Включить или отключить проверку орфографических ошибок."
782
783 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_spell_check.py:22
784 msgid "auto spellcheck enabled"
785 msgstr "Проверка орфографических ошибок включена"
786
787 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_spell_check.py:24
788 msgid "auto spellcheck disabled"
789 msgstr "Проверка орфографических ошибок выключена"
790
791 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_time.py:16
792 msgid "Enables or disables automatic reading of time after specified intervals"
793 msgstr "Включение или выключение автоматического сообщение времени в указанном интервале."
794
795 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_time.py:21
796 msgid "Automatic time announcement enabled"
797 msgstr "Автоматическое сообщение времени включено"
798
799 #: ../src/fenrirscreenreader/commands/commands/toggle_auto_time.py:23
800 msgid "Automatic time announcement disabled"
801 msgstr "Автоматическое сообщение времени отключено"
802
803 #: ../src/fenrirscreenreader/commands/commands/toggle_barrier.py:16
804 msgid "enables or disables the barrier mode"
805 msgstr "Включение или отключение режима барьера"
806
807 #: ../src/fenrirscreenreader/commands/commands/toggle_barrier.py:21
808 msgid "barrier mode enabled"
809 msgstr "Режим барьера включен"
810
811 #: ../src/fenrirscreenreader/commands/commands/toggle_barrier.py:23
812 msgid "barrier mode disabled"
813 msgstr "Режим барьера выключен"
814
815 #: ../src/fenrirscreenreader/commands/commands/toggle_braille.py:17
816 msgid "Enables and disables Braille output"
817 msgstr "Включение и отключение устройства Брайля."
818
819 #: ../src/fenrirscreenreader/commands/commands/toggle_braille.py:21
820 msgid "braille disabled"
821 msgstr "Браиль выключен"
822
823 #: ../src/fenrirscreenreader/commands/commands/toggle_braille.py:24
824 msgid "braille enabled"
825 msgstr "Браиль включен"
826
827 #: ../src/fenrirscreenreader/commands/commands/toggle_emoticons.py:16
828 msgid "enables or disables announcement of emoticons instead of chars"
829 msgstr "Включение или отключение смайлов вместо символов."
830
831 #: ../src/fenrirscreenreader/commands/commands/toggle_emoticons.py:21
832 msgid "emoticons enabled"
833 msgstr "Смайлы включены"
834
835 #: ../src/fenrirscreenreader/commands/commands/toggle_emoticons.py:23
836 msgid "emoticons disabled"
837 msgstr "Смайлы выключены"
838
839 #: ../src/fenrirscreenreader/commands/commands/toggle_has_attribute.py:16
840 msgid "enables or disables the announcement of attributes"
841 msgstr "Включение или отключение чтения атрибутов"
842
843 #: ../src/fenrirscreenreader/commands/commands/toggle_has_attribute.py:21
844 msgid "announcement of attributes enabled"
845 msgstr "Чтение атрибутов включено"
846
847 #: ../src/fenrirscreenreader/commands/commands/toggle_has_attribute.py:23
848 msgid "announcement of attributes disabled"
849 msgstr "Чтение атрибутов выключено"
850
851 #: ../src/fenrirscreenreader/commands/commands/toggle_highlight_tracking.py:16
852 msgid "enables or disables tracking of highlighted text"
853 msgstr "Включает или отключает отслеживание выделенного текста"
854
855 #: ../src/fenrirscreenreader/commands/commands/toggle_highlight_tracking.py:24
856 msgid "highlight tracking"
857 msgstr "Отслеживание выделения"
858
859 #: ../src/fenrirscreenreader/commands/commands/toggle_highlight_tracking.py:26
860 msgid "cursor tracking"
861 msgstr "Отслеживание курсора"
862
863 #: ../src/fenrirscreenreader/commands/commands/toggle_output.py:17
864 msgid "toggles all output settings"
865 msgstr "Переключает все настройки вывода"
866
867 #: ../src/fenrirscreenreader/commands/commands/toggle_output.py:23
868 msgid "Fenrir muted"
869 msgstr "Речь fenrir отключена"
870
871 #: ../src/fenrirscreenreader/commands/commands/toggle_output.py:31
872 msgid "Fenrir unmuted"
873 msgstr "Речь fenrir включена"
874
875 #: ../src/fenrirscreenreader/commands/commands/toggle_punctuation_level.py:23
876 msgid "No punctuation found."
877 msgstr "Пунктуация не найдена"
878
879 #: ../src/fenrirscreenreader/commands/commands/toggle_sound.py:17
880 msgid "enables or disables sound"
881 msgstr "Включение или отключение звуковых эффектов"
882
883 #: ../src/fenrirscreenreader/commands/commands/toggle_sound.py:21
884 msgid "sound disabled"
885 msgstr "Звуковые эффекты выключены"
886
887 #: ../src/fenrirscreenreader/commands/commands/toggle_sound.py:24
888 msgid "sound enabled"
889 msgstr "Звуковые эффекты включены"
890
891 #: ../src/fenrirscreenreader/commands/commands/toggle_speech.py:17
892 msgid "enables or disables speech"
893 msgstr "Включение или отключение речи"
894
895 #: ../src/fenrirscreenreader/commands/commands/toggle_speech.py:22
896 msgid "speech disabled"
897 msgstr "Речь выключена"
898
899 #: ../src/fenrirscreenreader/commands/commands/toggle_speech.py:25
900 #: ../src/fenrirscreenreader/commands/onByteInput/15000-enable_temp_speech.py:24
901 #: ../src/fenrirscreenreader/commands/onKeyInput/15000-enable_temp_speech.py:28
902 msgid "speech enabled"
903 msgstr "Речь включена"
904
905 #: ../src/fenrirscreenreader/commands/commands/toggle_tutorial_mode.py:18
906 msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+f1"
907 msgstr "Режим обучения закрыт. Чтобы снова войти в режим обучения нажмите fenrir+f1"
908
909 #: ../src/fenrirscreenreader/commands/commands/toggle_tutorial_mode.py:22
910 msgid "Entering tutorial mode. In this mode commands are described but not executed. You can move through the list of commands with the up and down arrow keys. To Exit tutorial mode press Fenrir+f1."
911 msgstr "Включен режим обучения. В этом режиме можно ознакомиться с описанием команд сами команды не выполняются. Перемещаться по списку можно с помощью клавиш стрелок вверх, вниз. Для закрытия нажмите fenrir+f1"
912
913 #: ../src/fenrirscreenreader/commands/commands/toggle_vmenu_mode.py:18
914 msgid "Entering or Leaving v menu mode."
915 msgstr "вход и выход из v меню"
916
917 #: ../src/fenrirscreenreader/commands/commands/toggle_vmenu_mode.py:22
918 msgid "Entering v menu."
919 msgstr "вход в v меню"
920
921 #: ../src/fenrirscreenreader/commands/commands/toggle_vmenu_mode.py:24
922 msgid "Leaving v menu."
923 msgstr "выъход из v меню"
924
925 #: ../src/fenrirscreenreader/commands/help/curr_help.py:17
926 msgid "get current help message"
927 msgstr "Получить текущее сообщение подсказки"
928
929 #: ../src/fenrirscreenreader/commands/help/next_help.py:17
930 msgid "get next help message"
931 msgstr "Получить следующее сообщение подсказки"
932
933 #: ../src/fenrirscreenreader/commands/help/prev_help.py:17
934 msgid "get prev help message"
935 msgstr "Получить предыдущее сообщение подсказки"
936
937 #:
938 #: ../src/fenrirscreenreader/commands/onCursorChange/65000-present_line_if_cursor_change_vertical.py:46
939 msgid "indented "
940 msgstr ""
941
942 #: ../src/fenrirscreenreader/commands/onHeartBeat/76000-time.py:66
943 msgid "Autotime: {0}"
944 msgstr "объявление времени {0}"
945
946 #: ../src/fenrirscreenreader/commands/onKeyInput/80000-capslock.py:22
947 msgid "Capslock on"
948 msgstr "Capslock включен"
949
950 #: ../src/fenrirscreenreader/commands/onKeyInput/80000-capslock.py:24
951 msgid "Capslock off"
952 msgstr "Capslock выключен"
953
954 #: ../src/fenrirscreenreader/commands/onKeyInput/80300-scrolllock.py:22
955 msgid "Scrolllock on"
956 msgstr "Scrolllock включен"
957
958 #: ../src/fenrirscreenreader/commands/onKeyInput/80300-scrolllock.py:24
959 msgid "Scrolllock off"
960 msgstr "Scrolllock выключен"
961
962 #: ../src/fenrirscreenreader/commands/onKeyInput/80500-numlock.py:22
963 msgid "Numlock on"
964 msgstr "Numlock включен"
965
966 #: ../src/fenrirscreenreader/commands/onKeyInput/80500-numlock.py:24
967 msgid "Numlock off"
968 msgstr "Numlock выключен"
969
970 #:
971 #: ../src/fenrirscreenreader/commands/onScreenChanged/80000-screen_change_announcement.py:20
972 msgid "screen {0}"
973 msgstr "Экран {0} "
974
975 #:
976 #: ../src/fenrirscreenreader/commands/onScreenUpdate/56000-highlight_tracking.py:16
977 msgid "enables or disables tracking of highlighted"
978 msgstr "Включает или отключает отслеживание выделения"
979
980 #: ../src/fenrirscreenreader/commands/vmenu-navigation/curr_vmenu_entry.py:17
981 msgid "get current v menu entry"
982 msgstr "Получить текущий пункт меню v"
983
984 #: ../src/fenrirscreenreader/commands/vmenu-navigation/dec_level_vmenu.py:17
985 msgid "leave v menu submenu"
986 msgstr "Выйти v меню подменю"
987
988 #: ../src/fenrirscreenreader/commands/vmenu-navigation/exec_vmenu_entry.py:17
989 msgid "execute v menu entry"
990 msgstr "Выполнить пункт v меню"
991
992 #: ../src/fenrirscreenreader/commands/vmenu-navigation/inc_level_vmenu.py:17
993 msgid "enter v menu submenu"
994 msgstr "войти в подменю меню"
995
996 #: ../src/fenrirscreenreader/commands/vmenu-navigation/next_vmenu_entry.py:17
997 msgid "get next v menu entry"
998 msgstr "получить следующий пункт меню v"
999
1000 #: ../src/fenrirscreenreader/commands/vmenu-navigation/prev_vmenu_entry.py:17
1001 msgid "get prev v menu entry"
1002 msgstr "получить предыдущий пункт меню v"
1003
1004 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_a.py:17
1005 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_b.py:17
1006 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_c.py:17
1007 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_d.py:17
1008 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_e.py:17
1009 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_f.py:17
1010 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_g.py:17
1011 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_h.py:17
1012 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_i.py:17
1013 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_j.py:17
1014 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_k.py:17
1015 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_l.py:17
1016 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_m.py:17
1017 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_n.py:17
1018 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_o.py:17
1019 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_p.py:17
1020 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_q.py:17
1021 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_r.py:17
1022 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_s.py:17
1023 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_t.py:17
1024 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_u.py:17
1025 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_v.py:17
1026 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_w.py:17
1027 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_x.py:17
1028 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_y.py:17
1029 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_z.py:17
1030 msgid "search for an menu entry"
1031 msgstr "поиск пункта меню"
1032
1033 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_a.py:23
1034 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_b.py:23
1035 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_c.py:23
1036 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_d.py:23
1037 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_e.py:23
1038 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_f.py:23
1039 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_g.py:23
1040 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_h.py:23
1041 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_i.py:23
1042 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_j.py:23
1043 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_k.py:23
1044 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_l.py:23
1045 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_m.py:23
1046 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_n.py:23
1047 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_o.py:23
1048 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_p.py:23
1049 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_q.py:23
1050 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_r.py:23
1051 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_s.py:23
1052 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_t.py:23
1053 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_u.py:23
1054 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_v.py:23
1055 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_w.py:23
1056 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_x.py:23
1057 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_y.py:23
1058 #: ../src/fenrirscreenreader/commands/vmenu-navigation/search_z.py:23
1059 msgid "not found"
1060 msgstr "Не найдено"
1061
1062 #: ../src/fenrirscreenreader/core/attributeManager.py:168
1063 msgid "bold"
1064 msgstr "Жирный"
1065
1066 #: ../src/fenrirscreenreader/core/attributeManager.py:176
1067 msgid "italic"
1068 msgstr "Курсивный"
1069
1070 #: ../src/fenrirscreenreader/core/attributeManager.py:184
1071 msgid "underline"
1072 msgstr "Подчеркнутый"
1073
1074 #: ../src/fenrirscreenreader/core/attributeManager.py:192
1075 msgid "strikethrough"
1076 msgstr "Зачеркнутый"
1077
1078 #: ../src/fenrirscreenreader/core/attributeManager.py:200
1079 msgid "reverse"
1080 msgstr "Обратный"
1081
1082 #: ../src/fenrirscreenreader/core/attributeManager.py:208
1083 msgid "blink"
1084 msgstr "Мерцание"
1085
1086 #: ../src/fenrirscreenreader/core/attributeManager.py:225
1087 #: ../src/fenrirscreenreader/core/attributeManager.py:232
1088 msgid "default"
1089 msgstr "По умолчанию"
1090
1091 #: ../src/fenrirscreenreader/core/byteManager.py:103
1092 #: ../src/fenrirscreenreader/core/byteManager.py:105
1093 msgid "Sticky Mode On"
1094 msgstr "Режим залипания включен"
1095
1096 #: ../src/fenrirscreenreader/core/byteManager.py:109
1097 msgid "bypass"
1098 msgstr ""
1099
1100 #: ../src/fenrirscreenreader/core/fenrirManager.py:26
1101 msgid "Start Fenrir"
1102 msgstr "fenrir запущен"
1103
1104 #: ../src/fenrirscreenreader/core/fenrirManager.py:234
1105 msgid "Quit Fenrir"
1106 msgstr "выключить fenrir"
1107
1108 #: ../src/fenrirscreenreader/core/helpManager.py:77
1109 msgid "toggles the tutorial mode"
1110 msgstr "Переключение в режим обучения"
1111
1112 #: ../src/fenrirscreenreader/core/outputManager.py:297
1113 msgid "speech temporary disabled"
1114 msgstr "Речь временно отключена"
1115
1116 #: ../src/fenrirscreenreader/core/quickMenuManager.py:124
1117 msgid "setting invalid"
1118 msgstr "Неправильная настройка"
1119
1120 #: ../src/fenrirscreenreader/core/quickMenuManager.py:131
1121 msgid "setting value invalid"
1122 msgstr "Значение настройки неправильное"
1123
1124 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1125 msgid "black"
1126 msgstr "черный"
1127
1128 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1129 msgid "blue"
1130 msgstr "синий"
1131
1132 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1133 msgid "cyan"
1134 msgstr ""
1135
1136 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1137 msgid "green"
1138 msgstr "зеленый"
1139
1140 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1141 msgid "red"
1142 msgstr "красный"
1143
1144 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1145 msgid "white"
1146 msgstr "белый"
1147
1148 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1149 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1150 msgid "Magenta"
1151 msgstr "пурпурный"
1152
1153 #: ../src/fenrirscreenreader/core/screenDriver.py:12
1154 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1155 msgid "brown/yellow"
1156 msgstr "коричневый/желтый"
1157
1158 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1159 msgid "Black"
1160 msgstr "черный"
1161
1162 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1163 msgid "Blue"
1164 msgstr "синий"
1165
1166 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1167 msgid "Cyan"
1168 msgstr ""
1169
1170 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1171 msgid "Dark gray"
1172 msgstr "темно серый"
1173
1174 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1175 msgid "Green"
1176 msgstr "зеленый"
1177
1178 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1179 msgid "Light blue"
1180 msgstr "голубой"
1181
1182 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1183 msgid "Light cyan"
1184 msgstr "светло-голубой"
1185
1186 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1187 msgid "Light gray"
1188 msgstr "светлосерый"
1189
1190 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1191 msgid "Light magenta"
1192 msgstr "Светло-пурпурный"
1193
1194 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1195 msgid "Light red"
1196 msgstr "розовый"
1197
1198 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1199 msgid "Light yellow"
1200 msgstr "светло желтый"
1201
1202 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1203 msgid "Red"
1204 msgstr "красный"
1205
1206 #: ../src/fenrirscreenreader/core/screenDriver.py:13
1207 msgid "White"
1208 msgstr "белый"
1209
1210 #: ../src/fenrirscreenreader/core/vmenuManager.py:66
1211 #: ../src/fenrirscreenreader/core/vmenuManager.py:226
1212 msgid "Menu"
1213 msgstr "Меню"
1214
1215 #: ../src/fenrirscreenreader/core/vmenuManager.py:234
1216 msgid "Action"
1217 msgstr "Действие"
1218
0 #!/bin/bash
1 # clilauncher.sh
2 # Description: Launches xterm with give application and fenrir.
3 #
4 # Copyright 2019, F123 Consulting, <information@f123.org>
5 # Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
6 #
7 # This is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free
9 # Software Foundation; either version 3, or (at your option) any later
10 # version.
11 #
12 # This software is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this package; see the file COPYING. If not, write to the Free
19 # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301, USA.
21 #
22 #--code--
23
24 if [[ $# -lt 1 ]]; then
25 echo "Usage: $0 program to launch args."
26 exit 1
27 fi
28
29 # Make sure the program being launched exists
30 command -v "${1%% *}" &> /dev/null || exit 1
31
32 for i in /tmp/fenrirscreenreader-*.sock ; do
33 if [[ "$i" != "/tmp/fenrirscreenreader-deamon.sock" ]]; then
34 echo -n "setting set screen#suspendingScreen=pty" | socat - UNIX-CLIENT:$i
35 fi
36 done
37
38 #/usr/bin/urxvt -name "${1%% *}" -e fenrir -d -s /etc/fenrirscreenreader/settings/xterm.conf -o "general.shell=/usr/bin/${1%% *};remote#socketFile=/tmp/fenrirscreenreader-${1%% *}.sock"
39 /usr/bin/urxvt -name "${1%% *}" -e ../src/fenrir -d -s ./xterm.conf -o "general.shell=/usr/bin/${1%% *};remote#socketFile=/tmp/fenrirscreenreader-${1%% *}.sock"
40
0 #!/bin/bash
1 # clilauncher.sh
2 # Description: Launches xterm with give application and fenrir.
3 #
4 # Copyright 2019, F123 Consulting, <information@f123.org>
5 # Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
6 #
7 # This is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free
9 # Software Foundation; either version 3, or (at your option) any later
10 # version.
11 #
12 # This software is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this package; see the file COPYING. If not, write to the Free
19 # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301, USA.
21 #
22 #--code--
23
24 rm -rf /tmp/fenrir*
25
26 for i in /tmp/fenrirscreenreader-*.sock ; do
27 if [[ "$i" != "/tmp/fenrirscreenreader-deamon.sock" ]]; then
28 echo -n "setting set screen#suspendingScreen=pty" | socat - UNIX-CLIENT:$i
29 fi
30 done
31
32 /usr/bin/urxvt -e ../src/fenrir -s ./xterm.conf -o "general.shell=./waitForKey1;remote#socketFile=/tmp/fenrirscreenreader-waitForKey1.sock"
33
34
0 #!/bin/bash
1 # clilauncher.sh
2 # Description: Launches xterm with give application and fenrir.
3 #
4 # Copyright 2019, F123 Consulting, <information@f123.org>
5 # Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
6 #
7 # This is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free
9 # Software Foundation; either version 3, or (at your option) any later
10 # version.
11 #
12 # This software is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this package; see the file COPYING. If not, write to the Free
19 # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301, USA.
21 #
22 #--code--
23
24 for i in /tmp/fenrirscreenreader-*.sock ; do
25 if [[ "$i" != "/tmp/fenrirscreenreader-deamon.sock" ]]; then
26 echo -n "setting set screen#suspendingScreen=pty" | socat - UNIX-CLIENT:$i
27 fi
28 done
29
30 /usr/bin/urxvt -e ../src/fenrir -d -s ./xterm.conf -o "general.shell=./waitForKey2;remote#socketFile=/tmp/fenrirscreenreader-waitForKey2.sock"
31
32
0 #!/bin/bash
1 echo "1"
2 echo "Press 'q' to exit"
3 count=0
4 while : ; do
5 read -n 1 k <&1
6 if [[ $k = q ]] ; then
7 printf "\nQuitting from the program\n"
8 break
9 else
10 ((count=$count+1))
11 echo "Press 'q' to exit"
12 fi
13 done
0 #!/bin/bash
1 echo "2"
2 echo "Press 'q' to exit"
3 count=0
4 while : ; do
5 read -n 1 k <&1
6 if [[ $k = q ]] ; then
7 printf "\nQuitting from the program\n"
8 break
9 else
10 ((count=$count+1))
11 echo "Press 'q' to exit"
12 fi
13 done
0 [sound]
1 enabled=True
2 driver=genericDriver
3 theme=default
4 volume=1.0
5 # shell commands for generic sound driver
6 genericPlayFileCommand=play -q -v fenrirVolume fenrirSoundFile
7 genericFrequencyCommand=play -q -v fenrirVolume -n -c1 synth fenrirDuration sine fenrirFrequence
8
9 [speech]
10 enabled=True
11 driver=speechdDriver
12 #driver=genericDriver
13 serverPath=
14 rate=0.85
15 pitch=0.5
16 # Pitch for capital letters
17 capitalPitch=0.9
18 #module=espeak
19 voice=bdl
20 #language=en
21 volume=1.0
22 autoReadIncoming=True
23
24 # genericSpeechCommand is the command that is executed for talking
25 # the following variables are replaced with values
26 # fenrirText = is the text that should be spoken
27 # fenrirModule = may be the speech module like used in speech-dispatcher, not every TTY need this
28 # fenrirLanguage = the language
29 # fenrirVoice = is the current voice that should be used
30 # the current volume, pitch and rate is calculated like this
31 # value = min + settingValue * (min - max )
32 # fenrirVolume = is replaced with the current volume
33 # fenrirPitch = is replaced with the current pitch
34 # fenrirRate = is replaced with the current speed (speech rate)
35 genericSpeechCommand=espeak -a fenrirVolume -s fenrirRate -p fenrirPitch -v fenrirVoice -- "fenrirText"
36
37 # these are the min and max values of the TTS system that is used in genericSpeechCommand
38 fenrirMinVolume=0
39 fenrirMaxVolume=200
40 fenrirMinPitch=0
41 fenrirMaxPitch=99
42 fenrirMinRate=80
43 fenrirMaxRate=890
44
45 [braille]
46 enabled=True
47 driver=dummyDriver
48 #layout=en
49 # to what should the flush timeout relate to
50 # word = flush after (number of words to display) * seconds
51 # char = flush after (number of chars to display) * seconds
52 # fix = flush after X seconds
53 # none = no automatic flush (manual via shortcut)
54 flushMode=word
55 # seconds to flush or
56 # -1 = no automatic flush (manual via shortcut)
57 flushTimeout=3
58 # how should the cursor be focused?
59 # page = if cursor cross the border move to next page and start at beginn
60 # fixCell = ajust the cursor on an special cell where it is always placed. the display scroll here more smooth.
61 cursorFocusMode=page
62 # define the cell on the Braille device where fenrir should scroll and keep the cursor
63 # 0 = first cell on device
64 # -1 = last cell on device
65 # >0 = fix cell number
66 fixCursorOnCell=-1
67 #How should the braille follow the focus
68 # none = no automatic toggle command used
69 # review = priority to review
70 # last = follow last used cursor
71 cursorFollowMode=last
72 # number of cells in panning (horizontal)
73 # 0 = display size, >0 number of cells
74 panSizeHorizontal=0
75
76 [screen]
77 driver=ptyDriver
78 encoding=auto
79 screenUpdateDelay=0.05
80 suspendingScreen=1
81 autodetectSuspendingScreen=False
82
83 [keyboard]
84 driver=evdevDriver
85 # filter input devices NOMICE, ALL or a DEVICE NAME
86 device=ALL
87 grabDevices=True
88 ignoreShortcuts=False
89 keyboardLayout=desktop
90 charEcho=False
91 charDeleteEcho=True
92 wordEcho=False
93 interruptOnKeyPress=True
94 # you can filter the keys on that the speech should interrupt (empty = all keys, otherwhise the given keys)
95 interruptOnKeyPressFilter=
96 # timeout for double tap in sec
97 doubleTapTimeout=0.2
98
99 [general]
100 debugLevel=1
101 # debugMode sets where the debug output should send to:
102 # debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
103 # debugMode=Print just prints on the screen
104 debugMode=File
105 debugFile=
106 punctuationProfile=default
107 punctuationLevel=some
108 respectPunctuationPause=True
109 newLinePause=True
110 numberOfClipboards=10
111 # used path for "export_clipboard_to_file"
112 # $user is replaced by username
113 clipboardExportPath=/tmp/fenrirClipboard
114 emoticons=True
115 fenrirKeys=KEY_KP0,KEY_CAPSLOCK
116 scriptKeys=KEY_META,KEY_COMPOSE
117 timeFormat=%H:%M:%P
118 dateFormat="%A, %B %d, %Y"
119 autoSpellCheck=True
120 spellCheckLanguage=en_US
121 scriptPath=/usr/share/fenrirscreenreader/scripts
122 # overload commands, and create new one without changing Fenrir default
123 commandPath=
124 #fenrirBGColor = the backgroundcolor
125 #fenrirFGColor = the foregroundcolor
126 #fenrirUnderline = speak the underline attribute
127 #fenrirBold = speak the bold attribute
128 #fenrirBlink = speak the blink attribute
129 #fenrirFont = the font
130 #fenrirFontSize = the fontsize
131 attributeFormatString=Background fenrirBGColor,Foreground fenrirFGColor,fenrirUnderline,fenrirBold,fenrirBlink, Font fenrirFont,Fontsize fenrirFontSize
132 autoPresentIndent=False
133 # play a sound when attributes are changeing
134 hasAttributes=False
135 # shell for PTY emulatiun (empty = default shell)
136 shell=
137
138 [focus]
139 #follow the text cursor
140 cursor=True
141 #follow highlighted text changes
142 highlight=False
143
144 [remote]
145 enable=True
146 # connection type
147 # unix = unix sockets
148 # tcp = tcp (localhost only)
149 method=unix
150 # tcp port
151 port=22447
152 # socket filepath
153 socketpath=/tmp/
154 # allow settings to overwrite
155 enableSettingsRemote=True
156 # allow commands to be executed
157 enableCommandRemote=True
158
159 [barrier]
160 enabled=True
161 leftBarriers=│└┌─
162 rightBarriers=│┘┐─
163
164 [review]
165 lineBreak=True
166 endOfScreen=True
167 # leave the review when pressing a key
168 leaveReviewOnCursorChange=True
169 # leave the review when changing the screen
170 leaveReviewOnScreenChange=True
171
172 [promote]
173 enabled=True
174 inactiveTimeoutSec=120
175 list=
176
177 [time]
178 # automatic time anouncement
179 enabled=False
180 # present time
181 presentTime=True
182 # present date (on change)
183 presentDate=True
184 # present time after x seconds
185 delaySec=0
186 # present time after to given minutes example every 15 minutes: 00,15,30,45
187 # if delaySec is >0 onMinutes is ignored
188 onMinutes=00,30
189 # announce via soundicon
190 announce=True
191 # interrupt current speech for time announcement
192 interrupt=False
0 !!!! ATTENTION !!!!
1 the speech-dispatcher driver was reworked. the language and voice was swapped.
2 this needs some reconfiguration in your settings.conf
3 what you have as speech language= needs now to be set to voice=
4 !!!! ATTENTION !!!!
5
6 1. vMenu
7 - it allows to define macros in an menu like structure
8 - allows us to create a settings menu
9 2. first letter navigation in vMenu
10 3. quit command for remote manager for exiting fenrir
11 4. "vmenu" command for remote manager for lock an vmenu
12 5. "resetvmenu" command for remote manager for release complete vmenu
13 6. NVDA compatible keyboard layouts
14 7. fixes to speech-dispatcher driver
15 8. quickMenu
16
17 Bugfixes and Cleanups
18
0 1. PTY screen driver (leaves experimental state, stable now)
1 - lot higher accuracy
2 - works with "dialog" now
3 - a lot of performance speedup
4 - shortcuts are now recognieced more accurate
5 2. VCSA screen driver got support for UTF32 using /dev/vcsu (needs Linux >=4.19)
6 3. Tutorial mode now creates more userfriendly output of the shortcuts
7 4. faster word echo
8 5. improved dynamic grab/ ungrab of devices
9 6. custom dicts and emojis can now use regex when prefix with regex;
10 Bugfixes and Cleanups
11
0 evdev>=1.1.2
1 daemonize>=2.5.0
2 dbus-python>=1.2.8
3 pyudev>=0.21.0
4 pexpect
5 pyttsx3
6 pyte>=0.7.0
55 from setuptools import find_packages
66 from setuptools import setup
77
8 fenrirVersion = '1.9.3'
8 fenrirVersion = '1.9.7'
99 packageVersion = 'post1'
1010
11 # handle flags for package manager like yaourt and pacaur.
11 # handle flags for package manager like aurman and pacaur.
1212 forceSettings = False
1313 if "--force-settings" in sys.argv:
1414 forceSettings = True
1717 data_files = []
1818 directories = glob.glob('config/*')
1919 for directory in directories:
20 files = glob.glob(directory+'/*')
20 files = glob.glob(directory+'/*')
2121 destDir = ''
2222 if 'config/punctuation' in directory :
2323 destDir = '/etc/fenrirscreenreader/punctuation'
3131 except:
3232 pass
3333 elif 'config/scripts' in directory:
34 destDir = '/usr/share/fenrirscreenreader/scripts'
34 destDir = '/usr/share/fenrirscreenreader/scripts'
3535 if destDir != '':
3636 data_files.append((destDir, files))
3737
38 files = glob.glob('config/sound/default/*')
39 destDir = '/usr/share/sounds/fenrirscreenreader/default'
38 files = glob.glob('config/sound/default/*')
39 destDir = '/usr/share/sounds/fenrirscreenreader/default'
4040 data_files.append((destDir, files))
41 files = glob.glob('config/sound//template/*')
41 files = glob.glob('config/sound//template/*')
4242 destDir = '/usr/share/sounds/fenrirscreenreader/template'
4343 data_files.append((destDir, files))
4444 files = glob.glob('tools/*')
5656 # description
5757 description="A TTY Screen Reader for Linux.",
5858 long_description=read('README.md'),
59 keywords=['screenreader', 'a11y', 'accessibility', 'terminal', 'TTY', 'console'],
59 keywords=['screenreader', 'a11y', 'accessibility', 'terminal', 'TTY', 'console'],
6060 license="License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
6161 url="https://github.com/chrys87/fenrir/",
6262 download_url = 'https://github.com/chrys87/fenrir/archive/' + fenrirVersion + '.tar.gz',
6363 classifiers=[
64 "Programming Language :: Python",
65 "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
64 "Programming Language :: Python",
65 "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
6666 "Development Status :: 5 - Production/Stable",
6767 "Topic :: Multimedia :: Sound/Audio :: Speech",
68 "Environment :: Console",
68 "Environment :: Console",
6969 ],
70
70
7171 # Application author details:
7272 author="Chrys, Storm_dragon, Jeremiah and others",
7373 author_email="chrysg@linux-a11y.org",
8282 zip_safe=False,
8383
8484 data_files=data_files,
85
85
8686 # Dependent packages (distributions)
8787 install_requires=[
88 "evdev",
89 "daemonize",
90 "dbus-python",
91 "pyudev",
88 "evdev>=1.1.2",
89 "daemonize>=2.5.0",
90 "dbus-python>=1.2.8",
91 "pyudev>=0.21.0",
9292 "setuptools",
9393 "pexpect",
9494 "pyttsx3",
95 "pyte",
95 "pyte>=0.7.0",
9696 ],
97
97
9898 )
9999
100100 if not forceSettings:
1515 self.env = environment
1616 try:
1717 import brlapi
18 self._brl = brlapi.Connection()
19 self._deviceSize = self._brl.displaySize
18 self._brl = brlapi.Connection()
19 self._deviceSize = self._brl.displaySize
2020 except Exception as e:
2121 print(e)
22 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
22 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
2323 return
2424 self._isInitialized = True
2525
4343
4444 def shutdown(self):
4545 if self._isInitialized:
46 self.leveScreen()
47 self._isInitialized = False
46 self.leveScreen()
47 self._isInitialized = False
4848 print('Braille Debug Driver: Shutdown')
3030
3131 def run(self):
3232 if not initialized:
33 self.env['runtime']['outputManager'].presentText(_('pyenchant is not installed'), interrupt=True)
3433 return
3534 if self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') != self.language:
3635 try:
1818
1919 def run(self):
2020 lastEcho = self.env['runtime']['outputManager'].getLastEcho()
21 if lastEcho.rstrip() != "":
22 lastEcho = lastEcho.rstrip()
2123 self.env['runtime']['memoryManager'].addValueToFirstIndex('clipboardHistory', lastEcho)
2224 self.env['runtime']['outputManager'].presentText(lastEcho, soundIcon='CopyToClipboard', interrupt=True)
2325
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get current quick menu entry')
17 def run(self):
18 menu = ''
19 value = ''
20 menu = self.env['runtime']['quickMenuManager'].getCurrentEntry()
21 if menu != '':
22 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
23 self.env['runtime']['outputManager'].presentText(menu + ' ' + value, interrupt=True)
24 def setCallback(self, callback):
25 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get current quick menu value')
17 def run(self):
18 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
19 self.env['runtime']['outputManager'].presentText(value, interrupt=True)
20 def setCallback(self, callback):
21 pass
1919 # Prefer review cursor over text cursor
2020 cursorPos = self.env['runtime']['cursorManager'].getReviewOrTextCursor()
2121
22 self.env['runtime']['outputManager'].presentText(_("line {0}, column {1}").format(cursorPos['y']+1, cursorPos['x']+1), interrupt=True)
22 self.env['runtime']['outputManager'].presentText(_("line {0}, column {1}, Terminal {2}").format(cursorPos['y']+1, cursorPos['x']+1, self.env['screen']['newTTY']), interrupt=True)
2323
2424 def setCallback(self, callback):
2525 pass
2727 return
2828 clipboard = self.env['runtime']['memoryManager'].getIndexListElement('clipboardHistory')
2929 for display in range(10):
30 p = Popen('su ' + self.env['general']['currUser'] + ' -c "echo -n \\\"' + clipboard.replace('"','\\\\\\"') +'\\\" | xclip -d :' + str(display) + ' -selection c"' , stdout=PIPE, stderr=PIPE, shell=True)
30 p = Popen('su ' + self.env['general']['currUser'] + ' -c "cat << \\\"EOF\\\" | xclip -d :' + str(display) + ' -selection clipboard\n' + clipboard + '\nEOF\n"', stdout=PIPE, stderr=PIPE, shell=True)
3131 stdout, stderr = p.communicate()
3232 self.env['runtime']['outputManager'].interruptOutput()
3333 #screenEncoding = self.env['runtime']['settingsManager'].getSetting('screen', 'encoding')
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get next quick menu entry')
17 def run(self):
18 menu = ''
19 value = ''
20 if self.env['runtime']['quickMenuManager'].nextEntry():
21 menu = self.env['runtime']['quickMenuManager'].getCurrentEntry()
22 if menu != '':
23 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
24 self.env['runtime']['outputManager'].presentText(menu + ' ' + value, interrupt=True)
25 else:
26 self.env['runtime']['outputManager'].presentText(_('Quick menu not available'), interrupt=True)
27 def setCallback(self, callback):
28 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get next quick menu value')
17 def run(self):
18 if self.env['runtime']['quickMenuManager'].nextValue():
19 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
20 self.env['runtime']['outputManager'].presentText(value, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get previous quick menu entry')
17 def run(self):
18 menu = ''
19 value = ''
20 if self.env['runtime']['quickMenuManager'].prevEntry():
21 menu = self.env['runtime']['quickMenuManager'].getCurrentEntry()
22 if menu != '':
23 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
24 self.env['runtime']['outputManager'].presentText(menu + ' ' + value, interrupt=True)
25 else:
26 self.env['runtime']['outputManager'].presentText(_('Quick menu not available'), interrupt=True)
27 def setCallback(self, callback):
28 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get previous quick menu value')
17 def run(self):
18 if self.env['runtime']['quickMenuManager'].prevValue():
19 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
20 self.env['runtime']['outputManager'].presentText(value, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.core import settingsManager
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('Saves your current Fenrir settings so they are the default.')
18 def run(self):
19 settingsFile = self.env['runtime']['settingsManager'].getSettingsFile()
20 self.env['runtime']['settingsManager'].saveSettings(settingsFile)
21 self.env['runtime']['outputManager'].presentText(_("Settings saved."), interrupt=True)
22 def setCallback(self, callback):
23 pass
1616 return _('disables speech until next keypress')
1717
1818 def run(self):
19 if self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled'):
20 self.env['runtime']['outputManager'].presentText(_("speech temporary disabled"), soundIcon='SpeechOff', interrupt=True)
21 self.env['commandBuffer']['enableSpeechOnKeypress'] = True
22 self.env['runtime']['settingsManager'].setSetting('speech', 'enabled', str(not self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled')))
23 self.env['runtime']['outputManager'].interruptOutput()
19 self.env['runtime']['outputManager'].tempDisableSpeech()
2420
2521 def setCallback(self, callback):
2622 pass
1717
1818 def run(self):
1919 if self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled'):
20 self.env['runtime']['outputManager'].interruptOutput()
2021 self.env['runtime']['outputManager'].presentText(_('speech disabled'), soundIcon='SpeechOff', interrupt=True)
2122 self.env['runtime']['settingsManager'].setSetting('speech', 'enabled', str(not self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled')))
2223 if self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled'):
1313 def shutdown(self):
1414 pass
1515 def getDescription(self):
16 self.env['runtime']['helpManager'].toggleTutorialMode()
17 #self.env['runtime']['outputManager'].presentText(, interrupt=True)
16 self.env['runtime']['helpManager'].toggleTutorialMode()
1817 return _('Exiting tutorial mode. To enter tutorial mode again press Fenrir+f1')
1918 def run(self):
20 self.env['runtime']['helpManager'].toggleTutorialMode()
21 self.env['runtime']['outputManager'].presentText( _('Entering tutorial mode. In this mode commands are described but not executed. You can move through the list of commands with the up and down arrow keys. To Exit tutorial mode press Fenrir+f1.'), interrupt=True)
19 self.env['runtime']['helpManager'].toggleTutorialMode()
20 if self.env['runtime']['helpManager'].isTutorialMode():
21 self.env['runtime']['outputManager'].presentText( _('Entering tutorial mode. In this mode commands are described but not executed. You can move through the list of commands with the up and down arrow keys. To Exit tutorial mode press Fenrir+f1.'), interrupt=True)
2222 def setCallback(self, callback):
2323 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 self.env['runtime']['vmenuManager'].togglelVMenuMode()
17 return _('Entering or Leaving v menu mode.')
18 def run(self):
19 self.env['runtime']['vmenuManager'].togglelVMenuMode()
20 if self.env['runtime']['vmenuManager'].getActive():
21 self.env['runtime']['outputManager'].presentText( _('Entering v menu.'), interrupt=True)
22 else:
23 self.env['runtime']['outputManager'].presentText( _('Leaving v menu.'), interrupt=True)
24 def setCallback(self, callback):
25 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # enabled?
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charEcho'):
21 return
22 # big changes are no char (but the value is bigger than one maybe the differ needs longer than you can type, so a little strange random buffer for now)
23 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
24 if xMove > 3:
25 return
26 if self.env['runtime']['inputManager'].getShortcutType() in ['KEY']:
27 if self.env['runtime']['inputManager'].getLastDeepestInput() in [['KEY_TAB']]:
28 return
29 elif self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
30 if self.env['runtime']['byteManager'].getLastByteKey() in [b' ', b'\t']:
31 return
32 # detect deletion or chilling
33 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
34 return
35 # is there any change?
36 if not self.env['runtime']['screenManager'].isDelta():
37 return
38 # filter unneded space on word begin
39 currDelta = self.env['screen']['newDelta']
40 if len(currDelta.strip()) != len(currDelta) and \
41 currDelta.strip() != '':
42 currDelta = currDelta.strip()
43 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
44
45 def setCallback(self, callback):
46 pass
47
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is it enabled?
22 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'):
23 return
24 # is naviation?
25 if self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'] != 1:
26 return
27 # just when cursor move worddetection is needed
28 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
29 return
30 # for now no new line
31 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33 # currently writing
34 if self.env['runtime']['screenManager'].isDelta():
35 return
36
37 # get the word
38 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
39 x, y, currWord, endOfScreen, lineBreak = \
40 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
41
42 # is there a word?
43 if currWord == '':
44 return
45 # at the end of a word
46 if not newContent[self.env['screen']['newCursor']['x']].isspace():
47 return
48 # at the end of a word
49 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
50 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
51 return
52
53 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
54
55 def setCallback(self, callback):
56 pass
57
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import os, string
9
10 initialized = False
11 try:
12 import enchant
13 initialized = True
14 except:
15 pass
16
17 class command():
18 def __init__(self):
19 self.language = ''
20 self.spellChecker = ''
21 def initialize(self, environment):
22 self.env = environment
23 self.updateSpellLanguage()
24 def shutdown(self):
25 pass
26 def getDescription(self):
27 return 'No Description found'
28
29 def updateSpellLanguage(self):
30 if not initialized:
31 return
32 self.spellChecker = enchant.Dict(self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage'))
33 self.language = self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage')
34
35 def run(self):
36 if not initialized:
37 return
38 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoSpellCheck'):
39 return
40 if self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') != self.language:
41 try:
42 self.updateSpellLanguage()
43 except:
44 return
45
46 # just when horizontal cursor move worddetection is needed
47 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
48 return
49
50 # for now no new line
51 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
52 return
53 # more than a keyecho?
54 if len(self.env['screen']['newDelta']) > 1:
55 return
56 # deletion
57 if self.env['runtime']['screenManager'].isNegativeDelta():
58 return
59 # first place could not be the end of a word
60 if self.env['screen']['newCursor']['x'] == 0:
61 return
62
63 # get the word (just for speedup only look at current line
64 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
65 x, y, currWord, endOfScreen, lineBreak = word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
66 # was this a typed word?
67 if self.env['runtime']['screenManager'].isDelta():
68 if not(newContent[self.env['screen']['oldCursor']['x']] in string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~' and x != self.env['screen']['oldCursor']['x']):
69 return
70 else:
71 currWord = currWord.strip(string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~')
72 else:
73 # or just arrow arround?
74 if not newContent[self.env['screen']['newCursor']['x']].isspace():
75 return
76 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
77 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
78 return
79
80 # just on end of word
81 if self.env['screen']['newCursor']['x'] > 0:
82 if not newContent[self.env['screen']['oldCursor']['x'] - 1].lower() in string.ascii_lowercase:
83 return
84
85 # ignore bash buildins
86 if currWord in ['cd','fg','bg','alias','bind','dir','caller','buildin','command','declare','echo','enable','help','let','local','logout',\
87 'mapfile','printf','read','readarray','source','type','typeset','ulimit','unalias']:
88 return
89 # ignore the application name
90 if currWord.upper() == 'FENRIR':
91 return
92 if currWord[0] =='-':
93 return
94 if currWord[0] == '/':
95 return
96 if currWord[0] == '#':
97 return
98 if currWord.startswith('./'):
99 return
100 if '@' in currWord and '.' in currWord:
101 return
102 if currWord[0] == '@':
103 return
104 if currWord.isnumeric():
105 return
106 if currWord.isdecimal():
107 return
108 if currWord.isspace():
109 return
110
111 try:
112 if os.path.exists("/bin/"+currWord):
113 return
114 except:
115 pass
116 try:
117 if os.path.exists("/usr/bin/"+currWord):
118 return
119 except:
120 pass
121 try:
122 if os.path.exists("/sbin/"+currWord):
123 return
124 except:
125 pass
126
127 if not self.spellChecker.check(currWord):
128 self.env['runtime']['outputManager'].presentText(_('misspelled'), soundIcon='mispell', interrupt=False, flush=False)
129
130 def setCallback(self, callback):
131 pass
132
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charDeleteEcho'):
20 return
21 # detect typing or chilling
22 if self.env['screen']['newCursor']['x'] >= self.env['screen']['oldCursor']['x']:
23 return
24
25 # More than just a deletion happend
26 if self.env['runtime']['screenManager'].isDelta(ignoreSpace=True):
27 return
28
29 # no deletion
30 if not self.env['runtime']['screenManager'].isNegativeDelta():
31 return
32
33 # too much for a single backspace...
34 # word begin produce a diff wiht len == 2 |a | others with 1 |a|
35 if len(self.env['screen']['newNegativeDelta']) > 2:
36 return
37
38 currNegativeDelta = self.env['screen']['newNegativeDelta']
39 if len(currNegativeDelta.strip()) != len(currNegativeDelta) and \
40 currNegativeDelta.strip() != '':
41 currNegativeDelta = currNegativeDelta.strip()
42 self.env['runtime']['outputManager'].presentText(currNegativeDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
43 def setCallback(self, callback):
44 pass
45
+0
-42
src/fenrirscreenreader/commands/onCursorChange/45000-char_echo.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # big changes are no char (but the value is bigger than one maybe the differ needs longer than you can type, so a little strange random buffer for now)
20 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
21 if xMove > 1:
22 return
23 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charEcho'):
24 return
25 # detect deletion or chilling
26 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
27 return
28 # is there any change?
29 if not self.env['runtime']['screenManager'].isDelta():
30 return
31
32 # filter unneded space on word begin
33 currDelta = self.env['screen']['newDelta']
34 if len(currDelta.strip()) != len(currDelta) and \
35 currDelta.strip() != '':
36 currDelta = currDelta.strip()
37 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
38
39 def setCallback(self, callback):
40 pass
41
+0
-42
src/fenrirscreenreader/commands/onCursorChange/46000-tab_completion.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # try to detect the tab completion by cursor change
20 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
21 if xMove == 1:
22 return
23 # is there any change?
24 if not self.env['runtime']['screenManager'].isDelta():
25 return
26 if not( (xMove > 1) and xMove == len(self.env['screen']['newDelta'])):
27 return
28 # detect deletion or chilling
29 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
30 return
31
32 # filter unneded space on word begin
33 currDelta = self.env['screen']['newDelta']
34 if len(currDelta.strip()) != len(currDelta) and \
35 currDelta.strip() != '':
36 currDelta = currDelta.strip()
37 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, announceCapital=True, flush=False)
38
39 def setCallback(self, callback):
40 pass
41
+0
-59
src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import line_utils
8 from fenrirscreenreader.utils import word_utils
9
10 class command():
11 def __init__(self):
12 self.lastIdent = -1
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return ''
19
20 def run(self):
21 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'):
22 return
23 if self.env['runtime']['screenManager'].isScreenChange():
24 self.lastIdent = 0
25 return
26 # this leads to problems in vim -> status line change -> no announcement, so we do check the lengh as hack
27 if self.env['runtime']['screenManager'].isDelta():
28 return
29
30 # is a vertical change?
31 if not self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33
34 x, y, currLine = line_utils.getCurrentLine(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText'])
35 if currLine.isspace():
36 self.env['runtime']['outputManager'].presentText(_("blank"), soundIcon='EmptyLine', interrupt=True, flush=False)
37 else:
38 # ident
39 currIdent = len(currLine) - len(currLine.lstrip())
40 if self.lastIdent == -1:
41 self.lastIdent = currIdent
42 doInterrupt = True
43 if self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoPresentIndent'):
44 if self.lastIdent != currIdent:
45 self.env['runtime']['outputManager'].presentText(_('indented ') + str(currIdent) + ' ', interrupt=doInterrupt, flush=False)
46 doInterrupt = False
47 # barrier
48 sayLine = currLine
49 if self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'):
50 isBarrier, barrierLine = self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y'])
51 if isBarrier:
52 sayLine = barrierLine
53 # output
54 self.env['runtime']['outputManager'].presentText(sayLine, interrupt=doInterrupt, flush=False)
55 self.lastIdent = currIdent
56 def setCallback(self, callback):
57 pass
58
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17 def run(self):
18 # try to detect the tab completion by cursor change
19 xMove = self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x']
20 if xMove <= 0:
21 return
22 if self.env['runtime']['inputManager'].getShortcutType() in ['KEY']:
23 if not (self.env['runtime']['inputManager'].getLastDeepestInput() in [['KEY_TAB']]):
24 if xMove < 5:
25 return
26 elif self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
27 found = False
28 for currByte in self.env['runtime']['byteManager'].getLastByteKey():
29 if currByte == 9:
30 found = True
31 if not found:
32 if xMove < 5:
33 return
34 # is there any change?
35 if not self.env['runtime']['screenManager'].isDelta():
36 return
37 if not xMove == len(self.env['screen']['newDelta']):
38 return
39 # filter unneded space on word begin
40 currDelta = self.env['screen']['newDelta']
41 if len(currDelta.strip()) != len(currDelta) and \
42 currDelta.strip() != '':
43 currDelta = currDelta.strip()
44 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, announceCapital=True, flush=False)
45
46 def setCallback(self, callback):
47 pass
48
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is navigation?
22 if not abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) > 1:
23 return
24
25 # just when cursor move worddetection is needed
26 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
27 return
28 # for now no new line
29 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
30 return
31 # currently writing
32 if self.env['runtime']['screenManager'].isDelta():
33 return
34
35 # get the word
36 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
37 x, y, currWord, endOfScreen, lineBreak = \
38 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
39
40 # is there a word?
41 if currWord == '':
42 return
43
44 # at the start of a word
45 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
46 (self.env['screen']['newCursor']['x'] != x):
47 return
48
49 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
50
51 def setCallback(self, callback):
52 pass
53
+0
-58
src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is it enabled?
22 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'):
23 return
24 # is naviation?
25 if self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'] != 1:
26 return
27 # just when cursor move worddetection is needed
28 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
29 return
30 # for now no new line
31 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33 # currently writing
34 if self.env['runtime']['screenManager'].isDelta():
35 return
36
37 # get the word
38 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
39 x, y, currWord, endOfScreen, lineBreak = \
40 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
41
42 # is there a word?
43 if currWord == '':
44 return
45 # at the end of a word
46 if not newContent[self.env['screen']['newCursor']['x']].isspace():
47 return
48 # at the end of a word
49 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
50 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
51 return
52
53 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
54
55 def setCallback(self, callback):
56 pass
57
+0
-54
src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is navigation?
22 if not abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) > 1:
23 return
24
25 # just when cursor move worddetection is needed
26 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
27 return
28 # for now no new line
29 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
30 return
31 # currently writing
32 if self.env['runtime']['screenManager'].isDelta():
33 return
34
35 # get the word
36 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
37 x, y, currWord, endOfScreen, lineBreak = \
38 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
39
40 # is there a word?
41 if currWord == '':
42 return
43
44 # at the start of a word
45 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
46 (self.env['screen']['newCursor']['x'] != x):
47 return
48
49 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
50
51 def setCallback(self, callback):
52 pass
53
+0
-134
src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import os, string
9
10 initialized = False
11 try:
12 import enchant
13 initialized = True
14 except:
15 pass
16
17 class command():
18 def __init__(self):
19 self.language = ''
20 self.spellChecker = ''
21 def initialize(self, environment):
22 self.env = environment
23 self.updateSpellLanguage()
24 def shutdown(self):
25 pass
26 def getDescription(self):
27 return 'No Description found'
28
29 def updateSpellLanguage(self):
30 if not initialized:
31 self.env['runtime']['outputManager'].presentText('pychant is not installed', interrupt=True)
32 return
33 self.spellChecker = enchant.Dict(self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage'))
34 self.language = self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage')
35
36 def run(self):
37 if not initialized:
38 return
39 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoSpellCheck'):
40 return
41 if self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') != self.language:
42 try:
43 self.updateSpellLanguage()
44 except:
45 return
46
47 # just when horizontal cursor move worddetection is needed
48 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
49 return
50
51 # for now no new line
52 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
53 return
54 # more than a keyecho?
55 if len(self.env['screen']['newDelta']) > 1:
56 return
57 # deletion
58 if self.env['runtime']['screenManager'].isNegativeDelta():
59 return
60 # first place could not be the end of a word
61 if self.env['screen']['newCursor']['x'] == 0:
62 return
63
64 # get the word (just for speedup only look at current line
65 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
66 x, y, currWord, endOfScreen, lineBreak = word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
67 # was this a typed word?
68 if self.env['runtime']['screenManager'].isDelta():
69 if not(newContent[self.env['screen']['oldCursor']['x']] in string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~' and x != self.env['screen']['oldCursor']['x']):
70 return
71 else:
72 currWord = currWord.strip(string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~')
73 else:
74 # or just arrow arround?
75 if not newContent[self.env['screen']['newCursor']['x']].isspace():
76 return
77 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
78 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
79 return
80
81 # just on end of word
82 if self.env['screen']['newCursor']['x'] > 0:
83 if not newContent[self.env['screen']['oldCursor']['x'] - 1].lower() in string.ascii_lowercase:
84 return
85
86 # ignore bash buildins
87 if currWord in ['cd','fg','bg','alias','bind','dir','caller','buildin','command','declare','echo','enable','help','let','local','logout',\
88 'mapfile','printf','read','readarray','source','type','typeset','ulimit','unalias']:
89 return
90 # ignore the application name
91 if currWord.upper() == 'FENRIR':
92 return
93 if currWord[0] =='-':
94 return
95 if currWord[0] == '/':
96 return
97 if currWord[0] == '#':
98 return
99 if currWord.startswith('./'):
100 return
101 if '@' in currWord and '.' in currWord:
102 return
103 if currWord[0] == '@':
104 return
105 if currWord.isnumeric():
106 return
107 if currWord.isdecimal():
108 return
109 if currWord.isspace():
110 return
111
112 try:
113 if os.path.exists("/bin/"+currWord):
114 return
115 except:
116 pass
117 try:
118 if os.path.exists("/usr/bin/"+currWord):
119 return
120 except:
121 pass
122 try:
123 if os.path.exists("/sbin/"+currWord):
124 return
125 except:
126 pass
127
128 if not self.spellChecker.check(currWord):
129 self.env['runtime']['outputManager'].presentText(_('misspelled'), soundIcon='mispell', interrupt=False, flush=False)
130
131 def setCallback(self, callback):
132 pass
133
+0
-46
src/fenrirscreenreader/commands/onCursorChange/65000-char_delete_echo.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charDeleteEcho'):
20 return
21 # detect typing or chilling
22 if self.env['screen']['newCursor']['x'] >= self.env['screen']['oldCursor']['x']:
23 return
24
25 # More than just a deletion happend
26 if self.env['runtime']['screenManager'].isDelta(ignoreSpace=True):
27 return
28
29 # no deletion
30 if not self.env['runtime']['screenManager'].isNegativeDelta():
31 return
32
33 # too much for a single backspace...
34 # word begin produce a diff wiht len == 2 |a | others with 1 |a|
35 if len(self.env['screen']['newNegativeDelta']) > 2:
36 return
37
38 currNegativeDelta = self.env['screen']['newNegativeDelta']
39 if len(currNegativeDelta.strip()) != len(currNegativeDelta) and \
40 currNegativeDelta.strip() != '':
41 currNegativeDelta = currNegativeDelta.strip()
42 self.env['runtime']['outputManager'].presentText(currNegativeDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
43 def setCallback(self, callback):
44 pass
45
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import line_utils
8 from fenrirscreenreader.utils import word_utils
9
10 class command():
11 def __init__(self):
12 self.lastIdent = -1
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return ''
19
20 def run(self):
21 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'):
22 return
23 if self.env['runtime']['screenManager'].isScreenChange():
24 self.lastIdent = 0
25 return
26 # this leads to problems in vim -> status line change -> no announcement, so we do check the lengh as hack
27 if self.env['runtime']['screenManager'].isDelta():
28 return
29
30 # is a vertical change?
31 if not self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33
34 x, y, currLine = line_utils.getCurrentLine(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText'])
35 if currLine.isspace():
36 self.env['runtime']['outputManager'].presentText(_("blank"), soundIcon='EmptyLine', interrupt=True, flush=False)
37 else:
38 # ident
39 currIdent = len(currLine) - len(currLine.lstrip())
40 if self.lastIdent == -1:
41 self.lastIdent = currIdent
42 doInterrupt = True
43 if self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoPresentIndent'):
44 if self.lastIdent != currIdent:
45 self.env['runtime']['outputManager'].presentText(_('indented ') + str(currIdent) + ' ', interrupt=doInterrupt, flush=False)
46 doInterrupt = False
47 # barrier
48 sayLine = currLine
49 if self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'):
50 isBarrier, barrierLine = self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y'])
51 if isBarrier:
52 sayLine = barrierLine
53 # output
54 self.env['runtime']['outputManager'].presentText(sayLine, interrupt=doInterrupt, flush=False)
55 self.lastIdent = currIdent
56 def setCallback(self, callback):
57 pass
58
+0
-26
src/fenrirscreenreader/commands/onCursorChange/66000-exit_review_mode.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('exits review mode')
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('review', 'leaveReviewOnCursorChange'):
20 return
21 if self.env['runtime']['cursorManager'].isReviewMode():
22 self.env['runtime']['cursorManager'].clearReviewCursor()
23
24 def setCallback(self, callback):
25 pass
+0
-34
src/fenrirscreenreader/commands/onCursorChange/77000-has_attribute.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import screen_utils
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('Reads attributes of current cursor position')
18 def run(self):
19 # is it enabled?
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'hasAttributes'):
21 return
22 # is a vertical change?
23 if not (self.env['runtime']['cursorManager'].isCursorVerticalMove() or\
24 self.env['runtime']['cursorManager'].isCursorHorizontalMove()):
25 return
26
27 cursorPos = self.env['screen']['newCursor']
28
29 if not self.env['runtime']['attributeManager'].hasAttributes(cursorPos):
30 return
31 self.env['runtime']['outputManager'].presentText('has attribute', soundIcon='HasAttributes', interrupt=False)
32 def setCallback(self, callback):
33 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import screen_utils
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('Reads attributes of current cursor position')
18 def run(self):
19 # is it enabled?
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'hasAttributes'):
21 return
22 # is a vertical change?
23 if not (self.env['runtime']['cursorManager'].isCursorVerticalMove() or\
24 self.env['runtime']['cursorManager'].isCursorHorizontalMove()):
25 return
26
27 cursorPos = self.env['screen']['newCursor']
28
29 if not self.env['runtime']['attributeManager'].hasAttributes(cursorPos):
30 return
31 self.env['runtime']['outputManager'].presentText('has attribute', soundIcon='HasAttributes', interrupt=False)
32 def setCallback(self, callback):
33 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('exits review mode')
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('review', 'leaveReviewOnCursorChange'):
20 return
21 if self.env['runtime']['cursorManager'].isReviewMode():
22 self.env['runtime']['cursorManager'].clearReviewCursor()
23
24 def setCallback(self, callback):
25 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # big changes are no char (but the value is bigger than one maybe the differ needs longer than you can type, so a little strange random buffer for now)
20 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
21 if xMove > 1:
22 return
23 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charEcho'):
24 return
25 # detect deletion or chilling
26 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
27 return
28 # is there any change?
29 if not self.env['runtime']['screenManager'].isDelta():
30 return
31
32 # filter unneded space on word begin
33 currDelta = self.env['screen']['newDelta']
34 if len(currDelta.strip()) != len(currDelta) and \
35 currDelta.strip() != '':
36 currDelta = currDelta.strip()
37 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
38
39 def setCallback(self, callback):
40 pass
41
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # try to detect the tab completion by cursor change
20 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
21 if xMove == 1:
22 return
23 # is there any change?
24 if not self.env['runtime']['screenManager'].isDelta():
25 return
26 if not( (xMove > 1) and xMove == len(self.env['screen']['newDelta'])):
27 return
28 # detect deletion or chilling
29 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
30 return
31
32 # filter unneded space on word begin
33 currDelta = self.env['screen']['newDelta']
34 if len(currDelta.strip()) != len(currDelta) and \
35 currDelta.strip() != '':
36 currDelta = currDelta.strip()
37 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, announceCapital=True, flush=False)
38
39 def setCallback(self, callback):
40 pass
41
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import char_utils
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return ''
18
19 def run(self):
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'):
21 return
22 if self.env['runtime']['screenManager'].isScreenChange():
23 return
24 # detect an change on the screen, we just want to cursor arround, so no change should appear
25 if self.env['runtime']['screenManager'].isDelta():
26 return
27 if self.env['runtime']['screenManager'].isNegativeDelta():
28 return
29 # is a vertical change?
30 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
31 return
32 # is it a horizontal change?
33 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
34 return
35
36 # echo word insteed of char
37 if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'):
38 if abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) != 1:
39 # get the word
40 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
41 x, y, currWord, endOfScreen, lineBreak = \
42 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
43 if self.env['screen']['newCursor']['x'] == x:
44 return
45 x, y, currChar = char_utils.getCurrentChar(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText'])
46 if not currChar.isspace():
47 self.env['runtime']['outputManager'].presentText(currChar, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
48 def setCallback(self, callback):
49 pass
50
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import line_utils
8 from fenrirscreenreader.utils import word_utils
9
10 class command():
11 def __init__(self):
12 self.lastIdent = -1
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return ''
19
20 def run(self):
21 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'):
22 return
23 if self.env['runtime']['screenManager'].isScreenChange():
24 self.lastIdent = 0
25 return
26 # this leads to problems in vim -> status line change -> no announcement, so we do check the lengh as hack
27 if self.env['runtime']['screenManager'].isDelta():
28 return
29
30 # is a vertical change?
31 if not self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33
34 x, y, currLine = line_utils.getCurrentLine(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText'])
35 if currLine.isspace():
36 self.env['runtime']['outputManager'].presentText(_("blank"), soundIcon='EmptyLine', interrupt=True, flush=False)
37 else:
38 # ident
39 currIdent = len(currLine) - len(currLine.lstrip())
40 if self.lastIdent == -1:
41 self.lastIdent = currIdent
42 doInterrupt = True
43 if self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoPresentIndent'):
44 if self.lastIdent != currIdent:
45 self.env['runtime']['outputManager'].presentText(_('indented ') + str(currIdent) + ' ', interrupt=doInterrupt, flush=False)
46 doInterrupt = False
47 # barrier
48 sayLine = currLine
49 if self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'):
50 isBarrier, barrierLine = self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y'])
51 if isBarrier:
52 sayLine = barrierLine
53 # output
54 self.env['runtime']['outputManager'].presentText(sayLine, interrupt=doInterrupt, flush=False)
55 self.lastIdent = currIdent
56 def setCallback(self, callback):
57 pass
58
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is it enabled?
22 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'):
23 return
24 # is naviation?
25 if self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'] != 1:
26 return
27 # just when cursor move worddetection is needed
28 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
29 return
30 # for now no new line
31 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33 # currently writing
34 if self.env['runtime']['screenManager'].isDelta():
35 return
36
37 # get the word
38 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
39 x, y, currWord, endOfScreen, lineBreak = \
40 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
41
42 # is there a word?
43 if currWord == '':
44 return
45 # at the end of a word
46 if not newContent[self.env['screen']['newCursor']['x']].isspace():
47 return
48 # at the end of a word
49 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
50 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
51 return
52
53 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
54
55 def setCallback(self, callback):
56 pass
57
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is navigation?
22 if not abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) > 1:
23 return
24
25 # just when cursor move worddetection is needed
26 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
27 return
28 # for now no new line
29 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
30 return
31 # currently writing
32 if self.env['runtime']['screenManager'].isDelta():
33 return
34
35 # get the word
36 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
37 x, y, currWord, endOfScreen, lineBreak = \
38 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
39
40 # is there a word?
41 if currWord == '':
42 return
43
44 # at the start of a word
45 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
46 (self.env['screen']['newCursor']['x'] != x):
47 return
48
49 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
50
51 def setCallback(self, callback):
52 pass
53
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import os, string
9
10 initialized = False
11 try:
12 import enchant
13 initialized = True
14 except:
15 pass
16
17 class command():
18 def __init__(self):
19 self.language = ''
20 self.spellChecker = ''
21 def initialize(self, environment):
22 self.env = environment
23 self.updateSpellLanguage()
24 def shutdown(self):
25 pass
26 def getDescription(self):
27 return 'No Description found'
28
29 def updateSpellLanguage(self):
30 if not initialized:
31 return
32 self.spellChecker = enchant.Dict(self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage'))
33 self.language = self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage')
34
35 def run(self):
36 if not initialized:
37 return
38 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoSpellCheck'):
39 return
40 if self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') != self.language:
41 try:
42 self.updateSpellLanguage()
43 except:
44 return
45
46 # just when horizontal cursor move worddetection is needed
47 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
48 return
49
50 # for now no new line
51 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
52 return
53 # more than a keyecho?
54 if len(self.env['screen']['newDelta']) > 1:
55 return
56 # deletion
57 if self.env['runtime']['screenManager'].isNegativeDelta():
58 return
59 # first place could not be the end of a word
60 if self.env['screen']['newCursor']['x'] == 0:
61 return
62
63 # get the word (just for speedup only look at current line
64 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
65 x, y, currWord, endOfScreen, lineBreak = word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
66 # was this a typed word?
67 if self.env['runtime']['screenManager'].isDelta():
68 if not(newContent[self.env['screen']['oldCursor']['x']] in string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~' and x != self.env['screen']['oldCursor']['x']):
69 return
70 else:
71 currWord = currWord.strip(string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~')
72 else:
73 # or just arrow arround?
74 if not newContent[self.env['screen']['newCursor']['x']].isspace():
75 return
76 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
77 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
78 return
79
80 # just on end of word
81 if self.env['screen']['newCursor']['x'] > 0:
82 if not newContent[self.env['screen']['oldCursor']['x'] - 1].lower() in string.ascii_lowercase:
83 return
84
85 # ignore bash buildins
86 if currWord in ['cd','fg','bg','alias','bind','dir','caller','buildin','command','declare','echo','enable','help','let','local','logout',\
87 'mapfile','printf','read','readarray','source','type','typeset','ulimit','unalias']:
88 return
89 # ignore the application name
90 if currWord.upper() == 'FENRIR':
91 return
92 if currWord[0] =='-':
93 return
94 if currWord[0] == '/':
95 return
96 if currWord[0] == '#':
97 return
98 if currWord.startswith('./'):
99 return
100 if '@' in currWord and '.' in currWord:
101 return
102 if currWord[0] == '@':
103 return
104 if currWord.isnumeric():
105 return
106 if currWord.isdecimal():
107 return
108 if currWord.isspace():
109 return
110
111 try:
112 if os.path.exists("/bin/"+currWord):
113 return
114 except:
115 pass
116 try:
117 if os.path.exists("/usr/bin/"+currWord):
118 return
119 except:
120 pass
121 try:
122 if os.path.exists("/sbin/"+currWord):
123 return
124 except:
125 pass
126
127 if not self.spellChecker.check(currWord):
128 self.env['runtime']['outputManager'].presentText(_('misspelled'), soundIcon='mispell', interrupt=False, flush=False)
129
130 def setCallback(self, callback):
131 pass
132
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charDeleteEcho'):
20 return
21 # detect typing or chilling
22 if self.env['screen']['newCursor']['x'] >= self.env['screen']['oldCursor']['x']:
23 return
24
25 # More than just a deletion happend
26 if self.env['runtime']['screenManager'].isDelta(ignoreSpace=True):
27 return
28
29 # no deletion
30 if not self.env['runtime']['screenManager'].isNegativeDelta():
31 return
32
33 # too much for a single backspace...
34 # word begin produce a diff wiht len == 2 |a | others with 1 |a|
35 if len(self.env['screen']['newNegativeDelta']) > 2:
36 return
37
38 currNegativeDelta = self.env['screen']['newNegativeDelta']
39 if len(currNegativeDelta.strip()) != len(currNegativeDelta) and \
40 currNegativeDelta.strip() != '':
41 currNegativeDelta = currNegativeDelta.strip()
42 self.env['runtime']['outputManager'].presentText(currNegativeDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
43 def setCallback(self, callback):
44 pass
45
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('exits review mode')
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('review', 'leaveReviewOnCursorChange'):
20 return
21 if self.env['runtime']['cursorManager'].isReviewMode():
22 self.env['runtime']['cursorManager'].clearReviewCursor()
23
24 def setCallback(self, callback):
25 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import screen_utils
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('Reads attributes of current cursor position')
18 def run(self):
19 # is it enabled?
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'hasAttributes'):
21 return
22 # is a vertical change?
23 if not (self.env['runtime']['cursorManager'].isCursorVerticalMove() or\
24 self.env['runtime']['cursorManager'].isCursorHorizontalMove()):
25 return
26
27 cursorPos = self.env['screen']['newCursor']
28
29 if not self.env['runtime']['attributeManager'].hasAttributes(cursorPos):
30 return
31 self.env['runtime']['outputManager'].presentText('has attribute', soundIcon='HasAttributes', interrupt=False)
32 def setCallback(self, callback):
33 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # big changes are no char (but the value is bigger than one maybe the differ needs longer than you can type, so a little strange random buffer for now)
20 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
21 if xMove > 1:
22 return
23 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charEcho'):
24 return
25 # detect deletion or chilling
26 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
27 return
28 # is there any change?
29 if not self.env['runtime']['screenManager'].isDelta():
30 return
31
32 # filter unneded space on word begin
33 currDelta = self.env['screen']['newDelta']
34 if len(currDelta.strip()) != len(currDelta) and \
35 currDelta.strip() != '':
36 currDelta = currDelta.strip()
37 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
38
39 def setCallback(self, callback):
40 pass
41
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is it enabled?
22 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'):
23 return
24 # is naviation?
25 if self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'] != 1:
26 return
27 # just when cursor move worddetection is needed
28 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
29 return
30 # for now no new line
31 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33 # currently writing
34 if self.env['runtime']['screenManager'].isDelta():
35 return
36
37 # get the word
38 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
39 x, y, currWord, endOfScreen, lineBreak = \
40 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
41
42 # is there a word?
43 if currWord == '':
44 return
45 # at the end of a word
46 if not newContent[self.env['screen']['newCursor']['x']].isspace():
47 return
48 # at the end of a word
49 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
50 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
51 return
52
53 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
54
55 def setCallback(self, callback):
56 pass
57
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import os, string
9
10 initialized = False
11 try:
12 import enchant
13 initialized = True
14 except:
15 pass
16
17 class command():
18 def __init__(self):
19 self.language = ''
20 self.spellChecker = ''
21 def initialize(self, environment):
22 self.env = environment
23 self.updateSpellLanguage()
24 def shutdown(self):
25 pass
26 def getDescription(self):
27 return 'No Description found'
28
29 def updateSpellLanguage(self):
30 if not initialized:
31 return
32 self.spellChecker = enchant.Dict(self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage'))
33 self.language = self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage')
34
35 def run(self):
36 if not initialized:
37 return
38 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoSpellCheck'):
39 return
40 if self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') != self.language:
41 try:
42 self.updateSpellLanguage()
43 except:
44 return
45
46 # just when horizontal cursor move worddetection is needed
47 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
48 return
49
50 # for now no new line
51 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
52 return
53 # more than a keyecho?
54 if len(self.env['screen']['newDelta']) > 1:
55 return
56 # deletion
57 if self.env['runtime']['screenManager'].isNegativeDelta():
58 return
59 # first place could not be the end of a word
60 if self.env['screen']['newCursor']['x'] == 0:
61 return
62
63 # get the word (just for speedup only look at current line
64 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
65 x, y, currWord, endOfScreen, lineBreak = word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
66 # was this a typed word?
67 if self.env['runtime']['screenManager'].isDelta():
68 if not(newContent[self.env['screen']['oldCursor']['x']] in string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~' and x != self.env['screen']['oldCursor']['x']):
69 return
70 else:
71 currWord = currWord.strip(string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~')
72 else:
73 # or just arrow arround?
74 if not newContent[self.env['screen']['newCursor']['x']].isspace():
75 return
76 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
77 (x + len(currWord) != self.env['screen']['newCursor']['x']-1):
78 return
79
80 # just on end of word
81 if self.env['screen']['newCursor']['x'] > 0:
82 if not newContent[self.env['screen']['oldCursor']['x'] - 1].lower() in string.ascii_lowercase:
83 return
84
85 # ignore bash buildins
86 if currWord in ['cd','fg','bg','alias','bind','dir','caller','buildin','command','declare','echo','enable','help','let','local','logout',\
87 'mapfile','printf','read','readarray','source','type','typeset','ulimit','unalias']:
88 return
89 # ignore the application name
90 if currWord.upper() == 'FENRIR':
91 return
92 if currWord[0] =='-':
93 return
94 if currWord[0] == '/':
95 return
96 if currWord[0] == '#':
97 return
98 if currWord.startswith('./'):
99 return
100 if '@' in currWord and '.' in currWord:
101 return
102 if currWord[0] == '@':
103 return
104 if currWord.isnumeric():
105 return
106 if currWord.isdecimal():
107 return
108 if currWord.isspace():
109 return
110
111 try:
112 if os.path.exists("/bin/"+currWord):
113 return
114 except:
115 pass
116 try:
117 if os.path.exists("/usr/bin/"+currWord):
118 return
119 except:
120 pass
121 try:
122 if os.path.exists("/sbin/"+currWord):
123 return
124 except:
125 pass
126
127 if not self.spellChecker.check(currWord):
128 self.env['runtime']['outputManager'].presentText(_('misspelled'), soundIcon='mispell', interrupt=False, flush=False)
129
130 def setCallback(self, callback):
131 pass
132
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charDeleteEcho'):
20 return
21 # detect typing or chilling
22 if self.env['screen']['newCursor']['x'] >= self.env['screen']['oldCursor']['x']:
23 return
24
25 # More than just a deletion happend
26 if self.env['runtime']['screenManager'].isDelta(ignoreSpace=True):
27 return
28
29 # no deletion
30 if not self.env['runtime']['screenManager'].isNegativeDelta():
31 return
32
33 # too much for a single backspace...
34 # word begin produce a diff wiht len == 2 |a | others with 1 |a|
35 if len(self.env['screen']['newNegativeDelta']) > 2:
36 return
37
38 currNegativeDelta = self.env['screen']['newNegativeDelta']
39 if len(currNegativeDelta.strip()) != len(currNegativeDelta) and \
40 currNegativeDelta.strip() != '':
41 currNegativeDelta = currNegativeDelta.strip()
42 self.env['runtime']['outputManager'].presentText(currNegativeDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
43 def setCallback(self, callback):
44 pass
45
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import char_utils
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return ''
18
19 def run(self):
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'):
21 return
22 if self.env['runtime']['screenManager'].isScreenChange():
23 return
24 # detect an change on the screen, we just want to cursor arround, so no change should appear
25 if self.env['runtime']['screenManager'].isDelta():
26 return
27 if self.env['runtime']['screenManager'].isNegativeDelta():
28 return
29 # is a vertical change?
30 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
31 return
32 # is it a horizontal change?
33 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
34 return
35
36 # echo word insteed of char
37 if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'):
38 if abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) != 1:
39 # get the word
40 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
41 x, y, currWord, endOfScreen, lineBreak = \
42 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
43 if self.env['screen']['newCursor']['x'] == x:
44 return
45 x, y, currChar = char_utils.getCurrentChar(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText'])
46 if not currChar.isspace():
47 self.env['runtime']['outputManager'].presentText(currChar, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False)
48 def setCallback(self, callback):
49 pass
50
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No Description found'
17
18 def run(self):
19 # try to detect the tab completion by cursor change
20 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
21 if xMove == 1:
22 return
23 # is there any change?
24 if not self.env['runtime']['screenManager'].isDelta():
25 return
26 if not( (xMove > 1) and xMove == len(self.env['screen']['newDelta'])):
27 return
28 # detect deletion or chilling
29 if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']:
30 return
31
32 # filter unneded space on word begin
33 currDelta = self.env['screen']['newDelta']
34 if len(currDelta.strip()) != len(currDelta) and \
35 currDelta.strip() != '':
36 currDelta = currDelta.strip()
37 self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, announceCapital=True, flush=False)
38
39 def setCallback(self, callback):
40 pass
41
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import word_utils
8 import string
9
10 class command():
11 def __init__(self):
12 pass
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No Description found'
19
20 def run(self):
21 # is navigation?
22 if not abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) > 1:
23 return
24
25 # just when cursor move worddetection is needed
26 if not self.env['runtime']['cursorManager'].isCursorHorizontalMove():
27 return
28 # for now no new line
29 if self.env['runtime']['cursorManager'].isCursorVerticalMove():
30 return
31 # currently writing
32 if self.env['runtime']['screenManager'].isDelta():
33 return
34
35 # get the word
36 newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
37 x, y, currWord, endOfScreen, lineBreak = \
38 word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent)
39
40 # is there a word?
41 if currWord == '':
42 return
43
44 # at the start of a word
45 if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \
46 (self.env['screen']['newCursor']['x'] != x):
47 return
48
49 self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False)
50
51 def setCallback(self, callback):
52 pass
53
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import line_utils
8 from fenrirscreenreader.utils import word_utils
9
10 class command():
11 def __init__(self):
12 self.lastIdent = -1
13 def initialize(self, environment):
14 self.env = environment
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return ''
19
20 def run(self):
21 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'):
22 return
23 if self.env['runtime']['screenManager'].isScreenChange():
24 self.lastIdent = 0
25 return
26 # this leads to problems in vim -> status line change -> no announcement, so we do check the lengh as hack
27 if self.env['runtime']['screenManager'].isDelta():
28 return
29
30 # is a vertical change?
31 if not self.env['runtime']['cursorManager'].isCursorVerticalMove():
32 return
33
34 x, y, currLine = line_utils.getCurrentLine(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText'])
35 if currLine.isspace():
36 self.env['runtime']['outputManager'].presentText(_("blank"), soundIcon='EmptyLine', interrupt=True, flush=False)
37 else:
38 # ident
39 currIdent = len(currLine) - len(currLine.lstrip())
40 if self.lastIdent == -1:
41 self.lastIdent = currIdent
42 doInterrupt = True
43 if self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoPresentIndent'):
44 if self.lastIdent != currIdent:
45 self.env['runtime']['outputManager'].presentText(_('indented ') + str(currIdent) + ' ', interrupt=doInterrupt, flush=False)
46 doInterrupt = False
47 # barrier
48 sayLine = currLine
49 if self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'):
50 isBarrier, barrierLine = self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y'])
51 if isBarrier:
52 sayLine = barrierLine
53 # output
54 self.env['runtime']['outputManager'].presentText(sayLine, interrupt=doInterrupt, flush=False)
55 self.lastIdent = currIdent
56 def setCallback(self, callback):
57 pass
58
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import screen_utils
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('Reads attributes of current cursor position')
18 def run(self):
19 # is it enabled?
20 if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'hasAttributes'):
21 return
22 # is a vertical change?
23 if not (self.env['runtime']['cursorManager'].isCursorVerticalMove() or\
24 self.env['runtime']['cursorManager'].isCursorHorizontalMove()):
25 return
26
27 cursorPos = self.env['screen']['newCursor']
28
29 if not self.env['runtime']['attributeManager'].hasAttributes(cursorPos):
30 return
31 self.env['runtime']['outputManager'].presentText('has attribute', soundIcon='HasAttributes', interrupt=False)
32 def setCallback(self, callback):
33 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('exits review mode')
17
18 def run(self):
19 if not self.env['runtime']['settingsManager'].getSettingAsBool('review', 'leaveReviewOnCursorChange'):
20 return
21 if self.env['runtime']['cursorManager'].isReviewMode():
22 self.env['runtime']['cursorManager'].clearReviewCursor()
23
24 def setCallback(self, callback):
25 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 if self.env['runtime']['helpManager'].isTutorialMode():
19 self.env['runtime']['inputManager'].keyEcho()
20
21 def setCallback(self, callback):
22 pass
+0
-22
src/fenrirscreenreader/commands/onPlugInputDevice/50000-UpdateDevices.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 pass
19 #self.env['runtime']['inputManager'].updateInputDevices()
20 def setCallback(self, callback):
21 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 import time
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 self.lastTime = time.time()
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No description found'
19 def run(self):
20 playSound = False
21 deviceList = self.env['runtime']['inputManager'].getLastDetectedDevices()
22 try:
23 for deviceEntry in deviceList:
24 # dont play sounds for virtual devices
25 playSound = playSound or not deviceEntry['virtual']
26 except:
27 playSound = True
28 if playSound:
29 if time.time() - self.lastTime > 5:
30 self.env['runtime']['outputManager'].playSoundIcon(soundIcon = 'accept', interrupt=True)
31 lastTime = time.time()
32 def setCallback(self, callback):
33 pass
+0
-25
src/fenrirscreenreader/commands/onPlugInputDevice/80000-plugSound.py less more
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 import time
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 self.lastTime = time.time()
15 def shutdown(self):
16 pass
17 def getDescription(self):
18 return 'No description found'
19 def run(self):
20 if time.time() - self.lastTime > 2:
21 self.env['runtime']['outputManager'].playSoundIcon(soundIcon = 'accept', interrupt=True)
22 lastTime = time.time()
23 def setCallback(self, callback):
24 pass
1212 def shutdown(self):
1313 pass
1414 def getDescription(self):
15 return _('enables or disables tracking of highlighted')
16
15 return _('enables or disables tracking of highlighted')
1716 def run(self):
1817 if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'highlight'):
1918 return
2019 attributeDelta = self.env['runtime']['attributeManager'].getAttributeDelta()
21 self.env['runtime']['outputManager'].presentText(attributeDelta, soundIcon='', interrupt=True, flush=False)
22
20 self.env['runtime']['outputManager'].presentText(attributeDelta, soundIcon='', interrupt=True, flush=False)
2321 def setCallback(self, callback):
2422 pass
1313 def shutdown(self):
1414 pass
1515 def getDescription(self):
16 return ''
16 return ''
1717 def run(self):
1818 if self.env['screen']['newAttribDelta'] != '':
1919 return
3030 if self.env['runtime']['inputManager'].getShortcutType() in ['KEY']:
3131 if not (self.env['runtime']['inputManager'].getLastDeepestInput() in [['KEY_UP'],['KEY_DOWN']]):
3232 return
33 if self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
33 elif self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
3434 if not (self.env['runtime']['byteManager'].getLastByteKey() in [b'^[[A',b'^[[B']):
3535 return
36
36
3737 prevLine = self.env['screen']['oldContentText'].split('\n')[self.env['screen']['newCursor']['y']]
38 currLine = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
38 currLine = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
3939 if prevLine == currLine:
4040 if self.env['screen']['newDelta'] != '':
41 return
41 return
4242 if not currLine.isspace():
4343 currPrompt = currLine.find('$')
4444 rootPrompt = currLine.find('#')
4646 if rootPrompt > 0:
4747 currPrompt = rootPrompt
4848 else:
49 announce = currLine
49 announce = currLine
5050 if currPrompt > 0:
5151 remove_digits = str.maketrans('0123456789', ' ')
5252 if prevLine[:currPrompt].translate(remove_digits) == currLine[:currPrompt].translate(remove_digits):
5353 announce = currLine[currPrompt+1:]
5454 else:
55 announce = currLine
55 announce = currLine
5656
5757 if currLine.isspace():
5858 self.env['runtime']['outputManager'].presentText(_("blank"), soundIcon='EmptyLine', interrupt=True, flush=False)
59 else:
59 else:
6060 self.env['runtime']['outputManager'].presentText(announce, interrupt=True, flush=False)
6161 self.env['commandsIgnore']['onScreenUpdate']['CHAR_DELETE_ECHO'] = True
6262 self.env['commandsIgnore']['onScreenUpdate']['CHAR_ECHO'] = True
1313 def shutdown(self):
1414 pass
1515 def getDescription(self):
16 return 'No Description found'
16 return 'No Description found'
1717
1818 def run(self):
1919 if not self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'autoReadIncoming'):
2020 return
2121 # is there something to read?
2222 if not self.env['runtime']['screenManager'].isDelta(ignoreSpace=True):
23 return
24
25 # this must be a keyecho or something
23 return
24
25 # this must be a keyecho or something
2626 #if len(self.env['screen']['newDelta'].strip(' \n\t')) <= 1:
2727 xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'])
2828 yMove = abs(self.env['screen']['newCursor']['y'] - self.env['screen']['oldCursor']['y'])
3030 if (xMove >= 1) and xMove == len(self.env['screen']['newDelta']):
3131 # if len(self.env['screen']['newDelta'].strip(' \n\t0123456789')) <= 2:
3232 if not '\n' in self.env['screen']['newDelta']:
33 return
33 return
3434 #print(xMove, yMove, len(self.env['screen']['newDelta']), len(self.env['screen']['newNegativeDelta']))
3535 self.env['runtime']['outputManager'].presentText(self.env['screen']['newDelta'], interrupt=False, flush=False)
3636
1414 def shutdown(self):
1515 pass
1616 def getDescription(self):
17 return 'No Description found'
18
17 return 'No Description found'
1918 def run(self):
2019 if not self.env['runtime']['settingsManager'].getSettingAsBool('promote', 'enabled'):
2120 return
2423 if int(time.time() - self.env['input']['lastInputTime']) < self.env['runtime']['settingsManager'].getSettingAsInt('promote', 'inactiveTimeoutSec'):
2524 return
2625 if len(self.env['runtime']['settingsManager'].getSetting('promote', 'list')) == 0:
27 return
26 return
2827 for promote in self.env['runtime']['settingsManager'].getSetting('promote', 'list').split(','):
2928 if promote in self.env['screen']['newDelta']:
30 self.env['runtime']['outputManager'].playSoundIcon('PromotedText')
29 self.env['runtime']['outputManager'].playSoundIcon('PromotedText')
3130 self.env['input']['lastInputTime'] = time.time()
3231 return
33
3432 def setCallback(self, callback):
3533 pass
3634
1313 def shutdown(self):
1414 pass
1515 def getDescription(self):
16 return 'No Description found'
17
16 return 'No Description found'
1817 def run(self):
1918 if not self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'):
2019 return
2120 if not self.env['runtime']['screenManager'].isDelta(ignoreSpace=True):
22 return
23
21 return
2422 self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y'])
25
2623 def setCallback(self, callback):
2724 pass
2825
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get current quick menu entry')
17 def run(self):
18 menu = ''
19 value = ''
20 menu = self.env['runtime']['quickMenuManager'].getCurrentEntry()
21 if menu != '':
22 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
23 self.env['runtime']['outputManager'].presentText(menu + ' ' + value, interrupt=True)
24 def setCallback(self, callback):
25 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get current quick menu value')
17 def run(self):
18 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
19 self.env['runtime']['outputManager'].presentText(value, interrupt=True)
20 def setCallback(self, callback):
21 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get next quick menu entry')
17 def run(self):
18 menu = ''
19 value = ''
20 if self.env['runtime']['quickMenuManager'].nextEntry():
21 menu = self.env['runtime']['quickMenuManager'].getCurrentEntry()
22 if menu != '':
23 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
24 self.env['runtime']['outputManager'].presentText(menu + ' ' + value, interrupt=True)
25 else:
26 self.env['runtime']['outputManager'].presentText(_('Quick menu not available'), interrupt=True)
27 def setCallback(self, callback):
28 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get next quick menu value')
17 def run(self):
18 if self.env['runtime']['quickMenuManager'].nextValue():
19 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
20 self.env['runtime']['outputManager'].presentText(value, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get previous quick menu entry')
17 def run(self):
18 menu = ''
19 value = ''
20 if self.env['runtime']['quickMenuManager'].prevEntry():
21 menu = self.env['runtime']['quickMenuManager'].getCurrentEntry()
22 if menu != '':
23 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
24 self.env['runtime']['outputManager'].presentText(menu + ' ' + value, interrupt=True)
25 else:
26 self.env['runtime']['outputManager'].presentText(_('Quick menu not available'), interrupt=True)
27 def setCallback(self, callback):
28 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get previous quick menu value')
17 def run(self):
18 if self.env['runtime']['quickMenuManager'].prevValue():
19 value = self.env['runtime']['quickMenuManager'].getCurrentValue()
20 self.env['runtime']['outputManager'].presentText(value, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get current v menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].getCurrentEntry()
19 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
20 def setCallback(self, callback):
21 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('leave v menu submenu')
17 def run(self):
18 self.env['runtime']['vmenuManager'].decLevel()
19 text = self.env['runtime']['vmenuManager'].getCurrentEntry()
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('execute v menu entry')
17 def run(self):
18 self.env['runtime']['vmenuManager'].executeMenu()
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('enter v menu submenu')
17 def run(self):
18 self.env['runtime']['vmenuManager'].incLevel()
19 text = self.env['runtime']['vmenuManager'].getCurrentEntry()
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get next v menu entry')
17 def run(self):
18 self.env['runtime']['vmenuManager'].nextIndex()
19 text = self.env['runtime']['vmenuManager'].getCurrentEntry()
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('get prev v menu entry')
17 def run(self):
18 self.env['runtime']['vmenuManager'].prevIndex()
19 text = self.env['runtime']['vmenuManager'].getCurrentEntry()
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 def setCallback(self, callback):
22 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('a')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('b')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('c')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('d')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('e')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('f')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('g')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('h')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('i')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('j')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('k')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('l')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('m')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('n')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('o')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('p')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('q')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('r')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('s')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('t')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('u')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('v')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('a')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('x')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('y')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return _('search for an menu entry')
17 def run(self):
18 text = self.env['runtime']['vmenuManager'].searchEntry('z')
19 if text != '':
20 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
21 else:
22 self.env['runtime']['outputManager'].presentText(_('not found'), soundIcon='ErrorScreen', interrupt=True)
23 def setCallback(self, callback):
24 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run open macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run open save' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run replace macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run search macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 import datetime
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('presents the date')
18
19 def run(self):
20 dateFormat = self.env['runtime']['settingsManager'].getSetting('general', 'dateFormat')
21
22 # get the time formatted
23 dateString = datetime.datetime.strftime(datetime.datetime.now(), dateFormat)
24
25 # present the time via speak and braile, there is no soundicon, interrupt the current speech
26 self.env['runtime']['outputManager'].presentText(dateString , soundIcon='', interrupt=True)
27
28 def setCallback(self, callback):
29 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 self.keyMakro = [[1, 'KEY_LEFTCTRL'], [1, 'KEY_G'], [0.05,'sleep'] ,[0, 'KEY_G'], [0, 'KEY_LEFTCTRL']]
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return 'No description found'
18 def run(self):
19 self.env['runtime']['inputManager'].sendKeys(self.keyMakro)
20 def setCallback(self, callback):
21 pass
22
23
24
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 self.macro = [[1,'KEY_LEFTSHIFT'],[1,'KEY_LEFTCTRL'],[1,'KEY_N'],[0.05,'SLEEP'],[0,'KEY_N'],[0,'KEY_LEFTCTRL'],[0,'KEY_LEFTSHIFT']]
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return 'No description found'
18 def run(self):
19 self.env['runtime']['inputManager'].sendKeys(self.macro)
20 def setCallback(self, callback):
21 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run open save' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run replace macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run search macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 import datetime
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('presents the date')
18
19 def run(self):
20 dateFormat = self.env['runtime']['settingsManager'].getSetting('general', 'dateFormat')
21
22 # get the time formatted
23 dateString = datetime.datetime.strftime(datetime.datetime.now(), dateFormat)
24
25 # present the time via speak and braile, there is no soundicon, interrupt the current speech
26 self.env['runtime']['outputManager'].presentText(dateString , soundIcon='', interrupt=True)
27
28 def setCallback(self, callback):
29 pass
0 #!/usr/bin/env python
1 # -*- encoding: utf-8
2 from fenrirscreenreader.core import debug
3
4
5 class command():
6 def __init__(self):
7 pass
8
9 def initialize(self, environment):
10 self.env = environment
11 self.keyMakro = [[1, 'KEY_LEFTCTRL'],
12 [1, 'KEY_G'],
13 [0.05, 'SLEEP'],
14 [0, 'KEY_G'],
15 [0, 'KEY_LEFTCTRL']]
16
17 def shutdown(self):
18 pass
19
20 def getDescription(self):
21 return "Learn about the Nano text editor."
22
23 def run(self):
24 self.env['runtime']['outputManager'].presentText(
25 "Okay, loading the information about Nano.", interrupt=True)
26 if self.env['runtime']['inputManager'].getShortcutType() in ['KEY']:
27 self.env['runtime']['inputManager'].sendKeys(self.keyMakro)
28 elif self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
29 self.env['runtime']['byteManager'].sendBytes(self.byteMakro)
30
31 def setCallback(self, callback):
32 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run open macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/usr/bin/env python
1 # -*- encoding: utf-8
2 from fenrirscreenreader.core import debug
3
4
5 class command():
6 def __init__(self):
7 pass
8
9 def initialize(self, environment):
10 self.env = environment
11 self.keyMakro = [[1, 'KEY_LEFTCTRL'],
12 [1, 'KEY_S'],
13 [0.05, 'SLEEP'],
14 [0, 'KEY_S'],
15 [0, 'KEY_LEFTCTRL']]
16
17 def shutdown(self):
18 pass
19
20 def getDescription(self):
21 return "Save your work."
22
23 def run(self):
24 self.env['runtime']['outputManager'].presentText(
25 "Okay, you will now be asked to save your work.", interrupt=True)
26 if self.env['runtime']['inputManager'].getShortcutType() in ['KEY']:
27 self.env['runtime']['inputManager'].sendKeys(self.keyMakro)
28 elif self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
29 self.env['runtime']['byteManager'].sendBytes(self.byteMakro)
30
31 def setCallback(self, callback):
32 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run replace macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run search macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 import datetime
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('presents the date')
18
19 def run(self):
20 dateFormat = self.env['runtime']['settingsManager'].getSetting('general', 'dateFormat')
21
22 # get the time formatted
23 dateString = datetime.datetime.strftime(datetime.datetime.now(), dateFormat)
24
25 # present the time via speak and braile, there is no soundicon, interrupt the current speech
26 self.env['runtime']['outputManager'].presentText(dateString , soundIcon='', interrupt=True)
27
28 def setCallback(self, callback):
29 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run open macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run open save' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run replace macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 def shutdown(self):
14 pass
15 def getDescription(self):
16 return 'No description found'
17 def run(self):
18 self.env['runtime']['outputManager'].presentText('ok i run search macro' , interrupt=True)
19 def setCallback(self, callback):
20 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 import datetime
8
9 class command():
10 def __init__(self):
11 pass
12 def initialize(self, environment):
13 self.env = environment
14 def shutdown(self):
15 pass
16 def getDescription(self):
17 return _('presents the date')
18
19 def run(self):
20 dateFormat = self.env['runtime']['settingsManager'].getSetting('general', 'dateFormat')
21
22 # get the time formatted
23 dateString = datetime.datetime.strftime(datetime.datetime.now(), dateFormat)
24
25 # present the time via speak and braile, there is no soundicon, interrupt the current speech
26 self.env['runtime']['outputManager'].presentText(dateString , soundIcon='', interrupt=True)
27
28 def setCallback(self, callback):
29 pass
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7
8 class command():
9 def __init__(self):
10 pass
11 def initialize(self, environment):
12 self.env = environment
13 # examples:
14 # self.keyMakro = [[1,'KEY_LEFTCTRL'],[1,'KEY_O'],[0.05,'SLEEP'],[0,'KEY_O'],[0,'KEY_LEFTCTRL']]
15 # self.keyMakro = [[1,'KEY_LEFTSHIFT'],[1,'KEY_LEFTCTRL'],[1,'KEY_N'],[0.05,'SLEEP'],[0,'KEY_N'],[0,'KEY_LEFTCTRL'],[0,'KEY_LEFTSHIFT']]
16 self.keyMakro = []
17 self.byteMakro = []
18 def shutdown(self):
19 pass
20 def getDescription(self):
21 return 'No description found'
22 def run(self):
23 if self.env['runtime']['inputManager'].getShortcutType() in ['KEY']:
24 self.env['runtime']['inputManager'].sendKeys(self.keyMakro)
25 elif self.env['runtime']['inputManager'].getShortcutType() in ['BYTE']:
26 self.env['runtime']['byteManager'].sendBytes(self.byteMakro)
27 def setCallback(self, callback):
28 pass
1313 self.currAttributeDelta = ''
1414 self.currAttributeCursor = None
1515 self.prefAttributeCursor = None
16 self.initDefaultAttributes()
17 self.prevLastCursorAttribute = None
18 self.currLastCursorAttribute = None
19
16 self.initDefaultAttributes()
17 self.prevLastCursorAttribute = None
18 self.currLastCursorAttribute = None
19
2020 def initialize(self, environment):
21 self.env = environment
21 self.env = environment
2222 def shutdown(self):
2323 pass
2424 def setLastCursorAttribute(self, lastCursorAttribute):
2525 self.prevLastCursorAttribute = self.currLastCursorAttribute
26 self.currLastCursorAttribute = lastCursorAttribute
27 def resetLastCursorAttribute(self, lastCursorAttribute):
26 self.currLastCursorAttribute = lastCursorAttribute
27 def resetLastCursorAttribute(self):
2828 self.prevLastCursorAttribute = None
29 self.currLastCursorAttribute = None
29 self.currLastCursorAttribute = None
3030 def isLastCursorAttributeChange(self):
3131 if self.prevLastCursorAttribute == None:
3232 return False
4242 def resetAttributeAll(self):
4343 self.resetAttributeDelta()
4444 self.resetAttributeCursor()
45 def getAttributeDelta(self):
46 return self.currAttributeDelta
45 def getAttributeDelta(self):
46 return self.currAttributeDelta
4747 def resetAttributeDelta(self):
48 self.currAttributeDelta = ''
49 def setAttributeDelta(self, currAttributeDelta):
48 self.currAttributeDelta = ''
49 def setAttributeDelta(self, currAttributeDelta):
5050 self.currAttributeDelta = currAttributeDelta
5151 def resetAttributeCursor(self):
5252 self.currAttributeCursor = None
5353 self.prefAttributeCursor = None
5454 def setAttributeCursor(self, currAttributeCursor):
55 self.prefAttributeCursor = self.currAttributeCursor
55 self.prefAttributeCursor = self.currAttributeCursor
5656 self.currAttributeCursor = currAttributeCursor.copy()
5757 def resetAttributes(self, currAttributes):
58 self.prevAttributes = None
59 self.currAttributes = currAttributes
58 self.prevAttributes = None
59 self.currAttributes = currAttributes
6060 def setAttributes(self, currAttributes):
61 self.prevAttributes = self.currAttributes
61 self.prevAttributes = self.currAttributes
6262 self.currAttributes = currAttributes.copy()
63
6364 def getAttributeByXY(self, x, y):
6465 if not self.currAttributes:
6566 return None
6667 if len(self.currAttributes) < y:
6768 return None
6869 if len(self.currAttributes[y]) < x - 1:
69 return None
70 try:
70 return None
71 try:
7172 return self.currAttributes[y][x]
7273 except KeyError:
7374 try:
8081 return
8182 if len(attribute) != 10:
8283 return
83 self.defaultAttributes.append(attribute)
84 self.defaultAttributes.append(attribute)
8485 def initDefaultAttributes(self):
8586 self.defaultAttributes = [None]
8687 self.defaultAttributes.append([
9495 False, # blink
9596 'default', # fontsize
9697 'default' # fontfamily
97 ]) #end attribute
98 ]) #end attribute
9899 def isDefaultAttribute(self,attribute):
99100 return attribute in self.defaultAttributes
100101 def hasAttributes(self, cursor, update=True):
105106 attribute = self.getAttributeByXY( cursorPos['x'], cursorPos['y'])
106107
107108 if update:
108 self.setLastCursorAttribute(attribute)
109 self.setLastCursorAttribute(attribute)
109110 if not self.isLastCursorAttributeChange():
110111 return False
111112
133134 # "italics",
134135 # "underscore",
135136 # "strikethrough",
136 # "reverse",
137 # "blink"
137 # "reverse",
138 # "blink"
138139 # "fontsieze"
139 # "fontfamily"
140 # "fontfamily"
140141 if attributeFormatString == '':
141142 attributeFormatString = self.env['runtime']['settingsManager'].getSetting('general', 'attributeFormatString')
142143 if not attributeFormatString:
147148 return ''
148149 if len(attribute) != 10:
149150 return ''
150
151
151152 # 0 FG color (name)
152153 try:
153154 attributeFormatString = attributeFormatString.replace('fenrirFGColor', _(attribute[0]))
168169 pass
169170 attributeFormatString = attributeFormatString.replace('fenrirBold', '')
170171
171 # 3 italics (True/ False)
172 try:
173 if attribute[3]:
172 # 3 italics (True/ False)
173 try:
174 if attribute[3]:
174175 attributeFormatString = attributeFormatString.replace('fenrirItalics', _('italic'))
175176 except Exception as e:
176177 pass
194195
195196 # 6 reverse (True/ False)
196197 try:
197 if attribute[6]:
198 if attribute[6]:
198199 attributeFormatString = attributeFormatString.replace('fenrirReverse', _('reverse'))
199200 except Exception as e:
200201 pass
201202 attributeFormatString = attributeFormatString.replace('fenrirReverse', '')
202203
203 # 7 blink (True/ False)
204 try:
205 if attribute[7]:
204 # 7 blink (True/ False)
205 try:
206 if attribute[7]:
206207 attributeFormatString = attributeFormatString.replace('fenrirBlink', _('blink'))
207208 except Exception as e:
208209 pass
235236 currCursor = None
236237 # screen change
237238 if self.prevAttributes == None:
238 return result, currCursor
239 return result, currCursor
239240 # no change
240241 if self.prevAttributes == self.currAttributes:
241242 return result, currCursor
242243 # error case
243244 if self.currAttributes == None:
244 return result, currCursor
245 return result, currCursor
245246 # special case for pty if not text exists.
246247 if len(self.currAttributes) == 0:
247 return result, currCursor
248 return result, currCursor
248249 text = self.env['runtime']['screenManager'].getScreenText()
249250 textLines = text.split('\n')
250251
267268 if line < 0:
268269 return False
269270 if line > len(currAttributes):
270 return False
271 return False
271272 useful = False
272273 if mode == 'default':
273274 # non default tracking
277278 if line == 0:
278279 useful = (currAttributes[line][column][attribute] != currAttributes[line + 1][column][attribute]) and (currAttributes[line][column][attribute] != currAttributes[line + 2][column][attribute])
279280 elif line >= len(prevAttributes):
280 useful = (currAttributes[line][column][attribute] != currAttributes[line - 1][column][attribute]) and (currAttributes[line][column][attribute] != currAttributes[line - 2][column][attribute])
281 useful = (currAttributes[line][column][attribute] != currAttributes[line - 1][column][attribute]) and (currAttributes[line][column][attribute] != currAttributes[line - 2][column][attribute])
281282 else:
282 useful = (currAttributes[line][column][attribute] != currAttributes[line + 1][column][attribute]) and (currAttributes[line][column][attribute] != currAttributes[line - 1][column][attribute])
283 useful = (currAttributes[line][column][attribute] != currAttributes[line + 1][column][attribute]) and (currAttributes[line][column][attribute] != currAttributes[line - 1][column][attribute])
283284 elif mode == 'barrier':
284285 # to be implement
285286 useful = True
286
287
287288 return useful
288289
4040
4141 if not isBarrier:
4242 sayLine = ''
43 return isBarrier, sayLine
44
45 def hasBorder(self, text, xCursor, yCursor, validBorder, barrierPos):
46 # check for corners here
47 lastLineNo = len(text) - 1
48 if yCursor <= 0:
49 if not (text[0][barrierPos] in validBorder):
50 return False
51 if len(text) > 1:
52 if not (text[1][barrierPos] in validBorder):
53 return False
54 if len(text) > 2:
55 if not (text[2][barrierPos] in validBorder):
56 return False
57 elif yCursor >= lastLineNo:
58 if not (text[lastLineNo][barrierPos] in validBorder):
59 return False
60 if len(text) > 1:
61 if not (text[lastLineNo - 1][barrierPos] in validBorder):
62 return False
63 if len(text) > 2:
64 if not (text[lastLineNo - 2][barrierPos] in validBorder):
65 return False
66 else:
67 if not (text[yCursor][barrierPos] in validBorder):
68 return False
69 if not (text[yCursor - 1][barrierPos] in validBorder):
70 return False
71 if not (text[yCursor + 1][barrierPos] in validBorder):
72 return False
73 return True
43 return isBarrier, sayLine
44
7445 def getBarrierText(self, text, xCursor, yCursor):
7546 line = text[yCursor]
7647 if not self.env['runtime']['settingsManager'].getSettingAsBool('barrier', 'enabled'):
8859 offset = xCursor - 1
8960 start = line[:offset].rfind(b)
9061 if start != -1:
91 if not self.hasBorder(text, xCursor, yCursor, leftBarriers, start):
92 start = -1
93 else:
94 start += 1
62 start += 1
9563 break
9664 if start == -1:
9765 return False, line
10068 end = line[start:].find(b)
10169 if end != -1:
10270 end = start + end
103 if not self.hasBorder(text, xCursor, yCursor,rightBarriers, end):
104 end = -1
10571 break
10672 if end == -1:
10773 return False, line
2828 if convertedEscapeSequence[0] == 94 and convertedEscapeSequence[1] ==91:
2929 convertedEscapeSequence = b'^[' + convertedEscapeSequence[2:]
3030 return convertedEscapeSequence
31 def handleByteStream(self, eventData, sep = b'\x1b'):
32 buffer = eventData
33 # handle prefix
34 endIndex = buffer.find(sep)
35 if endIndex > 0:
36 currSequence = buffer[:endIndex]
37 buffer = buffer[endIndex:]
38 self.handleSingleByteSequence(currSequence)
39 # special handlig for none found (performance)
40 elif endIndex == -1:
41 self.handleSingleByteSequence(buffer)
42 return
43 # handle outstanding sequence
44 while buffer != b'':
45 endIndex = buffer[len(sep):].find(sep)
46 if endIndex == -1:
47 currSequence = buffer
48 buffer = b''
49 else:
50 currSequence = buffer[:endIndex + len(sep)]
51 buffer = buffer[endIndex + len(sep):]
52 self.handleSingleByteSequence(currSequence)
3153 def handleByteInput(self, eventData):
3254 if not eventData:
3355 return
3456 if eventData == b'':
3557 return
36
58 try:
59 self.env['runtime']['debug'].writeDebugOut("handleByteInput " + eventData.decode('utf8') ,debug.debugLevel.INFO)
60 except:
61 pass
62 self.handleByteStream(eventData)
63 def handleSingleByteSequence(self, eventData):
3764 convertedEscapeSequence = self.unifyEscapeSeq(eventData)
3865
3966 if self.switchCtrlModeOnce > 0:
81108 self.env['runtime']['outputManager'].presentText(_('bypass'), soundIcon='PTYBypass', interrupt=True, flush=True)
82109 return True
83110 return False
111 def sendBytes(self, byteMacro):
112 pass
84113 def detectByteCommand(self, escapeSequence):
85114 convertedEscapeSequence = self.unifyEscapeSeq(escapeSequence)
86115 command = self.env['runtime']['inputManager'].getCommandForShortcut(convertedEscapeSequence)
3030 def shutdown(self):
3131 for commandFolder in self.env['general']['commandFolderList']:
3232 self.env['runtime']['commandManager'].shutdownCommands(commandFolder)
33
33
34 def loadFile(self, filepath = ''):
35 if filepath == '':
36 return None
37 if not os.path.exists(filepath):
38 self.env['runtime']['debug'].writeDebugOut("loadFile: filepath not exists:" + filepath ,debug.debugLevel.WARNING)
39 return None
40 if os.path.isdir(filepath):
41 self.env['runtime']['debug'].writeDebugOut("loadFile: filepath is a directory:" + filepath ,debug.debugLevel.ERROR)
42 return None
43 if not os.access(filepath, os.R_OK):
44 self.env['runtime']['debug'].writeDebugOut("loadFile: filepath not readable:" + filepath ,debug.debugLevel.ERROR)
45 return None
46
47 try:
48 fileName, fileExtension = os.path.splitext(filepath)
49 fileName = fileName.split('/')[-1]
50 if fileName.startswith('__'):
51 return None
52 if fileExtension.lower() == '.py':
53 command_mod = module_utils.importModule(fileName, filepath)
54 command = command_mod.command()
55 command.initialize(self.env)
56 self.env['runtime']['debug'].writeDebugOut("loadFile: Load command:" + filepath ,debug.debugLevel.INFO, onAnyLevel=True)
57 return command
58 except Exception as e:
59 self.env['runtime']['debug'].writeDebugOut("loadFile: Loading command:" + filepath ,debug.debugLevel.ERROR)
60 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
61 return None
3462 def loadCommands(self, section='commands',commandPath=''):
3563 if commandPath =='':
3664 commandPath = fenrirPath+ "/commands/"
3765 if not commandPath.endswith('/'):
38 commandPath += '/'
66 commandPath += '/'
3967 commandFolder = commandPath + section +"/"
4068 if not os.path.exists(commandFolder):
41 self.env['runtime']['debug'].writeDebugOut("commandFolder not exists:" + commandFolder ,debug.debugLevel.WARNING)
69 self.env['runtime']['debug'].writeDebugOut("loadCommands: commandFolder not exists:" + commandFolder ,debug.debugLevel.WARNING)
4270 return
4371 if not os.path.isdir(commandFolder):
44 self.env['runtime']['debug'].writeDebugOut("commandFolder not a directory:" + commandFolder ,debug.debugLevel.ERROR)
45 return
72 self.env['runtime']['debug'].writeDebugOut("loadCommands: commandFolder not a directory:" + commandFolder ,debug.debugLevel.ERROR)
73 return
4674 if not os.access(commandFolder, os.R_OK):
47 self.env['runtime']['debug'].writeDebugOut("commandFolder not readable:" + commandFolder ,debug.debugLevel.ERROR)
48 return
75 self.env['runtime']['debug'].writeDebugOut("loadCommands: commandFolder not readable:" + commandFolder ,debug.debugLevel.ERROR)
76 return
4977 self.env['commands'][section] = {}
5078 self.env['commandsIgnore'][section] = {}
5179 commandList = glob.glob(commandFolder+'*')
6593 self.env['commands'][section][fileName.upper()] = command_mod.command()
6694 self.env['commandsIgnore'][section][fileName.upper()[fileName.upper().find('-')+1:]+'_IGNORE'] = False
6795 self.env['commands'][section][fileName.upper()].initialize(self.env)
68 self.env['runtime']['debug'].writeDebugOut("Load command:" + section + "." + fileName.upper() ,debug.debugLevel.INFO, onAnyLevel=True)
69 except Exception as e:
70 self.env['runtime']['debug'].writeDebugOut("Loading command:" + command ,debug.debugLevel.ERROR)
96 self.env['runtime']['debug'].writeDebugOut("loadCommands: Load command:" + section + "." + fileName.upper() ,debug.debugLevel.INFO, onAnyLevel=True)
97 except Exception as e:
98 self.env['runtime']['debug'].writeDebugOut("loadCommands: Loading command:" + command ,debug.debugLevel.ERROR)
7199 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
72100 continue
73101
117145 if not self.env['runtime']['inputManager'].isValidKey(key.upper()):
118146 self.env['runtime']['debug'].writeDebugOut("invalid key : "+ key.upper() + ' script:' + fileName ,debug.debugLevel.WARNING)
119147 invalid = True
120 break
148 break
121149 shortcutKeys.append(key.upper())
122150 if invalid:
123 continue
151 continue
124152 if not 'KEY_SCRIPT' in shortcutKeys:
125 shortcutKeys.append('KEY_SCRIPT')
153 shortcutKeys.append('KEY_SCRIPT')
126154 shortcut.append(1)
127155 shortcut.append(sorted(shortcutKeys))
128 self.env['bindings'][str(shortcut)] = fileName.upper()
156 self.env['bindings'][str(shortcut)] = fileName.upper()
129157 except Exception as e:
130158 self.env['runtime']['debug'].writeDebugOut("Loading script:" + fileName ,debug.debugLevel.ERROR)
131 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
159 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
132160 continue
133161 def shutdownCommands(self, section):
134162 for command in sorted(self.env['commands'][section]):
145173 return
146174 #unload
147175 oldScript = unLoadScript
148 if self.commandExists(oldScript, trigger):
176 if self.commandExists(oldScript, trigger):
149177 try:
150178 self.env['runtime']['debug'].writeDebugOut("Executing switchtrigger.unload:" + trigger + "." + oldScript ,debug.debugLevel.INFO)
151 self.env['commands'][trigger][oldScript].unload()
179 self.env['commands'][trigger][oldScript].unload()
152180 except Exception as e:
153181 self.env['runtime']['debug'].writeDebugOut("Executing trigger:" + trigger + "." + oldScript ,debug.debugLevel.ERROR)
154182 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
155183 #load
156184 newScript = loadScript
157 if self.commandExists(newScript, trigger):
185 if self.commandExists(newScript, trigger):
158186 try:
159187 self.env['runtime']['debug'].writeDebugOut("Executing switchtrigger.load:" + trigger + "." + newScript ,debug.debugLevel.INFO)
160 self.env['commands'][trigger][newScript].load()
188 self.env['commands'][trigger][newScript].load()
161189 except Exception as e:
162190 self.env['runtime']['debug'].writeDebugOut("Executing trigger:" + trigger + "." + newScript ,debug.debugLevel.ERROR)
163 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
191 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
164192
165193 def executeDefaultTrigger(self, trigger, force=False):
166194 if not force:
167195 if self.env['runtime']['screenManager'].isSuspendingScreen():
168196 return
169197 for command in sorted(self.env['commands'][trigger]):
170 if self.commandExists(command, trigger):
198 if self.commandExists(command, trigger):
171199 try:
172200 if self.env['commandsIgnore'][trigger][command[command.find('-')+1:]+'_IGNORE']:
173201 self.env['commandsIgnore'][trigger][command[command.find('-')+1:]+'_IGNORE'] = False
174 self.env['runtime']['debug'].writeDebugOut("Ignore trigger.command:" + trigger + "." + command ,debug.debugLevel.INFO)
202 self.env['runtime']['debug'].writeDebugOut("Ignore trigger.command:" + trigger + "." + command ,debug.debugLevel.INFO)
175203 else:
176 self.env['runtime']['debug'].writeDebugOut("Executing trigger.command:" + trigger + "." + command ,debug.debugLevel.INFO)
177 self.env['commands'][trigger][command].run()
204 self.env['runtime']['debug'].writeDebugOut("Executing trigger.command:" + trigger + "." + command ,debug.debugLevel.INFO)
205 self.env['commands'][trigger][command].run()
178206 except Exception as e:
179207 self.env['runtime']['debug'].writeDebugOut("Executing trigger:" + trigger + "." + command + str(e) ,debug.debugLevel.ERROR)
180208
184212 if self.commandExists(command, section):
185213 try:
186214 if self.env['runtime']['helpManager'].isTutorialMode() and section != 'help':
187 self.env['runtime']['debug'].writeDebugOut("Tutorial for command:" + section + "." + command ,debug.debugLevel.INFO)
215 self.env['runtime']['debug'].writeDebugOut("Tutorial for command:" + section + "." + command ,debug.debugLevel.INFO)
188216 description = self.getCommandDescription(command, section)
189 self.env['runtime']['outputManager'].presentText(description, interrupt=True)
217 self.env['runtime']['outputManager'].presentText(description, interrupt=False)
190218 else:
191 self.env['runtime']['debug'].writeDebugOut("Executing command:" + section + "." + command ,debug.debugLevel.INFO)
219 self.env['runtime']['debug'].writeDebugOut("Executing command:" + section + "." + command ,debug.debugLevel.INFO)
192220 self.runCommand(command, section)
193221 except Exception as e:
194222 self.env['runtime']['debug'].writeDebugOut("Executing command:" + section + "." + command +' ' + str(e),debug.debugLevel.ERROR)
212240 self.env['commandInfo']['lastCommandExecutionTime'] = time.time()
213241
214242 def commandExists(self, command, section = 'commands'):
215 return( command in self.env['commands'][section])
216 def getShortcutForCommand(self, command):
217 shortcut = ''
218243 try:
219 shortcut = list(self.env['bindings'].keys())[list(self.env['bindings'].values()).index(command)]
244 return( command in self.env['commands'][section])
245 except:
246 return False
247 def getShortcutForCommand(self, command, formatKeys = False):
248 shortcut = []
249 try:
250 rawShortcut = list(self.env['bindings'].keys())[list(self.env['bindings'].values()).index(command)]
251 # prefer numbers for multitap
252 for k in ['2', '3', '4', '5', '6', '7', '8']:
253 if k in rawShortcut:
254 formattedKey = k
255 if formatKeys:
256 formattedKey = formattedKey.lower()
257 formattedKey += ' times '
258 shortcut.append(formattedKey)
259 rawShortcut.remove(k)
260 # prefer metha keys
261 for k in ['KEY_FENRIR', 'KEY_SCRIPT', 'KEY_CTRL', 'KEY_SHIFT', 'KEY_ALT', 'KEY_META']:
262 if k in rawShortcut:
263 formattedKey = k
264 if formatKeys:
265 formattedKey = formattedKey.lower()
266 formattedKey = formattedKey.replace('key_kp', ' keypad ')
267 formattedKey = formattedKey.replace('key_', ' ')
268 shortcut.append(formattedKey)
269 rawShortcut.remove(k)
270 # handle other keys
271 for k in rawShortcut:
272 formattedKey = k
273 if formatKeys:
274 formattedKey = formattedKey.lower()
275 formattedKey = formattedKey.replace('key_kp', ' keypad ')
276 formattedKey = formattedKey.replace('key_', ' ')
277 shortcut.append(formattedKey)
220278 except:
221279 pass
222280 return shortcut
55 import pathlib, os
66
77 class debugManager():
8 def __init__(self, fileName = '/var/log/fenrirscreenreader/fenrir.log'):
8 def __init__(self, fileName = ''):
99 self._file = None
1010 self._fileOpened = False
11 self._fileName = fileName
11 self._fileName = '/tmp/fenrir_' + str(os.getpid()) + '_' + str(datetime.utcnow().strftime('%Y-%m-%d_%H-%M-%S')) + '.log'
12 if fileName != '':
13 self._fileName = fileName
1214 def initialize(self, environment):
13 self.env = environment
15 self.env = environment
1416 def shutdown(self):
1517 self.closeDebugFile()
1618 def __del__(self):
2628 if self._fileName != '':
2729 directory = os.path.dirname(self._fileName)
2830 if not os.path.exists(directory):
29 pathlib.Path(directory).mkdir(parents=True, exist_ok=True)
31 pathlib.Path(directory).mkdir(parents=True, exist_ok=True)
3032 try:
3133 self._file = open(self._fileName,'a')
3234 self._fileOpened = True
2525 'output': outputData,
2626 'soundIcons': {},
2727 'bindings': {},
28 'rawBindings': {},
2829 }
3737 parser.add_argument('-o', '--options', metavar='SECTION#SETTING=VALUE;..', default='', help='Overwrite options in given settings file. Sections, settings and Values are cases sensitive')
3838 parser.add_argument('-d', '--debug', action='store_true', help='Turns on Debugmode')
3939 parser.add_argument('-p', '--print', action='store_true', help='Print debug messages on screen')
40 parser.add_argument('-e', '--emulated-pty', action='store_true', help='Use PTY emulation and escape sequences for input')
40 parser.add_argument('-e', '--emulated-pty', action='store_true', help='Use PTY emulation and escape sequences for input. Allows to use fenrir on the desktop, in a terminal for X or Wayland')
4141 parser.add_argument('-E', '--emulated-evdev', action='store_true', help='Use PTY emulation and evdev for input (single instance)')
4242 try:
4343 args = parser.parse_args()
6767 else:
6868 if self.environment['runtime']['helpManager'].isTutorialMode():
6969 self.environment['runtime']['inputManager'].clearEventBuffer()
70 self.environment['runtime']['inputManager'].keyEcho(event['Data'])
71
72 if self.environment['runtime']['vmenuManager'].getActive():
73 self.environment['runtime']['inputManager'].clearEventBuffer()
7074
7175 self.detectShortcutCommand()
7276
7579 if self.singleKeyCommand:
7680 if self.environment['runtime']['inputManager'].noKeyPressed():
7781 self.environment['runtime']['inputManager'].clearEventBuffer()
78 else:
82 else:
7983 self.environment['runtime']['inputManager'].writeEventBuffer()
8084 if self.environment['runtime']['inputManager'].noKeyPressed():
8185 self.modifierInput = False
8286 self.singleKeyCommand = False
87 self.environment['runtime']['inputManager'].handleDeviceGrab()
8388 if self.environment['input']['keyForeward'] > 0:
8489 self.environment['input']['keyForeward'] -=1
8590 self.environment['runtime']['commandManager'].executeDefaultTrigger('onKeyInput')
9095 if event['Data'] == b'':
9196 return
9297 self.environment['runtime']['byteManager'].handleByteInput(event['Data'])
93
9498 self.environment['runtime']['commandManager'].executeDefaultTrigger('onByteInput')
9599 def handleExecuteCommand(self, event):
96100 if not event['Data']:
97 return
101 return
98102 if event['Data'] == '':
99103 return
100104 command = event['Data']
101105
106 # special modes
102107 if self.environment['runtime']['helpManager'].isTutorialMode():
103108 if self.environment['runtime']['commandManager'].commandExists( command, 'help'):
104109 self.environment['runtime']['commandManager'].executeCommand( command, 'help')
105110 return
106 self.environment['runtime']['commandManager'].executeCommand( command, 'commands')
111 elif self.environment['runtime']['vmenuManager'].getActive():
112 if self.environment['runtime']['commandManager'].commandExists( command, 'vmenu-navigation'):
113 self.environment['runtime']['commandManager'].executeCommand( command, 'vmenu-navigation')
114 return
115
116 # default
117 self.environment['runtime']['commandManager'].executeCommand( command, 'commands')
107118 def handleRemoteIncomming(self, event):
108119 if not event['Data']:
109120 return
110 self.environment['runtime']['remoteManager'].handleRemoteIncomming(event['Data'])
111 def handleScreenChange(self, event):
121 self.environment['runtime']['remoteManager'].handleRemoteIncomming(event['Data'])
122 def handleScreenChange(self, event):
112123 self.environment['runtime']['screenManager'].hanldeScreenChange(event['Data'])
113 '''
124 '''
114125 if self.environment['runtime']['applicationManager'].isApplicationChange():
115126 self.environment['runtime']['commandManager'].executeDefaultTrigger('onApplicationChange')
116127 self.environment['runtime']['commandManager'].executeSwitchTrigger('onSwitchApplicationProfile', \
117128 self.environment['runtime']['applicationManager'].getPrevApplication(), \
118 self.environment['runtime']['applicationManager'].getCurrentApplication())
119 '''
120 self.environment['runtime']['commandManager'].executeDefaultTrigger('onScreenChanged')
121 self.environment['runtime']['screenDriver'].getCurrScreen()
129 self.environment['runtime']['applicationManager'].getCurrentApplication())
130 '''
131 if self.environment['runtime']['vmenuManager'].getActive():
132 return
133
134 self.environment['runtime']['commandManager'].executeDefaultTrigger('onScreenChanged')
135 self.environment['runtime']['screenDriver'].getCurrScreen()
122136 def handleScreenUpdate(self, event):
123137 #startTime = time.time()
124138 self.environment['runtime']['screenManager'].handleScreenUpdate(event['Data'])
127141 self.environment['runtime']['commandManager'].executeDefaultTrigger('onApplicationChange')
128142 self.environment['runtime']['commandManager'].executeSwitchTrigger('onSwitchApplicationProfile', \
129143 self.environment['runtime']['applicationManager'].getPrevApplication(), \
130 self.environment['runtime']['applicationManager'].getCurrentApplication())
144 self.environment['runtime']['applicationManager'].getCurrentApplication())
131145 '''
132146 # timout for the last keypress
133147 if time.time() - self.environment['runtime']['inputManager'].getLastInputTime() >= 0.3:
134 self.environment['runtime']['inputManager'].clearLastDeepInput()
135 # has cursor changed?
148 self.environment['runtime']['inputManager'].clearLastDeepInput()
149 # has cursor changed?
136150 if self.environment['runtime']['cursorManager'].isCursorVerticalMove() or \
137151 self.environment['runtime']['cursorManager'].isCursorHorizontalMove():
138152 self.environment['runtime']['commandManager'].executeDefaultTrigger('onCursorChange')
139153 self.environment['runtime']['commandManager'].executeDefaultTrigger('onScreenUpdate')
140154 self.environment['runtime']['inputManager'].clearLastDeepInput()
141155 #print('handleScreenUpdate:',time.time() - startTime)
142
143156 def handlePlugInputDevice(self, event):
157 try:
158 self.environment['runtime']['inputManager'].setLastDetectedDevices(event['Data'])
159 except:
160 pass
144161 self.environment['runtime']['inputManager'].handlePlugInputDevice(event['Data'])
145 self.environment['runtime']['commandManager'].executeDefaultTrigger('onPlugInputDevice', force=True)
146
162 self.environment['runtime']['commandManager'].executeDefaultTrigger('onPlugInputDevice', force=True)
163 self.environment['runtime']['inputManager'].setLastDetectedDevices(None)
147164 def handleHeartBeat(self, event):
148165 self.environment['runtime']['commandManager'].executeDefaultTrigger('onHeartBeat',force=True)
149 #self.environment['runtime']['outputManager'].brailleText(flush=False)
150
151
152 def detectShortcutCommand(self):
166 #self.environment['runtime']['outputManager'].brailleText(flush=False)
167
168
169 def detectShortcutCommand(self):
153170 if self.environment['input']['keyForeward'] > 0:
154171 return
155172 if self.environment['runtime']['inputManager'].isKeyPress():
160177 self.singleKeyCommand = len( self.environment['runtime']['inputManager'].getLastDeepestInput() ) == 1
161178 # key is already released. we need the old one
162179 if not( self.singleKeyCommand and self.environment['runtime']['inputManager'].noKeyPressed()):
163 shortcut = self.environment['runtime']['inputManager'].getCurrShortcut()
180 shortcut = self.environment['runtime']['inputManager'].getCurrShortcut()
164181 self.command = self.environment['runtime']['inputManager'].getCommandForShortcut(shortcut)
165
182
166183 if not self.modifierInput:
167184 if self.environment['runtime']['inputManager'].isKeyPress():
168185 if self.command != '':
171188 if not (self.singleKeyCommand or self.modifierInput):
172189 return
173190
174 # fire event
191 # fire event
175192 if self.command != '':
176 if self.modifierInput:
193 if self.modifierInput:
177194 self.environment['runtime']['eventManager'].putToEventQueue(fenrirEventType.ExecuteCommand, self.command)
178 self.command = ''
179 else:
195 self.command = ''
196 else:
180197 if self.singleKeyCommand:
181198 if self.environment['runtime']['inputManager'].noKeyPressed():
182199 self.environment['runtime']['eventManager'].putToEventQueue(fenrirEventType.ExecuteCommand, self.command)
183200 self.command = ''
184201 def setProcessName(self, name = 'fenrir'):
185202 """Attempts to set the process name to 'fenrir'."""
186
187 #sys.argv[0] = name
188
189 # Disabling the import error of setproctitle.
190 # pylint: disable-msg=F0401
191203 try:
192204 from setproctitle import setproctitle
193205 except ImportError:
216228 self.shutdownRequest()
217229
218230 def shutdown(self):
219 self.environment['runtime']['eventManager'].stopMainEventLoop()
220 self.environment['runtime']['outputManager'].presentText(_("Quit Fenrir"), soundIcon='ScreenReaderOff', interrupt=True)
231 self.environment['runtime']['inputManager'].ungrabAllDevices()
232 self.environment['runtime']['eventManager'].stopMainEventLoop()
233 self.environment['runtime']['outputManager'].presentText(_("Quit Fenrir"), soundIcon='ScreenReaderOff', interrupt=True)
221234 self.environment['runtime']['eventManager'].cleanEventQueue()
222235 time.sleep(0.6)
223236 for currManager in self.environment['general']['managerList']:
224237 if self.environment['runtime'][currManager]:
225 self.environment['runtime'][currManager].shutdown()
238 self.environment['runtime'][currManager].shutdown()
226239 del self.environment['runtime'][currManager]
227240
228241 self.environment = None
1313 'managerList':[ 'attributeManager','punctuationManager', 'byteManager', 'cursorManager', 'applicationManager', 'commandManager'
1414 , 'screenManager', 'inputManager','outputManager', 'helpManager', 'memoryManager', 'eventManager','processManager', 'debug'],
1515 'commandFolderList':['commands','onKeyInput', 'onByteInput', 'onCursorChange', 'onScreenUpdate','onScreenChanged','onHeartBeat', 'onPlugInputDevice'
16 ,'onApplicationChange','onSwitchApplicationProfile','help',],
16 ,'onApplicationChange','onSwitchApplicationProfile','help','vmenu-navigation',],
1717 }
99 class helpManager():
1010 def __init__(self):
1111 self.helpDict = {}
12 self.tutorialListIndex = None
12 self.tutorialListIndex = None
1313 def initialize(self, environment):
1414 self.env = environment
1515 def shutdown(self):
1717 def toggleTutorialMode(self):
1818 self.setTutorialMode(not self.env['general']['tutorialMode'])
1919 def setTutorialMode(self, newTutorialMode):
20 self.env['general']['tutorialMode'] = newTutorialMode
20 if self.env['runtime']['vmenuManager'].getActive():
21 return
22 self.env['general']['tutorialMode'] = newTutorialMode
2123 if newTutorialMode:
22 self.createHelpDict()
24 self.createHelpDict()
2325 self.env['bindings'][str([1, ['KEY_ESC']])] = 'TOGGLE_TUTORIAL_MODE'
2426 self.env['bindings'][str([1, ['KEY_UP']])] = 'PREV_HELP'
2527 self.env['bindings'][str([1, ['KEY_DOWN']])] = 'NEXT_HELP'
26 self.env['bindings'][str([1, ['KEY_SPACE']])] = 'CURR_HELP'
28 self.env['bindings'][str([1, ['KEY_SPACE']])] = 'CURR_HELP'
2729 else:
2830 try:
29 del(self.env['bindings'][str([1, ['KEY_ESC']])])
30 del(self.env['bindings'][str([1, ['KEY_UP']])])
31 del(self.env['bindings'][str([1, ['KEY_DOWN']])])
32 del(self.env['bindings'][str([1, ['KEY_SPACE']])])
31 self.env['bindings'] = self.env['runtime']['settingsManager'].getBindingBackup()
3332 except:
34 pass
33 pass
3534 def isTutorialMode(self):
36 return self.env['general']['tutorialMode']
35 return self.env['general']['tutorialMode']
36 def getFormattedShortcutForCommand(self, command):
37 shortcut = []
38 rawShortcut = []
39 try:
40 rawShortcut = list(self.env['bindings'].keys())[list(self.env['bindings'].values()).index(command)]
41 rawShortcut = self.env['rawBindings'][rawShortcut]
42 # prefer numbers for multitap
43 if rawShortcut[0] in range(2, 9):
44 formattedKey = str(rawShortcut[0]) +' times '
45 shortcut.append(formattedKey)
46 # prefer metha keys
47 for k in ['KEY_FENRIR', 'KEY_SCRIPT', 'KEY_CTRL', 'KEY_SHIFT', 'KEY_ALT', 'KEY_META']:
48 if k in rawShortcut[1]:
49 formattedKey = k
50 formattedKey = formattedKey.lower()
51 formattedKey = formattedKey.replace('key_kp', ' keypad ')
52 formattedKey = formattedKey.replace('key_', ' ')
53 shortcut.append(formattedKey)
54 rawShortcut[1].remove(k)
55 # handle other keys
56 for k in rawShortcut[1]:
57 formattedKey = k
58 formattedKey = formattedKey.lower()
59 formattedKey = formattedKey.replace('key_kp', ' keypad ')
60 formattedKey = formattedKey.replace('key_', ' ')
61 shortcut.append(formattedKey)
62 except Exception as e:
63 return ''
64 shortcut = str(shortcut)
65 shortcut = shortcut.replace('[','')
66 shortcut = shortcut.replace(']','')
67 shortcut = shortcut.replace("'",'')
68 return shortcut
69
3770 def getCommandHelpText(self, command, section = 'commands'):
3871 commandName = command.lower()
39 commandName = commandName.split('__-__')[0]
40 commandName = commandName.replace('_',' ')
72 commandName = commandName.split('__-__')[0]
73 commandName = commandName.replace('_',' ')
4174 commandName = commandName.replace('_',' ')
4275 if command == 'TOGGLE_TUTORIAL_MODE':
4376 commandDescription = _('toggles the tutorial mode')
4477 else:
45 commandDescription = self.env['runtime']['commandManager'].getCommandDescription( command, section = 'commands')
78 commandDescription = self.env['runtime']['commandManager'].getCommandDescription(command, section = 'commands')
4679 if commandDescription == '':
4780 commandDescription = 'no Description available'
48 commandShortcut = self.env['runtime']['commandManager'].getShortcutForCommand( command)
49 commandShortcut = commandShortcut.replace('KEY_',' ')
50 commandShortcut = commandShortcut.replace('[','')
51 commandShortcut = commandShortcut.replace(']','')
52 commandShortcut = commandShortcut.replace("'",'')
81 commandShortcut = self.getFormattedShortcutForCommand(command)
5382 if commandShortcut == '':
5483 commandShortcut = 'unbound'
5584 helptext = commandName + ', Shortcut ' + commandShortcut + ', Description ' + commandDescription
5685 return helptext
5786 def createHelpDict(self, section = 'commands'):
58 self.helpDict = {}
87 self.helpDict = {}
5988 for command in sorted(self.env['commands'][section].keys()):
60 self.helpDict[len(self.helpDict)] = self.getCommandHelpText(command, section)
89 self.helpDict[len(self.helpDict)] = self.getCommandHelpText(command, section)
6190 if len(self.helpDict) > 0:
6291 self.tutorialListIndex = 0
6392 else:
64 self.tutorialListIndex = None
65 def getHelpForCurrentIndex(self):
93 self.tutorialListIndex = None
94 def getHelpForCurrentIndex(self):
6695 if self.tutorialListIndex == None:
6796 return ''
6897 return self.helpDict[self.tutorialListIndex]
1010 self._initialized = False
1111 def initialize(self, environment):
1212 self.env = environment
13 self.env['runtime']['inputManager'].setShortcutType('KEY')
13 self.env['runtime']['inputManager'].setShortcutType('KEY')
1414 self._isInitialized = True
1515 def shutdown(self):
1616 if self._initialized:
17 self.removeAllDevices()
17 self.removeAllDevices()
1818 self._isInitialized = False
1919 def getInputEvent(self):
2020 time.sleep(0.1)
2121 return None
2222 def clearEventBuffer(self):
2323 if not self._initialized:
24 return
24 return
2525 del self.env['input']['eventBuffer'][:]
2626 def updateInputDevices(self, newDevices = None, init = False):
2727 if not self._initialized:
28 return
28 return
2929 def getLedState(self, led = 0):
3030 if not self._initialized:
31 return False
31 return False
3232 return False
3333 def toggleLedState(self, led = 0):
3434 if not self._initialized:
3535 return
3636 def grabAllDevices(self):
3737 if not self._initialized:
38 return
38 return True
39 return True
3940 def ungrabAllDevices(self):
4041 if not self._initialized:
41 return
42 return True
43 return True
4244 def hasIDevices(self):
4345 if not self._initialized:
4446 return False
4547 return True
4648 def removeAllDevices(self):
4749 if not self._initialized:
48 return
50 return
51 def sendKey(self):
52 if not self._initialized:
53 return
4954 def __del__(self):
5055 if not self._initialized:
51 return
56 return
5257 try:
5358 self.removeAllDevices()
5459 except:
55
66 from fenrirscreenreader.core import debug
77 from fenrirscreenreader.core import inputData
8 import os, inspect, time
8 import os, inspect, time, traceback
99 currentdir = os.path.dirname(os.path.realpath(os.path.abspath(inspect.getfile(inspect.currentframe()))))
1010 fenrirPath = os.path.dirname(currentdir)
1111
1212 class inputManager():
1313 def __init__(self):
1414 self.shortcutType = 'KEY'
15 self.executeDeviceGrab = False
15 self.executeDeviceGrab = False
16 self.lastDetectedDevices = None
1617 def setShortcutType(self, shortcutType = 'KEY'):
1718 if shortcutType in ['KEY', 'BYTE']:
1819 self.shortcutType = shortcutType
3233 self.env['input']['newScrollLock'] = self.env['runtime']['inputDriver'].getLedState(2)
3334 self.env['input']['oldScrollLock'] = self.env['input']['newScrollLock']
3435 self.lastDeepestInput = []
36 self.lastEvent = None
3537 self.env['input']['shortcutRepeat'] = 1
3638 self.lastInputTime = time.time()
3739 def shutdown(self):
4648 return event
4749 def setExecuteDeviceGrab(self, newExecuteDeviceGrab = True):
4850 self.executeDeviceGrab = newExecuteDeviceGrab
49 def handleDeviceGrab(self):
51 def handleDeviceGrab(self, force = False):
52 if force:
53 self.setExecuteDeviceGrab()
5054 if not self.executeDeviceGrab:
5155 return
5256 if self.env['input']['eventBuffer'] != []:
5357 return
5458 if not self.noKeyPressed():
55 return
59 return
5660 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
57 return
61 self.executeDeviceGrab = False
62 return
5863 if self.env['runtime']['screenManager'].getCurrScreenIgnored():
59 self.ungrabAllDevices()
64 while not self.ungrabAllDevices():
65 time.sleep(0.25)
66 self.env['runtime']['debug'].writeDebugOut("retry ungrabAllDevices " ,debug.debugLevel.WARNING)
67 self.env['runtime']['debug'].writeDebugOut("All devices ungrabbed" ,debug.debugLevel.INFO)
6068 else:
61 self.grabAllDevices()
62 self.executeDeviceGrab = False
69 while not self.grabAllDevices():
70 time.sleep(0.25)
71 self.env['runtime']['debug'].writeDebugOut("retry grabAllDevices" ,debug.debugLevel.WARNING)
72 self.env['runtime']['debug'].writeDebugOut("All devices grabbed" ,debug.debugLevel.INFO)
73 self.executeDeviceGrab = False
74 def sendKeys(self, keyMacro):
75 for e in keyMacro:
76 key = ''
77 value = 0
78 if len(e) != 2:
79 continue
80 if isinstance(e[0], int) and isinstance(e[1], str):
81 key = e[1].upper()
82 value = e[0]
83 elif isinstance(e[1], int) and isinstance(e[0], str):
84 key = e[0].upper()
85 value = e[1]
86 else:
87 continue
88 if key.upper() == 'SLEEP':
89 time.sleep(value)
90 else:
91 self.env['runtime']['inputDriver'].sendKey(key, value)
92 def getLastEvent(self):
93 return self.lastEvent
6394 def handleInputEvent(self, eventData):
64 #print(eventData)
6595 if not eventData:
6696 return
97 self.lastEvent = eventData
6798 # a hang apears.. try to fix
6899 if self.env['input']['eventBuffer'] == []:
69100 if self.env['input']['currInput'] != []:
70 self.env['input']['currInput'] = []
71 self.env['input']['shortcutRepeat'] = 1
72
101 self.env['input']['currInput'] = []
102 self.env['input']['shortcutRepeat'] = 1
103
73104 self.env['input']['prevInput'] = self.env['input']['currInput'].copy()
74105 if eventData['EventState'] == 0:
75106 if eventData['EventName'] in self.env['input']['currInput']:
78109 self.env['input']['currInput'] = sorted(self.env['input']['currInput'])
79110 elif len(self.env['input']['currInput']) == 0:
80111 self.env['input']['shortcutRepeat'] = 1
81 self.lastInputTime = time.time()
112 self.lastInputTime = time.time()
82113 elif eventData['EventState'] == 1:
83114 if not eventData['EventName'] in self.env['input']['currInput']:
84115 self.env['input']['currInput'].append(eventData['EventName'])
91122 self.env['input']['shortcutRepeat'] += 1
92123 else:
93124 self.env['input']['shortcutRepeat'] = 1
94 self.handleLedStates(eventData)
125 self.handleLedStates(eventData)
95126 self.lastInputTime = time.time()
96127 elif eventData['EventState'] == 2:
97 self.lastInputTime = time.time()
128 self.lastInputTime = time.time()
98129
99130 self.env['input']['oldNumLock'] = self.env['input']['newNumLock']
100131 self.env['input']['newNumLock'] = self.env['runtime']['inputDriver'].getLedState()
105136 self.env['runtime']['debug'].writeDebugOut("currInput " + str(self.env['input']['currInput'] ) ,debug.debugLevel.INFO)
106137 if self.noKeyPressed():
107138 self.env['input']['prevInput'] = []
108 self.handleDeviceGrab()
109
139
110140 def handleLedStates(self, mEvent):
111141 try:
112142 if mEvent['EventName'] == 'KEY_NUMLOCK':
113 self.env['runtime']['inputDriver'].toggleLedState()
114 elif mEvent['EventName'] == 'KEY_CAPSLOCK':
115 self.env['runtime']['inputDriver'].toggleLedState(1)
116 elif mEvent['EventName'] == 'KEY_SCROLLLOCK':
117 self.env['runtime']['inputDriver'].toggleLedState(2)
143 self.env['runtime']['inputDriver'].toggleLedState()
144 elif mEvent['EventName'] == 'KEY_CAPSLOCK':
145 self.env['runtime']['inputDriver'].toggleLedState(1)
146 elif mEvent['EventName'] == 'KEY_SCROLLLOCK':
147 self.env['runtime']['inputDriver'].toggleLedState(2)
118148 except:
119149 pass
120150 def grabAllDevices(self):
121151 if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
122152 try:
123 self.env['runtime']['inputDriver'].grabAllDevices()
153 return self.env['runtime']['inputDriver'].grabAllDevices()
124154 except Exception as e:
125 pass
155 return False
156 return True
126157 def ungrabAllDevices(self):
127158 if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
128159 try:
129 self.env['runtime']['inputDriver'].ungrabAllDevices()
160 return self.env['runtime']['inputDriver'].ungrabAllDevices()
130161 except Exception as e:
131 pass
162 return False
163 return True
132164 def handlePlugInputDevice(self, eventData):
133 self.env['runtime']['inputManager'].updateInputDevices(eventData)
134
165 for deviceEntry in eventData:
166 self.updateInputDevices(deviceEntry['device'])
135167 def updateInputDevices(self, newDevice = None):
136168 try:
137 self.env['runtime']['inputDriver'].updateInputDevices(newDevice)
138 except:
139 pass
140 self.setExecuteDeviceGrab()
169 self.env['runtime']['inputDriver'].updateInputDevices(newDevice)
170 except:
171 pass
141172 try:
142173 if self.env['runtime']['screenManager']:
143 self.handleDeviceGrab()
174 self.handleDeviceGrab(force = True)
144175 except:
145176 pass
146177 def removeAllDevices(self):
156187 return ''
157188 eventName = eventName.upper()
158189 if eventName == 'KEY_LEFTCTRL':
159 eventName = 'KEY_CTRL'
190 eventName = 'KEY_CTRL'
160191 elif eventName == 'KEY_RIGHTCTRL':
161192 eventName = 'KEY_CTRL'
162193 elif eventName == 'KEY_LEFTSHIFT':
170201 elif eventName == 'KEY_LEFTMETA':
171202 eventName = 'KEY_META'
172203 elif eventName == 'KEY_RIGHTMETA':
173 eventName = 'KEY_META'
204 eventName = 'KEY_META'
174205 if self.isFenrirKey(eventName):
175206 eventName = 'KEY_FENRIR'
176207 if self.isScriptKey(eventName):
177 eventName = 'KEY_SCRIPT'
208 eventName = 'KEY_SCRIPT'
178209 return eventName
179210
180211 def clearEventBuffer(self):
181212 try:
182213 self.env['runtime']['inputDriver'].clearEventBuffer()
183214 except Exception as e:
184 pass
215 pass
185216 def setLastDeepestInput(self, currentDeepestInput):
186217 self.lastDeepestInput = currentDeepestInput
187218 def clearLastDeepInput(self):
188 self.lastDeepestInput = []
219 self.lastDeepestInput = []
189220 def getLastInputTime(self):
190 return self.lastInputTime
221 return self.lastInputTime
191222 def getLastDeepestInput(self):
192223 return self.lastDeepestInput
193224 def writeEventBuffer(self):
208239 shortcut.append(self.env['input']['shortcutRepeat'])
209240 shortcut.append(self.getLastDeepestInput())
210241 return str(shortcut)
211
242
212243 def getPrevShortcut(self):
213244 shortcut = []
214245 shortcut.append(self.env['input']['shortcutRepeat'])
220251 shortcut.append(self.env['input']['shortcutRepeat'])
221252 if inputSequence:
222253 shortcut.append(inputSequence)
223 else:
254 else:
224255 shortcut.append(self.env['input']['currInput'])
225256 if len(self.env['input']['prevInput']) < len(self.env['input']['currInput']):
226257 if self.env['input']['shortcutRepeat'] > 1 and not self.shortcutExists(str(shortcut)):
227258 shortcut = []
228259 self.env['input']['shortcutRepeat'] = 1
229260 shortcut.append(self.env['input']['shortcutRepeat'])
230 shortcut.append(self.env['input']['currInput'])
231 self.env['runtime']['debug'].writeDebugOut("currShortcut " + str(shortcut) ,debug.debugLevel.INFO)
261 shortcut.append(self.env['input']['currInput'])
262 self.env['runtime']['debug'].writeDebugOut("currShortcut " + str(shortcut) ,debug.debugLevel.INFO)
232263 return str(shortcut)
233
264
234265 def currKeyIsModifier(self):
235266 if len(self.getLastDeepestInput()) != 1:
236267 return False
237268 return (self.env['input']['currInput'][0] =='KEY_FENRIR') or (self.env['input']['currInput'][0] == 'KEY_SCRIPT')
238
269
239270 def isFenrirKey(self, eventName):
240271 return eventName in self.env['input']['fenrirKey']
241
272
242273 def isScriptKey(self, eventName):
243274 return eventName in self.env['input']['scriptKey']
244
275
245276 def getCommandForShortcut(self, shortcut):
246277 if not self.shortcutExists(shortcut):
247278 return ''
248279 return self.env['bindings'][shortcut]
280 def keyEcho(self, eventData = None):
281 if not eventData:
282 eventData = self.getLastEvent()
283 if not eventData:
284 return
285 keyName = ''
286 if eventData['EventState'] == 1:
287 keyName = eventData['EventName'].lower()
288 if keyName.startswith('key_'):
289 keyName = keyName[4:]
290 self.env['runtime']['outputManager'].presentText(_(keyName), interrupt=True)
249291
250292 def shortcutExists(self, shortcut):
251293 return(shortcut in self.env['bindings'])
258300 break
259301 line = line.replace('\n','')
260302 if line.replace(" ","") == '':
261 continue
303 continue
262304 if line.replace(" ","").startswith("#"):
263305 continue
264306 if line.count("=") != 1:
277319 shortcutRepeat = int(key)
278320 except:
279321 if not self.isValidKey(key.upper()):
280 self.env['runtime']['debug'].writeDebugOut("invalid key : "+ key.upper() + ' command:' +commandName ,debug.debugLevel.WARNING)
322 self.env['runtime']['debug'].writeDebugOut("invalid key : "+ key.upper() + ' command:' +commandName ,debug.debugLevel.WARNING)
281323 invalid = True
282324 break
283325 shortcutKeys.append(key.upper())
286328 shortcut.append(shortcutRepeat)
287329 shortcut.append(sorted(shortcutKeys))
288330 if len(shortcutKeys) != 1 and not 'KEY_FENRIR' in shortcutKeys:
289 self.env['runtime']['debug'].writeDebugOut("invalid shortcut (missing KEY_FENRIR): "+ str(shortcut) + ' command:' +commandName ,debug.debugLevel.ERROR)
290 continue
331 self.env['runtime']['debug'].writeDebugOut("invalid shortcut (missing KEY_FENRIR): "+ str(shortcut) + ' command:' +commandName ,debug.debugLevel.ERROR)
332 continue
291333 self.env['runtime']['debug'].writeDebugOut("Shortcut: "+ str(shortcut) + ' command:' +commandName ,debug.debugLevel.INFO, onAnyLevel=True)
292 self.env['bindings'][str(shortcut)] = commandName
334 self.env['bindings'][str(shortcut)] = commandName
335 self.env['rawBindings'][str(shortcut)] = shortcut
293336 kbConfig.close()
294337 # fix bindings
295338 self.env['bindings'][str([1, ['KEY_F1', 'KEY_FENRIR']])] = 'TOGGLE_TUTORIAL_MODE'
296339 def isValidKey(self, key):
297 return key in inputData.keyNames
340 return key in inputData.keyNames
341 def setLastDetectedDevices(self, devices):
342 self.lastDetectedDevices =devices
343 def getLastDetectedDevices(self):
344 return self.lastDetectedDevices
134134 else:
135135 displayText = self.getBrailleTextWithOffset(self.env['output']['messageText'], self.env['output']['messageOffset'])
136136 self.env['runtime']['brailleDriver'].writeText('flush'+displayText)
137
137 def resetSpeechDriver(self):
138 try:
139 self.env['runtime']['speechDriver'].reset()
140 except Exception as e:
141 self.env['runtime']['debug'].writeDebugOut("reset " + str(e),debug.debugLevel.ERROR)
142
138143 def getBrailleCursor(self):
139144 if self.env['runtime']['settingsManager'].getSetting('braille', 'cursorFollowMode').upper() == 'REVIEW':
140145 return self.env['runtime']['cursorManager'].getReviewOrTextCursor()
262267 if not self.env['runtime']['settingsManager'].getSettingAsBool('sound', 'enabled'):
263268 self.env['runtime']['debug'].writeDebugOut("Sound disabled in outputManager.speakText",debug.debugLevel.INFO)
264269 return False
265
270
271 try:
272 e = self.env['soundIcons'][soundIcon]
273 except:
274 self.env['runtime']['debug'].writeDebugOut("SoundIcon doesnt exist: " + soundIcon, debug.debugLevel.WARNING)
275 return False
276
266277 if self.env['runtime']['soundDriver'] == None:
267278 self.env['runtime']['debug'].writeDebugOut("No speechDriver in outputManager.speakText",debug.debugLevel.ERROR)
268 return False
279 return False
280
269281 try:
270282 self.env['runtime']['soundDriver'].setVolume(self.env['runtime']['settingsManager'].getSettingAsFloat('sound', 'volume'))
283 except Exception as e:
284 self.env['runtime']['debug'].writeDebugOut("outputManager.playSoundIcon::setVolume: " + str(e),debug.debugLevel.ERROR)
285
286 try:
271287 self.env['runtime']['soundDriver'].playSoundFile(self.env['soundIcons'][soundIcon], interrupt)
272288 return True
273289 except Exception as e:
274 self.env['runtime']['debug'].writeDebugOut("\"playSoundIcon\" in outputManager.speakText ",debug.debugLevel.ERROR)
275 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
290 self.env['runtime']['debug'].writeDebugOut("outputManager.playSoundIcon::playSoundFile: " + str(e),debug.debugLevel.ERROR)
291 return False
292
276293 return False
294 def tempDisableSpeech(self):
295 if self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled'):
296 self.presentText(_("speech temporary disabled"), soundIcon='SpeechOff', interrupt=True)
297 self.env['commandBuffer']['enableSpeechOnKeypress'] = True
298 self.env['runtime']['settingsManager'].setSetting('speech', 'enabled', str(not self.env['runtime']['settingsManager'].getSettingAsBool('speech', 'enabled')))
299 self.interruptOutput()
277300 def announceActiveCursor(self, interrupt_p=False):
278301 if self.env['runtime']['cursorManager'].isReviewMode():
279302 self.presentText(' review cursor ', interrupt=interrupt_p)
2222
2323 def terminateAllProcesses(self):
2424 for proc in self._Processes:
25 try:
26 proc.terminate()
27 except KeyboardInterrupt:
28 pass
29 except:
30 pass
31 proc.join()
25 #try:
26 # proc.terminate()
27 #except KeyboardInterrupt:
28 # pass
29 #except:
30 # pass
31 proc.join()
3232 for t in self._Threads:
33 t.join()
33 t.join()
3434 def heartBeatTimer(self, active):
3535 try:
3636 time.sleep(0.5)
55
66 from fenrirscreenreader.core import debug
77 import string
8 from collections import OrderedDict
89
910 punctuationData = {
1011 'LEVELDICT':{
1415 'all': string.punctuation + ' §',
1516 },
1617 'PUNCTDICT':{
17 ' ':'space',
18 '&':'and',
19 "'":"apostrophe",
20 '@':'at',
21 '\\':'backslash',
22 '|':'bar',
23 '!':'bang',
24 '^':'carrot',
25 ':':'colon',
26 ',':'comma',
27 '-':'dash',
28 '$':'dollar',
29 '.':'dot',
30 '>':'greater',
31 '`':'grave',
32 '#':'hash',
33 '{':'left brace',
34 '[':'left bracket',
35 '(':'left paren',
36 '<':'less',
37 '%':'percent',
38 '+':'plus',
39 '?':'question',
40 '"':'quote',
41 ')':'right paren',
42 '}':'right brace',
43 ']':'right bracket',
44 ';':'semicolon',
45 '/':'slash',
46 '*':'star',
47 '~':'tilde',
48 '_':'line',
49 '=':'equals',
5018 },
51 'CUSTOMDICT':{
52 },
53 'EMOTICONDICT':{
54 ':)':'smiley',
55 ';)':'winking face',
56 'XD':'loool',
57 ':@':'angry face',
58 ':D':'lought'
59 },
19 'CUSTOMDICT':OrderedDict(),
20 'EMOTICONDICT':OrderedDict(),
6021 }
3232 del currAllPunctNone[ord(char)]
3333 except:
3434 pass
35 return text.translate(currAllPunctNone)
36
35 return text.translate(currAllPunctNone)
3736 def useCustomDict(self, text, customDict, seperator=''):
3837 resultText = str(text)
3938 if customDict:
4039 for key,item in customDict.items():
41 resultText = resultText.replace(str(key),seperator + str(item) + seperator)
40 try:
41 regexLbl = 'REGEX;'
42 if key.upper().startswith(regexLbl) and (len(key) > len(regexLbl)):
43 resultText = re.sub(str(key[len(regexLbl):]), seperator + str(item) + seperator, resultText)
44 else:
45 resultText = resultText.replace(str(key),seperator + str(item) + seperator)
46 except Exception as e:
47 self.env['runtime']['debug'].writeDebugOut("useCustomDict replace:'" + key + "' with '" + item +"' failed:" + str(e),debug.debugLevel.ERROR, onAnyLevel=False)
4248 return resultText
43
4449 def usePunctuationDict(self, text, punctuationDict, punctuation):
4550 resultText = str(text)
4651
4853 if ' ' in punctuation:
4954 resultText = resultText.replace(' ',' ' + punctuationDict[' '] + ' ')
5055 for key,item in punctuationDict.items():
51 if key in punctuation and key not in ' ':
56 if (punctuation != '' and key in punctuation) and key not in ' ':
5257 if self.env['runtime']['settingsManager'].getSetting('general', 'respectPunctuationPause') and \
5358 len(key) == 1 and \
5459 key in "',.;:?!":
55 resultText = resultText.replace(str(key),' ' +str(item) + str(key) + ' ')
60 resultText = resultText.replace(str(key),' ' +str(item) + str(key) + ' ')
5661 else:
5762 resultText = resultText.replace(str(key),' ' +str(item) + ' ')
5863 return resultText
95100 if line.replace(" ","") == '':
96101 continue
97102 if line.replace(" ","").startswith("#"):
98 continue
103 if not line.replace(" ","").startswith("#:===:"):
104 continue
99105 if line.replace(" ","").upper().startswith("[") and \
100106 line.replace(" ","").upper().endswith("DICT]"):
101107 currDictName = line[line.find('[') + 1 :line.upper().find('DICT]') + 4].upper()
113119 sepLine[1] = ':===:'
114120 self.env['punctuation'][currDictName][sepLine[0]] = sepLine[1]
115121 self.env['runtime']['debug'].writeDebugOut("Punctuation: " + currDictName + '.' + str(sepLine[0]) + ' :' + sepLine[1] ,debug.debugLevel.INFO, onAnyLevel=True)
116 dictConfig.close()
122 dictConfig.close()
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.core.settingsData import settingsData
8
9 class quickMenuManager():
10 def __init__(self):
11 self.position = 0
12 self.quickMenu = []
13 self.settings = settingsData
14
15 def initialize(self, environment):
16 self.env = environment
17 self.loadMenu(self.env['runtime']['settingsManager'].getSetting('menu', 'quickMenu'))
18 def shutdown(self):
19 pass
20 def loadMenu(self, menuString):
21 self.position = 0
22 self.quickMenu = []
23 if menuString == '':
24 return
25 entrys = menuString.split(';')
26 for e in entrys:
27 entry = e.split('#')
28 if len(entry) != 2:
29 continue
30 try:
31 t = self.settings[entry[0]][entry[1]]
32 except:
33 print(entry[0],entry[1], 'not found')
34 continue
35 self.quickMenu.append({'section': entry[0], 'setting': entry[1]})
36 def nextEntry(self):
37 if len(self.quickMenu) == 0:
38 return False
39 self.position += 1
40 if self.position >= len(self.quickMenu):
41 self.position = 0
42 return True
43 def prevEntry(self):
44 if len(self.quickMenu) == 0:
45 return False
46 self.position -= 1
47 if self.position < 0:
48 self.position = len(self.quickMenu) - 1
49 return True
50 def nextValue(self):
51 if len(self.quickMenu) == 0:
52 return False
53 section = self.quickMenu[self.position]['section']
54 setting = self.quickMenu[self.position]['setting']
55 valueString = ''
56 try:
57 valueString = self.env['runtime']['settingsManager'].getSetting(section, setting)
58 except:
59 return False
60
61 try:
62 if isinstance(self.settings[section][setting], str):
63 value = str(valueString)
64 return False
65 elif isinstance(self.settings[section][setting], bool):
66 if not valueString in ['True','False']:
67 return False
68 value = not value
69 self.env['runtime']['settingsManager'].setSetting(section, setting, str(value))
70 elif isinstance(self.settings[section][setting], int):
71 value = int(valueString)
72 value += 1
73 self.env['runtime']['settingsManager'].setSetting(section, setting, str(value))
74 elif isinstance(self.settings[section][setting], float):
75 value = float(valueString)
76 value += 0.05
77 if value > 1.0:
78 value = 1.0
79 self.env['runtime']['settingsManager'].setSetting(section, setting, str(value)[:4])
80 except Exception as e:
81 return False
82 return True
83 def prevValue(self):
84 if len(self.quickMenu) == 0:
85 return False
86 section = self.quickMenu[self.position]['section']
87 setting = self.quickMenu[self.position]['setting']
88 valueString = ''
89 try:
90 valueString = self.env['runtime']['settingsManager'].getSetting(section, setting)
91 except:
92 return False
93 try:
94 if isinstance(self.settings[section][setting], str):
95 value = str(valueString)
96 return False
97 elif isinstance(self.settings[section][setting], bool):
98 if not valueString in ['True','False']:
99 return False
100 value = not value
101 self.env['runtime']['settingsManager'].setSetting(section, setting, str(value))
102 elif isinstance(self.settings[section][setting], int):
103 value = int(valueString)
104 value -= 1
105 if value < 0:
106 value = 0
107 self.env['runtime']['settingsManager'].setSetting(section, setting, str(value))
108 elif isinstance(self.settings[section][setting], float):
109 value = float(valueString)
110 value -= 0.05
111 if value < 0.0:
112 value = 0.0
113 self.env['runtime']['settingsManager'].setSetting(section, setting, str(value)[:4])
114 except Exception as e:
115 return False
116 return True
117 def getCurrentEntry(self):
118 if len(self.quickMenu) == 0:
119 return ''
120 try:
121 return _(self.quickMenu[self.position]['section']) + ' ' + _(self.quickMenu[self.position]['setting'])
122 except:
123 return _('setting invalid')
124 def getCurrentValue(self):
125 if len(self.quickMenu) == 0:
126 return ''
127 try:
128 return self.env['runtime']['settingsManager'].getSetting(self.quickMenu[self.position]['section'], self.quickMenu[self.position]['setting'])
129 except:
130 return _('setting value invalid')
3434 # command controll
3535 self.commandConst = 'COMMAND '
3636 self.sayConst = 'SAY '
37 self.vmenuConst = 'VMENU '
38 self.resetVmenuConst = 'RESETVMENU'
3739 self.interruptConst = 'INTERRUPT'
40 self.quitAppConst = 'QUITAPPLICATION'
41 self.tempDisableSpeechConst = 'TEMPDISABLESPEECH'
3842 self.defineWindowConst = 'WINDOW '
3943 self.resetWindowConst = 'RESETWINDOW'
44 self.setClipboardConst = 'CLIPBOARD '
4045 # setting controll
4146 self.settingConst = 'SETTING '
4247 self.setSettingConst = 'SET '
43 self.saveSettingConst = 'SAVE '
48 self.saveAsSettingConst = 'SAVEAS '
49 self.saveSettingConst = 'SAVE'
4450 self.resetSettingConst = 'RESET'
4551 def initialize(self, environment):
4652 self.env = environment
5864 if upperSettingsText.startswith(self.setSettingConst):
5965 parameterText = settingsText[len(self.setSettingConst):]
6066 self.setSettings(parameterText)
67 # save as setting
68 elif upperSettingsText.startswith(self.saveAsSettingConst):
69 parameterText = settingsText[len(self.saveAsSettingConst):]
70 self.saveSettings(parameterText)
6171 # save setting
62 if upperSettingsText.startswith(self.saveSettingConst):
63 parameterText = settingsText[len(self.saveSettingConst):]
64 self.saveSettings(parameterText)
72 elif upperSettingsText == self.saveSettingConst:
73 self.saveSettings()
6574 # reset setting
66 if upperSettingsText.startswith(self.resetSettingConst):
75 elif upperSettingsText == self.resetSettingConst:
6776 self.resetSettings()
77
6878 def handleCommandExecution(self, commandText):
6979 if not self.env['runtime']['settingsManager'].getSettingAsBool('remote', 'enableCommandRemote'):
7080 return
7686 parameterText = commandText[len(self.sayConst):]
7787 self.say(parameterText)
7888 # interrupt
79 if upperCommandText.startswith(self.interruptConst):
89 elif upperCommandText == self.interruptConst:
8090 self.interruptSpeech()
91 # temp disable speech
92 elif upperCommandText == self.tempDisableSpeechConst:
93 self.tempDisableSpeech()
94 # set vmenu
95 elif upperCommandText.startswith(self.vmenuConst):
96 parameterText = commandText[len(self.vmenuConst):]
97 self.setVMenu(parameterText)
98 # reset vmenu
99 elif upperCommandText == self.resetVmenuConst:
100 self.resetVMenu()
101 # quit fenrir
102 elif upperCommandText == self.quitAppConst:
103 self.quitFenrir()
81104 # define window
82 if upperCommandText.startswith(self.defineWindowConst):
105 elif upperCommandText.startswith(self.defineWindowConst):
83106 parameterText = commandText[len(self.defineWindowConst):]
84107 self.defineWindow(parameterText)
85108 # reset window
86 if upperCommandText.startswith(self.resetWindowConst):
109 elif upperCommandText == self.resetWindowConst:
87110 self.resetWindow()
111 # set clipboard
112 elif upperCommandText.startswith(self.setClipboardConst):
113 parameterText = commandText[len(self.setClipboardConst):]
114 self.setClipboard(parameterText)
115 def tempDisableSpeech(self):
116 self.env['runtime']['outputManager'].tempDisableSpeech()
117 def setVMenu(self, vmenu = ''):
118 self.env['runtime']['vmenuManager'].setCurrMenu(vmenu)
119 def resetVMenu(self):
120 self.env['runtime']['vmenuManager'].setCurrMenu()
121 def setClipboard(self, text = ''):
122 self.env['runtime']['memoryManager'].addValueToFirstIndex('clipboardHistory', text)
123 def quitFenrir(self):
124 self.env['runtime']['eventManager'].stopMainEventLoop()
88125 def defineWindow(self, windowText):
89126 start = {}
90127 end = {}
110147 self.env['runtime']['outputManager'].speakText(text)
111148 def interruptSpeech(self):
112149 self.env['runtime']['outputManager'].interruptOutput()
113 def saveSettings(self, settingConfigPath):
150 def saveSettings(self, settingConfigPath = None):
114151 if not settingConfigPath:
115 return
152 settingConfigPath = self.env['runtime']['settingsManager'].getSettingsFile()
116153 if settingConfigPath == '':
117154 return
118155 self.env['runtime']['settingsManager'].saveSettings(settingConfigPath)
120157 self.env['runtime']['settingsManager'].resetSettingArgDict()
121158 def setSettings(self, settingsArgs):
122159 self.env['runtime']['settingsManager'].parseSettingArgs(settingsArgs)
160 self.env['runtime']['screenManager'].updateScreenIgnored()
161 self.env['runtime']['inputManager'].handleDeviceGrab(force = True)
123162 def handleRemoteIncomming(self, eventData):
124163 if not eventData:
125164 return
126165 upperEventData = eventData.upper()
127166 self.env['runtime']['debug'].writeDebugOut('remoteManager:handleRemoteIncomming: event: ' + str(eventData),debug.debugLevel.INFO)
128
167
129168 if upperEventData.startswith(self.settingConst):
130169 settingsText = eventData[len(self.settingConst):]
131170 self.handleSettingsChange(settingsText)
2323 def initialize(self, environment):
2424 self.env = environment
2525 self.env['runtime']['settingsManager'].loadDriver(\
26 self.env['runtime']['settingsManager'].getSetting('screen', 'driver'), 'screenDriver')
27 self.getCurrScreen()
26 self.env['runtime']['settingsManager'].getSetting('screen', 'driver'), 'screenDriver')
2827 self.getCurrScreen()
29 self.getSessionInformation()
28 self.getCurrScreen()
29 self.getSessionInformation()
3030 self.updateScreenIgnored()
31 self.updateScreenIgnored()
31 self.updateScreenIgnored()
3232 def resetScreenText(self, screenText):
3333 self.prevScreenText = ''
34 self.currScreenText = screenText
34 self.currScreenText = screenText
3535 def setScreenText(self, screenText):
3636 self.prevScreenText = self.currScreenText
3737 self.currScreenText = screenText
4343 except:
4444 pass
4545 def getSessionInformation(self):
46 try:
46 try:
4747 self.env['runtime']['screenDriver'].getSessionInformation()
4848 except:
49 pass
50
49 pass
5150 def shutdown(self):
5251 self.env['runtime']['settingsManager'].shutdownDriver('screenDriver')
5352 def isCurrScreenIgnoredChanged(self):
5453 return self.getCurrScreenIgnored() != self.getPrevScreenIgnored()
5554 def hanldeScreenChange(self, eventData):
5655 self.getCurrScreen()
57 self.getSessionInformation()
58 self.updateScreenIgnored()
56 self.getSessionInformation()
57 self.updateScreenIgnored()
5958 if self.isCurrScreenIgnoredChanged():
6059 self.env['runtime']['inputManager'].setExecuteDeviceGrab()
61 self.env['runtime']['inputManager'].handleDeviceGrab()
62
63 if self.isScreenChange():
60 self.env['runtime']['inputManager'].handleDeviceGrab()
61 if self.isScreenChange():
6462 self.changeBrailleScreen()
65
66 if not self.isSuspendingScreen(self.env['screen']['newTTY']):
63 if not self.isSuspendingScreen(self.env['screen']['newTTY']):
6764 self.update(eventData, 'onScreenChange')
6865 self.env['screen']['lastScreenUpdate'] = time.time()
6966 else:
70 self.env['runtime']['outputManager'].interruptOutput()
71
67 self.env['runtime']['outputManager'].interruptOutput()
7268 def handleScreenUpdate(self, eventData):
7369 self.env['screen']['oldApplication'] = self.env['screen']['newApplication']
7470 self.updateScreenIgnored()
7571 if self.isCurrScreenIgnoredChanged():
7672 self.env['runtime']['inputManager'].setExecuteDeviceGrab()
77 self.env['runtime']['inputManager'].handleDeviceGrab()
78 if not self.getCurrScreenIgnored():
73 self.env['runtime']['inputManager'].handleDeviceGrab()
74 if not self.getCurrScreenIgnored():
7975 self.update(eventData, 'onScreenUpdate')
8076 #if trigger == 'onUpdate' or self.isScreenChange() \
8177 # or len(self.env['screen']['newDelta']) > 6:
82 # self.env['runtime']['screenDriver'].getCurrApplication()
78 # self.env['runtime']['screenDriver'].getCurrApplication()
8379 self.env['screen']['lastScreenUpdate'] = time.time()
84 elif self.isCurrScreenIgnoredChanged():
85 self.env['runtime']['outputManager'].interruptOutput()
80 elif self.isCurrScreenIgnoredChanged():
81 self.env['runtime']['outputManager'].interruptOutput()
8682 def getCurrScreenIgnored(self):
8783 return self.currScreenIgnored
8884 def getPrevScreenIgnored(self):
89 return self.prevScreenIgnored
85 return self.prevScreenIgnored
9086 def updateScreenIgnored(self):
91 self.prevScreenIgnored = self.currScreenIgnored
92 self.currScreenIgnored = self.isSuspendingScreen(self.env['screen']['newTTY'])
87 self.prevScreenIgnored = self.currScreenIgnored
88 self.currScreenIgnored = self.isSuspendingScreen(self.env['screen']['newTTY'])
9389 def update(self, eventData, trigger='onUpdate'):
9490 # set new "old" values
9591 self.env['screen']['oldContentBytes'] = self.env['screen']['newContentBytes']
9692 self.env['screen']['oldContentText'] = self.env['screen']['newContentText']
97 self.env['screen']['oldCursor'] = self.env['screen']['newCursor'].copy()
93 self.env['screen']['oldCursor'] = self.env['screen']['newCursor'].copy()
9894 self.env['screen']['oldDelta'] = self.env['screen']['newDelta']
9995 self.env['screen']['oldNegativeDelta'] = self.env['screen']['newNegativeDelta']
10096 self.env['screen']['newContentBytes'] = eventData['bytes']
10399 self.env['screen']['lines'] = int( eventData['lines'])
104100 self.env['screen']['columns'] = int( eventData['columns'])
105101 self.colums = int( eventData['columns'])
106 self.rows = int( eventData['lines'])
102 self.rows = int( eventData['lines'])
107103 self.env['screen']['newCursor']['x'] = int( eventData['textCursor']['x'])
108104 self.env['screen']['newCursor']['y'] = int( eventData['textCursor']['y'])
109105 self.env['screen']['newTTY'] = eventData['screen']
112108 # screen change
113109 if self.isScreenChange():
114110 self.env['screen']['oldContentBytes'] = b''
115 self.resetScreenText(eventData['text'])
111 self.resetScreenText(eventData['text'])
116112 self.env['runtime']['attributeManager'].resetAttributes(eventData['attributes'])
117 self.env['runtime']['attributeManager'].resetAttributeCursor()
113 self.env['runtime']['attributeManager'].resetAttributeCursor()
118114 self.env['screen']['oldContentText'] = ''
119115 self.env['screen']['oldCursor']['x'] = 0
120116 self.env['screen']['oldCursor']['y'] = 0
121 self.env['screen']['oldDelta'] = ''
122 self.env['screen']['oldNegativeDelta'] = ''
117 self.env['screen']['oldDelta'] = ''
118 self.env['screen']['oldNegativeDelta'] = ''
123119 else:
124 self.setScreenText(eventData['text'])
120 self.setScreenText(eventData['text'])
125121 self.env['runtime']['attributeManager'].setAttributes(eventData['attributes'])
126122 # initialize current deltas
127123 self.env['screen']['newNegativeDelta'] = ''
130126
131127 # changes on the screen
132128 oldScreenText = re.sub(' +',' ',self.env['runtime']['screenManager'].getWindowAreaInText(self.env['screen']['oldContentText']))
133 newScreenText = re.sub(' +',' ',self.env['runtime']['screenManager'].getWindowAreaInText(self.env['screen']['newContentText']))
129 newScreenText = re.sub(' +',' ',self.env['runtime']['screenManager'].getWindowAreaInText(self.env['screen']['newContentText']))
134130 typing = False
135 diffList = []
136
131 diffList = []
132
137133 if (self.env['screen']['oldContentText'] != self.env['screen']['newContentText']):
138134 if self.env['screen']['newContentText'] != '' and self.env['screen']['oldContentText'] == '':
139135 if oldScreenText == '' and\
141137 self.env['screen']['newDelta'] = newScreenText
142138 else:
143139 cursorLineStart = self.env['screen']['newCursor']['y'] * self.env['screen']['columns'] + self.env['screen']['newCursor']['y']
144 cursorLineEnd = cursorLineStart + self.env['screen']['columns']
140 cursorLineEnd = cursorLineStart + self.env['screen']['columns']
145141 if abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) >= 1 and \
146142 self.env['screen']['oldCursor']['y'] == self.env['screen']['newCursor']['y'] and \
147143 self.env['screen']['newContentText'][:cursorLineStart] == self.env['screen']['oldContentText'][:cursorLineStart] and \
151147 #if cursorLineStart < cursorLineStart + self.env['screen']['newCursor']['x'] - 4:
152148 # cursorLineStartOffset = cursorLineStart + self.env['screen']['newCursor']['x'] - 4
153149 if cursorLineEnd > cursorLineStart + self.env['screen']['newCursor']['x'] + 3:
154 cursorLineEndOffset = cursorLineStart + self.env['screen']['newCursor']['x'] + 3
150 cursorLineEndOffset = cursorLineStart + self.env['screen']['newCursor']['x'] + 3
155151 oldScreenText = self.env['screen']['oldContentText'][cursorLineStartOffset:cursorLineEndOffset]
156152 # oldScreenText = re.sub(' +',' ',oldScreenText)
157153 newScreenText = self.env['screen']['newContentText'][cursorLineStartOffset:cursorLineEndOffset]
158154 #newScreenText = re.sub(' +',' ',newScreenText)
159155 diff = self.differ.compare(oldScreenText, newScreenText)
160156 diffList = list(diff)
161 typing = True
157 typing = True
162158 tempNewDelta = ''.join(x[2:] for x in diffList if x[0] == '+')
163159 if tempNewDelta.strip() != '':
164160 if tempNewDelta != ''.join(newScreenText[self.env['screen']['oldCursor']['x']:self.env['screen']['newCursor']['x']].rstrip()):
166162 typing = False
167163 else:
168164 diff = self.differ.compare(oldScreenText.split('\n'),\
169 newScreenText.split('\n'))
165 newScreenText.split('\n'))
170166 diffList = list(diff)
171167
172168 if not typing:
173169 self.env['screen']['newDelta'] = '\n'.join(x[2:] for x in diffList if x[0] == '+')
174170 else:
175 self.env['screen']['newDelta'] = ''.join(x[2:] for x in diffList if x[0] == '+')
171 self.env['screen']['newDelta'] = ''.join(x[2:] for x in diffList if x[0] == '+')
176172 self.env['screen']['newNegativeDelta'] = ''.join(x[2:] for x in diffList if x[0] == '-')
177173
178174 # track highlighted
180176 if self.env['runtime']['attributeManager'].isAttributeChange():
181177 if self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'highlight'):
182178 attributeDelta, attributeCursor = self.env['runtime']['attributeManager'].trackHighlights()
183 if attributeCursor:
179 if attributeCursor:
184180 self.env['runtime']['attributeManager'].setAttributeCursor(attributeCursor)
185 self.env['runtime']['attributeManager'].setAttributeDelta(attributeDelta)
181 self.env['runtime']['attributeManager'].setAttributeDelta(attributeDelta)
186182 except Exception as e:
187183 self.env['runtime']['debug'].writeDebugOut('screenManager:update:highlight: ' + str(e),debug.debugLevel.ERROR)
188184
192188 ignoreScreens = []
193189 fixIgnoreScreens = self.env['runtime']['settingsManager'].getSetting('screen', 'suspendingScreen')
194190 if fixIgnoreScreens != '':
195 ignoreScreens.extend(fixIgnoreScreens.split(','))
191 ignoreScreens.extend(fixIgnoreScreens.split(','))
196192 if self.env['runtime']['settingsManager'].getSettingAsBool('screen', 'autodetectSuspendingScreen'):
197193 ignoreScreens.extend(self.env['screen']['autoIgnoreScreens'])
198 self.env['runtime']['debug'].writeDebugOut('screenManager:isSuspendingScreen ignore:' + str(ignoreScreens) + ' current:'+ str(screen ), debug.debugLevel.INFO)
194 self.env['runtime']['debug'].writeDebugOut('screenManager:isSuspendingScreen ignore:' + str(ignoreScreens) + ' current:'+ str(screen ), debug.debugLevel.INFO)
199195 return (screen in ignoreScreens)
200196
201197 def isScreenChange(self):
207203 if ignoreSpace:
208204 newDelta = newDelta.strip()
209205 return newDelta != ''
210 def isNegativeDelta(self):
206 def isNegativeDelta(self):
211207 return self.env['screen']['newNegativeDelta'] != ''
212208 def getWindowAreaInText(self, text):
213209 if not self.env['runtime']['cursorManager'].isApplicationWindowSet():
219215 for line in windowList:
220216 windowText += line[self.env['commandBuffer']['windowArea'][currApp]['1']['x']:self.env['commandBuffer']['windowArea'][currApp]['2']['x'] + 1] + '\n'
221217 return windowText
222
218
223219 def injectTextToScreen(self, text, screen = None):
224220 try:
225221 self.env['runtime']['screenDriver'].injectTextToScreen(text, screen)
239235 self.env['runtime']['debug'].writeDebugOut('screenManager:changeBrailleScreen:leveScreen ' + str(e),debug.debugLevel.ERROR)
240236 if not self.isSuspendingScreen():
241237 try:
242 self.env['runtime']['brailleDriver'].enterScreen(self.env['screen']['newTTY'])
243 except Exception as e:
238 self.env['runtime']['brailleDriver'].enterScreen(self.env['screen']['newTTY'])
239 except Exception as e:
244240 self.env['runtime']['debug'].writeDebugOut('screenManager:changeBrailleScreen:enterScreen ' + str(e),debug.debugLevel.ERROR)
5555 'general':{
5656 'debugLevel': debug.debugLevel.DEACTIVE,
5757 'debugMode': 'FILE',
58 'debugFile': '/var/log/fenrirscreenreader/fenrir.log',
58 'debugFile': '',
5959 'punctuationProfile':'default',
6060 'punctuationLevel': 'some',
6161 'respectPunctuationPause':True,
8383 'enabled': True,
8484 'driver': 'unixDriver',
8585 'port': 22447,
86 'socketpath':'/tmp/',
86 'socketFile':'',
8787 'enableSettingsRemote': True,
8888 'enableCommandRemote': True,
8989 },
9797 'endOfScreen': True,
9898 'leaveReviewOnCursorChange': True,
9999 'leaveReviewOnScreenChange': True,
100 },
101 'menu':{
102 'vmenuPath': '',
103 'quickMenu': 'speech#rate;speech#pitch;speech#volume',
100104 },
101105 'promote':{
102106 'enabled': True,
2121 from fenrirscreenreader.core import cursorManager
2222 from fenrirscreenreader.core import applicationManager
2323 from fenrirscreenreader.core import helpManager
24 from fenrirscreenreader.core import vmenuManager
2425 from fenrirscreenreader.core import textManager
2526 from fenrirscreenreader.core import tableManager
2627 from fenrirscreenreader.core import byteManager
2829 from fenrirscreenreader.core import barrierManager
2930 from fenrirscreenreader.core import remoteManager
3031 from fenrirscreenreader.core import sayAllManager
32 from fenrirscreenreader.core import quickMenuManager
3133 from fenrirscreenreader.core import environment
3234 from fenrirscreenreader.core.settingsData import settingsData
3335 from fenrirscreenreader.core import debug
3739 def __init__(self):
3840 self.settings = settingsData
3941 self.settingArgDict = {}
42 self.bindingsBackup = None
43 self.settingsFile = ''
4044 def initialize(self, environment):
4145 self.env = environment
4246 def shutdown(self):
4347 pass
44
48 def getBindingBackup(self):
49 return self.bindingsBackup.copy()
4550 def loadSoundIcons(self, soundIconPath):
4651 siConfig = open(soundIconPath + '/soundicons.conf',"r")
4752 while(True):
7075 self.env['soundIcons'][soundIcon] = soundIconFile
7176 self.env['runtime']['debug'].writeDebugOut("SoundIcon: " + soundIcon + '.' + soundIconFile, debug.debugLevel.INFO, onAnyLevel=True)
7277 siConfig.close()
73
78 def getSettingsFile(self):
79 return self.settingsFile
80 def setSettingsFile(self, settingsFile):
81 if not os.path.exists(settingsFile):
82 return
83 if not os.access(settingsFile, os.R_OK):
84 return
85 self.settingsFile = settingsFile
7486 def loadSettings(self, settingConfigPath):
7587 if not os.path.exists(settingConfigPath):
7688 return False
7789 if not os.access(settingConfigPath, os.R_OK):
7890 return False
7991 self.env['settings'] = ConfigParser()
80 self.env['settings'].read(settingConfigPath)
92 try:
93 self.env['settings'].read(settingConfigPath)
94 except:
95 return False
96 self.setSettingsFile(settingConfigPath)
8197 return True
8298 def saveSettings(self, settingConfigPath):
8399 # set opt dict here
194210 self.env['input']['scriptKey'].append(key)
195211 def resetSettingArgDict(self):
196212 self.settingArgDict = {}
213 self.env['runtime']['outputManager'].resetSpeechDriver()
197214 def setOptionArgDict(self, section, setting, value):
198215 #section = section.lower()
199216 #setting = setting.lower()
222239 #self.env['runtime']['debug'].writeDebugOut('settingsManager:setOptionArgDict:Datatype missmatch: '+ section + '#' + setting + '=' + value + ' Error:' + str(e), debug.debugLevel.ERROR)
223240 return
224241
225
226
227242 def parseSettingArgs(self, settingArgs):
228243 for optionElem in settingArgs.split(';'):
229 if len(optionElem.split('#',1)) != 2:
230 continue
231 if len(optionElem.split('#',1)[1].split('=',1)) != 2:
232 continue
233
234 section = str(optionElem.split('#',1)[0])
235 option = str(optionElem.split('#',1)[1].split('=',1)[0])
236 value = optionElem.split('#',1)[1].split('=',1)[1]
244 settingValList = []
245 sectionOptionList = []
246 section = ''
247 option = ''
248 value = ''
249 settingValList = optionElem.split('=',1)
250 if len(settingValList) != 2:
251 continue
252 if '#' in settingValList[0]:
253 sectionOptionList = settingValList[0].split('#', 1)
254 elif '.' in settingValList[0]:
255 sectionOptionList = settingValList[0].split('.', 1)
256 elif ',' in settingValList[0]:
257 sectionOptionList = settingValList[0].split(',', 1)
258 elif '!' in settingValList[0]:
259 sectionOptionList = settingValList[0].split('!', 1)
260 else:
261 continue
262 if len(sectionOptionList) != 2:
263 continue
264
265 section = str(sectionOptionList[0])
266 option = str(sectionOptionList[1])
267 value = str(settingValList[1])
237268 self.setOptionArgDict(section, option, value)
238269
239270 def initFenrirConfig(self, cliArgs, fenrirManager = None, environment = environment.environment):
276307 # TODO needs cleanup use dict
277308 #self.setOptionArgDict('keyboard', 'keyboardLayout', 'pty')
278309 self.setSetting('keyboard', 'keyboardLayout', 'pty')
279 self.setSetting('general', 'debugFile', '/tmp/fenrir-pty.log')
280310 if cliArgs.emulated_evdev:
281311 self.setSetting('screen', 'driver', 'ptyDriver')
282312 self.setSetting('keyboard', 'driver', 'evdevDriver')
382412 environment['runtime']['barrierManager'].initialize(environment)
383413 environment['runtime']['sayAllManager'] = sayAllManager.sayAllManager()
384414 environment['runtime']['sayAllManager'].initialize(environment)
415 environment['runtime']['vmenuManager'] = vmenuManager.vmenuManager()
416 environment['runtime']['vmenuManager'].initialize(environment)
417 environment['runtime']['quickMenuManager'] = quickMenuManager.quickMenuManager()
418 environment['runtime']['quickMenuManager'].initialize(environment)
419
420 # only possible after having input and screen managers with clean buffer
421 environment['runtime']['inputManager'].writeEventBuffer()
422 environment['runtime']['inputManager'].handleDeviceGrab(force = True)
423
385424 environment['runtime']['debug'].writeDebugOut('\/-------environment-------\/',debug.debugLevel.INFO, onAnyLevel=True)
386425 environment['runtime']['debug'].writeDebugOut(str(environment), debug.debugLevel.INFO, onAnyLevel=True)
387426 environment['runtime']['debug'].writeDebugOut('\/-------settings.conf-------\/', debug.debugLevel.INFO, onAnyLevel=True)
388427 environment['runtime']['debug'].writeDebugOut(str(environment['settings']._sections) , debug.debugLevel.INFO, onAnyLevel=True)
389428 environment['runtime']['debug'].writeDebugOut('\/-------self.settingArgDict-------\/',debug.debugLevel.INFO, onAnyLevel=True)
390429 environment['runtime']['debug'].writeDebugOut(str( self.settingArgDict) ,debug.debugLevel.INFO, onAnyLevel=True)
430 self.bindingsBackup = environment['bindings'].copy()
431
391432 return environment
77
88 class speechDriver():
99 def __init__(self):
10 pass
11 def initialize(self, environment):
1012 self._isInitialized = False
1113 self.language = None
1214 self.voice = None
1416 self.pitch = None
1517 self.rate = None
1618 self.volume = None
17 def initialize(self, environment):
1819 self.env = environment
19 self._isInitialized = True
20
20 self._isInitialized = True
2121 def shutdown(self):
2222 if self._isInitialized:
2323 self.cancel()
24 self._isInitialized = False
24 self._isInitialized = False
2525
2626 def speak(self,text, queueable=True):
2727 if not self._isInitialized:
3131
3232 def cancel(self):
3333 if not self._isInitialized:
34 return
34 return
3535
3636 def setCallback(self, callback):
3737 if not self._isInitialized:
38 return
38 return
3939 if not callback:
4040 return
4141
4747 if not self._isInitialized:
4848 return
4949 if voice == '':
50 return
50 return
5151 self.voice = voice
5252
5353 def setPitch(self, pitch):
7676 if not isinstance(module, str):
7777 return
7878 if module == '':
79 return
79 return
8080 self.module = module
81
81 def reset(self):
82 self.shutdown()
83 self.initialize(self.env)
8284 def setLanguage(self, language):
8385 if not self._isInitialized:
8486 return
8587 if not isinstance(language, str):
8688 return
8789 if language == '':
88 return
90 return
8991 self.language = language
9092 def setVolume(self, volume):
9193 if not self._isInitialized:
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
3 # Fenrir TTY screen reader
4 # By Chrys, Storm Dragon, and contributers.
5
6 from fenrirscreenreader.core import debug
7 from fenrirscreenreader.utils import module_utils
8 import os, inspect, time
9
10 currentdir = os.path.dirname(os.path.realpath(os.path.abspath(inspect.getfile(inspect.currentframe()))))
11 fenrirPath = os.path.dirname(currentdir)
12
13 class vmenuManager():
14 def __init__(self):
15 self.menuDict = {}
16 self.currIndex = None
17 self.currMenu = ''
18 self.active = False
19 self.reset = True
20 self.useTimeout = True
21 self.searchText = ''
22 self.lastSearchTime = time.time()
23 def initialize(self, environment):
24 self.env = environment
25 # use default path
26 self.defaultVMenuPath = fenrirPath+ "/commands/vmenu-profiles/" + self.env['runtime']['inputManager'].getShortcutType()
27 # if there is no user configuration
28 if self.env['runtime']['settingsManager'].getSetting('menu', 'vmenuPath') != '':
29 self.defaultVMenuPath = self.env['runtime']['settingsManager'].getSetting('menu', 'vmenuPath')
30 if not self.defaultVMenuPath.endswith('/'):
31 self.defaultVMenuPath += '/'
32 self.defaultVMenuPath += self.env['runtime']['inputManager'].getShortcutType()
33
34 self.createMenuTree()
35 self.closeAfterAction = False
36 def shutdown(self):
37 pass
38 def clearSearchText(self):
39 self.searchText = ''
40 def searchEntry(self, value, forceReset = False):
41 if self.currIndex == None:
42 return ''
43 if self.reset or forceReset:
44 self.clearSearchText()
45 else:
46 if self.useTimeout:
47 if time.time() - self.lastSearchTime > 1:
48 self.clearSearchText()
49 self.searchText += value.upper()
50 self.lastSearchTime = time.time()
51 startIndex = self.getCurrIndex()
52 while True:
53 if not self.nextIndex():
54 return ''
55 entry = self.getCurrentEntry()
56 if entry.upper().startswith(self.searchText):
57 return entry
58 if startIndex == self.getCurrIndex():
59 return ''
60
61 def setCurrMenu(self, currMenu = ''):
62 self.currIndex = None
63 self.currMenu = ''
64 if currMenu != '':
65 currMenu += ' ' + _('Menu')
66 try:
67 t = self.menuDict[currMenu]
68 l = list(self.menuDict.keys())
69 self.currIndex = [l.index(currMenu)]
70 except Exception as e:
71 print(e)
72 self.currMenu = ''
73 self.currIndex = None
74 return
75 if self.incLevel():
76 self.currMenu = currMenu
77 else:
78 self.currMenu = ''
79 self.currIndex = None
80 def getCurrMenu(self):
81 return self.currMenu
82 def getActive(self):
83 return self.active
84 def togglelVMenuMode(self, closeAfterAction = True):
85 self.setActive(not self.getActive(), closeAfterAction)
86 def setActive(self, active, closeAfterAction = True):
87 if self.env['runtime']['helpManager'].isTutorialMode():
88 return
89 self.active = active
90 if self.active:
91 self.closeAfterAction = closeAfterAction
92 try:
93 self.createMenuTree()
94 except Exception as e:
95 print(e)
96 try:
97 if self.currMenu != '':
98 self.setCurrMenu(self.currMenu)
99 if self.currIndex == None:
100 if len(self.menuDict) > 0:
101 self.currIndex = [0]
102 except Exception as e:
103 print(e)
104 try:
105 # navigation
106 self.env['bindings'][str([1, ['KEY_ESC']])] = 'TOGGLE_VMENU_MODE'
107 self.env['bindings'][str([1, ['KEY_UP']])] = 'PREV_VMENU_ENTRY'
108 self.env['bindings'][str([1, ['KEY_DOWN']])] = 'NEXT_VMENU_ENTRY'
109 self.env['bindings'][str([1, ['KEY_SPACE']])] = 'CURR_VMENU_ENTRY'
110 self.env['bindings'][str([1, ['KEY_LEFT']])] = 'DEC_LEVEL_VMENU'
111 self.env['bindings'][str([1, ['KEY_RIGHT']])] = 'INC_LEVEL_VMENU'
112 self.env['bindings'][str([1, ['KEY_ENTER']])] = 'EXEC_VMENU_ENTRY'
113 # search
114 self.env['bindings'][str([1, ['KEY_A']])] = 'SEARCH_A'
115 self.env['bindings'][str([1, ['KEY_B']])] = 'SEARCH_B'
116 self.env['bindings'][str([1, ['KEY_C']])] = 'SEARCH_C'
117 self.env['bindings'][str([1, ['KEY_D']])] = 'SEARCH_D'
118 self.env['bindings'][str([1, ['KEY_E']])] = 'SEARCH_E'
119 self.env['bindings'][str([1, ['KEY_F']])] = 'SEARCH_F'
120 self.env['bindings'][str([1, ['KEY_G']])] = 'SEARCH_G'
121 self.env['bindings'][str([1, ['KEY_H']])] = 'SEARCH_H'
122 self.env['bindings'][str([1, ['KEY_I']])] = 'SEARCH_I'
123 self.env['bindings'][str([1, ['KEY_J']])] = 'SEARCH_J'
124 self.env['bindings'][str([1, ['KEY_K']])] = 'SEARCH_K'
125 self.env['bindings'][str([1, ['KEY_L']])] = 'SEARCH_L'
126 self.env['bindings'][str([1, ['KEY_M']])] = 'SEARCH_M'
127 self.env['bindings'][str([1, ['KEY_N']])] = 'SEARCH_N'
128 self.env['bindings'][str([1, ['KEY_O']])] = 'SEARCH_O'
129 self.env['bindings'][str([1, ['KEY_P']])] = 'SEARCH_P'
130 self.env['bindings'][str([1, ['KEY_Q']])] = 'SEARCH_Q'
131 self.env['bindings'][str([1, ['KEY_R']])] = 'SEARCH_R'
132 self.env['bindings'][str([1, ['KEY_S']])] = 'SEARCH_S'
133 self.env['bindings'][str([1, ['KEY_T']])] = 'SEARCH_T'
134 self.env['bindings'][str([1, ['KEY_U']])] = 'SEARCH_U'
135 self.env['bindings'][str([1, ['KEY_V']])] = 'SEARCH_V'
136 self.env['bindings'][str([1, ['KEY_W']])] = 'SEARCH_W'
137 self.env['bindings'][str([1, ['KEY_X']])] = 'SEARCH_X'
138 self.env['bindings'][str([1, ['KEY_Y']])] = 'SEARCH_Y'
139 self.env['bindings'][str([1, ['KEY_Z']])] = 'SEARCH_Z'
140 except Exception as e:
141 print(e)
142 else:
143 try:
144 self.currIndex = None
145 self.env['bindings'] = self.env['runtime']['settingsManager'].getBindingBackup()
146 except:
147 pass
148 def createMenuTree(self, resetIndex = True):
149 if resetIndex:
150 self.currIndex = None
151 menu = self.fs_tree_to_dict( self.defaultVMenuPath)
152 if menu:
153 self.menuDict = menu
154 # index still valid?
155 if self.currIndex != None:
156 try:
157 r = self.getValueByPath(self.menuDict, self.currIndex)
158 if r == {}:
159 self.currIndex = None
160 except:
161 self.currIndex = None
162 def executeMenu(self):
163 if self.currIndex == None:
164 return
165 try:
166 command = self.getValueByPath(self.menuDict, self.currIndex)
167 if not command == None:
168 command.run()
169 if self.closeAfterAction:
170 self.setActive(False)
171 except Exception as e:
172 try:
173 self.incLevel()
174 text = self.getCurrentEntry()
175 self.env['runtime']['outputManager'].presentText(text, interrupt=True)
176 except:
177 print(e)
178
179 def incLevel(self):
180 if self.currIndex == None:
181 return False
182 try:
183 r = self.getValueByPath(self.menuDict, self.currIndex +[0])
184 if r == {}:
185 return False
186 except:
187 return False
188 self.currIndex.append(0)
189 return True
190 def decLevel(self):
191 if self.currIndex == None:
192 return False
193 if self.currMenu != '':
194 if len(self.currIndex) <= 2:
195 return False
196 elif len(self.currIndex) == 1:
197 return False
198 self.currIndex = self.currIndex[:len(self.currIndex) - 1]
199 return True
200 def nextIndex(self):
201 if self.currIndex == None:
202 return False
203 if self.currIndex[len(self.currIndex) - 1] + 1 >= len(self.getNestedByPath(self.menuDict, self.currIndex[:-1])):
204 self.currIndex[len(self.currIndex) - 1] = 0
205 else:
206 self.currIndex[len(self.currIndex) - 1] += 1
207 return True
208 def getCurrIndex(self):
209 if self.currIndex == None:
210 return 0
211 return self.currIndex[len(self.currIndex) - 1]
212 def prevIndex(self):
213 if self.currIndex == None:
214 return False
215 if self.currIndex[len(self.currIndex) - 1] == 0:
216 self.currIndex[len(self.currIndex) - 1] = len(self.getNestedByPath(self.menuDict, self.currIndex[:-1])) - 1
217 else:
218 self.currIndex[len(self.currIndex) - 1] -= 1
219 return True
220
221 def getCurrentEntry(self):
222 return self.getKeysByPath(self.menuDict, self.currIndex)[self.currIndex[-1]]
223 def fs_tree_to_dict(self, path_):
224 for root, dirs, files in os.walk(path_):
225 tree = {d + ' ' + _('Menu'): self.fs_tree_to_dict(os.path.join(root, d)) for d in dirs if not d.startswith('__')}
226 for f in files:
227 try:
228 fileName, fileExtension = os.path.splitext(f)
229 fileName = fileName.split('/')[-1]
230 if fileName.startswith('__'):
231 continue
232 command = self.env['runtime']['commandManager'].loadFile(root + '/' + f)
233 tree.update({fileName + ' ' + _('Action'): command})
234 except Exception as e:
235 print(e)
236 return tree # note we discontinue iteration trough os.walk
237 def getNestedByPath(self, complete, path):
238 path = path.copy()
239 if path != []:
240 index = list(complete.keys())[path[0]]
241 nested = self.getNestedByPath(complete[index], path[1:])
242 return nested
243 else:
244 return complete
245
246
247 def getKeysByPath(self, complete, path):
248 if not isinstance(complete, dict):
249 return[]
250 d = complete
251 for i in path[:-1]:
252 d = d[list(d.keys())[i]]
253 return list(d.keys())
254
255 def getValueByPath(self, complete, path):
256 if not isinstance(complete, dict):
257 return complete
258 d = complete.copy()
259 for i in path:
260 d = d[list(d.keys())[i]]
261 return d
33 # Fenrir TTY screen reader
44 # By Chrys, Storm Dragon, and contributers.
55
6 version = '1.9.4'
7 codename = 'tucher'
6 version = '1.9.7'
7 codename = 'krug'
1313
1414 def initialize(self, environment):
1515 self.env = environment
16 self.env['runtime']['inputManager'].setShortcutType('KEY')
17 self._initialized = True
18 print('Input Debug Driver: Initialized')
16 self.env['runtime']['inputManager'].setShortcutType('KEY')
17 self._initialized = True
18 print('Input Debug Driver: Initialized')
1919
2020 def shutdown(self):
2121 if self._initialized:
22 self.removeAllDevices()
23 self._initialized = False
22 self.removeAllDevices()
23 self._initialized = False
2424 print('Input Debug Driver: Shutdown')
2525
2626 def getInputEvent(self):
3131 return None
3232 def writeEventBuffer(self):
3333 if not self._initialized:
34 return
34 return
3535 print('Input Debug Driver: writeEventBuffer')
3636 def clearEventBuffer(self):
3737 if not self._initialized:
38 return
39 del self.env['input']['eventBuffer'][:]
38 return
39 del self.env['input']['eventBuffer'][:]
4040 print('Input Debug Driver: clearEventBuffer')
4141 def updateInputDevices(self, newDevices = None, init = False):
4242 if not self._initialized:
43 return
43 return
4444 print('Input Debug Driver: updateInputDevices')
4545 def getLedState(self, led = 0):
4646 if not self._initialized:
47 return False
48 return False
47 return False
48 return False
4949 def toggleLedState(self, led = 0):
5050 if not self._initialized:
51 return
51 return
5252 print('Input Debug Driver: toggleLedState')
5353 def grabAllDevices(self):
5454 if not self._initialized:
55 return
55 return
5656 print('Input Debug Driver: grabAllDevices')
5757 def ungrabAllDevices(self):
5858 if not self._initialized:
59 return
59 return
6060 print('Input Debug Driver: ungrabAllDevices')
6161
6262 def removeAllDevices(self):
6666 def __del__(self):
6767 if self._initialized:
6868 self.removeAllDevices()
69 print('Input Debug Driver: __del__')
69 print('Input Debug Driver: __del__')
7070
7171
0 #!/bin/python
1 # -*- coding: utf-8 -*-
2
30 # Fenrir TTY screen reader
41 # By Chrys, Storm Dragon, and contributers.
52
96 _udevAvailableError = ''
107 try:
118 import evdev
12 from evdev import InputDevice, UInput
9 from evdev import InputDevice, UInput, ecodes as e
1310 _evdevAvailable = True
1411
1512 except Exception as e:
4239 self.gDevices = {}
4340 self.iDeviceNo = 0
4441 self.watchDog = Value(c_bool, True)
42 self.UInputinject = UInput()
4543 def initialize(self, environment):
4644 self.env = environment
4745 self.env['runtime']['inputManager'].setShortcutType('KEY')
4846 global _evdevAvailable
4947 global _udevAvailable
50 self._initialized = _evdevAvailable and _udevAvailable
51 if not self._initialized:
52 global _evdevAvailableError
53 global _udevAvailableError
54 currError = ' '
55 if not _evdevAvailable:
56 currError += _evdevAvailableError
57 if not _udevAvailable:
58 currError += ' ' + _udevAvailableError
59 self.env['runtime']['debug'].writeDebugOut('InputDriver:' + currError, debug.debugLevel.ERROR)
60 return
61
62 self.env['runtime']['processManager'].addCustomEventThread(self.plugInputDeviceWatchdogUdev)
48 global _evdevAvailableError
49 global _udevAvailableError
50 if not _udevAvailable:
51 self.env['runtime']['debug'].writeDebugOut('InputDriver:' + _udevAvailableError, debug.debugLevel.ERROR)
52 if not _evdevAvailable:
53 self.env['runtime']['debug'].writeDebugOut('InputDriver:' + _evdevAvailableError, debug.debugLevel.ERROR)
54 return
55
56 if _udevAvailable:
57 self.env['runtime']['processManager'].addCustomEventThread(self.plugInputDeviceWatchdogUdev)
6358 self.env['runtime']['processManager'].addCustomEventThread(self.inputWatchdog)
59 self._initialized = True
60
6461 def plugInputDeviceWatchdogUdev(self,active , eventQueue):
6562 context = pyudev.Context()
6663 monitor = pyudev.Monitor.from_netlink(context)
6764 monitor.filter_by(subsystem='input')
6865 monitor.start()
66 ignorePlug = False
6967 while active.value:
7068 validDevices = []
7169 device = monitor.poll(1)
7270 while device:
7371 self.env['runtime']['debug'].writeDebugOut('plugInputDeviceWatchdogUdev:' + str(device), debug.debugLevel.INFO)
7472 try:
75 if not '/sys/devices/virtual/input/' in device.sys_path:
73 try:
74 if device.name.upper() in ['','SPEAKUP','FENRIR-UINPUT']:
75 ignorePlug = True
76 if device.phys.upper() in ['','SPEAKUP','FENRIR-UINPUT']:
77 ignorePlug = True
78 if 'BRLTTY' in device.name.upper():
79 ignorePlug = True
80 except Exception as e:
81 self.env['runtime']['debug'].writeDebugOut("plugInputDeviceWatchdogUdev CHECK NAME CRASH: " + str(e),debug.debugLevel.ERROR)
82 if not ignorePlug:
83 virtual = '/sys/devices/virtual/input/' in device.sys_path
7684 if device.device_node:
77 validDevices.append(str(device.device_node))
78 except:
79 pass
85 validDevices.append({'device': device.device_node, 'virtual': virtual})
86 except Exception as e:
87 self.env['runtime']['debug'].writeDebugOut("plugInputDeviceWatchdogUdev APPEND CRASH: " + str(e),debug.debugLevel.ERROR)
8088 try:
81 device = monitor.poll(0.1)
82 except:
89 pollTimeout = 1
90 device = monitor.poll(pollTimeout)
91 except:
8392 device = None
93 ignorePlug = False
8494 if validDevices:
8595 eventQueue.put({"Type":fenrirEventType.PlugInputDevice,"Data":validDevices})
86 return time.time()
87
96 return time.time()
97
8898 def inputWatchdog(self,active , eventQueue):
8999 try:
90100 while active.value:
91101 r, w, x = select(self.iDevices, [], [], 0.8)
92 event = None
102 event = None
93103 foundKeyInSequence = False
94104 foreward = False
95105 eventFired = False
136146 if self.gDevices[iDevice.fd]:
137147 self.writeUInput(uDevice, event)
138148 except Exception as e:
139 pass
149 pass
140150
141151 def writeUInput(self, uDevice, event):
142152 if not self._initialized:
143 return
153 return
144154 uDevice.write_event(event)
155 time.sleep(0.0000002)
145156 uDevice.syn()
146157
147158 def updateInputDevices(self, newDevices = None, init = False):
151162 deviceFileList = None
152163
153164 if newDevices and not init:
165 if not isinstance(newDevices, list):
166 newDevices = [newDevices]
154167 deviceFileList = newDevices
155168 else:
156169 deviceFileList = evdev.list_devices()
187200 except:
188201 continue
189202 try:
190 if currDevice.name.upper() in ['','SPEAKUP','PY-EVDEV-UINPUT']:
191 continue
192 if currDevice.phys.upper() in ['','SPEAKUP','PY-EVDEV-UINPUT']:
193 continue
203 if currDevice.name.upper() in ['','SPEAKUP','FENRIR-UINPUT']:
204 continue
205 if currDevice.phys.upper() in ['','SPEAKUP','FENRIR-UINPUT']:
206 continue
194207 if 'BRLTTY' in currDevice.name.upper():
195208 continue
196209 except:
199212 if mode in ['ALL','NOMICE']:
200213 if eventType.EV_KEY in cap:
201214 if 116 in cap[eventType.EV_KEY] and len(cap[eventType.EV_KEY]) < 10:
202 self.env['runtime']['debug'].writeDebugOut('Device Skipped (has 116):' + currDevice.name,debug.debugLevel.INFO)
215 self.env['runtime']['debug'].writeDebugOut('Device Skipped (has 116):' + currDevice.name,debug.debugLevel.INFO)
203216 continue
204217 if len(cap[eventType.EV_KEY]) < 60:
205 self.env['runtime']['debug'].writeDebugOut('Device Skipped (< 60 keys):' + currDevice.name,debug.debugLevel.INFO)
206 continue
218 self.env['runtime']['debug'].writeDebugOut('Device Skipped (< 60 keys):' + currDevice.name,debug.debugLevel.INFO)
219 continue
207220 if mode == 'ALL':
208221 self.addDevice(currDevice)
209 self.env['runtime']['debug'].writeDebugOut('Device added (ALL):' + self.iDevices[currDevice.fd].name, debug.debugLevel.INFO)
222 self.env['runtime']['debug'].writeDebugOut('Device added (ALL):' + self.iDevices[currDevice.fd].name, debug.debugLevel.INFO)
210223 elif mode == 'NOMICE':
211224 if not ((eventType.EV_REL in cap) or (eventType.EV_ABS in cap)):
212225 self.addDevice(currDevice)
213 self.env['runtime']['debug'].writeDebugOut('Device added (NOMICE):' + self.iDevices[currDevice.fd].name,debug.debugLevel.INFO)
226 self.env['runtime']['debug'].writeDebugOut('Device added (NOMICE):' + self.iDevices[currDevice.fd].name,debug.debugLevel.INFO)
214227 else:
215 self.env['runtime']['debug'].writeDebugOut('Device Skipped (NOMICE):' + currDevice.name,debug.debugLevel.INFO)
228 self.env['runtime']['debug'].writeDebugOut('Device Skipped (NOMICE):' + currDevice.name,debug.debugLevel.INFO)
216229 else:
217 self.env['runtime']['debug'].writeDebugOut('Device Skipped (no EV_KEY):' + currDevice.name,debug.debugLevel.INFO)
230 self.env['runtime']['debug'].writeDebugOut('Device Skipped (no EV_KEY):' + currDevice.name,debug.debugLevel.INFO)
218231 elif currDevice.name.upper() in mode.split(','):
219232 self.addDevice(currDevice)
220 self.env['runtime']['debug'].writeDebugOut('Device added (Name):' + self.iDevices[currDevice.fd].name,debug.debugLevel.INFO)
233 self.env['runtime']['debug'].writeDebugOut('Device added (Name):' + self.iDevices[currDevice.fd].name,debug.debugLevel.INFO)
221234 except Exception as e:
222235 self.env['runtime']['debug'].writeDebugOut("Device Skipped (Exception): " + deviceFile +' ' + currDevice.name +' '+ str(e),debug.debugLevel.INFO)
223236 self.iDeviceNo = len(evdev.list_devices())
230243 self.iDevicesFD.append(fd)
231244 for fd in self.iDevicesFD:
232245 if not fd in self.iDevices:
233 self.iDevicesFD.remove(fd)
246 self.iDevicesFD.remove(fd)
234247 except:
235248 pass
236249 def mapEvent(self, event):
237250 if not self._initialized:
238 return None
251 return None
239252 if not event:
240253 return None
241254 mEvent = inputData.inputEvent
250263 mEvent['EventName'] = mEvent['EventName'][0]
251264 mEvent['EventValue'] = event.code
252265 mEvent['EventSec'] = event.sec
253 mEvent['EventUsec'] = event.usec
266 mEvent['EventUsec'] = event.usec
254267 mEvent['EventState'] = event.value
255268 mEvent['EventType'] = event.type
256269 return mEvent
257270 except Exception as e:
258271 return None
259
272
260273 def getLedState(self, led = 0):
261274 if not self.hasIDevices():
262 return False
275 return False
263276 # 0 = Numlock
264277 # 1 = Capslock
265278 # 2 = Rollen
266279 for fd, dev in self.iDevices.items():
267280 if led in dev.leds():
268281 return True
269 return False
282 return False
270283 def toggleLedState(self, led = 0):
271284 if not self.hasIDevices():
272 return False
285 return False
273286 ledState = self.getLedState(led)
274287 for i in self.iDevices:
275288 if self.gDevices[i]:
276289 # 17 LEDs
277 if 17 in self.iDevices[i].capabilities():
290 if 17 in self.iDevices[i].capabilities():
278291 if ledState == 1:
279292 self.iDevices[i].set_led(led , 0)
280293 else:
281294 self.iDevices[i].set_led(led , 1)
282295 def grabAllDevices(self):
283296 if not self._initialized:
284 return
297 return True
298 ok = True
285299 for fd in self.iDevices:
286 self.grabDevice(fd)
287
300 if not self.gDevices[fd]:
301 ok = ok and self.grabDevice(fd)
302 return ok
288303 def ungrabAllDevices(self):
289304 if not self._initialized:
290 return
305 return True
306 ok = True
291307 for fd in self.iDevices:
292 self.ungrabDevice(fd)
293
308 if self.gDevices[fd]:
309 ok = ok and self.ungrabDevice(fd)
310 return ok
294311 def createUInputDev(self, fd):
295312 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
296313 self.uDevices[fd] = None
302319 self.uDevices[fd] = None
303320 if self.uDevices[fd] != None:
304321 return
305 try:
306 self.uDevices[fd] = UInput.from_device(self.iDevices[fd])
322 try:
323 self.uDevices[fd] = UInput.from_device(self.iDevices[fd], name='fenrir-uinput', phys='fenrir-uinput')
307324 except Exception as e:
308325 try:
309 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: compat fallback: ' + str(e),debug.debugLevel.WARNING)
326 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: compat fallback: ' + str(e),debug.debugLevel.WARNING)
310327 dev = self.iDevices[fd]
311328 cap = dev.capabilities()
312329 del cap[0]
313330 self.uDevices[fd] = UInput(
314331 cap,
315 dev.name,
332 name = 'fenrir-uinput',
333 phys = 'fenrir-uinput'
316334 )
317335 except Exception as e:
318 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: init Uinput not possible: ' + str(e),debug.debugLevel.ERROR)
319 return
336 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: init Uinput not possible: ' + str(e),debug.debugLevel.ERROR)
337 return
320338 def addDevice(self, newDevice):
321 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: device added: ' + str(newDevice.fd) + ' ' +str(newDevice),debug.debugLevel.INFO)
322 self.iDevices[newDevice.fd] = newDevice
323 self.gDevices[newDevice.fd] = False
324 self.createUInputDev(newDevice.fd)
339 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: device added: ' + str(newDevice.fd) + ' ' +str(newDevice),debug.debugLevel.INFO)
340 try:
341 self.iDevices[newDevice.fd] = newDevice
342 self.createUInputDev(newDevice.fd)
343 self.gDevices[newDevice.fd] = False
344 except:
345 # if it doesnt work clean up
346 try:
347 del(self.iDevices[newDevice.fd])
348 except:
349 pass
350 try:
351 del(self.uDevices[newDevice.fd])
352 except:
353 pass
354 try:
355 del(self.gDevices[newDevice.fd])
356 except:
357 pass
325358 def grabDevice(self, fd):
326359 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
327 return
360 return True
328361 try:
329362 self.iDevices[fd].grab()
330363 self.gDevices[fd] = True
331 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: grab device ('+ str(self.iDevices[fd].name) + ')',debug.debugLevel.INFO)
332 except IOError:
333 self.gDevices[fd] = True
364 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: grab device ('+ str(self.iDevices[fd].name) + ')',debug.debugLevel.INFO)
365 except IOError:
366 if not self.gDevices[fd]:
367 return False
368 # self.gDevices[fd] = True
369 # #self.removeDevice(fd)
334370 except Exception as e:
335 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: grabing not possible: ' + str(e),debug.debugLevel.ERROR)
371 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: grabing not possible: ' + str(e),debug.debugLevel.ERROR)
372 return False
373 return True
336374 def ungrabDevice(self,fd):
337375 if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
338 return
339 try:
340 self.gDevices[fd] = False
376 return True
377 try:
341378 self.iDevices[fd].ungrab()
379 self.gDevices[fd] = False
342380 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: ungrab device ('+ str(self.iDevices[fd].name) + ')',debug.debugLevel.INFO)
343 except:
344 pass
381 except IOError:
382 if self.gDevices[fd]:
383 return False
384 # self.gDevices[fd] = False
385 # #self.removeDevice(fd)
386 except Exception as e:
387 return False
388 return True
345389 def removeDevice(self,fd):
346 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: device removed: ' + str(fd) + ' ' +str(self.iDevices[fd]),debug.debugLevel.INFO)
390 self.env['runtime']['debug'].writeDebugOut('InputDriver evdev: device removed: ' + str(fd) + ' ' +str(self.iDevices[fd]),debug.debugLevel.INFO)
347391 self.clearEventBuffer()
348392 try:
349393 self.ungrabDevice(fd)
364408 try:
365409 del(self.uDevices[fd])
366410 except:
367 pass
411 pass
368412 try:
369413 del(self.gDevices[fd])
370414 except:
371 pass
415 pass
372416 self.updateMPiDevicesFD()
373
417
374418 def hasIDevices(self):
375419 if not self._initialized:
376420 return False
378422 return False
379423 if len(self.iDevices) == 0:
380424 return False
381 return True
425 return True
426
427 def sendKey(self, key, state):
428 if not self._initialized:
429 return
430 try:
431 self.UInputinject.write(e.EV_KEY, e.ecodes[key], state)
432 self.UInputinject.syn()
433 except:
434 pass
382435
383436 def removeAllDevices(self):
384437 if not self.hasIDevices():
388441 self.removeDevice(fd)
389442 self.iDevices.clear()
390443 self.uDevices.clear()
391 self.gDevices.clear()
444 self.gDevices.clear()
392445 self.iDeviceNo = 0
99
1010 class driver(inputDriver):
1111 def __init__(self):
12 self._isInitialized = False
12 self._isInitialized = False
1313 inputDriver.__init__(self)
1414 def initialize(self, environment):
1515 self.env = environment
1616 self.env['runtime']['inputManager'].setShortcutType('BYTE')
17 self._isInitialized = True
17 self._isInitialized = True
1717 self.env['runtime']['processManager'].addCustomEventThread(self.watchDog, multiprocess=True)
1818 def watchDog(self, active, eventQueue):
1919 # echo "command say this is a test" | nc localhost 22447
20 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21 self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
20 self.fenrirSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21 self.fenrirSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
2222 self.host = '127.0.0.1'
2323 self.port = self.env['runtime']['settingsManager'].getSettingAsInt('remote', 'port')
24 self.sock.bind((self.host, self.port))
25 self.sock.listen(1)
26 while active.value == 1:
27 client_sock, client_addr = self.sock.accept()
28 if client_sock:
29 # Check if the client is still connected and if data is available:
30 try:
31 r, w, e = select.select([client_sock,], [], [])
32 except select.error:
33 return
34 if len(r) > 0:
35 rawdata = client_sock.recv(8129)
36 try:
37 data = rawdata.decode("utf-8").rstrip().lstrip()
38 eventQueue.put({"Type":fenrirEventType.RemoteIncomming,
39 "Data": data
40 })
41 except:
42 pass
24 self.fenrirSock.bind((self.host, self.port))
25 self.fenrirSock.listen(1)
26 while active.value:
27 try:
28 r, _, _ = select.select([self.fenrirSock], [], [], 0.8)
29 except select.error:
30 break
31 if r == []:
32 continue
33 if self.fenrirSock in r:
34 client_sock, client_addr = self.fenrirSock.accept()
35 try:
36 rawdata = client_sock.recv(8129)
37 except:
38 pass
39 try:
40 data = rawdata.decode("utf-8").rstrip().lstrip()
41 eventQueue.put({"Type":fenrirEventType.RemoteIncomming,
42 "Data": data
43 })
44 except:
45 pass
46 try:
4347 client_sock.close()
44 if self.sock:
45 self.sock.close()
46 self.sock = None
48 except:
49 pass
50 if self.fenrirSock:
51 self.fenrirSock.close()
52 self.fenrirSock = None
1818 self.env['runtime']['processManager'].addCustomEventThread(self.watchDog, multiprocess=True)
1919 def watchDog(self, active, eventQueue):
2020 # echo "command say this is a test" | socat - UNIX-CLIENT:/tmp/fenrirscreenreader-deamon.sock
21
22 if self.env['runtime']['settingsManager'].getSetting('screen', 'driver') =='vcsaDriver':
23 socketpath = self.env['runtime']['settingsManager'].getSettingAsInt('remote', 'socketpath') + 'fenrirscreenreader-deamon.sock'
24 else:
25 socketpath = self.env['runtime']['settingsManager'].getSettingAsInt('remote', 'socketpath') + 'fenrirscreenreader-' + str(os.getpid()) + '.sock'
26 if os.path.exists(socketpath):
27 os.remove(socketpath)
28 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
29 self.sock.bind(socketpath)
30 self.sock.listen(1)
31 if self.env['runtime']['settingsManager'].getSetting('screen', 'driver') =='vcsaDriver':
32 os.chmod(socketpath, 0o222)
33 while active.value == 1:
34 client_sock, client_addr = self.sock.accept()
35 if client_sock:
36 # Check if the client is still connected and if data is available:
37 try:
38 r, w, e = select.select([client_sock,], [], [])
39 except select.error:
40 return
41 if len(r) > 0:
42 rawdata = client_sock.recv(8129)
43 try:
44 data = rawdata.decode("utf-8").rstrip().lstrip()
45 eventQueue.put({"Type":fenrirEventType.RemoteIncomming,
46 "Data": data
47 })
48 except:
49 pass
21 socketFile = ''
22 try:
23 socketFile = self.env['runtime']['settingsManager'].getSetting('remote', 'socketFile')
24 except:
25 pass
26 if socketFile == '':
27 if self.env['runtime']['settingsManager'].getSetting('screen', 'driver') =='vcsaDriver':
28 socketFile = '/tmp/fenrirscreenreader-deamon.sock'
29 else:
30 socketFile = '/tmp/fenrirscreenreader-' + str(os.getppid()) + '.sock'
31 if os.path.exists(socketFile):
32 os.unlink(socketFile)
33 self.fenrirSock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
34 self.fenrirSock.bind(socketFile)
35 os.chmod(socketFile, 0o222)
36 self.fenrirSock.listen(1)
37 while active.value:
38 # Check if the client is still connected and if data is available:
39 try:
40 r, _, _ = select.select([self.fenrirSock], [], [], 0.8)
41 except select.error:
42 break
43 if r == []:
44 continue
45 if self.fenrirSock in r:
46 client_sock, client_addr = self.fenrirSock.accept()
47 try:
48 rawdata = client_sock.recv(8129)
49 except:
50 pass
51 try:
52 data = rawdata.decode("utf-8").rstrip().lstrip()
53 eventQueue.put({"Type":fenrirEventType.RemoteIncomming,
54 "Data": data
55 })
56 except:
57 pass
58 try:
5059 client_sock.close()
51
52 if os.path.exists(socketpath):
53 os.remove(socketpath)
54 if self.sock:
55 self.sock.close()
56 self.sock = None
60 except:
61 pass
62 if self.fenrirSock:
63 self.fenrirSock.close()
64 self.fenrirSock = None
65 if os.path.exists(socketFile):
66 os.unlink(socketFile)
33 # Fenrir TTY screen reader
44 # By Chrys, Storm Dragon, and contributers.
55
6 import os, struct, sys, pty, tty, termios, shlex, signal, select, pyte, time, fcntl ,getpass
6 import os, struct, sys, pty, tty, termios, shlex, signal, pyte, time, fcntl ,getpass
7 from select import select
78 from fenrirscreenreader.core import debug
89 from fenrirscreenreader.core.eventData import fenrirEventType
910 from fenrirscreenreader.core.screenDriver import screenDriver
1011 from fenrirscreenreader.utils import screen_utils
1112
13
14 class fenrirScreen(pyte.Screen):
15 def set_margins(self, *args, **kwargs):
16 kwargs.pop("private", None)
17 super(fenrirScreen, self).set_margins(*args, **kwargs)
18
1219 class Terminal:
1320 def __init__(self, columns, lines, p_in):
1421 self.text = ''
1522 self.attributes = None
16 self.screen = pyte.HistoryScreen(columns, lines)
17 self.screen.set_mode(pyte.modes.LNM)
23 self.screen = fenrirScreen(columns, lines)
1824 self.screen.write_process_input = \
1925 lambda data: p_in.write(data.encode())
2026 self.stream = pyte.ByteStream()
2127 self.stream.attach(self.screen)
2228 def feed(self, data):
2329 self.stream.feed(data)
24
30
2531 def updateAttributes(self, initialize = False):
26 buffer = self.screen.buffer
32 buffer = self.screen.buffer
2733 lines = None
2834 if not initialize:
2935 lines = self.screen.dirty
3036 else:
3137 lines = range(self.screen.lines)
32 self.attributes = [[list(attribute[1:]) + [False, 'default', 'default'] for attribute in line.values()] for line in buffer.values()]
33
38 self.attributes = [[list(attribute[1:]) + [False, 'default', 'default'] for attribute in line.values()] for line in buffer.values()]
3439 for y in lines:
3540 try:
3641 t = self.attributes[y]
5459 if yPos == -1:
5560 yPos = self.screen.cursor.y
5661 self.screen.cursor.x = min(self.screen.cursor.x, self.screen.columns - 1)
57 self.screen.cursor.y = min(self.screen.cursor.y, self.screen.lines - 1)
62 self.screen.cursor.y = min(self.screen.cursor.y, self.screen.lines - 1)
5863 def GetScreenContent(self):
5964 cursor = self.screen.cursor
6065 self.text = '\n'.join(self.screen.display)
6166 self.updateAttributes(self.attributes == None)
62 self.screen.dirty.clear()
67 self.screen.dirty.clear()
6368 return {"cursor": (cursor.x, cursor.y),
6469 'lines': self.screen.lines,
6570 'columns': self.screen.columns,
6671 "text": self.text,
6772 'attributes': self.attributes.copy(),
68 'screen': 'pty',
69 'screenUpdateTime': time.time(),
73 'screen': 'pty',
74 'screenUpdateTime': time.time(),
7075 }.copy()
7176
7277 class driver(screenDriver):
7378 def __init__(self):
74 screenDriver.__init__(self)
79 screenDriver.__init__(self)
7580 self.signalPipe = os.pipe()
7681 self.p_out = None
82 self.terminal = None
83 self.p_pid = -1
7784 signal.signal(signal.SIGWINCH, self.handleSigwinch)
7885 def initialize(self, environment):
7986 self.env = environment
95102 self.env['screen']['autoIgnoreScreens'] = []
96103 self.env['general']['prevUser'] = getpass.getuser()
97104 self.env['general']['currUser'] = getpass.getuser()
98 def readAll(self, fd, timeout = 9999999, interruptFd = None, len = 2048):
99 bytes = b''
105 def readAll(self, fd, timeout = 0.3, interruptFd = None, len = 65536):
106 msgBytes = b''
100107 fdList = []
101 fdList += [fd]
108 fdList += [fd]
102109 if interruptFd:
103110 fdList += [interruptFd]
104111 starttime = time.time()
105112 while True:
106 # respect timeout but wait a little bit of time to see if something more is here
107 if (time.time() - starttime) >= timeout:
108 break
109 r = screen_utils.hasMoreWhat(fdList,0)
110 hasmore = fd in r
111 if not hasmore:
112 break
113 # exit on interrupt available
114 if interruptFd in r:
113 r = screen_utils.hasMoreWhat(fdList, 0.0001)
114 # nothing more to read
115 if not fd in r:
115116 break
116117 data = os.read(fd, len)
117118 if data == b'':
118119 raise EOFError
119 bytes += data
120 return bytes
120 msgBytes += data
121 # exit on interrupt available
122 if interruptFd in r:
123 break
124 # respect timeout but wait a little bit of time to see if something more is here
125 if (time.time() - starttime) >= timeout:
126 break
127 return msgBytes
121128 def openTerminal(self, columns, lines, command):
122129 p_pid, master_fd = pty.fork()
123130 if p_pid == 0: # Child.
124131 argv = shlex.split(command)
125132 env = os.environ.copy()
126133 #values are VT100,xterm-256color,linux
127 env["TERM"] = 'linux'
134 try:
135 if env["TERM"] == '':
136 env["TERM"] = 'linux'
137 except:
138 env["TERM"] = 'linux'
128139 os.execvpe(argv[0], argv, env)
129140 # File-like object for I/O with the child process aka command.
130141 p_out = os.fdopen(master_fd, "w+b", 0)
140151 lines, columns, _, _ = struct.unpack('HHHH', fcntl.ioctl(fd, termios.TIOCGWINSZ, s))
141152 return lines, columns
142153 def handleSigwinch(self, *args):
143 os.write(self.signalPipe[1], b'w')
154 os.write(self.signalPipe[1], b'w')
144155 def terminalEmulation(self,active , eventQueue):
145156 try:
146 old_attr = termios.tcgetattr(sys.stdin)
157 old_attr = termios.tcgetattr(sys.stdin)
147158 tty.setraw(0)
148159 lines, columns = self.getTerminalSize(0)
149160 if self.command == '':
150161 self.command = screen_utils.getShell()
151 terminal, p_pid, self.p_out = self.openTerminal(columns, lines, self.command)
162 self.terminal, self.p_pid, self.p_out = self.openTerminal(columns, lines, self.command)
152163 lines, columns = self.resizeTerminal(self.p_out)
153 terminal.resize(lines, columns)
164 self.terminal.resize(lines, columns)
154165 fdList = [sys.stdin, self.p_out, self.signalPipe[0]]
155166 while active.value:
156 r, _, _ = select.select(fdList, [], [], 1)
167 r, _, _ = select(fdList, [], [], 1)
157168 # none
158169 if r == []:
159170 continue
161172 if self.signalPipe[0] in r:
162173 os.read(self.signalPipe[0], 1)
163174 lines, columns = self.resizeTerminal(self.p_out)
164 terminal.resize(lines, columns)
175 self.terminal.resize(lines, columns)
165176 # input
166177 if sys.stdin in r:
167178 try:
168 msgBytes = self.readAll(sys.stdin.fileno())
179 msgBytes = self.readAll(sys.stdin.fileno(), len=4096)
169180 except (EOFError, OSError):
170 active.value = False
171 break
181 eventQueue.put({"Type":fenrirEventType.StopMainLoop,"Data":None})
182 break
172183 if self.shortcutType == 'KEY':
173184 try:
174185 self.injectTextToScreen(msgBytes)
175186 except:
176 active.value = False
187 eventQueue.put({"Type":fenrirEventType.StopMainLoop,"Data":None})
177188 break
178 else:
189 else:
179190 eventQueue.put({"Type":fenrirEventType.ByteInput,
180 "Data":msgBytes })
191 "Data":msgBytes })
181192 # output
182193 if self.p_out in r:
183194 try:
184 msgBytes = self.readAll(self.p_out.fileno(), timeout=0.001, interruptFd=sys.stdin)
195 msgBytes = self.readAll(self.p_out.fileno(), interruptFd=sys.stdin.fileno())
185196 except (EOFError, OSError):
186 active.value = False
187 break
188 terminal.feed(msgBytes)
189 os.write(sys.stdout.fileno(), msgBytes)
197 eventQueue.put({"Type":fenrirEventType.StopMainLoop,"Data":None})
198 break
199 # feed and send event bevore write, the pyte already has the right state
200 # so fenrir already can progress bevore os.write what should give some better reaction time
201 self.terminal.feed(msgBytes)
190202 eventQueue.put({"Type":fenrirEventType.ScreenUpdate,
191 "Data":screen_utils.createScreenEventData(terminal.GetScreenContent())
203 "Data":screen_utils.createScreenEventData(self.terminal.GetScreenContent())
192204 })
205 self.injectTextToScreen(msgBytes, screen=sys.stdout.fileno())
193206 except Exception as e: # Process died?
194207 print(e)
195 active.value = False
208 eventQueue.put({"Type":fenrirEventType.StopMainLoop,"Data":None})
196209 finally:
197 os.kill(p_pid, signal.SIGTERM)
198 self.p_out.close()
210 os.kill(self.p_pid, signal.SIGTERM)
211 self.p_out.close()
199212 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_attr)
200213 eventQueue.put({"Type":fenrirEventType.StopMainLoop,"Data":None})
201214 sys.exit(0)
2222 from fenrirscreenreader.core import debug
2323 from fenrirscreenreader.core.eventData import fenrirEventType
2424 from fenrirscreenreader.core.screenDriver import screenDriver
25 from fenrirscreenreader.utils import screen_utils
2526
2627 class driver(screenDriver):
2728 def __init__(self):
3132 self.charmap = {}
3233 self.bgColorValues = {0: 'black', 1: 'blue', 2: 'green', 3: 'cyan', 4: 'red', 5: 'magenta', 6: 'brown/yellow', 7: 'white'}
3334 self.fgColorValues = {0: 'black', 1: 'blue', 2: 'green', 3: 'cyan', 4: 'red', 5: 'magenta', 6: 'brown/yellow', 7: 'light gray', 8: 'dark gray', 9: 'light blue', 10: 'light green', 11: 'light cyan', 12: 'light red', 13: 'light magenta', 14: 'light yellow', 15: 'white'}
34 self.hichar = None
35 self.hichar = None
3536 def initialize(self, environment):
3637 self.env = environment
3738 self.env['runtime']['attributeManager'].appendDefaultAttributes([
4546 False, # blink
4647 'default', # fontsize
4748 'default' # fontfamily
48 ]) #end attribute )
49 self.env['runtime']['processManager'].addCustomEventThread(self.updateWatchdog, multiprocess=True)
49 ]) #end attribute )
50 self.env['runtime']['processManager'].addCustomEventThread(self.updateWatchdog, multiprocess=True)
5051 def getCurrScreen(self):
5152 self.env['screen']['oldTTY'] = self.env['screen']['newTTY']
52 try:
53 try:
5354 currScreenFile = open('/sys/devices/virtual/tty/tty0/active','r')
5455 self.env['screen']['newTTY'] = str(currScreenFile.read()[3:-1])
5556 currScreenFile.close()
5657 except Exception as e:
57 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
58 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
5859 def injectTextToScreen(self, text, screen = None):
5960 useScreen = "/dev/tty" + self.env['screen']['newTTY']
6061 if screen != None:
6263 with open(useScreen, 'w') as fd:
6364 for c in text:
6465 fcntl.ioctl(fd, termios.TIOCSTI, c)
65
66
6667 def getSessionInformation(self):
67 self.env['screen']['autoIgnoreScreens'] = []
68 self.env['screen']['autoIgnoreScreens'] = []
6869 try:
6970 if not self.sysBus:
70 self.sysBus = dbus.SystemBus()
71 self.sysBus = dbus.SystemBus()
7172 obj = self.sysBus.get_object('org.freedesktop.login1', '/org/freedesktop/login1')
7273 inf = dbus.Interface(obj, 'org.freedesktop.login1.Manager')
7374 self.ListSessions = inf.get_dbus_method('ListSessions')
8283 screen = str(inf.Get('org.freedesktop.login1.Session', 'TTY'))
8384 screen = screen[screen.upper().find('TTY') + 3:]
8485 if screen == '':
85 self.env['runtime']['debug'].writeDebugOut('No TTY found for session:' + session[4],debug.debugLevel.ERROR)
86 self.env['runtime']['debug'].writeDebugOut('No TTY found for session:' + session[4],debug.debugLevel.ERROR)
8687 return
8788 if sessionType.upper() != 'TTY':
8889 self.env['screen']['autoIgnoreScreens'] += [screen]
8990 if screen == self.env['screen']['newTTY'] :
9091 if self.env['general']['currUser'] != session[2]:
9192 self.env['general']['prevUser'] = self.env['general']['currUser']
92 self.env['general']['currUser'] = session[2]
93 except Exception as e:
94 self.env['runtime']['debug'].writeDebugOut('getSessionInformation: Maybe no LoginD:' + str(e),debug.debugLevel.ERROR)
93 self.env['general']['currUser'] = session[2]
94 except Exception as e:
95 self.env['runtime']['debug'].writeDebugOut('getSessionInformation: Maybe no LoginD:' + str(e),debug.debugLevel.ERROR)
9596 #self.env['runtime']['debug'].writeDebugOut('getSessionInformation:' + str(self.env['screen']['autoIgnoreScreens']) + ' ' + str(self.env['general']) ,debug.debugLevel.INFO)
9697
9798 def updateWatchdog(self,active , eventQueue):
9899 try:
100 useVCSU = os.access('/dev/vcsu', os.R_OK)
99101 vcsa = {}
100102 vcsaDevices = glob.glob('/dev/vcsa*')
101 for vcsaDev in vcsaDevices:
102 index = vcsaDev[9:]
103 vcsa[str(index)] = open(vcsaDev,'rb')
104
103 vcsu = {}
104 vcsuDevices = None
105 lastScreenContent = b''
105106 tty = open('/sys/devices/virtual/tty/tty0/active','r')
106107 currScreen = str(tty.read()[3:-1])
107108 oldScreen = currScreen
109 for vcsaDev in vcsaDevices:
110 index = str(vcsaDev[9:])
111 vcsa[index] = open(vcsaDev,'rb')
112 if index == currScreen:
113 lastScreenContent = vcsa[index].read()
114 if useVCSU:
115 vcsuDevices = glob.glob('/dev/vcsu*')
116 for vcsuDev in vcsuDevices:
117 index = str(vcsuDev[9:])
118 vcsu[index] = open(vcsuDev,'rb')
108119 self.updateCharMap(currScreen)
109120 watchdog = select.epoll()
110121 watchdog.register(vcsa[currScreen], select.POLLPRI | select.POLLERR)
111122 watchdog.register(tty, select.POLLPRI | select.POLLERR)
112 while active.value == 1:
123 while active.value:
113124 changes = watchdog.poll(1)
114125 for change in changes:
115126 fileno = change[0]
116127 event = change[1]
117128 if fileno == tty.fileno():
118 self.env['runtime']['debug'].writeDebugOut('ScreenChange',debug.debugLevel.INFO)
129 self.env['runtime']['debug'].writeDebugOut('ScreenChange',debug.debugLevel.INFO)
119130 tty.seek(0)
120 currScreen = str(tty.read()[3:-1])
131 currScreen = str(tty.read()[3:-1])
121132 if currScreen != oldScreen:
122133 try:
123 watchdog.unregister(vcsa[ oldScreen ])
134 watchdog.unregister(vcsa[oldScreen])
124135 except:
125136 pass
126137 try:
127 watchdog.register(vcsa[ currScreen ], select.POLLPRI | select.POLLERR)
138 watchdog.register(vcsa[currScreen], select.POLLPRI | select.POLLERR)
128139 except:
129140 pass
130 self.updateCharMap(currScreen)
141 self.updateCharMap(currScreen)
131142 oldScreen = currScreen
132143 try:
133 vcsa[currScreen].seek(0)
134 lastScreenContent = vcsa[currScreen].read()
144 vcsa[currScreen].seek(0)
145 lastScreenContent = vcsa[currScreen].read()
135146 except:
136 pass
147 pass
148 vcsuContent = None
149 if useVCSU:
150 vcsu[currScreen].seek(0)
151 vcsuContent = vcsu[currScreen].read()
137152 eventQueue.put({"Type":fenrirEventType.ScreenChanged,
138 "Data":self.createScreenEventData(currScreen,lastScreenContent)
153 "Data":self.createScreenEventData(currScreen, lastScreenContent, vcsuContent)
139154 })
140155 else:
141 self.env['runtime']['debug'].writeDebugOut('ScreenUpdate',debug.debugLevel.INFO)
142 vcsa[currScreen].seek(0)
156 self.env['runtime']['debug'].writeDebugOut('ScreenUpdate',debug.debugLevel.INFO)
157 vcsa[currScreen].seek(0)
158 time.sleep(0.01)
143159 dirtyContent = vcsa[currScreen].read()
144 screenContent = b''
160 screenContent = dirtyContent
161 vcsuContent = None
145162 timeout = time.time()
146 while screenContent != dirtyContent:
147 screenContent = dirtyContent
148 if time.time() - timeout >= 0.4:
149 break
150 time.sleep(0.02)
151 vcsa[currScreen].seek(0)
152 dirtyContent = vcsa[currScreen].read()
163 # error case
164 if screenContent == b'':
165 continue
166 if lastScreenContent == b'':
167 lastScreenContent = screenContent
168 if (abs( int(screenContent[2]) - int(lastScreenContent[2])) in [1,2]) and \
169 (int(screenContent[3]) == int(lastScreenContent[3])):
170 # Skip X Movement
171 pass
172 elif (abs( int(screenContent[3]) - int(lastScreenContent[3])) in [1]) and \
173 (int(screenContent[2]) == int(lastScreenContent[2])):
174 # Skip Y Movement
175 pass
176 else:
177 # anything else? wait for completion
178 while True:
179 screenContent = dirtyContent
180 time.sleep(0.02)
181 #r,_,_ = select.select([vcsa[currScreen]], [], [], 0.07)
182 #if not vcsa[currScreen] in r:
183 # break
184 vcsa[currScreen].seek(0)
185 dirtyContent = vcsa[currScreen].read()
186 if screenContent == dirtyContent:
187 break
188 if time.time() - timeout >= 0.1:
189 screenContent = dirtyContent
190 break
191 if useVCSU:
192 vcsu[currScreen].seek(0)
193 vcsuContent = vcsu[currScreen].read()
194 lastScreenContent = screenContent
153195 eventQueue.put({"Type":fenrirEventType.ScreenUpdate,
154 "Data":self.createScreenEventData(currScreen,screenContent)
196 "Data":self.createScreenEventData(currScreen, screenContent, vcsuContent)
155197 })
156198 except Exception as e:
157199 self.env['runtime']['debug'].writeDebugOut('VCSA:updateWatchdog:' + str(e),debug.debugLevel.ERROR)
158200 time.sleep(0.2)
159
160
161 def createScreenEventData(self, screen, content):
201
202 def createScreenEventData(self, screen, vcsaContent, vcsuContent = None):
162203 eventData = {
163 'bytes': content,
164 'lines': int( content[0]),
165 'columns': int( content[1]),
204 'bytes': vcsaContent,
205 'lines': int( vcsaContent[0]),
206 'columns': int( vcsaContent[1]),
166207 'textCursor':
167208 {
168 'x': int( content[2]),
169 'y': int( content[3])
209 'x': int( vcsaContent[2]),
210 'y': int( vcsaContent[3])
170211 },
171 'screen': screen,
172 'screenUpdateTime': time.time(),
212 'screen': screen,
213 'screenUpdateTime': time.time(),
214 'text': '',
215 'attributes': [],
173216 }
174 eventData['text'], eventData['attributes'] =\
175 self.autoDecodeVCSA(content[4:], eventData['lines'], eventData['columns'])
176 return eventData.copy()
217 try:
218 eventData['text'], eventData['attributes'] =\
219 self.autoDecodeVCSA(vcsaContent[4:], eventData['lines'], eventData['columns'])
220 except:
221 pass
222 # VCSU seems to give b' ' instead of b'\x00\x00\x00' (tsp), deactivated until its fixed
223 if vcsuContent != None:
224 try:
225 vcsuContentAsText = vcsuContent.decode('UTF-32')
226 eventData['text'] = screen_utils.insertNewlines(vcsuContentAsText, eventData['columns'])
227 except:
228 pass
229 return eventData.copy()
177230 def updateCharMap(self, screen):
178231 self.charmap = {}
179232 try:
180233 tty = open('/dev/tty' + screen, 'rb')
181234 except Exception as e:
182235 self.env['runtime']['debug'].writeDebugOut('VCSA:updateCharMap:' + str(e),debug.debugLevel.ERROR)
183 return
236 return
184237 GIO_UNIMAP = 0x4B66
185238 VT_GETHIFONTMASK = 0x560D
186239 himask = array("H", (0,))
211264 for y in range(rows):
212265 lineText = ''
213266 lineAttrib = []
267 blink = 0
268 bold = 0
269 ink = 7
270 paper = 0
214271 for x in range(cols):
215272 data = allData[i: i + 2]
216 i += 2
273 i += 2
217274 if data == b' \x07':
218275 #attr = 7
219276 #ink = 7
233290 lineAttrib.append(charAttrib)
234291 lineText += ' '
235292 continue
236 (sh,) = unpack("=H", data)
237 attr = (sh >> 8) & 0xFF
238 ch = sh & 0xFF
239 if self.hichar == 0x100:
240 attr >>= 1
241 ink = attr & 0x0F
242 paper = (attr>>4) & 0x0F
243 blink = 0
244 if attr & 1:
245 blink = 1
246 # blink seems to be set always, ignore for now
247 blink = 0
248 bold = 0
249 if attr & 16:
250 bold = 1
251 #if (ink != 7) or (paper != 0):
252 # print(ink,paper)
253 if sh & self.hichar:
254 ch |= 0x100
293 ch = None
255294 try:
256 lineText += self.charmap[ch]
295 (sh,) = unpack("=H", data)
296 attr = (sh >> 8) & 0xFF
297 ch = sh & 0xFF
298 try:
299 if sh & self.hichar:
300 ch |= 0x100
301 except:
302 ch = None
303 if self.hichar == 0x100:
304 attr >>= 1
305 ink = attr & 0x0F
306 paper = (attr>>4) & 0x0F
307 if attr & 1:
308 blink = 1
309 # blink seems to be set always, ignore for now
310 blink = 0
311 bold = 0
312 if attr & 16:
313 bold = 1
314 #if (ink != 7) or (paper != 0):
315 # print(ink,paper)
316 except:
317 pass
318 try:
319 lineText += self.charmap[ch]
257320 except KeyError:
258321 lineText += '?'
322
259323 charAttrib = [
260324 self.fgColorValues[ink],
261325 self.bgColorValues[paper],
280344 currScreen = self.env['screen']['newTTY']
281345 apps = subprocess.Popen('ps -t tty' + currScreen + ' -o comm,tty,stat', shell=True, stdout=subprocess.PIPE).stdout.read().decode()[:-1].split('\n')
282346 except Exception as e:
283 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
347 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
284348 return
285349 try:
286350 for i in apps:
295359 not "PS" == i[0]:
296360 if "TTY"+currScreen in i[1]:
297361 if self.env['screen']['newApplication'] != i[0]:
298 self.env['screen']['newApplication'] = i[0]
362 self.env['screen']['newApplication'] = i[0]
299363 return
300364 except Exception as e:
301365 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
302
2727
2828 def playFrequence(self, frequence = 1000, duration = 0.3, adjustVolume = 0):
2929 if not self._initialized:
30 return
30 return
3131 if interrupt:
3232 self.cancel()
3333 popenFrequenceCommand = shlex.split(self.frequenceCommand)
3535 word = word.replace('fenrirVolume', str(self.volume + adjustVolume ))
3636 word = word.replace('fenrirFreqDuration', str(duration))
3737 word = word.replace('fenrirFrequence', str(frequence))
38 popenFrequenceCommand[idx] = word
38 popenFrequenceCommand[idx] = word
3939 self.proc = subprocess.Popen(popenFrequenceCommand, stdin=None, stdout=None, stderr=None, shell=False)
4040 self.soundType = 'frequence'
4141 def playSoundFile(self, filePath, interrupt = True):
4242 if not self._initialized:
43 return
43 return
4444 if interrupt:
4545 self.cancel()
4646 popenSoundFileCommand = shlex.split(self.soundFileCommand)
4747 for idx, word in enumerate(popenSoundFileCommand):
4848 word = word.replace('fenrirVolume', str(self.volume ))
4949 word = word.replace('fenrirSoundFile', str(filePath))
50 popenSoundFileCommand[idx] = word
50 popenSoundFileCommand[idx] = word
5151 self.proc = subprocess.Popen(popenSoundFileCommand, shell=False)
5252 self.soundType = 'file'
5353 def cancel(self):
5454 if not self._initialized:
55 return
55 return
5656 if self.soundType == '':
5757 return
5858 if self.soundType == 'file':
5959 self.proc.kill()
6060 if self.soundType == 'frequence':
61 self.proc.kill()
62 self.soundType = ''
61 self.proc.kill()
62 self.soundType = ''
99
1010 _gstreamerAvailable = False
1111 try:
12 import gi
13 from gi.repository import GLib
12 import gi
13 from gi.repository import GLib
1414 gi.require_version('Gst', '1.0')
1515 from gi.repository import Gst
16 _gstreamerAvailable, args = Gst.init_check(None)
16 _gstreamerAvailable, args = Gst.init_check(None)
1717 except Exception as e:
1818 _gstreamerAvailable = False
1919 _availableError = str(e)
2727 def initialize(self, environment):
2828 self.env = environment
2929 global _gstreamerAvailable
30 self._initialized = _gstreamerAvailable
30 self._initialized = _gstreamerAvailable
3131 if not self._initialized:
3232 global _availableError
33 self.environment['runtime']['debug'].writeDebugOut('Gstreamer not available ' + _availableError,debug.debugLevel.ERROR)
33 self.environment['runtime']['debug'].writeDebugOut('Gstreamer not available ' + _availableError,debug.debugLevel.ERROR)
3434 return
3535 self._player = Gst.ElementFactory.make('playbin', 'player')
3636 bus = self._player.get_bus()
4747 self._pipeline.add(self._source)
4848 self._pipeline.add(self._sink)
4949 self._source.link(self._sink)
50 self.mainloop = GLib.MainLoop()
50 self.mainloop = GLib.MainLoop()
5151 self.thread = threading.Thread(target=self.mainloop.run)
5252 self.thread.start()
5353
6565 elif message.type == Gst.MessageType.ERROR:
6666 self._player.set_state(Gst.State.NULL)
6767 error, info = message.parse_error()
68 self.env['runtime']['debug'].writeDebugOut('GSTREAMER: _onPlayerMessage'+ str(error) + str(info),debug.debugLevel.WARNING)
68 self.env['runtime']['debug'].writeDebugOut('GSTREAMER: _onPlayerMessage'+ str(error) + str(info),debug.debugLevel.WARNING)
6969
7070 def _onPipelineMessage(self, bus, message):
7171 if not self._initialized:
7979
8080 def _onTimeout(self, element):
8181 if not self._initialized:
82 return
82 return
8383 element.set_state(Gst.State.NULL)
8484
8585 def playSoundFile(self, fileName, interrupt=True):
8686 if not self._initialized:
87 return
87 return
8888 if interrupt:
8989 self.cancel()
90 self._player.set_property('volume', self.volume)
9091 self._player.set_property('uri', 'file://%s' % fileName)
9192 self._player.set_state(Gst.State.PLAYING)
9293
9394 def playFrequence(self, frequence, duration, adjustVolume, interrupt=True):
9495 if not self._initialized:
95 return
96 return
9697 if interrupt:
9798 self.cancel()
98 self._source.set_property('volume', tone.volume)
99 self._source.set_property('freq', tone.frequency)
100 self._source.set_property('wave', tone.wave)
99 self._source.set_property('volume', self.volume)
100 self._source.set_property('freq', frequence)
101101 self._pipeline.set_state(Gst.State.PLAYING)
102 duration = int(1000 * tone.duration)
103102 GLib.timeout_add(duration, self._onTimeout, self._pipeline)
104103
105104 def cancel(self, element=None):
1818 def shutdown(self):
1919 if self._isInitialized:
2020 self.cancel()
21 self._isInitialized = False
21 self._isInitialized = False
2222 print('Speech Debug Driver: Shutdown')
2323
2424 def speak(self,text, queueable=True):
3232 def cancel(self):
3333 if not self._isInitialized:
3434 return
35 print('Speech Debug Driver: Cancel')
35 print('Speech Debug Driver: Cancel')
3636
3737 def setCallback(self, callback):
38 print('Speech Debug Driver: setCallback')
38 print('Speech Debug Driver: setCallback')
3939
4040 def clear_buffer(self):
4141 if not self._isInitialized:
4242 return
43 print('Speech Debug Driver: clear_buffer')
43 print('Speech Debug Driver: clear_buffer')
4444
4545 def setVoice(self, voice):
4646 if not self._isInitialized:
4747 return
48 print('Speech Debug Driver: setVoice:' + str(voice))
48 print('Speech Debug Driver: setVoice:' + str(voice))
4949
5050 def setPitch(self, pitch):
5151 if not self._isInitialized:
5252 return
53 print('Speech Debug Driver: setPitch:' + str(pitch))
53 print('Speech Debug Driver: setPitch:' + str(pitch))
5454
5555 def setRate(self, rate):
5656 if not self._isInitialized:
5757 return
58 print('Speech Debug Driver: setRate:' + str(rate))
58 print('Speech Debug Driver: setRate:' + str(rate))
5959
6060 def setModule(self, module):
6161 if not self._isInitialized:
62 return
63 print('Speech Debug Driver: setModule:' + str(module))
62 return
63 print('Speech Debug Driver: setModule:' + str(module))
6464
6565 def setLanguage(self, language):
6666 if not self._isInitialized:
6767 return
68 print('Speech Debug Driver: setLanguage:' + str(language))
68 print('Speech Debug Driver: setLanguage:' + str(language))
6969
7070 def setVolume(self, volume):
7171 if not self._isInitialized:
72 return
72 return
7373 print('Speech Debug Driver: setVolume:' + str(volume))
1414 def __init__(self):
1515 speechDriver.__init__(self)
1616 def initialize(self, environment):
17 self.env = environment
17 self.env = environment
1818 try:
1919 self.server = pexpect.spawn('tclsh ' + self.env['runtime']['settingsManager'].getSetting('speech', 'serverPath'))
20 self._isInitialized = True
20 self._isInitialized = True
2121 except Exception as e:
22 self.env['runtime']['debug'].writeDebugOut('speechDriver:initialize:' + str(e),debug.debugLevel.ERROR)
22 self.env['runtime']['debug'].writeDebugOut('speechDriver:initialize:' + str(e),debug.debugLevel.ERROR)
2323
2424 def shutdown(self):
2525 if self.server:
2626 try:
2727 self.server.terminate()
2828 except Exception as e:
29 self.env['runtime']['debug'].writeDebugOut('speechDriver:shutdown:self.server.terminate():' + str(e),debug.debugLevel.ERROR)
29 self.env['runtime']['debug'].writeDebugOut('speechDriver:shutdown:self.server.terminate():' + str(e),debug.debugLevel.ERROR)
3030
3131 def speak(self,text, queueable=True):
3232 if not self._isInitialized:
4444 cleanText = 'tts_say \"' + cleanText +'\"'
4545 self.server.sendline(cleanText)
4646 except Exception as e:
47 self.env['runtime']['debug'].writeDebugOut('speechDriver:speak:self.server.sendline():' + str(e),debug.debugLevel.ERROR)
47 self.env['runtime']['debug'].writeDebugOut('speechDriver:speak:self.server.sendline():' + str(e),debug.debugLevel.ERROR)
4848
4949 def cancel(self):
5050 if not self._isInitialized:
5353 self.server.sendline('stop')
5454 except Exception as e:
5555 print(e)
56 self.env['runtime']['debug'].writeDebugOut('speechDriver:cancel:self.server.sendline():' + str(e),debug.debugLevel.ERROR)
56 self.env['runtime']['debug'].writeDebugOut('speechDriver:cancel:self.server.sendline():' + str(e),debug.debugLevel.ERROR)
5757
5858 def setRate(self, rate):
5959 if not self._isInitialized:
6161 try:
6262 self.server.sendline('tts_set_speech_rate ' + str(int(rate * 400)))
6363 except Exception as e:
64 self.env['runtime']['debug'].writeDebugOut('speechDriver:setRate:self.server.sendline():' + str(e),debug.debugLevel.ERROR)
64 self.env['runtime']['debug'].writeDebugOut('speechDriver:setRate:self.server.sendline():' + str(e),debug.debugLevel.ERROR)
6565
6666 def setLanguage(self, language):
6767 if not self._isInitialized:
1313 self._es = None
1414
1515 def initialize(self, environment):
16 self.env = environment
16 self.env = environment
1717 try:
1818 from espeak import espeak
1919 self._es = espeak
2020 self._isInitialized = True
2121 except Exception as e:
22 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
22 self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
2323 self._initialized = False
2424
2525 def speak(self,text, interrupt=True):
2929 self.cancel()
3030 if self.language != None:
3131 if self.language != '':
32 self._es.set_voice(self.language)
32 self._es.set_voice(self.language)
3333 elif self.voice != None:
34 if self.voice != '':
35 self._es.set_voice(self.voice)
34 if self.voice != '':
35 self._es.set_voice(self.voice)
3636 self._es.synth(text)
3737
3838 def cancel(self):
2626 self.speechThread = Thread(target=self.worker)
2727 self.lock = Lock()
2828 self.textQueue = speakQueue()
29 def initialize(self, environment):
29 def initialize(self, environment):
3030 self.env = environment
3131 self.minVolume = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMinVolume')
32 self.maxVolume = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMaxVolume')
33 self.minPitch = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMinPitch')
32 self.maxVolume = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMaxVolume')
33 self.minPitch = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMinPitch')
3434 self.maxPitch = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMaxPitch')
3535 self.minRate = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMinRate')
3636 self.maxRate = self.env['runtime']['settingsManager'].getSettingAsInt('speech', 'fenrirMaxRate')
3939 if self.speechCommand == '':
4040 self.speechCommand = 'espeak -a fenrirVolume -s fenrirRate -p fenrirPitch -v fenrirVoice -- "fenrirText"'
4141 if False: #for debugging overwrite here
42 #self.speechCommand = 'spd-say --wait -r 100 -i 100 "fenrirText"'
43 self.speechCommand = 'flite -t "fenrirText"'
42 #self.speechCommand = 'spd-say --wait -r 100 -i 100 "fenrirText"'
43 self.speechCommand = 'flite -t "fenrirText"'
4444
45 self._isInitialized = True
45 self._isInitialized = True
4646 if self._isInitialized:
47 self.speechThread.start()
47 self.speechThread.start()
4848 def shutdown(self):
4949 if not self._isInitialized:
5050 return
51 self.cancel()
51 self.cancel()
5252 self.textQueue.put(-1)
5353
5454 def speak(self,text, queueable=True):
5555 if not self._isInitialized:
5656 return
57 if not queueable:
58 self.cancel()
57 if not queueable:
58 self.cancel()
5959 utterance = {
6060 'text': text,
6161 'volume': self.volume,
6464 'module': self.module,
6565 'language': self.language,
6666 'voice': self.voice,
67 }
67 }
6868 self.textQueue.put(utterance.copy())
6969
7070 def cancel(self):
7676 try:
7777 self.proc.terminate()
7878 except Exception as e:
79 self.env['runtime']['debug'].writeDebugOut('speechDriver:Cancel:self.proc.terminate():' + str(e),debug.debugLevel.WARNING)
79 self.env['runtime']['debug'].writeDebugOut('speechDriver:Cancel:self.proc.terminate():' + str(e),debug.debugLevel.WARNING)
8080 try:
8181 self.proc.kill()
8282 except Exception as e:
83 self.env['runtime']['debug'].writeDebugOut('speechDriver:Cancel:self.proc.kill():' + str(e),debug.debugLevel.WARNING)
84 self.proc = None
83 self.env['runtime']['debug'].writeDebugOut('speechDriver:Cancel:self.proc.kill():' + str(e),debug.debugLevel.WARNING)
84 self.proc = None
8585 self.lock.release()
8686 def setCallback(self, callback):
87 print('SpeechDummyDriver: setCallback')
87 print('SpeechDummyDriver: setCallback')
8888
8989 def clear_buffer(self):
9090 if not self._isInitialized:
9191 return
92 self.textQueue.clear()
92 self.textQueue.clear()
9393
9494 def setVoice(self, voice):
9595 if not self._isInitialized:
136136 if not 'text' in utterance:
137137 continue
138138 if not isinstance(utterance['text'],str):
139 continue
139 continue
140140 if utterance['text'] == '':
141141 continue
142142 # check for valid data fields
177177 popenSpeechCommand[idx] = word
178178
179179 try:
180 self.env['runtime']['debug'].writeDebugOut('speechDriver:worker:' + ' '.join(popenSpeechCommand),debug.debugLevel.INFO)
180 self.env['runtime']['debug'].writeDebugOut('speechDriver:worker:' + ' '.join(popenSpeechCommand),debug.debugLevel.INFO)
181181 self.lock.acquire(True)
182182 self.proc = Popen(popenSpeechCommand, stdin=None, stdout=None, stderr=None, shell=False)
183183 self.lock.release()
184184 self.proc.wait()
185185 except Exception as e:
186 self.env['runtime']['debug'].writeDebugOut('speechDriver:worker:' + str(e),debug.debugLevel.ERROR)
186 self.env['runtime']['debug'].writeDebugOut('speechDriver:worker:' + str(e),debug.debugLevel.ERROR)
187187
188188 self.lock.acquire(True)
189189 self.proc = None
1313 speechDriver.__init__(self)
1414 self._engine = None
1515 def initialize(self, environment):
16 self.env = environment
16 self.env = environment
1717 def shutdown(self):
1818 if self._isInitialized:
19 self.cancel()
19 self.cancel()
2020 self._engine.endLoop()
21 self._initialized = False
21 self._initialized = False
2222 def eventLoop(self):
2323 self._engine.startLoop()
2424 def startEngine(self):
2727 if self.module != '':
2828 self._engine = pyttsx3.init(self.module)
2929 else:
30 self._engine = pyttsx3.init()
30 self._engine = pyttsx3.init()
3131 self.eventLoopThread = Thread(target=self.eventLoop)
3232 self._isInitialized = True
3333 self.eventLoopThread.start()
3434 except Exception as e:
35 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:initialize:' + str(e),debug.debugLevel.ERROR)
35 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:initialize:' + str(e),debug.debugLevel.ERROR)
3636
3737 def speak(self,text, interrupt=True):
3838 if not self._isInitialized:
3939 self.startEngine()
40 if not self._isInitialized:
40 if not self._isInitialized:
4141 return
4242 if not interrupt:
4343 self.cancel()
5050 except Exception as e:
5151 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:speak:rate:' + str(e),debug.debugLevel.ERROR)
5252 try:
53 self._engine.setProperty('pitch', self.pitch)
53 self._engine.setProperty('pitch', self.pitch)
5454 except Exception as e:
55 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:speak:pitch:' + str(e),debug.debugLevel.ERROR)
55 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:speak:pitch:' + str(e),debug.debugLevel.ERROR)
5656 if self.language != None:
5757 if self.language != '':
5858 try:
59 self._engine.setProperty('voice', self.language)
59 self._engine.setProperty('voice', self.language)
6060 except Exception as e:
61 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:speak:language:' + str(e),debug.debugLevel.ERROR)
61 self.env['runtime']['debug'].writeDebugOut('SpeechDriver:speak:language:' + str(e),debug.debugLevel.ERROR)
6262
6363 elif self.voice != None:
6464 if self.voice != '':
1010 class driver(speechDriver):
1111 def __init__(self):
1212 speechDriver.__init__(self)
13 self._sd = None
1413
1514 def initialize(self, environment):
15 self._sd = None
1616 self.env = environment
17 self._isInitialized = False
18 self.language = ''
19 self.voice = ''
20 self.module = ''
1721 try:
1822 import speechd
1923 self._sd = speechd.SSIPClient('fenrir')
2024 self._punct = speechd.PunctuationMode()
2125 self._isInitialized = True
2226 except Exception as e:
23 self.env['runtime']['debug'].writeDebugOut('speechDriver initialize:' + str(e),debug.debugLevel.ERROR)
24
27 self.env['runtime']['debug'].writeDebugOut('speechDriver initialize:' + str(e),debug.debugLevel.ERROR)
28
2529 def shutdown(self):
2630 if not self._isInitialized:
2731 return
2832 self.cancel()
2933 try:
3034 self._sd.close()
31 except:
35 except Exception as e:
3236 pass
33 self._isInitialized = False
34
37 self._isInitialized = False
38
3539 def speak(self,text, queueable=True):
3640 if not queueable:
37 self.cancel()
41 self.cancel()
42 if not self._isInitialized:
43 self.initialize(self.env)
44 if not queueable:
45 self.cancel()
46 if not self._isInitialized:
47 return
48
49 try:
50 if self.module != '':
51 self._sd.set_output_module(self.module)
52 except Exception as e:
53 self.env['runtime']['debug'].writeDebugOut('speechDriver setModule:' + str(e),debug.debugLevel.ERROR)
54
55 try:
56 if self.language != '':
57 self._sd.set_language(self.language)
58 except Exception as e:
59 self.env['runtime']['debug'].writeDebugOut('speechDriver set_language:' + str(e),debug.debugLevel.ERROR)
60
61 try:
62 if self.voice != '':
63 self._sd.set_synthesis_voice(self.voice)
64 except Exception as e:
65 self.env['runtime']['debug'].writeDebugOut('speechDriver setVoice:' + str(e),debug.debugLevel.ERROR)
66
67 try:
68 self._sd.set_punctuation(self._punct.NONE)
69 except Exception as e:
70 self.env['runtime']['debug'].writeDebugOut('speechDriver set_punctuation:' + str(e),debug.debugLevel.ERROR)
71
72 try:
73 self._sd.speak(text)
74 except Exception as e:
75 self.env['runtime']['debug'].writeDebugOut('speechDriver speak:' + str(e),debug.debugLevel.ERROR)
76 self._isInitialized = False
77
78 def cancel(self):
3879 if not self._isInitialized:
3980 self.initialize(self.env)
4081 if not self._isInitialized:
4182 return
4283 try:
43 self._sd.set_output_module(self.module)
84 self._sd.cancel()
4485 except Exception as e:
45 self.env['runtime']['debug'].writeDebugOut('speechDriver setModule:' + str(e),debug.debugLevel.ERROR)
46
47 try:
48 if self.voice:
49 if self.voice != '':
50 self._sd.set_voice(self.voice)
51 except Exception as e:
52 self.env['runtime']['debug'].writeDebugOut('speechDriver setVoice:' + str(e),debug.debugLevel.ERROR)
53 try:
54 if self.language != '':
55 self._sd.set_synthesis_voice(self.language)
56 self._sd.set_punctuation(self._punct.NONE)
57 self._sd.speak(text)
58 except Exception as e:
59 self.env['runtime']['debug'].writeDebugOut('speechDriver speak:' + str(e),debug.debugLevel.ERROR)
86 self.env['runtime']['debug'].writeDebugOut('speechDriver cancel:' + str(e),debug.debugLevel.ERROR)
6087 self._isInitialized = False
6188
62 def cancel(self):
63 if not self._isInitialized:
64 return
65 try:
66 self._sd.cancel()
67 except Exception as e:
68 self.env['runtime']['debug'].writeDebugOut('speechDriver cancel:' + str(e),debug.debugLevel.ERROR)
69 self._isInitialized = False
70
7189 def setPitch(self, pitch):
7290 if not self._isInitialized:
7391 return
7492 try:
7593 self._sd.set_pitch(int(-100 + pitch * 200))
7694 except Exception as e:
77 self.env['runtime']['debug'].writeDebugOut('speechDriver setPitch:' + str(e),debug.debugLevel.ERROR)
95 self.env['runtime']['debug'].writeDebugOut('speechDriver setPitch:' + str(e),debug.debugLevel.ERROR)
7896
7997 def setRate(self, rate):
8098 if not self._isInitialized:
82100 try:
83101 self._sd.set_rate(int(-100 + rate * 200))
84102 except Exception as e:
85 self.env['runtime']['debug'].writeDebugOut('speechDriver setRate:' + str(e),debug.debugLevel.ERROR)
86
103 self.env['runtime']['debug'].writeDebugOut('speechDriver setRate:' + str(e),debug.debugLevel.ERROR)
104
87105 def setVolume(self, volume):
88106 if not self._isInitialized:
89107 return
90 try:
108 try:
91109 self._sd.set_volume(int(-100 + volume * 200))
92110 except Exception as e:
93 self.env['runtime']['debug'].writeDebugOut('speechDriver setVolume:' + str(e),debug.debugLevel.ERROR)
111 self.env['runtime']['debug'].writeDebugOut('speechDriver setVolume:' + str(e),debug.debugLevel.ERROR)
1010 endOfScreen = False
1111 if currText == '':
1212 return -1, -1, '', endOfScreen
13 wrappedLines = currText.split('\n')
13 wrappedLines = currText.split('\n')
1414 x = currX
1515 y = currY
1616 if y - 1 >= 0:
1717 y -= 1
1818 else:
19 endOfScreen = True
19 endOfScreen = True
2020 x = 0
2121 currLine = ''
2222 if not endOfScreen:
23 currLine = wrappedLines[y]
23 currLine = wrappedLines[y]
2424 return x, y, currLine, endOfScreen
2525
2626 def getCurrentLine(currX,currY, currText):
2727 if currText == '':
2828 return -1, -1, ''
29 wrappedLines = currText.split('\n')
29 wrappedLines = currText.split('\n')
3030 x = currX
3131 y = currY
3232 x = 0
3737 endOfScreen = False
3838 if currText == '':
3939 return -1, -1, '', endOfScreen
40 wrappedLines = currText.split('\n')
40 wrappedLines = currText.split('\n')
4141 x = currX
4242 y = currY
4343 if y + 1 < len(wrappedLines):
44 # By Chrys, Storm Dragon, and contributers.
55
66 from fenrirscreenreader.core import debug
7 import getpass, time, string, select, os
7 import getpass, time, string, os
8 from select import select
89
910 def removeNonprintable(text):
1011 # Get the difference of all ASCII characters from the set of printable characters
3031 'screen': content['screen'],
3132 'text': content['text'],
3233 'attributes': content['attributes'],
33 'screenUpdateTime': time.time(),
34 'screenUpdateTime': time.time(),
3435 }
3536 return eventData.copy()
3637
37 def hasMore(fd, timetout=0.1):
38 r, _, _ = select.select([fd], [], [], timetout)
39 return (fd in r)
40 def hasMoreWhat(fdList, timetout=0.1):
38 def hasMore(fd, timetout=0.05):
39 r, _, _ = select([fd], [], [], timetout)
40 return (fd in r)
41
42 def hasMoreWhat(fdList, timetout=0.05):
4143 if not isinstance(fdList, list):
4244 return []
4345 elif fdList == []:
4446 return []
45 r, _, _ = select.select(fdList, [], [], timetout)
47 r, _, _ = select(fdList, [], [], timetout)
4648 return r
49
4750 def isValidShell(shell = ''):
4851 if not isinstance(shell, str):
4952 return False
5760 except:
5861 return False
5962 return True
63
6064 def getShell():
6165 try:
6266 shell = os.environ["FENRIRSHELL"]
63 if isValidShell(shell):
67 if isValidShell(shell):
6468 return shell
6569 except:
6670 pass
7882 (username, encrypwd, uid, gid, gecos, homedir, shell) = user.split(':')
7983 shell = shell.replace('\n','')
8084 if username == getpass.getuser():
81 if isValidShell(shell):
85 if isValidShell(shell):
8286 return shell
8387 except:
8488 pass
44 msgid ""
55 msgstr ""
66 "Project-Id-Version: PACKAGE VERSION\n"
7 "POT-Creation-Date: 2017-02-26 22:19+UTC\n"
7 "POT-Creation-Date: 2020-04-19 08:56+0700\n"
88 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
99 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1010 "Language-Team: LANGUAGE <LL@li.org>\n"
1111 "MIME-Version: 1.0\n"
12 "Content-Type: text/plain; charset=UTF-8\n"
12 "Content-Type: text/plain; charset=cp1251\n"
1313 "Content-Transfer-Encoding: 8bit\n"
1414 "Generated-By: pygettext.py 1.5\n"
1515
1616
17 #: ../src/fenrir/commands/commands/add_word_to_spell_check.py:27
17 #: ../src/fenrirscreenreader\commands\commands\add_word_to_spell_check.py:27
1818 msgid "adds the current word to the exceptions dictionary"
1919 msgstr ""
2020
21 #: ../src/fenrir/commands/commands/add_word_to_spell_check.py:34
22 #: ../src/fenrir/commands/commands/remove_word_from_spell_check.py:34
23 #: ../src/fenrir/commands/commands/spell_check.py:29
24 #: ../src/fenrir/commands/commands/spell_check.py:36
21 #: ../src/fenrirscreenreader\commands\commands\add_word_to_spell_check.py:34
22 #: ../src/fenrirscreenreader\commands\commands\remove_word_from_spell_check.py:34
23 #: ../src/fenrirscreenreader\commands\commands\spell_check.py:35
2524 msgid "pyenchant is not installed"
2625 msgstr ""
2726
28 #: ../src/fenrir/commands/commands/add_word_to_spell_check.py:49
29 msgid "{0} is already in dict"
30 msgstr ""
31
32 #: ../src/fenrir/commands/commands/add_word_to_spell_check.py:52
33 msgid "{0} added"
34 msgstr ""
35
36 #: ../src/fenrir/commands/commands/bookmark_1.py:19
37 #: ../src/fenrir/commands/commands/bookmark_10.py:19
38 #: ../src/fenrir/commands/commands/bookmark_2.py:19
39 #: ../src/fenrir/commands/commands/bookmark_3.py:19
40 #: ../src/fenrir/commands/commands/bookmark_4.py:19
41 #: ../src/fenrir/commands/commands/bookmark_5.py:19
42 #: ../src/fenrir/commands/commands/bookmark_6.py:19
43 #: ../src/fenrir/commands/commands/bookmark_7.py:19
44 #: ../src/fenrir/commands/commands/bookmark_8.py:19
45 #: ../src/fenrir/commands/commands/bookmark_9.py:19
27 #: ../src/fenrirscreenreader\commands\commands\add_word_to_spell_check.py:49
28 msgid "{0} is already in dictionary"
29 msgstr ""
30
31 #: ../src/fenrirscreenreader\commands\commands\add_word_to_spell_check.py:52
32 msgid "{0} added to dictionary"
33 msgstr ""
34
35 #: ../src/fenrirscreenreader\commands\commands\attribute_cursor.py:18
36 #: ../src/fenrirscreenreader\commands\onCursorChange\85000-has_attribute.py:18
37 msgid "Reads attributes of current cursor position"
38 msgstr ""
39
40 #: ../src/fenrirscreenreader\commands\commands\bookmark_1.py:19
41 #: ../src/fenrirscreenreader\commands\commands\bookmark_10.py:19
42 #: ../src/fenrirscreenreader\commands\commands\bookmark_2.py:19
43 #: ../src/fenrirscreenreader\commands\commands\bookmark_3.py:19
44 #: ../src/fenrirscreenreader\commands\commands\bookmark_4.py:19
45 #: ../src/fenrirscreenreader\commands\commands\bookmark_5.py:19
46 #: ../src/fenrirscreenreader\commands\commands\bookmark_6.py:19
47 #: ../src/fenrirscreenreader\commands\commands\bookmark_7.py:19
48 #: ../src/fenrirscreenreader\commands\commands\bookmark_8.py:19
49 #: ../src/fenrirscreenreader\commands\commands\bookmark_9.py:19
4650 msgid "read Bookmark {0}"
4751 msgstr ""
4852
49 #: ../src/fenrir/commands/commands/bookmark_1.py:24
50 #: ../src/fenrir/commands/commands/bookmark_10.py:24
51 #: ../src/fenrir/commands/commands/bookmark_2.py:24
52 #: ../src/fenrir/commands/commands/bookmark_3.py:24
53 #: ../src/fenrir/commands/commands/bookmark_4.py:24
54 #: ../src/fenrir/commands/commands/bookmark_5.py:24
55 #: ../src/fenrir/commands/commands/bookmark_6.py:24
56 #: ../src/fenrir/commands/commands/bookmark_7.py:24
57 #: ../src/fenrir/commands/commands/bookmark_8.py:24
58 #: ../src/fenrir/commands/commands/bookmark_9.py:24
53 #: ../src/fenrirscreenreader\commands\commands\bookmark_1.py:24
54 #: ../src/fenrirscreenreader\commands\commands\bookmark_10.py:24
55 #: ../src/fenrirscreenreader\commands\commands\bookmark_2.py:24
56 #: ../src/fenrirscreenreader\commands\commands\bookmark_3.py:24
57 #: ../src/fenrirscreenreader\commands\commands\bookmark_4.py:24
58 #: ../src/fenrirscreenreader\commands\commands\bookmark_5.py:24
59 #: ../src/fenrirscreenreader\commands\commands\bookmark_6.py:24
60 #: ../src/fenrirscreenreader\commands\commands\bookmark_7.py:24
61 #: ../src/fenrirscreenreader\commands\commands\bookmark_8.py:24
62 #: ../src/fenrirscreenreader\commands\commands\bookmark_9.py:24
5963 msgid "Bookmark {0} not set"
6064 msgstr ""
6165
62 #: ../src/fenrir/commands/commands/bookmark_1.py:27
63 #: ../src/fenrir/commands/commands/bookmark_1.py:30
64 #: ../src/fenrir/commands/commands/bookmark_10.py:27
65 #: ../src/fenrir/commands/commands/bookmark_10.py:30
66 #: ../src/fenrir/commands/commands/bookmark_2.py:27
67 #: ../src/fenrir/commands/commands/bookmark_2.py:30
68 #: ../src/fenrir/commands/commands/bookmark_3.py:27
69 #: ../src/fenrir/commands/commands/bookmark_3.py:30
70 #: ../src/fenrir/commands/commands/bookmark_4.py:27
71 #: ../src/fenrir/commands/commands/bookmark_4.py:30
72 #: ../src/fenrir/commands/commands/bookmark_5.py:27
73 #: ../src/fenrir/commands/commands/bookmark_5.py:30
74 #: ../src/fenrir/commands/commands/bookmark_6.py:27
75 #: ../src/fenrir/commands/commands/bookmark_6.py:30
76 #: ../src/fenrir/commands/commands/bookmark_7.py:27
77 #: ../src/fenrir/commands/commands/bookmark_7.py:30
78 #: ../src/fenrir/commands/commands/bookmark_8.py:27
79 #: ../src/fenrir/commands/commands/bookmark_8.py:30
80 #: ../src/fenrir/commands/commands/bookmark_9.py:27
81 #: ../src/fenrir/commands/commands/bookmark_9.py:30
66 #: ../src/fenrirscreenreader\commands\commands\bookmark_1.py:27
67 #: ../src/fenrirscreenreader\commands\commands\bookmark_1.py:30
68 #: ../src/fenrirscreenreader\commands\commands\bookmark_10.py:27
69 #: ../src/fenrirscreenreader\commands\commands\bookmark_10.py:30
70 #: ../src/fenrirscreenreader\commands\commands\bookmark_2.py:27
71 #: ../src/fenrirscreenreader\commands\commands\bookmark_2.py:30
72 #: ../src/fenrirscreenreader\commands\commands\bookmark_3.py:27
73 #: ../src/fenrirscreenreader\commands\commands\bookmark_3.py:30
74 #: ../src/fenrirscreenreader\commands\commands\bookmark_4.py:27
75 #: ../src/fenrirscreenreader\commands\commands\bookmark_4.py:30
76 #: ../src/fenrirscreenreader\commands\commands\bookmark_5.py:27
77 #: ../src/fenrirscreenreader\commands\commands\bookmark_5.py:30
78 #: ../src/fenrirscreenreader\commands\commands\bookmark_6.py:27
79 #: ../src/fenrirscreenreader\commands\commands\bookmark_6.py:30
80 #: ../src/fenrirscreenreader\commands\commands\bookmark_7.py:27
81 #: ../src/fenrirscreenreader\commands\commands\bookmark_7.py:30
82 #: ../src/fenrirscreenreader\commands\commands\bookmark_8.py:27
83 #: ../src/fenrirscreenreader\commands\commands\bookmark_8.py:30
84 #: ../src/fenrirscreenreader\commands\commands\bookmark_9.py:27
85 #: ../src/fenrirscreenreader\commands\commands\bookmark_9.py:30
8286 msgid "Bookmark for application {0} not set"
8387 msgstr ""
8488
85 #: ../src/fenrir/commands/commands/bookmark_1.py:43
86 #: ../src/fenrir/commands/commands/bookmark_10.py:43
87 #: ../src/fenrir/commands/commands/bookmark_2.py:43
88 #: ../src/fenrir/commands/commands/bookmark_3.py:43
89 #: ../src/fenrir/commands/commands/bookmark_4.py:43
90 #: ../src/fenrir/commands/commands/bookmark_5.py:43
91 #: ../src/fenrir/commands/commands/bookmark_6.py:43
92 #: ../src/fenrir/commands/commands/bookmark_7.py:43
93 #: ../src/fenrir/commands/commands/bookmark_8.py:43
94 #: ../src/fenrir/commands/commands/bookmark_9.py:43
95 #: ../src/fenrir/commands/commands/curr_screen_after_cursor.py:27
96 #: ../src/fenrir/commands/commands/curr_screen_before_cursor.py:30
97 #: ../src/fenrir/commands/commands/cursor_read_to_end_of_line.py:27
98 #: ../src/fenrir/commands/commands/indent_curr_line.py:31
99 #: ../src/fenrir/commands/commands/marked_text.py:33
100 #: ../src/fenrir/commands/commands/present_first_line.py:25
101 #: ../src/fenrir/commands/commands/present_last_line.py:25
102 #: ../src/fenrir/commands/commands/review_curr_char_phonetic.py:27
103 #: ../src/fenrir/commands/commands/review_curr_line.py:27
104 #: ../src/fenrir/commands/commands/review_curr_word.py:27
105 #: ../src/fenrir/commands/commands/review_curr_word_phonetic.py:27
106 #: ../src/fenrir/commands/commands/review_line_begin.py:27
107 #: ../src/fenrir/commands/commands/review_next_line.py:29
108 #: ../src/fenrir/commands/commands/review_next_word.py:29
109 #: ../src/fenrir/commands/commands/review_next_word_phonetic.py:27
110 #: ../src/fenrir/commands/commands/review_prev_line.py:27
111 #: ../src/fenrir/commands/commands/review_prev_word.py:27
112 #: ../src/fenrir/commands/commands/review_prev_word_phonetic.py:27
113 #: ../src/fenrir/commands/onInput/55000-present_line_if_cursor_change_vertical.py:38
114 #: ../src/fenrir/commands/onInput/72000-history.py:50
89 #: ../src/fenrirscreenreader\commands\commands\bookmark_1.py:43
90 #: ../src/fenrirscreenreader\commands\commands\bookmark_10.py:43
91 #: ../src/fenrirscreenreader\commands\commands\bookmark_2.py:43
92 #: ../src/fenrirscreenreader\commands\commands\bookmark_3.py:43
93 #: ../src/fenrirscreenreader\commands\commands\bookmark_4.py:43
94 #: ../src/fenrirscreenreader\commands\commands\bookmark_5.py:43
95 #: ../src/fenrirscreenreader\commands\commands\bookmark_6.py:43
96 #: ../src/fenrirscreenreader\commands\commands\bookmark_7.py:43
97 #: ../src/fenrirscreenreader\commands\commands\bookmark_8.py:43
98 #: ../src/fenrirscreenreader\commands\commands\bookmark_9.py:43
99 #: ../src/fenrirscreenreader\commands\commands\curr_screen_after_cursor.py:27
100 #: ../src/fenrirscreenreader\commands\commands\curr_screen_before_cursor.py:30
101 #: ../src/fenrirscreenreader\commands\commands\cursor_read_to_end_of_line.py:27
102 #: ../src/fenrirscreenreader\commands\commands\indent_curr_line.py:31
103 #: ../src/fenrirscreenreader\commands\commands\marked_text.py:33
104 #: ../src/fenrirscreenreader\commands\commands\present_first_line.py:25
105 #: ../src/fenrirscreenreader\commands\commands\present_last_line.py:25
106 #: ../src/fenrirscreenreader\commands\commands\review_curr_char_phonetic.py:27
107 #: ../src/fenrirscreenreader\commands\commands\review_curr_line.py:27
108 #: ../src/fenrirscreenreader\commands\commands\review_curr_word.py:27
109 #: ../src/fenrirscreenreader\commands\commands\review_curr_word_phonetic.py:27
110 #: ../src/fenrirscreenreader\commands\commands\review_line_begin.py:27
111 #: ../src/fenrirscreenreader\commands\commands\review_next_line.py:29
112 #: ../src/fenrirscreenreader\commands\commands\review_next_word.py:29
113 #: ../src/fenrirscreenreader\commands\commands\review_next_word_phonetic.py:27
114 #: ../src/fenrirscreenreader\commands\commands\review_prev_line.py:27
115 #: ../src/fenrirscreenreader\commands\commands\review_prev_word.py:27
116 #: ../src/fenrirscreenreader\commands\commands\review_prev_word_phonetic.py:27
117 #: ../src/fenrirscreenreader\commands\onCursorChange\65000-present_line_if_cursor_change_vertical.py:37
118 #: ../src/fenrirscreenreader\commands\onScreenUpdate\60000-history.py:59
115119 msgid "blank"
116120 msgstr ""
117121
118 #: ../src/fenrir/commands/commands/braille_flush.py:17
119 msgid "flush the braille device if a message is written on"
120 msgstr ""
121
122 #: ../src/fenrir/commands/commands/braille_pan_left.py:17
122 #: ../src/fenrirscreenreader\commands\commands\braille_flush.py:17
123 msgid "Clear the Braille device if it is displaying a message"
124 msgstr ""
125
126 #: ../src/fenrirscreenreader\commands\commands\braille_pan_left.py:17
123127 msgid "Move braille view to the left."
124128 msgstr ""
125129
126 #: ../src/fenrir/commands/commands/braille_pan_right.py:17
130 #: ../src/fenrirscreenreader\commands\commands\braille_pan_right.py:17
127131 msgid "Move braille view to the right."
128132 msgstr ""
129133
130 #: ../src/fenrir/commands/commands/braille_return_to_cursor.py:17
134 #: ../src/fenrirscreenreader\commands\commands\braille_return_to_cursor.py:17
131135 msgid "Set the braille view back to cursor."
132136 msgstr ""
133137
134 #: ../src/fenrir/commands/commands/clear_bookmark_1.py:17
135 #: ../src/fenrir/commands/commands/clear_bookmark_10.py:17
136 #: ../src/fenrir/commands/commands/clear_bookmark_2.py:17
137 #: ../src/fenrir/commands/commands/clear_bookmark_3.py:17
138 #: ../src/fenrir/commands/commands/clear_bookmark_4.py:17
139 #: ../src/fenrir/commands/commands/clear_bookmark_5.py:17
140 #: ../src/fenrir/commands/commands/clear_bookmark_6.py:17
141 #: ../src/fenrir/commands/commands/clear_bookmark_7.py:17
142 #: ../src/fenrir/commands/commands/clear_bookmark_8.py:17
143 #: ../src/fenrir/commands/commands/clear_bookmark_9.py:17
138 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_1.py:17
139 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_10.py:17
140 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_2.py:17
141 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_3.py:17
142 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_4.py:17
143 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_5.py:17
144 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_6.py:17
145 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_7.py:17
146 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_8.py:17
147 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_9.py:17
144148 msgid "remove Bookmark {0}"
145149 msgstr ""
146150
147 #: ../src/fenrir/commands/commands/clear_bookmark_1.py:24
148 #: ../src/fenrir/commands/commands/clear_bookmark_10.py:24
149 #: ../src/fenrir/commands/commands/clear_bookmark_2.py:24
150 #: ../src/fenrir/commands/commands/clear_bookmark_3.py:24
151 #: ../src/fenrir/commands/commands/clear_bookmark_4.py:24
152 #: ../src/fenrir/commands/commands/clear_bookmark_5.py:24
153 #: ../src/fenrir/commands/commands/clear_bookmark_6.py:24
154 #: ../src/fenrir/commands/commands/clear_bookmark_7.py:24
155 #: ../src/fenrir/commands/commands/clear_bookmark_8.py:24
156 #: ../src/fenrir/commands/commands/clear_bookmark_9.py:24
151 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_1.py:24
152 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_10.py:24
153 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_2.py:24
154 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_3.py:24
155 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_4.py:24
156 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_5.py:24
157 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_6.py:24
158 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_7.py:24
159 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_8.py:24
160 #: ../src/fenrirscreenreader\commands\commands\clear_bookmark_9.py:24
157161 msgid "Bookmark {0} removed for application {1}"
158162 msgstr ""
159163
160 #: ../src/fenrir/commands/commands/clear_clipboard.py:17
164 #: ../src/fenrirscreenreader\commands\commands\clear_clipboard.py:17
161165 msgid "clears the currently selected clipboard"
162166 msgstr ""
163167
164 #: ../src/fenrir/commands/commands/clear_clipboard.py:22
168 #: ../src/fenrirscreenreader\commands\commands\clear_clipboard.py:21
165169 msgid "clipboard cleared"
166170 msgstr ""
167171
168 #: ../src/fenrir/commands/commands/clear_window_application.py:17
172 #: ../src/fenrirscreenreader\commands\commands\clear_window_application.py:17
169173 msgid "Turn off window mode for application"
170174 msgstr ""
171175
172 #: ../src/fenrir/commands/commands/clear_window_application.py:22
176 #: ../src/fenrirscreenreader\commands\commands\clear_window_application.py:22
173177 msgid "Window Mode off for application {0}"
174178 msgstr ""
175179
176 #: ../src/fenrir/commands/commands/clear_window_application.py:24
180 #: ../src/fenrirscreenreader\commands\commands\clear_window_application.py:24
177181 msgid "Not in window Mode"
178182 msgstr ""
179183
180 #: ../src/fenrir/commands/commands/copy_marked_to_clipboard.py:18
184 #:
185 #: ../src/fenrirscreenreader\commands\commands\copy_last_echo_to_clipboard.py:18
186 msgid "copies last presented text to the clipboard"
187 msgstr ""
188
189 #: ../src/fenrirscreenreader\commands\commands\copy_marked_to_clipboard.py:18
181190 msgid "copies marked text to the currently selected clipboard"
182191 msgstr ""
183192
184 #: ../src/fenrir/commands/commands/copy_marked_to_clipboard.py:22
185 msgid "one or two marks needed"
186 msgstr ""
187
188 #: ../src/fenrir/commands/commands/curr_clipboard.py:17
193 #: ../src/fenrirscreenreader\commands\commands\copy_marked_to_clipboard.py:22
194 msgid "One or two marks are needed"
195 msgstr ""
196
197 #: ../src/fenrirscreenreader\commands\commands\curr_clipboard.py:17
189198 msgid "speaks the contents of the currently selected clipboard"
190199 msgstr ""
191200
192 #: ../src/fenrir/commands/commands/curr_clipboard.py:21
193 #: ../src/fenrir/commands/commands/export_clipboard_to_x.py:29
194 #: ../src/fenrir/commands/commands/export_clipboard_to_x.py:32
195 #: ../src/fenrir/commands/commands/export_clipboard_to_x.py:35
196 #: ../src/fenrir/commands/commands/export_clipboard_to_x.py:38
197 #: ../src/fenrir/commands/commands/first_clipboard.py:21
198 #: ../src/fenrir/commands/commands/last_clipboard.py:21
199 #: ../src/fenrir/commands/commands/next_clipboard.py:21
200 #: ../src/fenrir/commands/commands/paste_clipboard.py:23
201 #: ../src/fenrir/commands/commands/paste_clipboard.py:26
202 #: ../src/fenrir/commands/commands/paste_clipboard.py:29
203 #: ../src/fenrir/commands/commands/paste_clipboard.py:32
204 #: ../src/fenrir/commands/commands/prev_clipboard.py:21
201 #: ../src/fenrirscreenreader\commands\commands\curr_clipboard.py:21
202 #: ../src/fenrirscreenreader\commands\commands\export_clipboard_to_file.py:28
203 #: ../src/fenrirscreenreader\commands\commands\export_clipboard_to_x.py:27
204 #: ../src/fenrirscreenreader\commands\commands\first_clipboard.py:21
205 #: ../src/fenrirscreenreader\commands\commands\last_clipboard.py:21
206 #: ../src/fenrirscreenreader\commands\commands\next_clipboard.py:21
207 #: ../src/fenrirscreenreader\commands\commands\paste_clipboard.py:23
208 #: ../src/fenrirscreenreader\commands\commands\prev_clipboard.py:21
205209 msgid "clipboard empty"
206210 msgstr ""
207211
208 #: ../src/fenrir/commands/commands/curr_screen.py:17
212 #: ../src/fenrirscreenreader\commands\commands\curr_screen.py:17
209213 msgid "reads the contents of the current screen"
210214 msgstr ""
211215
212 #: ../src/fenrir/commands/commands/curr_screen.py:21
216 #: ../src/fenrirscreenreader\commands\commands\curr_screen.py:21
213217 msgid "screen is empty"
214218 msgstr ""
215219
216 #: ../src/fenrir/commands/commands/curr_screen_after_cursor.py:18
220 #: ../src/fenrirscreenreader\commands\commands\curr_screen_after_cursor.py:18
217221 msgid "reads from the cursor to the bottom of the screen"
218222 msgstr ""
219223
220 #: ../src/fenrir/commands/commands/curr_screen_before_cursor.py:18
224 #: ../src/fenrirscreenreader\commands\commands\curr_screen_before_cursor.py:18
221225 msgid "Reads from the top of the screen to the cursor position"
222226 msgstr ""
223227
224 #: ../src/fenrir/commands/commands/cursor_column.py:17
225 msgid "presents the current column number for review cursor in review mode or the text cursor if not. Starts with 1"
226 msgstr ""
227
228 #: ../src/fenrir/commands/commands/cursor_lineno.py:17
229 msgid "presents the current line number for review cursor in review mode or the text cursor if not. Starts with 1"
230 msgstr ""
231
232 #: ../src/fenrir/commands/commands/cursor_position.py:17
228 #: ../src/fenrirscreenreader\commands\commands\current_quick_menu_entry.py:17
229 #: ../src/fenrirscreenreader\commands\quickMenu\current_quick_menu_entry.py:17
230 msgid "get current quick menu entry"
231 msgstr ""
232
233 #: ../src/fenrirscreenreader\commands\commands\current_quick_menu_value.py:17
234 #: ../src/fenrirscreenreader\commands\quickMenu\current_quick_menu_value.py:17
235 msgid "get current quick menu value"
236 msgstr ""
237
238 #: ../src/fenrirscreenreader\commands\commands\cursor_column.py:17
239 msgid "Column number for cursor"
240 msgstr ""
241
242 #: ../src/fenrirscreenreader\commands\commands\cursor_lineno.py:17
243 msgid "Line number for cursor"
244 msgstr ""
245
246 #: ../src/fenrirscreenreader\commands\commands\cursor_position.py:17
233247 msgid "displays the position of the review cursor"
234248 msgstr ""
235249
236 #: ../src/fenrir/commands/commands/cursor_position.py:23
237 msgid "line {0}, column {1}"
238 msgstr ""
239
240 #: ../src/fenrir/commands/commands/cursor_read_to_end_of_line.py:18
250 #: ../src/fenrirscreenreader\commands\commands\cursor_position.py:23
251 msgid "line {0}, column {1}, Terminal {2}"
252 msgstr ""
253
254 #:
255 #: ../src/fenrirscreenreader\commands\commands\cursor_read_to_end_of_line.py:18
241256 msgid "read to end of line, use review cursor if you are in review mode, otherwhise use text cursor"
242257 msgstr ""
243258
244 #: ../src/fenrir/commands/commands/date.py:18
259 #: ../src/fenrirscreenreader\commands\commands\date.py:18
245260 msgid "presents the date"
246261 msgstr ""
247262
248 #: ../src/fenrir/commands/commands/dec_sound_volume.py:18
263 #: ../src/fenrirscreenreader\commands\commands\dec_alsa_volume.py:24
264 msgid "Decrease system volume"
265 msgstr ""
266
267 #: ../src/fenrirscreenreader\commands\commands\dec_alsa_volume.py:28
268 #: ../src/fenrirscreenreader\commands\commands\inc_alsa_volume.py:28
269 msgid "alsaaudio is not installed"
270 msgstr ""
271
272 #: ../src/fenrirscreenreader\commands\commands\dec_alsa_volume.py:36
273 #: ../src/fenrirscreenreader\commands\commands\inc_alsa_volume.py:36
274 msgid "{0} percent system volume"
275 msgstr ""
276
277 #: ../src/fenrirscreenreader\commands\commands\dec_sound_volume.py:18
249278 msgid "decrease sound volume"
250279 msgstr ""
251280
252 #: ../src/fenrir/commands/commands/dec_sound_volume.py:29
253 #: ../src/fenrir/commands/commands/inc_sound_volume.py:29
281 #: ../src/fenrirscreenreader\commands\commands\dec_sound_volume.py:29
282 #: ../src/fenrirscreenreader\commands\commands\inc_sound_volume.py:29
254283 msgid "{0} percent sound volume"
255284 msgstr ""
256285
257 #: ../src/fenrir/commands/commands/dec_speech_pitch.py:18
258 msgid "decreases the pitch of the speech"
259 msgstr ""
260
261 #: ../src/fenrir/commands/commands/dec_speech_pitch.py:27
262 #: ../src/fenrir/commands/commands/inc_speech_pitch.py:27
286 #: ../src/fenrirscreenreader\commands\commands\dec_speech_pitch.py:18
287 msgid "Decreases the pitch of the speech"
288 msgstr ""
289
290 #: ../src/fenrirscreenreader\commands\commands\dec_speech_pitch.py:26
291 #: ../src/fenrirscreenreader\commands\commands\inc_speech_pitch.py:27
263292 msgid "{0} percent speech pitch"
264293 msgstr ""
265294
266 #: ../src/fenrir/commands/commands/dec_speech_rate.py:18
267 msgid "decreases the rate of the speech"
268 msgstr ""
269
270 #: ../src/fenrir/commands/commands/dec_speech_rate.py:27
271 #: ../src/fenrir/commands/commands/inc_speech_rate.py:27
295 #: ../src/fenrirscreenreader\commands\commands\dec_speech_rate.py:18
296 msgid "Decreases the rate of the speech"
297 msgstr ""
298
299 #: ../src/fenrirscreenreader\commands\commands\dec_speech_rate.py:27
300 #: ../src/fenrirscreenreader\commands\commands\inc_speech_rate.py:27
272301 msgid "{0} percent speech rate"
273302 msgstr ""
274303
275 #: ../src/fenrir/commands/commands/dec_speech_volume.py:18
276 msgid "decreases the volume of the speech"
277 msgstr ""
278
279 #: ../src/fenrir/commands/commands/dec_speech_volume.py:27
280 #: ../src/fenrir/commands/commands/inc_speech_volume.py:27
304 #: ../src/fenrirscreenreader\commands\commands\dec_speech_volume.py:18
305 msgid "Decreases the volume of the speech"
306 msgstr ""
307
308 #: ../src/fenrirscreenreader\commands\commands\dec_speech_volume.py:27
309 #: ../src/fenrirscreenreader\commands\commands\inc_speech_volume.py:27
281310 msgid "{0} percent speech volume"
282311 msgstr ""
283312
284 #: ../src/fenrir/commands/commands/exit_review.py:17
313 #: ../src/fenrirscreenreader\commands\commands\exit_review.py:17
314 #: ../src/fenrirscreenreader\commands\onCursorChange\95000-exit_review_mode.py:17
285315 msgid "exits review mode"
286316 msgstr ""
287317
288 #: ../src/fenrir/commands/commands/exit_review.py:21
289 msgid "Not in review mode"
290 msgstr ""
291
292 #: ../src/fenrir/commands/commands/exit_review.py:25
293 msgid "leave review mode"
294 msgstr ""
295
296 #: ../src/fenrir/commands/commands/export_clipboard_to_x.py:21
297 msgid "export the current fenrir clipboard to X clipboard"
298 msgstr ""
299
300 #: ../src/fenrir/commands/commands/first_clipboard.py:17
318 #: ../src/fenrirscreenreader\commands\commands\exit_review.py:21
319 msgid "Not in Review Mode"
320 msgstr ""
321
322 #: ../src/fenrirscreenreader\commands\commands\exit_review.py:25
323 msgid "Exiting Review Mode"
324 msgstr ""
325
326 #: ../src/fenrirscreenreader\commands\commands\export_clipboard_to_file.py:19
327 msgid "export the current fenrir clipboard to a file"
328 msgstr ""
329
330 #: ../src/fenrirscreenreader\commands\commands\export_clipboard_to_file.py:34
331 msgid "clipboard exported to file"
332 msgstr ""
333
334 #: ../src/fenrirscreenreader\commands\commands\export_clipboard_to_x.py:20
335 msgid "Export current fenrir clipboard to X or GUI clipboard"
336 msgstr ""
337
338 #: ../src/fenrirscreenreader\commands\commands\first_clipboard.py:17
301339 msgid "selects the first clipboard"
302340 msgstr ""
303341
304 #: ../src/fenrir/commands/commands/forward_keypress.py:17
305 msgid "sends the following keypress to the terminal"
306 msgstr ""
307
308 #: ../src/fenrir/commands/commands/forward_keypress.py:21
342 #: ../src/fenrirscreenreader\commands\commands\forward_keypress.py:17
343 msgid "sends the following keypress to the terminal or application"
344 msgstr ""
345
346 #: ../src/fenrirscreenreader\commands\commands\forward_keypress.py:21
309347 msgid "Forward next keypress"
310348 msgstr ""
311349
312 #: ../src/fenrir/commands/commands/inc_sound_volume.py:18
350 #:
351 #: ../src/fenrirscreenreader\commands\commands\import_clipboard_from_file.py:19
352 msgid "imports text from clipboard file to the clipboard"
353 msgstr ""
354
355 #:
356 #: ../src/fenrirscreenreader\commands\commands\import_clipboard_from_file.py:27
357 msgid "File does not exist"
358 msgstr ""
359
360 #: ../src/fenrirscreenreader\commands\commands\import_clipboard_from_x.py:21
361 msgid "imports the graphical clipboard to Fenrir's clipboard"
362 msgstr ""
363
364 #: ../src/fenrirscreenreader\commands\commands\inc_alsa_volume.py:24
365 msgid "Increase system volume"
366 msgstr ""
367
368 #: ../src/fenrirscreenreader\commands\commands\inc_sound_volume.py:18
313369 msgid "adjusts the volume for in coming sounds"
314370 msgstr ""
315371
316 #: ../src/fenrir/commands/commands/inc_speech_pitch.py:18
317 msgid "increases the pitch of the speech"
318 msgstr ""
319
320 #: ../src/fenrir/commands/commands/inc_speech_rate.py:18
321 msgid "increase the speech rate"
322 msgstr ""
323
324 #: ../src/fenrir/commands/commands/inc_speech_volume.py:18
325 msgid "increase the speech volume"
326 msgstr ""
327
328 #: ../src/fenrir/commands/commands/indent_curr_line.py:18
329 msgid "shows the indention level for the current line"
330 msgstr ""
331
332 #: ../src/fenrir/commands/commands/indent_curr_line.py:33
372 #: ../src/fenrirscreenreader\commands\commands\inc_speech_pitch.py:18
373 msgid "Increases the pitch of the speech"
374 msgstr ""
375
376 #: ../src/fenrirscreenreader\commands\commands\inc_speech_rate.py:18
377 msgid "Increase the speech rate"
378 msgstr ""
379
380 #: ../src/fenrirscreenreader\commands\commands\inc_speech_volume.py:18
381 msgid "Increase the speech volume"
382 msgstr ""
383
384 #: ../src/fenrirscreenreader\commands\commands\indent_curr_line.py:18
385 msgid "Presents the indentation level for the current line"
386 msgstr ""
387
388 #: ../src/fenrirscreenreader\commands\commands\indent_curr_line.py:33
333389 msgid "indent {0}"
334390 msgstr ""
335391
336 #: ../src/fenrir/commands/commands/last_clipboard.py:17
392 #: ../src/fenrirscreenreader\commands\commands\last_clipboard.py:17
337393 msgid "selects the last clipboard"
338394 msgstr ""
339395
340 #: ../src/fenrir/commands/commands/last_incoming.py:17
341 msgid "displays the last received text"
342 msgstr ""
343
344 #: ../src/fenrir/commands/commands/marked_text.py:18
345 msgid "speaks the currently selected text that will be copied to the clipboard"
346 msgstr ""
347
348 #: ../src/fenrir/commands/commands/marked_text.py:23
396 #: ../src/fenrirscreenreader\commands\commands\last_incoming.py:17
397 msgid "Presents the text which was last received"
398 msgstr ""
399
400 #: ../src/fenrirscreenreader\commands\commands\marked_text.py:18
401 msgid "Presents the currently selected text that will be copied to the clipboard"
402 msgstr ""
403
404 #: ../src/fenrirscreenreader\commands\commands\marked_text.py:23
349405 msgid "please set begin and endmark"
350406 msgstr ""
351407
352 #: ../src/fenrir/commands/commands/next_clipboard.py:17
408 #: ../src/fenrirscreenreader\commands\commands\next_clipboard.py:17
353409 msgid "selects the next clipboard"
354410 msgstr ""
355411
356 #: ../src/fenrir/commands/commands/next_clipboard.py:26
412 #: ../src/fenrirscreenreader\commands\commands\next_clipboard.py:28
413 #: ../src/fenrirscreenreader\commands\commands\prev_clipboard.py:28
357414 msgid "First clipboard "
358415 msgstr ""
359416
360 #: ../src/fenrir/commands/commands/paste_clipboard.py:18
417 #: ../src/fenrirscreenreader\commands\commands\next_clipboard.py:30
418 #: ../src/fenrirscreenreader\commands\commands\prev_clipboard.py:30
419 msgid "Last clipboard "
420 msgstr ""
421
422 #: ../src/fenrirscreenreader\commands\commands\next_quick_menu_entry.py:17
423 #: ../src/fenrirscreenreader\commands\quickMenu\next_quick_menu_entry.py:17
424 msgid "get next quick menu entry"
425 msgstr ""
426
427 #: ../src/fenrirscreenreader\commands\commands\next_quick_menu_entry.py:27
428 #: ../src/fenrirscreenreader\commands\commands\prev_quick_menu_entry.py:27
429 #: ../src/fenrirscreenreader\commands\quickMenu\next_quick_menu_entry.py:27
430 #: ../src/fenrirscreenreader\commands\quickMenu\prev_quick_menu_entry.py:27
431 msgid "Quick menu not available"
432 msgstr ""
433
434 #: ../src/fenrirscreenreader\commands\commands\next_quick_menu_value.py:17
435 #: ../src/fenrirscreenreader\commands\quickMenu\next_quick_menu_value.py:17
436 msgid "get next quick menu value"
437 msgstr ""
438
439 #: ../src/fenrirscreenreader\commands\commands\paste_clipboard.py:19
361440 msgid "pastes the text from the currently selected clipboard"
362441 msgstr ""
363442
364 #: ../src/fenrir/commands/commands/present_first_line.py:18
443 #: ../src/fenrirscreenreader\commands\commands\present_first_line.py:18
365444 msgid "present first line"
366445 msgstr ""
367446
368 #: ../src/fenrir/commands/commands/present_last_line.py:18
369 #: ../src/fenrir/commands/commands/review_curr_line.py:18
447 #: ../src/fenrirscreenreader\commands\commands\present_last_line.py:18
448 #: ../src/fenrirscreenreader\commands\commands\review_curr_line.py:18
370449 msgid "current line"
371450 msgstr ""
372451
373 #: ../src/fenrir/commands/commands/prev_clipboard.py:17
452 #: ../src/fenrirscreenreader\commands\commands\prev_clipboard.py:17
374453 msgid "selects the previous clipboard"
375454 msgstr ""
376455
377 #: ../src/fenrir/commands/commands/prev_clipboard.py:26
378 msgid "Last clipboard "
379 msgstr ""
380
381 #: ../src/fenrir/commands/commands/quit_fenrir.py:17
456 #: ../src/fenrirscreenreader\commands\commands\prev_quick_menu_entry.py:17
457 #: ../src/fenrirscreenreader\commands\quickMenu\prev_quick_menu_entry.py:17
458 msgid "get previous quick menu entry"
459 msgstr ""
460
461 #: ../src/fenrirscreenreader\commands\commands\prev_quick_menu_value.py:17
462 #: ../src/fenrirscreenreader\commands\quickMenu\prev_quick_menu_value.py:17
463 msgid "get previous quick menu value"
464 msgstr ""
465
466 #: ../src/fenrirscreenreader\commands\commands\quit_fenrir.py:17
382467 msgid "exits Fenrir"
383468 msgstr ""
384469
385 #: ../src/fenrir/commands/commands/remove_marks.py:17
386 msgid "removes marks from selected text"
387 msgstr ""
388
389 #: ../src/fenrir/commands/commands/remove_marks.py:21
470 #: ../src/fenrirscreenreader\commands\commands\remove_marks.py:17
471 msgid "Removes marks from selected text"
472 msgstr ""
473
474 #: ../src/fenrirscreenreader\commands\commands\remove_marks.py:21
390475 msgid "Remove marks"
391476 msgstr ""
392477
393 #: ../src/fenrir/commands/commands/remove_word_from_spell_check.py:27
478 #:
479 #: ../src/fenrirscreenreader\commands\commands\remove_word_from_spell_check.py:27
394480 msgid "removes the current word from the exceptions dictionary"
395481 msgstr ""
396482
397 #: ../src/fenrir/commands/commands/remove_word_from_spell_check.py:50
398 msgid "{0} is already removed from dict"
399 msgstr ""
400
401 #: ../src/fenrir/commands/commands/remove_word_from_spell_check.py:53
483 #:
484 #: ../src/fenrirscreenreader\commands\commands\remove_word_from_spell_check.py:50
485 msgid "{0} is not in the dictionary"
486 msgstr ""
487
488 #:
489 #: ../src/fenrirscreenreader\commands\commands\remove_word_from_spell_check.py:53
402490 msgid "{0} removed"
403491 msgstr ""
404492
405 #: ../src/fenrir/commands/commands/review_bottom.py:17
406 msgid "move review to bottom of screen"
407 msgstr ""
408
409 #: ../src/fenrir/commands/commands/review_bottom.py:21
493 #: ../src/fenrirscreenreader\commands\commands\review_bottom.py:17
494 msgid "Move review to the bottom of the screen"
495 msgstr ""
496
497 #: ../src/fenrirscreenreader\commands\commands\review_bottom.py:21
410498 msgid "Bottom"
411499 msgstr ""
412500
413 #: ../src/fenrir/commands/commands/review_curr_char.py:18
501 #: ../src/fenrirscreenreader\commands\commands\review_curr_char.py:18
414502 msgid "presents the current character."
415503 msgstr ""
416504
417 #: ../src/fenrir/commands/commands/review_curr_char_phonetic.py:18
505 #: ../src/fenrirscreenreader\commands\commands\review_curr_char_phonetic.py:18
418506 msgid "set review and phonetically presents the current character"
419507 msgstr ""
420508
421 #: ../src/fenrir/commands/commands/review_curr_word.py:18
509 #: ../src/fenrirscreenreader\commands\commands\review_curr_word.py:18
422510 msgid "current word."
423511 msgstr ""
424512
425 #: ../src/fenrir/commands/commands/review_curr_word.py:32
426 #: ../src/fenrir/commands/commands/review_curr_word_phonetic.py:36
427 #: ../src/fenrir/commands/commands/review_down.py:27
428 #: ../src/fenrir/commands/commands/review_next_char.py:28
429 #: ../src/fenrir/commands/commands/review_next_char_phonetic.py:30
430 #: ../src/fenrir/commands/commands/review_next_line.py:34
431 #: ../src/fenrir/commands/commands/review_next_word.py:34
432 #: ../src/fenrir/commands/commands/review_next_word_phonetic.py:36
433 #: ../src/fenrir/commands/commands/review_prev_char.py:31
434 #: ../src/fenrir/commands/commands/review_prev_char_phonetic.py:30
435 #: ../src/fenrir/commands/commands/review_prev_line.py:32
436 #: ../src/fenrir/commands/commands/review_prev_word.py:32
437 #: ../src/fenrir/commands/commands/review_prev_word_phonetic.py:36
438 #: ../src/fenrir/commands/commands/review_up.py:27
513 #: ../src/fenrirscreenreader\commands\commands\review_curr_word.py:32
514 #: ../src/fenrirscreenreader\commands\commands\review_curr_word_phonetic.py:36
515 #: ../src/fenrirscreenreader\commands\commands\review_down.py:27
516 #: ../src/fenrirscreenreader\commands\commands\review_next_char.py:28
517 #: ../src/fenrirscreenreader\commands\commands\review_next_char_phonetic.py:30
518 #: ../src/fenrirscreenreader\commands\commands\review_next_line.py:34
519 #: ../src/fenrirscreenreader\commands\commands\review_next_word.py:34
520 #: ../src/fenrirscreenreader\commands\commands\review_next_word_phonetic.py:36
521 #: ../src/fenrirscreenreader\commands\commands\review_prev_char.py:31
522 #: ../src/fenrirscreenreader\commands\commands\review_prev_char_phonetic.py:30
523 #: ../src/fenrirscreenreader\commands\commands\review_prev_line.py:32
524 #: ../src/fenrirscreenreader\commands\commands\review_prev_word.py:32
525 #: ../src/fenrirscreenreader\commands\commands\review_prev_word_phonetic.py:36
526 #: ../src/fenrirscreenreader\commands\commands\review_up.py:27
439527 msgid "end of screen"
440528 msgstr ""
441529
442 #: ../src/fenrir/commands/commands/review_curr_word.py:35
443 #: ../src/fenrir/commands/commands/review_curr_word_phonetic.py:39
444 #: ../src/fenrir/commands/commands/review_next_char.py:31
445 #: ../src/fenrir/commands/commands/review_next_char_phonetic.py:33
446 #: ../src/fenrir/commands/commands/review_next_word.py:37
447 #: ../src/fenrir/commands/commands/review_next_word_phonetic.py:39
448 #: ../src/fenrir/commands/commands/review_prev_char.py:34
449 #: ../src/fenrir/commands/commands/review_prev_char_phonetic.py:33
450 #: ../src/fenrir/commands/commands/review_prev_word.py:35
451 #: ../src/fenrir/commands/commands/review_prev_word_phonetic.py:39
452 #: ../src/fenrir/commands/commands/review_up.py:30
530 #: ../src/fenrirscreenreader\commands\commands\review_curr_word.py:35
531 #: ../src/fenrirscreenreader\commands\commands\review_curr_word_phonetic.py:39
532 #: ../src/fenrirscreenreader\commands\commands\review_next_char.py:31
533 #: ../src/fenrirscreenreader\commands\commands\review_next_char_phonetic.py:33
534 #: ../src/fenrirscreenreader\commands\commands\review_next_word.py:37
535 #: ../src/fenrirscreenreader\commands\commands\review_next_word_phonetic.py:39
536 #: ../src/fenrirscreenreader\commands\commands\review_prev_char.py:34
537 #: ../src/fenrirscreenreader\commands\commands\review_prev_char_phonetic.py:33
538 #: ../src/fenrirscreenreader\commands\commands\review_prev_word.py:35
539 #: ../src/fenrirscreenreader\commands\commands\review_prev_word_phonetic.py:39
540 #: ../src/fenrirscreenreader\commands\commands\review_up.py:30
453541 msgid "line break"
454542 msgstr ""
455543
456 #: ../src/fenrir/commands/commands/review_curr_word_phonetic.py:19
457 #: ../src/fenrir/commands/commands/review_next_word_phonetic.py:19
458 #: ../src/fenrir/commands/commands/review_prev_word_phonetic.py:19
459 msgid "phonetically spells the current word and set review to it"
460 msgstr ""
461
462 #: ../src/fenrir/commands/commands/review_down.py:18
463 msgid "set review cursor to char below the current char and present it."
464 msgstr ""
465
466 #: ../src/fenrir/commands/commands/review_line_begin.py:18
544 #: ../src/fenrirscreenreader\commands\commands\review_curr_word_phonetic.py:19
545 msgid "Phonetically spells the current word"
546 msgstr ""
547
548 #: ../src/fenrirscreenreader\commands\commands\review_down.py:18
549 msgid "Move review to the character below the current position"
550 msgstr ""
551
552 #: ../src/fenrirscreenreader\commands\commands\review_line_begin.py:18
467553 msgid "set review cursor to begin of current line and display the content"
468554 msgstr ""
469555
470 #: ../src/fenrir/commands/commands/review_line_begin.py:30
556 #: ../src/fenrirscreenreader\commands\commands\review_line_begin.py:30
471557 msgid "beginning of line"
472558 msgstr ""
473559
474 #: ../src/fenrir/commands/commands/review_line_end.py:18
475 #: ../src/fenrir/commands/commands/review_line_first_char.py:19
476 #: ../src/fenrir/commands/commands/review_line_last_char.py:18
477 msgid "set review cursor to end of current line and display the content"
478 msgstr ""
479
480 #: ../src/fenrir/commands/commands/review_line_end.py:27
560 #: ../src/fenrirscreenreader\commands\commands\review_line_end.py:18
561 msgid "Move Review to the end of current line and display the content"
562 msgstr ""
563
564 #: ../src/fenrirscreenreader\commands\commands\review_line_end.py:27
481565 msgid "end of line"
482566 msgstr ""
483567
484 #: ../src/fenrir/commands/commands/review_line_first_char.py:26
568 #: ../src/fenrirscreenreader\commands\commands\review_line_first_char.py:19
569 msgid "Move Review to the first character on the line"
570 msgstr ""
571
572 #: ../src/fenrirscreenreader\commands\commands\review_line_first_char.py:26
485573 msgid "line is empty"
486574 msgstr ""
487575
488 #: ../src/fenrir/commands/commands/review_line_first_char.py:33
489 msgid "first char in line indent {0}"
490 msgstr ""
491
492 #: ../src/fenrir/commands/commands/review_line_last_char.py:27
493 msgid "last char in line"
494 msgstr ""
495
496 #: ../src/fenrir/commands/commands/review_next_char.py:18
497 msgid "moves review to the next character and presents it"
498 msgstr ""
499
500 #: ../src/fenrir/commands/commands/review_next_char_phonetic.py:18
576 #: ../src/fenrirscreenreader\commands\commands\review_line_first_char.py:33
577 msgid "first character in line indent {0}"
578 msgstr ""
579
580 #: ../src/fenrirscreenreader\commands\commands\review_line_last_char.py:18
581 msgid "Move Review to the last character on the line"
582 msgstr ""
583
584 #: ../src/fenrirscreenreader\commands\commands\review_line_last_char.py:27
585 msgid "last character in line"
586 msgstr ""
587
588 #: ../src/fenrirscreenreader\commands\commands\review_next_char.py:18
589 msgid "Moves review to the next character "
590 msgstr ""
591
592 #: ../src/fenrirscreenreader\commands\commands\review_next_char_phonetic.py:18
501593 msgid "phonetically presents the next character and set review to it"
502594 msgstr ""
503595
504 #: ../src/fenrir/commands/commands/review_next_line.py:18
505 msgid "moves review to the next line and presents it"
506 msgstr ""
507
508 #: ../src/fenrir/commands/commands/review_next_word.py:18
509 msgid "moves review to the next word and presents it"
510 msgstr ""
511
512 #: ../src/fenrir/commands/commands/review_prev_char.py:18
513 msgid "moves review to the previous character and presents it"
514 msgstr ""
515
516 #: ../src/fenrir/commands/commands/review_prev_char_phonetic.py:18
596 #: ../src/fenrirscreenreader\commands\commands\review_next_line.py:18
597 msgid "moves review to the next line "
598 msgstr ""
599
600 #: ../src/fenrirscreenreader\commands\commands\review_next_word.py:18
601 msgid "moves review to the next word "
602 msgstr ""
603
604 #: ../src/fenrirscreenreader\commands\commands\review_next_word_phonetic.py:19
605 msgid "Phonetically spells the next word and moves review to it"
606 msgstr ""
607
608 #: ../src/fenrirscreenreader\commands\commands\review_prev_char.py:18
609 msgid "moves review to the previous character "
610 msgstr ""
611
612 #: ../src/fenrirscreenreader\commands\commands\review_prev_char_phonetic.py:18
517613 msgid "phonetically presents the previous character and set review to it"
518614 msgstr ""
519615
520 #: ../src/fenrir/commands/commands/review_prev_line.py:18
521 msgid "moves review to the previous line and presents it"
522 msgstr ""
523
524 #: ../src/fenrir/commands/commands/review_prev_word.py:18
525 msgid "moves review focus to the previous word and presents it"
526 msgstr ""
527
528 #: ../src/fenrir/commands/commands/review_top.py:18
616 #: ../src/fenrirscreenreader\commands\commands\review_prev_line.py:18
617 msgid "moves review to the previous line "
618 msgstr ""
619
620 #: ../src/fenrirscreenreader\commands\commands\review_prev_word.py:18
621 msgid "moves review focus to the previous word "
622 msgstr ""
623
624 #: ../src/fenrirscreenreader\commands\commands\review_prev_word_phonetic.py:19
625 msgid "Phonetically spells the previous word and moves review to it"
626 msgstr ""
627
628 #: ../src/fenrirscreenreader\commands\commands\review_top.py:18
529629 msgid "move review to top of screen"
530630 msgstr ""
531631
532 #: ../src/fenrir/commands/commands/review_top.py:22
632 #: ../src/fenrirscreenreader\commands\commands\review_top.py:22
533633 msgid "Top"
534634 msgstr ""
535635
536 #: ../src/fenrir/commands/commands/review_up.py:18
537 msgid "set review cursor to the char in the line below and present it"
538 msgstr ""
539
540 #: ../src/fenrir/commands/commands/set_bookmark_1.py:18
541 #: ../src/fenrir/commands/commands/set_bookmark_10.py:18
542 #: ../src/fenrir/commands/commands/set_bookmark_2.py:18
543 #: ../src/fenrir/commands/commands/set_bookmark_3.py:18
544 #: ../src/fenrir/commands/commands/set_bookmark_4.py:18
545 #: ../src/fenrir/commands/commands/set_bookmark_5.py:18
546 #: ../src/fenrir/commands/commands/set_bookmark_6.py:18
547 #: ../src/fenrir/commands/commands/set_bookmark_7.py:18
548 #: ../src/fenrir/commands/commands/set_bookmark_8.py:18
549 #: ../src/fenrir/commands/commands/set_bookmark_9.py:18
636 #: ../src/fenrirscreenreader\commands\commands\review_up.py:18
637 msgid "Move review to the character in the line above the current position"
638 msgstr ""
639
640 #: ../src/fenrirscreenreader\commands\commands\save_settings.py:18
641 msgid "Saves your current Fenrir settings so they are the default."
642 msgstr ""
643
644 #: ../src/fenrirscreenreader\commands\commands\save_settings.py:22
645 msgid "Settings saved."
646 msgstr ""
647
648 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_1.py:18
649 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_10.py:18
650 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_2.py:18
651 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_3.py:18
652 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_4.py:18
653 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_5.py:18
654 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_6.py:18
655 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_7.py:18
656 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_8.py:18
657 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_9.py:18
550658 msgid "set Bookmark {0}"
551659 msgstr ""
552660
553 #: ../src/fenrir/commands/commands/set_bookmark_1.py:22
554 #: ../src/fenrir/commands/commands/set_bookmark_10.py:22
555 #: ../src/fenrir/commands/commands/set_bookmark_2.py:22
556 #: ../src/fenrir/commands/commands/set_bookmark_3.py:22
557 #: ../src/fenrir/commands/commands/set_bookmark_4.py:22
558 #: ../src/fenrir/commands/commands/set_bookmark_5.py:22
559 #: ../src/fenrir/commands/commands/set_bookmark_6.py:22
560 #: ../src/fenrir/commands/commands/set_bookmark_7.py:22
561 #: ../src/fenrir/commands/commands/set_bookmark_8.py:22
562 #: ../src/fenrir/commands/commands/set_bookmark_9.py:22
563 msgid "No Mark found"
564 msgstr ""
565
566 #: ../src/fenrir/commands/commands/set_bookmark_1.py:32
567 #: ../src/fenrir/commands/commands/set_bookmark_10.py:32
568 #: ../src/fenrir/commands/commands/set_bookmark_2.py:32
569 #: ../src/fenrir/commands/commands/set_bookmark_3.py:32
570 #: ../src/fenrir/commands/commands/set_bookmark_4.py:32
571 #: ../src/fenrir/commands/commands/set_bookmark_5.py:32
572 #: ../src/fenrir/commands/commands/set_bookmark_6.py:32
573 #: ../src/fenrir/commands/commands/set_bookmark_7.py:32
574 #: ../src/fenrir/commands/commands/set_bookmark_8.py:32
575 #: ../src/fenrir/commands/commands/set_bookmark_9.py:32
661 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_1.py:22
662 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_10.py:22
663 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_2.py:22
664 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_3.py:22
665 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_4.py:22
666 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_5.py:22
667 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_6.py:22
668 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_7.py:22
669 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_8.py:22
670 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_9.py:22
671 msgid "No mark found"
672 msgstr ""
673
674 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_1.py:32
675 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_10.py:32
676 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_2.py:32
677 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_3.py:32
678 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_4.py:32
679 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_5.py:32
680 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_6.py:32
681 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_7.py:32
682 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_8.py:32
683 #: ../src/fenrirscreenreader\commands\commands\set_bookmark_9.py:32
576684 msgid "Bookmark {0} set for application {1}"
577685 msgstr ""
578686
579 #: ../src/fenrir/commands/commands/set_mark.py:17
687 #: ../src/fenrirscreenreader\commands\commands\set_mark.py:17
580688 msgid "places marks to select text to copy to the clipboard"
581689 msgstr ""
582690
583 #: ../src/fenrir/commands/commands/set_mark.py:21
691 #: ../src/fenrirscreenreader\commands\commands\set_mark.py:21
584692 msgid "no review cursor"
585693 msgstr ""
586694
587 #: ../src/fenrir/commands/commands/set_mark.py:26
588 #: ../src/fenrir/commands/commands/set_mark.py:28
695 #: ../src/fenrirscreenreader\commands\commands\set_mark.py:26
696 #: ../src/fenrirscreenreader\commands\commands\set_mark.py:28
589697 msgid "set mark"
590698 msgstr ""
591699
592 #: ../src/fenrir/commands/commands/set_window_application.py:17
700 #: ../src/fenrirscreenreader\commands\commands\set_window_application.py:17
593701 msgid "set Window Mode, needs 2 marks "
594702 msgstr ""
595703
596 #: ../src/fenrir/commands/commands/set_window_application.py:22
704 #: ../src/fenrirscreenreader\commands\commands\set_window_application.py:22
597705 msgid "Window Mode on for application {0}"
598706 msgstr ""
599707
600 #: ../src/fenrir/commands/commands/set_window_application.py:25
708 #: ../src/fenrirscreenreader\commands\commands\set_window_application.py:25
601709 msgid "Set window begin and end marks"
602710 msgstr ""
603711
604 #: ../src/fenrir/commands/commands/shut_up.py:17
605 msgid "interrupts the current presentation"
606 msgstr ""
607
608 #: ../src/fenrir/commands/commands/spell_check.py:26
712 #: ../src/fenrirscreenreader\commands\commands\shut_up.py:17
713 msgid "Interrupts the current presentation"
714 msgstr ""
715
716 #: ../src/fenrirscreenreader\commands\commands\spell_check.py:26
609717 msgid "checks the spelling of the current word"
610718 msgstr ""
611719
612 #: ../src/fenrir/commands/commands/spell_check.py:52
613 #: ../src/fenrir/commands/onInput/62000-spell_check.py:132
720 #: ../src/fenrirscreenreader\commands\commands\spell_check.py:51
721 #: ../src/fenrirscreenreader\commands\onCursorChange\35000-spell_check.py:129
614722 msgid "misspelled"
615723 msgstr ""
616724
617 #: ../src/fenrir/commands/commands/spell_check.py:54
725 #: ../src/fenrirscreenreader\commands\commands\spell_check.py:53
618726 msgid "correct"
619727 msgstr ""
620728
621 #: ../src/fenrir/commands/commands/subprocess.py:21
729 #: ../src/fenrirscreenreader\commands\commands\subprocess.py:21
622730 msgid "script: {0} fullpath: {1}"
623731 msgstr ""
624732
625 #: ../src/fenrir/commands/commands/subprocess.py:24
626 msgid "scriptfile does not exist"
627 msgstr ""
628
629 #: ../src/fenrir/commands/commands/subprocess.py:27
630 msgid "scriptfile is not a file"
631 msgstr ""
632
633 #: ../src/fenrir/commands/commands/subprocess.py:30
634 msgid "scriptfile is not executable"
635 msgstr ""
636
637 #: ../src/fenrir/commands/commands/temp_disable_speech.py:17
638 #: ../src/fenrir/commands/onInput/15000-enable_temp_speech.py:17
733 #: ../src/fenrirscreenreader\commands\commands\subprocess.py:24
734 msgid "Script file not found"
735 msgstr ""
736
737 #: ../src/fenrirscreenreader\commands\commands\subprocess.py:27
738 msgid "Script source is not a valid file"
739 msgstr ""
740
741 #: ../src/fenrirscreenreader\commands\commands\subprocess.py:30
742 msgid "Script file is not executable"
743 msgstr ""
744
745 #: ../src/fenrirscreenreader\commands\commands\temp_disable_speech.py:17
746 #: ../src/fenrirscreenreader\commands\onByteInput\15000-enable_temp_speech.py:17
747 #: ../src/fenrirscreenreader\commands\onKeyInput\15000-enable_temp_speech.py:17
639748 msgid "disables speech until next keypress"
640749 msgstr ""
641750
642 #: ../src/fenrir/commands/commands/temp_disable_speech.py:21
751 #: ../src/fenrirscreenreader\commands\commands\time.py:18
752 msgid "presents the time"
753 msgstr ""
754
755 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_indent.py:16
756 msgid "enables or disables automatic reading of indentation level changes"
757 msgstr ""
758
759 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_indent.py:21
760 msgid "autoindent enabled"
761 msgstr ""
762
763 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_indent.py:23
764 msgid "autoindent disabled"
765 msgstr ""
766
767 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_read.py:16
768 msgid "enables or disables automatic reading of new text as it appears"
769 msgstr ""
770
771 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_read.py:21
772 msgid "autoread enabled"
773 msgstr ""
774
775 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_read.py:23
776 msgid "autoread disabled"
777 msgstr ""
778
779 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_spell_check.py:17
780 msgid "enables or disables automatic spell checking"
781 msgstr ""
782
783 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_spell_check.py:22
784 msgid "auto spellcheck enabled"
785 msgstr ""
786
787 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_spell_check.py:24
788 msgid "auto spellcheck disabled"
789 msgstr ""
790
791 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_time.py:16
792 msgid "Enables or disables automatic reading of time after specified intervals"
793 msgstr ""
794
795 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_time.py:21
796 msgid "Automatic time announcement enabled"
797 msgstr ""
798
799 #: ../src/fenrirscreenreader\commands\commands\toggle_auto_time.py:23
800 msgid "Automatic time announcement disabled"
801 msgstr ""
802
803 #: ../src/fenrirscreenreader\commands\commands\toggle_barrier.py:16
804 msgid "enables or disables the barrier mode"
805 msgstr ""
806
807 #: ../src/fenrirscreenreader\commands\commands\toggle_barrier.py:21
808 msgid "barrier mode enabled"
809 msgstr ""
810
811 #: ../src/fenrirscreenreader\commands\commands\toggle_barrier.py:23
812 msgid "barrier mode disabled"
813 msgstr ""
814
815 #: ../src/fenrirscreenreader\commands\commands\toggle_braille.py:17
816 msgid "Enables and disables Braille output"
817 msgstr ""
818
819 #: ../src/fenrirscreenreader\commands\commands\toggle_braille.py:21
820 msgid "braille disabled"
821 msgstr ""
822
823 #: ../src/fenrirscreenreader\commands\commands\toggle_braille.py:24
824 msgid "braille enabled"
825 msgstr ""
826
827 #: ../src/fenrirscreenreader\commands\commands\toggle_emoticons.py:16
828 msgid "enables or disables announcement of emoticons instead of chars"
829 msgstr ""
830
831 #: ../src/fenrirscreenreader\commands\commands\toggle_emoticons.py:21
832 msgid "emoticons enabled"
833 msgstr ""
834
835 #: ../src/fenrirscreenreader\commands\commands\toggle_emoticons.py:23
836 msgid "emoticons disabled"
837 msgstr ""
838
839 #: ../src/fenrirscreenreader\commands\commands\toggle_has_attribute.py:16
840 msgid "enables or disables the announcement of attributes"
841 msgstr ""
842
843 #: ../src/fenrirscreenreader\commands\commands\toggle_has_attribute.py:21
844 msgid "announcement of attributes enabled"
845 msgstr ""
846
847 #: ../src/fenrirscreenreader\commands\commands\toggle_has_attribute.py:23
848 msgid "announcement of attributes disabled"
849 msgstr ""
850
851 #: ../src/fenrirscreenreader\commands\commands\toggle_highlight_tracking.py:16
852 msgid "enables or disables tracking of highlighted text"
853 msgstr ""
854
855 #: ../src/fenrirscreenreader\commands\commands\toggle_highlight_tracking.py:24
856 msgid "highlight tracking"
857 msgstr ""
858
859 #: ../src/fenrirscreenreader\commands\commands\toggle_highlight_tracking.py:26
860 msgid "cursor tracking"
861 msgstr ""
862
863 #: ../src/fenrirscreenreader\commands\commands\toggle_output.py:17
864 msgid "toggles all output settings"
865 msgstr ""
866
867 #: ../src/fenrirscreenreader\commands\commands\toggle_output.py:23
868 msgid "Fenrir muted"
869 msgstr ""
870
871 #: ../src/fenrirscreenreader\commands\commands\toggle_output.py:31
872 msgid "Fenrir unmuted"
873 msgstr ""
874
875 #: ../src/fenrirscreenreader\commands\commands\toggle_punctuation_level.py:23
876 msgid "No punctuation found."
877 msgstr ""
878
879 #: ../src/fenrirscreenreader\commands\commands\toggle_sound.py:17
880 msgid "enables or disables sound"
881 msgstr ""
882
883 #: ../src/fenrirscreenreader\commands\commands\toggle_sound.py:21
884 msgid "sound disabled"
885 msgstr ""
886
887 #: ../src/fenrirscreenreader\commands\commands\toggle_sound.py:24
888 msgid "sound enabled"
889 msgstr ""
890
891 #: ../src/fenrirscreenreader\commands\commands\toggle_speech.py:17
892 msgid "enables or disables speech"
893 msgstr ""
894
895 #: ../src/fenrirscreenreader\commands\commands\toggle_speech.py:22
896 msgid "speech disabled"
897 msgstr ""
898
899 #: ../src/fenrirscreenreader\commands\commands\toggle_speech.py:25
900 #: ../src/fenrirscreenreader\commands\onByteInput\15000-enable_temp_speech.py:24
901 #: ../src/fenrirscreenreader\commands\onKeyInput\15000-enable_temp_speech.py:28
902 msgid "speech enabled"
903 msgstr ""
904
905 #: ../src/fenrirscreenreader\commands\commands\toggle_tutorial_mode.py:18
906 msgid "Exiting tutorial mode. To enter tutorial mode again press Fenrir+f1"
907 msgstr ""
908
909 #: ../src/fenrirscreenreader\commands\commands\toggle_tutorial_mode.py:22
910 msgid "Entering tutorial mode. In this mode commands are described but not executed. You can move through the list of commands with the up and down arrow keys. To Exit tutorial mode press Fenrir+f1."
911 msgstr ""
912
913 #: ../src/fenrirscreenreader\commands\commands\toggle_vmenu_mode.py:18
914 msgid "Entering or Leaving v menu mode."
915 msgstr ""
916
917 #: ../src/fenrirscreenreader\commands\commands\toggle_vmenu_mode.py:22
918 msgid "Entering v menu."
919 msgstr ""
920
921 #: ../src/fenrirscreenreader\commands\commands\toggle_vmenu_mode.py:24
922 msgid "Leaving v menu."
923 msgstr ""
924
925 #: ../src/fenrirscreenreader\commands\help\curr_help.py:17
926 msgid "get current help message"
927 msgstr ""
928
929 #: ../src/fenrirscreenreader\commands\help\next_help.py:17
930 msgid "get next help message"
931 msgstr ""
932
933 #: ../src/fenrirscreenreader\commands\help\prev_help.py:17
934 msgid "get prev help message"
935 msgstr ""
936
937 #:
938 #: ../src/fenrirscreenreader\commands\onCursorChange\65000-present_line_if_cursor_change_vertical.py:46
939 msgid "indented "
940 msgstr ""
941
942 #: ../src/fenrirscreenreader\commands\onHeartBeat\76000-time.py:66
943 msgid "Autotime: {0}"
944 msgstr ""
945
946 #: ../src/fenrirscreenreader\commands\onKeyInput\80000-capslock.py:22
947 msgid "Capslock on"
948 msgstr ""
949
950 #: ../src/fenrirscreenreader\commands\onKeyInput\80000-capslock.py:24
951 msgid "Capslock off"
952 msgstr ""
953
954 #: ../src/fenrirscreenreader\commands\onKeyInput\80300-scrolllock.py:22
955 msgid "Scrolllock on"
956 msgstr ""
957
958 #: ../src/fenrirscreenreader\commands\onKeyInput\80300-scrolllock.py:24
959 msgid "Scrolllock off"
960 msgstr ""
961
962 #: ../src/fenrirscreenreader\commands\onKeyInput\80500-numlock.py:22
963 msgid "Numlock on"
964 msgstr ""
965
966 #: ../src/fenrirscreenreader\commands\onKeyInput\80500-numlock.py:24
967 msgid "Numlock off"
968 msgstr ""
969
970 #:
971 #: ../src/fenrirscreenreader\commands\onScreenChanged\80000-screen_change_announcement.py:20
972 msgid "screen {0}"
973 msgstr ""
974
975 #:
976 #: ../src/fenrirscreenreader\commands\onScreenUpdate\56000-highlight_tracking.py:16
977 msgid "enables or disables tracking of highlighted"
978 msgstr ""
979
980 #: ../src/fenrirscreenreader\commands\vmenu-navigation\curr_vmenu_entry.py:17
981 msgid "get current v menu entry"
982 msgstr ""
983
984 #: ../src/fenrirscreenreader\commands\vmenu-navigation\dec_level_vmenu.py:17
985 msgid "leave v menu submenu"
986 msgstr ""
987
988 #: ../src/fenrirscreenreader\commands\vmenu-navigation\exec_vmenu_entry.py:17
989 msgid "execute v menu entry"
990 msgstr ""
991
992 #: ../src/fenrirscreenreader\commands\vmenu-navigation\inc_level_vmenu.py:17
993 msgid "enter v menu submenu"
994 msgstr ""
995
996 #: ../src/fenrirscreenreader\commands\vmenu-navigation\next_vmenu_entry.py:17
997 msgid "get next v menu entry"
998 msgstr ""
999
1000 #: ../src/fenrirscreenreader\commands\vmenu-navigation\prev_vmenu_entry.py:17
1001 msgid "get prev v menu entry"
1002 msgstr ""
1003
1004 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_a.py:17
1005 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_b.py:17
1006 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_c.py:17
1007 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_d.py:17
1008 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_e.py:17
1009 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_f.py:17
1010 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_g.py:17
1011 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_h.py:17
1012 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_i.py:17
1013 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_j.py:17
1014 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_k.py:17
1015 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_l.py:17
1016 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_m.py:17
1017 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_n.py:17
1018 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_o.py:17
1019 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_p.py:17
1020 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_q.py:17
1021 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_r.py:17
1022 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_s.py:17
1023 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_t.py:17
1024 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_u.py:17
1025 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_v.py:17
1026 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_w.py:17
1027 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_x.py:17
1028 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_y.py:17
1029 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_z.py:17
1030 msgid "search for an menu entry"
1031 msgstr ""
1032
1033 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_a.py:23
1034 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_b.py:23
1035 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_c.py:23
1036 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_d.py:23
1037 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_e.py:23
1038 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_f.py:23
1039 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_g.py:23
1040 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_h.py:23
1041 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_i.py:23
1042 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_j.py:23
1043 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_k.py:23
1044 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_l.py:23
1045 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_m.py:23
1046 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_n.py:23
1047 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_o.py:23
1048 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_p.py:23
1049 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_q.py:23
1050 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_r.py:23
1051 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_s.py:23
1052 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_t.py:23
1053 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_u.py:23
1054 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_v.py:23
1055 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_w.py:23
1056 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_x.py:23
1057 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_y.py:23
1058 #: ../src/fenrirscreenreader\commands\vmenu-navigation\search_z.py:23
1059 msgid "not found"
1060 msgstr ""
1061
1062 #: ../src/fenrirscreenreader\core\attributeManager.py:168
1063 msgid "bold"
1064 msgstr ""
1065
1066 #: ../src/fenrirscreenreader\core\attributeManager.py:176
1067 msgid "italic"
1068 msgstr ""
1069
1070 #: ../src/fenrirscreenreader\core\attributeManager.py:184
1071 msgid "underline"
1072 msgstr ""
1073
1074 #: ../src/fenrirscreenreader\core\attributeManager.py:192
1075 msgid "strikethrough"
1076 msgstr ""
1077
1078 #: ../src/fenrirscreenreader\core\attributeManager.py:200
1079 msgid "reverse"
1080 msgstr ""
1081
1082 #: ../src/fenrirscreenreader\core\attributeManager.py:208
1083 msgid "blink"
1084 msgstr ""
1085
1086 #: ../src/fenrirscreenreader\core\attributeManager.py:225
1087 #: ../src/fenrirscreenreader\core\attributeManager.py:232
1088 msgid "default"
1089 msgstr ""
1090
1091 #: ../src/fenrirscreenreader\core\byteManager.py:103
1092 #: ../src/fenrirscreenreader\core\byteManager.py:105
1093 msgid "Sticky Mode On"
1094 msgstr ""
1095
1096 #: ../src/fenrirscreenreader\core\byteManager.py:109
1097 msgid "bypass"
1098 msgstr ""
1099
1100 #: ../src/fenrirscreenreader\core\fenrirManager.py:26
1101 msgid "Start Fenrir"
1102 msgstr ""
1103
1104 #: ../src/fenrirscreenreader\core\fenrirManager.py:234
1105 msgid "Quit Fenrir"
1106 msgstr ""
1107
1108 #: ../src/fenrirscreenreader\core\helpManager.py:77
1109 msgid "toggles the tutorial mode"
1110 msgstr ""
1111
1112 #: ../src/fenrirscreenreader\core\outputManager.py:297
6431113 msgid "speech temporary disabled"
6441114 msgstr ""
6451115
646 #: ../src/fenrir/commands/commands/time.py:18
647 msgid "presents the time"
648 msgstr ""
649
650 #: ../src/fenrir/commands/commands/toggle_auto_read.py:16
651 msgid "enables or disables automatic reading of new text as it appears"
652 msgstr ""
653
654 #: ../src/fenrir/commands/commands/toggle_auto_read.py:21
655 msgid "autoread enabled"
656 msgstr ""
657
658 #: ../src/fenrir/commands/commands/toggle_auto_read.py:23
659 msgid "autoread disabled"
660 msgstr ""
661
662 #: ../src/fenrir/commands/commands/toggle_auto_spell_check.py:17
663 msgid "enables or disables automatic spell checking"
664 msgstr ""
665
666 #: ../src/fenrir/commands/commands/toggle_auto_spell_check.py:22
667 msgid "auto spellcheck enabled"
668 msgstr ""
669
670 #: ../src/fenrir/commands/commands/toggle_auto_spell_check.py:24
671 msgid "auto spellcheck disabled"
672 msgstr ""
673
674 #: ../src/fenrir/commands/commands/toggle_auto_time.py:16
675 msgid "enables or disables automatic reading of time after an period"
676 msgstr ""
677
678 #: ../src/fenrir/commands/commands/toggle_auto_time.py:21
679 msgid "autotime enabled"
680 msgstr ""
681
682 #: ../src/fenrir/commands/commands/toggle_auto_time.py:23
683 msgid "autotime disabled"
684 msgstr ""
685
686 #: ../src/fenrir/commands/commands/toggle_braille.py:17
687 msgid "enables and disables output in braille"
688 msgstr ""
689
690 #: ../src/fenrir/commands/commands/toggle_braille.py:21
691 msgid "braille disabled"
692 msgstr ""
693
694 #: ../src/fenrir/commands/commands/toggle_braille.py:24
695 msgid "braille enabled"
696 msgstr ""
697
698 #: ../src/fenrir/commands/commands/toggle_emoticons.py:16
699 msgid "enables or disables announcement of emoticons instead of chars"
700 msgstr ""
701
702 #: ../src/fenrir/commands/commands/toggle_emoticons.py:21
703 msgid "emoticons enabled"
704 msgstr ""
705
706 #: ../src/fenrir/commands/commands/toggle_emoticons.py:23
707 msgid "emoticons disabled"
708 msgstr ""
709
710 #: ../src/fenrir/commands/commands/toggle_highlight_tracking.py:16
711 #: ../src/fenrir/commands/onInput/56000-highlight_tracking.py:16
712 msgid "enables or disables tracking of highlighted"
713 msgstr ""
714
715 #: ../src/fenrir/commands/commands/toggle_highlight_tracking.py:24
716 msgid "highlight tracking"
717 msgstr ""
718
719 #: ../src/fenrir/commands/commands/toggle_highlight_tracking.py:26
720 msgid "cursor tracking"
721 msgstr ""
722
723 #: ../src/fenrir/commands/commands/toggle_output.py:17
724 msgid "toggles all output settings"
725 msgstr ""
726
727 #: ../src/fenrir/commands/commands/toggle_output.py:23
728 msgid "Fenrir muted"
729 msgstr ""
730
731 #: ../src/fenrir/commands/commands/toggle_output.py:31
732 msgid "Fenrir unmuted"
733 msgstr ""
734
735 #: ../src/fenrir/commands/commands/toggle_punctuation_level.py:23
736 msgid "No punctuation found."
737 msgstr ""
738
739 #: ../src/fenrir/commands/commands/toggle_sound.py:17
740 msgid "enables or disables sound"
741 msgstr ""
742
743 #: ../src/fenrir/commands/commands/toggle_sound.py:21
744 msgid "sound disabled"
745 msgstr ""
746
747 #: ../src/fenrir/commands/commands/toggle_sound.py:24
748 msgid "sound enabled"
749 msgstr ""
750
751 #: ../src/fenrir/commands/commands/toggle_speech.py:17
752 msgid "enables or disables speech"
753 msgstr ""
754
755 #: ../src/fenrir/commands/commands/toggle_speech.py:21
756 msgid "speech disabled"
757 msgstr ""
758
759 #: ../src/fenrir/commands/commands/toggle_speech.py:24
760 #: ../src/fenrir/commands/onInput/15000-enable_temp_speech.py:28
761 msgid "speech enabled"
762 msgstr ""
763
764 #: ../src/fenrir/commands/commands/toggle_tutorial_mode.py:18
765 msgid "You are leaving the tutorial mode. Press that shortcut again to enter the tutorial mode again."
766 msgstr ""
767
768 #: ../src/fenrir/commands/commands/toggle_tutorial_mode.py:21
769 msgid "you entered the tutorial mode. In that mode the commands are not executed. but you get a description of what the shortcut does. To leave the tutorial mode, press that shortcut again."
770 msgstr ""
771
772 #: ../src/fenrir/commands/onInput/80000-capslock.py:22
773 msgid "Capslock on"
774 msgstr ""
775
776 #: ../src/fenrir/commands/onInput/80000-capslock.py:24
777 msgid "Capslock off"
778 msgstr ""
779
780 #: ../src/fenrir/commands/onInput/80300-scrolllock.py:22
781 msgid "Scrolllock on"
782 msgstr ""
783
784 #: ../src/fenrir/commands/onInput/80300-scrolllock.py:24
785 msgid "Scrolllock off"
786 msgstr ""
787
788 #: ../src/fenrir/commands/onInput/80500-numlock.py:22
789 msgid "Numlock on"
790 msgstr ""
791
792 #: ../src/fenrir/commands/onInput/80500-numlock.py:24
793 msgid "Numlock off"
794 msgstr ""
795
796 #:
797 #: ../src/fenrir/commands/onScreenChanged/80000-screen_change_announcement.py:20
798 msgid "screen {0}"
799 msgstr ""
800
801 #: ../src/fenrir/commands/onScreenUpdate/76000-time.py:66
802 msgid "Autotime: {0}"
803 msgstr ""
804
805 #: ../src/fenrir/fenrir.py:24
806 msgid "Start Fenrir"
807 msgstr ""
808
809 #: ../src/fenrir/fenrir.py:99
810 msgid "Quit Fenrir"
811 msgstr ""
812
1116 #: ../src/fenrirscreenreader\core\quickMenuManager.py:124
1117 msgid "setting invalid"
1118 msgstr ""
1119
1120 #: ../src/fenrirscreenreader\core\quickMenuManager.py:131
1121 msgid "setting value invalid"
1122 msgstr ""
1123
1124 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1125 msgid "black"
1126 msgstr ""
1127
1128 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1129 msgid "blue"
1130 msgstr ""
1131
1132 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1133 msgid "cyan"
1134 msgstr ""
1135
1136 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1137 msgid "green"
1138 msgstr ""
1139
1140 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1141 msgid "red"
1142 msgstr ""
1143
1144 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1145 msgid "white"
1146 msgstr ""
1147
1148 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1149 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1150 msgid "Magenta"
1151 msgstr ""
1152
1153 #: ../src/fenrirscreenreader\core\screenDriver.py:12
1154 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1155 msgid "brown/yellow"
1156 msgstr ""
1157
1158 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1159 msgid "Black"
1160 msgstr ""
1161
1162 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1163 msgid "Blue"
1164 msgstr ""
1165
1166 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1167 msgid "Cyan"
1168 msgstr ""
1169
1170 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1171 msgid "Dark gray"
1172 msgstr ""
1173
1174 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1175 msgid "Green"
1176 msgstr ""
1177
1178 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1179 msgid "Light blue"
1180 msgstr ""
1181
1182 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1183 msgid "Light cyan"
1184 msgstr ""
1185
1186 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1187 msgid "Light gray"
1188 msgstr ""
1189
1190 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1191 msgid "Light magenta"
1192 msgstr ""
1193
1194 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1195 msgid "Light red"
1196 msgstr ""
1197
1198 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1199 msgid "Light yellow"
1200 msgstr ""
1201
1202 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1203 msgid "Red"
1204 msgstr ""
1205
1206 #: ../src/fenrirscreenreader\core\screenDriver.py:13
1207 msgid "White"
1208 msgstr ""
1209
1210 #: ../src/fenrirscreenreader\core\vmenuManager.py:66
1211 #: ../src/fenrirscreenreader\core\vmenuManager.py:226
1212 msgid "Menu"
1213 msgstr ""
1214
1215 #: ../src/fenrirscreenreader\core\vmenuManager.py:234
1216 msgid "Action"
1217 msgstr ""
1218
00 #!/usr/bin/env bash
1
2 pygettext3 -d fenrir ../src/fenrir/*.py ../src/fenrir/*/*.py ../src/fenrir/*/*/*.py
1 sudo pygettext3 -d fenrir ../src/fenrirscreenreader/*.py ../src/fenrirscreenreader/*/*.py ../src/fenrirscreenreader/*/*/*.py