#!/usr/bin/python3 # -*- coding: utf-8 -*- # input-remapper - GUI for device specific keyboard mappings # Copyright (C) 2022 sezanzeb # # This file is part of input-remapper. # # input-remapper is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # input-remapper is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with input-remapper. If not, see . """Starts the user interface.""" from __future__ import annotations import os import sys import atexit import logging from argparse import ArgumentParser from inputremapper.gui.gettext import _, LOCALE_DIR import gi gi.require_version('Gtk', '3.0') gi.require_version('GLib', '2.0') gi.require_version('GtkSource', '4') from gi.repository import Gtk # https://github.com/Nuitka/Nuitka/issues/607#issuecomment-650217096 Gtk.init() from inputremapper.logger import logger, update_verbosity, log_info def start_processes() -> DaemonProxy: """Start helper and daemon via pkexec to run in the background.""" # this function is overwritten in tests daemon = Daemon.connect() debug = " -d" if logger.level <= logging.DEBUG else "" cmd = f"pkexec input-remapper-control --command helper {debug}" logger.debug("Running `%s`", cmd) exit_code = os.system(cmd) if exit_code != 0: logger.error("Failed to pkexec the helper, code %d", exit_code) sys.exit(11) return daemon if __name__ == '__main__': parser = ArgumentParser() parser.add_argument( '-d', '--debug', action='store_true', dest='debug', help=_('Displays additional debug information'), default=False ) options = parser.parse_args(sys.argv[1:]) update_verbosity(options.debug) log_info('input-remapper-gtk') logger.debug('Using locale directory: {}'.format(LOCALE_DIR)) # import input-remapper stuff after setting the log verbosity from inputremapper.gui.message_broker import MessageBroker, MessageType from inputremapper.configs.system_mapping import system_mapping from inputremapper.gui.data_manager import DataManager from inputremapper.gui.user_interface import UserInterface from inputremapper.gui.controller import Controller from inputremapper.injection.global_uinputs import GlobalUInputs from inputremapper.groups import _Groups from inputremapper.gui.reader import Reader from inputremapper.daemon import Daemon, DaemonProxy from inputremapper.configs.global_config import GlobalConfig from inputremapper.configs.migrations import migrate migrate() message_broker = MessageBroker() # create the reader before we start the helper (start_processes) otherwise it # can come to race conditions with the creation of pipes reader = Reader(message_broker, _Groups()) daemon = start_processes() data_manager = DataManager( message_broker, GlobalConfig(), reader, daemon, GlobalUInputs(), system_mapping ) controller = Controller(message_broker, data_manager) user_interface = UserInterface(message_broker, controller) controller.set_gui(user_interface) message_broker.signal(MessageType.init) def stop(): if isinstance(daemon, Daemon): # have fun debugging completely unrelated tests if you remove this daemon.stop_all() controller.close() atexit.register(stop) Gtk.main()