100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
|
# Python imports
|
||
|
import os
|
||
|
|
||
|
# Lib imports
|
||
|
import gi
|
||
|
from gi.repository import GObject
|
||
|
|
||
|
# Application imports
|
||
|
from plugins.plugins_controller import PluginsController
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
try:
|
||
|
from gi.repository import GdkX11
|
||
|
except ImportError:
|
||
|
logger.debug("Could not import X11 gir module...")
|
||
|
|
||
|
def display_manager():
|
||
|
""" Try to detect which display manager we are running under... """
|
||
|
if os.environ.get('WAYLAND_DISPLAY'):
|
||
|
return 'WAYLAND'
|
||
|
return 'X11' # Fallback assumption of X11
|
||
|
|
||
|
|
||
|
if display_manager() == 'X11':
|
||
|
try:
|
||
|
gi.require_version('Keybinder', '3.0')
|
||
|
from gi.repository import Keybinder
|
||
|
Keybinder.init()
|
||
|
Keybinder.set_use_cooked_accelerators(False)
|
||
|
except (ImportError, ValueError):
|
||
|
logger.debug('Unable to load Keybinder module. This means the hide_window shortcut will be unavailable')
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
class ControllerData:
|
||
|
''' ControllerData contains most of the state of the app at ay given time. It also has some support methods. '''
|
||
|
|
||
|
def setup_controller_data(self) -> None:
|
||
|
self.builder = None
|
||
|
self.core_widget = None
|
||
|
|
||
|
self.load_glade_file()
|
||
|
self.plugins = PluginsController()
|
||
|
|
||
|
self.hidefunc = None
|
||
|
self.show_image = True
|
||
|
self.guake_key = settings.get_guake_key()
|
||
|
|
||
|
|
||
|
def setup_toggle_event(self) -> None:
|
||
|
self.window = settings.get_builder().get_object(f"{app_name.lower()}")
|
||
|
|
||
|
# Attempt to grab a global hotkey for hiding the window.
|
||
|
# If we fail, we'll never hide the window, iconifying instead.
|
||
|
if self.guake_key and display_manager() == 'X11':
|
||
|
try:
|
||
|
hidebound = Keybinder.bind(self.guake_key, self.on_hide_window)
|
||
|
except (KeyError, NameError):
|
||
|
pass
|
||
|
|
||
|
if not hidebound:
|
||
|
logger.debug('Unable to bind hide_window key, another instance/window has it.')
|
||
|
self.hidefunc = self.window.iconify
|
||
|
else:
|
||
|
self.hidefunc = self.window.hide
|
||
|
|
||
|
|
||
|
def clear_console(self) -> None:
|
||
|
''' Clears the terminal screen. '''
|
||
|
os.system('cls' if os.name == 'nt' else 'clear')
|
||
|
|
||
|
def call_method(self, _method_name: str, data: type) -> type:
|
||
|
'''
|
||
|
Calls a method from scope of class.
|
||
|
|
||
|
Parameters:
|
||
|
a (obj): self
|
||
|
b (str): method name to be called
|
||
|
c (*): Data (if any) to be passed to the method.
|
||
|
Note: It must be structured according to the given methods requirements.
|
||
|
|
||
|
Returns:
|
||
|
Return data is that which the calling method gives.
|
||
|
'''
|
||
|
method_name = str(_method_name)
|
||
|
method = getattr(self, method_name, lambda data: f"No valid key passed...\nkey={method_name}\nargs={data}")
|
||
|
return method(*data) if data else method()
|
||
|
|
||
|
def has_method(self, obj: type, method: type) -> type:
|
||
|
''' Checks if a given method exists. '''
|
||
|
return callable(getattr(obj, method, None))
|
||
|
|
||
|
def clear_children(self, widget: type) -> None:
|
||
|
''' Clear children of a gtk widget. '''
|
||
|
for child in widget.get_children():
|
||
|
widget.remove(child)
|