2021-11-27 21:53:05 +00:00
|
|
|
# Python imports
|
2021-12-07 07:48:52 +00:00
|
|
|
import re
|
2021-11-27 21:53:05 +00:00
|
|
|
|
2021-12-07 04:44:39 +00:00
|
|
|
# Lib imports
|
2021-11-27 21:53:05 +00:00
|
|
|
import gi
|
|
|
|
gi.require_version('Gtk', '3.0')
|
|
|
|
gi.require_version('Gdk', '3.0')
|
2022-11-29 04:34:13 +00:00
|
|
|
from gi.repository import Gtk
|
|
|
|
from gi.repository import Gdk
|
2021-11-27 21:53:05 +00:00
|
|
|
|
|
|
|
# Application imports
|
|
|
|
|
|
|
|
|
2021-12-11 03:05:38 +00:00
|
|
|
valid_keyvalue_pat = re.compile(r"[a-z0-9A-Z-_\[\]\(\)\| ]")
|
2021-12-07 04:44:39 +00:00
|
|
|
|
|
|
|
|
2022-11-29 04:34:13 +00:00
|
|
|
|
|
|
|
|
2021-11-27 21:53:05 +00:00
|
|
|
class KeyboardSignalsMixin:
|
2022-02-20 07:32:51 +00:00
|
|
|
""" KeyboardSignalsMixin keyboard hooks controller. """
|
|
|
|
|
2022-03-08 01:18:55 +00:00
|
|
|
# TODO: Need to set methods that use this to somehow check the keybindings state instead.
|
2021-12-26 06:32:45 +00:00
|
|
|
def unset_keys_and_data(self, widget=None, eve=None):
|
2022-02-25 23:58:11 +00:00
|
|
|
self.ctrl_down = False
|
|
|
|
self.shift_down = False
|
|
|
|
self.alt_down = False
|
2021-12-26 06:32:45 +00:00
|
|
|
|
2022-03-07 03:27:47 +00:00
|
|
|
def on_global_key_press_controller(self, eve, user_data):
|
2021-11-27 21:53:05 +00:00
|
|
|
keyname = Gdk.keyval_name(user_data.keyval).lower()
|
2022-02-25 23:58:11 +00:00
|
|
|
if keyname.replace("_l", "").replace("_r", "") in ["control", "alt", "shift"]:
|
2021-11-27 21:53:05 +00:00
|
|
|
if "control" in keyname:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.ctrl_down = True
|
2021-11-27 21:53:05 +00:00
|
|
|
if "shift" in keyname:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.shift_down = True
|
2021-11-27 21:53:05 +00:00
|
|
|
if "alt" in keyname:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.alt_down = True
|
2021-11-27 21:53:05 +00:00
|
|
|
|
2022-03-07 03:27:47 +00:00
|
|
|
def on_global_key_release_controller(self, widget, event):
|
|
|
|
"""Handler for keyboard events"""
|
|
|
|
keyname = Gdk.keyval_name(event.keyval).lower()
|
2022-02-25 23:58:11 +00:00
|
|
|
if keyname.replace("_l", "").replace("_r", "") in ["control", "alt", "shift"]:
|
2021-11-27 21:53:05 +00:00
|
|
|
if "control" in keyname:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.ctrl_down = False
|
2021-11-27 21:53:05 +00:00
|
|
|
if "shift" in keyname:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.shift_down = False
|
2021-11-27 21:53:05 +00:00
|
|
|
if "alt" in keyname:
|
2022-02-25 23:58:11 +00:00
|
|
|
self.alt_down = False
|
2021-11-27 21:53:05 +00:00
|
|
|
|
2023-02-24 05:03:29 +00:00
|
|
|
mapping = keybindings.lookup(event)
|
2022-03-07 03:27:47 +00:00
|
|
|
if mapping:
|
2022-12-09 05:33:04 +00:00
|
|
|
# See if in filemanager scope
|
2022-07-07 17:51:51 +00:00
|
|
|
try:
|
2022-12-09 05:33:04 +00:00
|
|
|
getattr(self, mapping)()
|
2022-07-07 17:51:51 +00:00
|
|
|
return True
|
|
|
|
except Exception:
|
2022-12-09 05:33:04 +00:00
|
|
|
# Must be plugins scope, event call, OR we forgot to add method to file manager scope
|
|
|
|
if "||" in mapping:
|
|
|
|
sender, eve_type = mapping.split("||")
|
|
|
|
else:
|
|
|
|
sender = ""
|
|
|
|
eve_type = mapping
|
|
|
|
|
2022-10-02 03:12:14 +00:00
|
|
|
self.handle_plugin_key_event(sender, eve_type)
|
2022-03-07 03:27:47 +00:00
|
|
|
else:
|
2023-02-24 05:03:29 +00:00
|
|
|
logger.debug(f"on_global_key_release_controller > key > {keyname}")
|
2022-03-07 03:27:47 +00:00
|
|
|
|
|
|
|
if self.ctrl_down:
|
|
|
|
if keyname in ["1", "kp_1", "2", "kp_2", "3", "kp_3", "4", "kp_4"]:
|
|
|
|
self.builder.get_object(f"tggl_notebook_{keyname.strip('kp_')}").released()
|
|
|
|
|
2022-10-02 03:12:14 +00:00
|
|
|
def handle_plugin_key_event(self, sender, eve_type):
|
|
|
|
event_system.emit(eve_type)
|
|
|
|
|
2022-03-07 03:27:47 +00:00
|
|
|
def keyboard_close_tab(self):
|
|
|
|
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
|
|
|
notebook = self.builder.get_object(f"window_{wid}")
|
|
|
|
scroll = self.builder.get_object(f"{wid}|{tid}")
|
|
|
|
page = notebook.page_num(scroll)
|
|
|
|
tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
|
|
|
watcher = tab.get_dir_watcher()
|
|
|
|
watcher.cancel()
|
|
|
|
|
|
|
|
self.get_fm_window(wid).delete_tab_by_id(tid)
|
|
|
|
notebook.remove_page(page)
|
2022-10-10 01:59:44 +00:00
|
|
|
if not trace_debug:
|
|
|
|
self.fm_controller.save_state()
|
2022-03-07 03:27:47 +00:00
|
|
|
self.set_window_title()
|