Пример #1
0
 def __init__(self, extension_server):
     self.extensions_dir = EXTENSIONS_DIR  # type: str
     self.extension_errors = {}  # type: Dict[str, ExtRunError]
     self.extension_procs = {}
     self.extension_server = extension_server
     self.dont_run_extensions = get_options().no_extensions
     self.verbose = get_options().verbose
    def _init_webview(self):
        """
        Initialize preferences WebView
        """
        self.webview = WebKit2.WebView()
        self.ui['scrolled_window'].add(self.webview)
        opts = get_options()
        self._load_prefs_html()

        web_settings = self.webview.get_settings()
        web_settings.set_enable_developer_extras(bool(opts.dev))
        web_settings.set_enable_xss_auditor(False)
        web_settings.set_enable_write_console_messages_to_stdout(True)

        self.webview.get_context().register_uri_scheme('prefs',
                                                       self.on_scheme_callback)
        self.webview.get_context().set_cache_model(
            WebKit2.CacheModel.DOCUMENT_VIEWER)  # disable caching
        self.webview.connect('button-press-event',
                             self.webview_on_button_press_event)
        self.webview.connect('context-menu', self.webview_on_context_menu)

        inspector = self.webview.get_inspector()
        inspector.connect("attach",
                          lambda inspector, target_view: WebKit2.WebView())
Пример #3
0
def main():
    """
    Main function that starts everything
    """

    # start DBus loop
    DBusGMainLoop(set_as_default=True)
    bus = dbus.SessionBus()
    instance = bus.request_name(DBUS_SERVICE)

    if instance != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER:
        print(
            "DBus name already taken. Ulauncher is probably backgrounded. Did you mean `ulauncher-toggle`?",
            file=sys.stderr)
        toggle_window = dbus.SessionBus().get_object(
            DBUS_SERVICE, DBUS_PATH).get_dbus_method("toggle_window")
        toggle_window()
        return

    _create_dirs()

    options = get_options()
    setup_logging(options)
    logger = logging.getLogger('ulauncher')
    logger.info('Ulauncher version %s', get_version())
    logger.info('Extension API version %s', api_version)
    logger.info("GTK+ %s.%s.%s", Gtk.get_major_version(),
                Gtk.get_minor_version(), Gtk.get_micro_version())
    logger.info("Is Wayland: %s", is_wayland())
    logger.info("Wayland compatibility: %s",
                ('on' if is_wayland_compatibility_on() else 'off'))

    # log uncaught exceptions
    def except_hook(exctype, value, tb):
        logger.error("Uncaught exception", exc_info=(exctype, value, tb))

    sys.excepthook = except_hook

    window = UlauncherWindow.get_instance()
    UlauncherDbusService(window)
    if not options.hide_window:
        window.show()

    if Settings.get_instance().get_property('show-indicator-icon'):
        AppIndicator.get_instance().show()

    # workaround to make Ctrl+C quitting the app
    signal_handler = SignalHandler(window)
    gtk_thread = run_async(Gtk.main)()
    try:
        while gtk_thread.is_alive() and not signal_handler.killed():
            time.sleep(0.5)
    except KeyboardInterrupt:
        logger.warning('On KeyboardInterrupt')
    finally:
        Gtk.main_quit()
Пример #4
0
    def init_theme(self):
        load_available_themes()
        theme = Theme.get_current()
        theme.clear_cache()

        # removing window shadow solves issue with DEs without a compositor (#230)
        if get_options().no_window_shadow:
            self.window_body.get_style_context().add_class('no-window-shadow')

        self.init_styles(theme.compile_css())
Пример #5
0
    def _init_webview(self):
        settings = WebKit2.Settings(
            enable_developer_extras=bool(get_options().dev),
            enable_hyperlink_auditing=False,
            enable_page_cache=False,
            enable_write_console_messages_to_stdout=True,
            enable_xss_auditor=False,
            hardware_acceleration_policy=WebKit2.HardwareAccelerationPolicy.
            NEVER,
        )

        server = PreferencesContextServer.get_instance(self.get_application())
        self.webview = WebKit2.WebView(settings=settings,
                                       web_context=server.context)
        server.client = self.webview
        self.add(self.webview)
        self.webview.show()
        self.load_page()
        # Show right click menu if running with --dev flag
        self.webview.connect('context-menu', lambda *_: not get_options().dev)

        inspector = self.webview.get_inspector()
        inspector.connect("attach",
                          lambda inspector, target_view: WebKit2.WebView())
Пример #6
0
    def finish_initializing(self, builder):
        """Called while initializing this instance in __new__

        finish_initializing should be called after parsing the UI definition
        and creating a UlauncherWindow object with it in order to finish
        initializing the start of the new UlauncherWindow instance.
        """
        # Get a reference to the builder and set up the signals.
        self.builder = builder
        self.ui = builder.get_ui(self, True)
        self.PreferencesDialog = None  # class
        self.preferences_dialog = None  # instance

        self.results_nav = None
        self.window = self.ui['ulauncher_window']
        self.window_body = self.ui['body']
        self.input = self.ui['input']
        self.prefs_btn = self.ui['prefs_btn']
        self.result_box = self.ui["result_box"]

        self.input.connect('changed', self.on_input_changed)
        self.prefs_btn.connect('clicked', self.on_mnu_preferences_activate)

        self.set_keep_above(True)

        self.PreferencesDialog = PreferencesUlauncherDialog
        self.settings = Settings.get_instance()

        self.fix_window_width()
        self.position_window()
        self.init_theme()

        # this will trigger to show frequent apps if necessary
        self.show_results([])

        if not is_wayland_compatibility_on():
            # bind hotkey
            Keybinder.init()
            accel_name = self.settings.get_property('hotkey-show-app')
            # bind in the main thread
            GLib.idle_add(self.bind_show_app_hotkey, accel_name)

        start_app_watcher()
        ExtensionServer.get_instance().start()
        time.sleep(0.01)
        ExtensionRunner.get_instance().run_all()
        if not get_options().no_extensions:
            ExtensionDownloader.get_instance().download_missing()
Пример #7
0
    def finish_initializing(self, ui):
        # pylint: disable=attribute-defined-outside-init
        self.ui = ui
        self.preferences = None  # instance

        self.results_nav = None
        self.window_body = self.ui['body']
        self.input = self.ui['input']
        self.prefs_btn = self.ui['prefs_btn']
        self.result_box = self.ui["result_box"]
        self.scroll_container = self.ui["result_box_scroll_container"]

        self.input.connect('changed', self.on_input_changed)
        self.prefs_btn.connect('clicked', self.on_mnu_preferences_activate)

        self.set_keep_above(True)

        self.settings = Settings.get_instance()

        self.fix_window_width()
        self.position_window()
        self.init_theme()

        # this will trigger to show frequent apps if necessary
        self.show_results([])

        self.connect('button-press-event', self.mouse_down_event)
        self.connect('button-release-event', self.mouse_up_event)
        self.connect('motion_notify_event', self.mouse_move_event)

        if self.settings.get_property('show-indicator-icon'):
            AppIndicator.get_instance(self).show()

        if IS_X11:
            # bind hotkey
            Keybinder.init()
            accel_name = self.settings.get_property('hotkey-show-app')
            # bind in the main thread
            GLib.idle_add(self.bind_hotkey, accel_name)

        ExtensionServer.get_instance().start()
        time.sleep(0.01)
        ExtensionRunner.get_instance().run_all()
        if not get_options().no_extensions:
            ExtensionDownloader.get_instance().download_missing()
Пример #8
0
def main():
    """
    Main function that starts everything
    """

    options = get_options()
    setup_logging(options)
    logger.info('Ulauncher version %s', VERSION)
    logger.info('Extension API version %s', API_VERSION)
    logger.info("GTK+ %s.%s.%s", Gtk.get_major_version(),
                Gtk.get_minor_version(), Gtk.get_micro_version())
    logger.info("Session type: %s", XDG_SESSION_TYPE)
    if XDG_SESSION_TYPE != "x11":
        logger.info("X11 backend: %s", ('Yes' if IS_X11_COMPATIBLE else 'No'))
    if (Gtk.get_major_version(), Gtk.get_minor_version()) < (3, 22):
        logger.error(
            "Ulauncher requires GTK+ version 3.22 or newer. Please upgrade your GTK version."
        )
    if options.no_window_shadow:
        logger.warning(
            "The --no-window-shadow argument has been moved to a user setting")
    if options.hide_window:
        # Ulauncher's "Launch at Login" is now implemented with systemd, but originally
        # it was implemented using XDG autostart. To prevent files created the old way
        # from starting a second Ulauncher background process we have to make sure the
        # --no-window flag prevents the app from starting.
        sys.exit("The --hide-window argument has been renamed to --no-window")

    # log uncaught exceptions
    def except_hook(exctype, value, tb):
        logger.error("Uncaught exception", exc_info=(exctype, value, tb))

    sys.excepthook = except_hook

    app = UlauncherApp()

    GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGHUP,
                         partial(reload_config, app), None)
    GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGTERM, app.quit)

    try:
        app.run(sys.argv)
    except KeyboardInterrupt:
        logger.warning('On KeyboardInterrupt')
    def _init_webview(self):
        """
        Initialize preferences WebView
        """
        self.webview = WebKit2.WebView()
        self.ui['scrolled_window'].add(self.webview)
        opts = get_options()
        self._load_prefs_html()

        web_settings = self.webview.get_settings()
        web_settings.set_enable_developer_extras(bool(opts.dev))
        web_settings.set_enable_xss_auditor(False)
        web_settings.set_enable_write_console_messages_to_stdout(True)

        self.webview.get_context().register_uri_scheme('prefs', self.on_scheme_callback)
        self.webview.get_context().set_cache_model(WebKit2.CacheModel.DOCUMENT_VIEWER)  # disable caching
        self.webview.connect('button-press-event', self.webview_on_button_press_event)
        self.webview.connect('context-menu', self.webview_on_context_menu)

        inspector = self.webview.get_inspector()
        inspector.connect("attach", lambda inspector, target_view: WebKit2.WebView())
 def _handle_no_window_shadow_option(self, window_wrapper):
     # removing window shadow solves issue with DEs without a compositor (#230)
     if get_options().no_window_shadow:
         window_wrapper.get_style_context().add_class('no-window-shadow')
Пример #11
0
def main():
    """
    Main function that starts everything
    """
    options = get_options()

    # Set up global logging for stdout and file
    file_handler = logging.FileHandler(f"{STATE_DIR}/last.log", mode='w+')
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(
        logging.DEBUG if options.verbose else logging.WARNING)
    stream_handler.setFormatter(ColoredFormatter())

    logging.root.handlers = []
    logging.basicConfig(
        level=logging.DEBUG,
        format=
        "%(asctime)s | %(levelname)s | %(message)s | %(module)s.%(funcName)s():%(lineno)s",
        handlers=[file_handler, stream_handler])

    # Logger for actual use in this file
    logger = logging.getLogger()

    logger.info('Ulauncher version %s', VERSION)
    logger.info('Extension API version %s', API_VERSION)
    logger.info("GTK+ %s.%s.%s", Gtk.get_major_version(),
                Gtk.get_minor_version(), Gtk.get_micro_version())
    logger.info("PyGobject+ %i.%i.%i", *gi.version_info)

    logger.info("Desktop: %s (%s) on %s", DESKTOP_NAME, XDG_SESSION_TYPE,
                DISTRO)

    if XDG_SESSION_TYPE != "X11":
        logger.info("X11 backend: %s", ('Yes' if IS_X11_COMPATIBLE else 'No'))
    if (Gtk.get_major_version(), Gtk.get_minor_version()) < (3, 22):
        logger.critical(
            "Ulauncher requires GTK+ version 3.22 or newer. Please upgrade your GTK version."
        )
        sys.exit()
    if gi.version_info < (3, 30, 0):
        logger.critical(
            "Ulauncher requires PyGobject version 3.30 or newer. "
            "See https://github.com/Ulauncher/Ulauncher/issues/1051 for PyGobject upgrade instructions."
        )
        sys.exit()
    if options.no_window_shadow:
        logger.warning(
            "The --no-window-shadow argument has been moved to a user setting")
    if options.hide_window:
        # Ulauncher's "Launch at Login" is now implemented with systemd, but originally
        # it was implemented using XDG autostart. To prevent files created the old way
        # from starting a second Ulauncher background process we have to make sure the
        # --no-window flag prevents the app from starting.
        logger.critical(
            "The --hide-window argument has been renamed to --no-window")
        sys.exit()

    # log uncaught exceptions
    def except_hook(exctype, value, tb):
        logger.error("Uncaught exception", exc_info=(exctype, value, tb))

    sys.excepthook = except_hook

    app = UlauncherApp()

    GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGHUP,
                         partial(reload_config, app, logger), None)
    GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGTERM, app.quit)

    try:
        app.run(sys.argv)
    except KeyboardInterrupt:
        logger.warning('On KeyboardInterrupt')
Пример #12
0
 def __init__(self):
     self.extensions_dir = EXTENSIONS_DIR
     self.extension_procs = {}
     self.extensionServer = ExtensionServer.get_instance()
     self.dont_run_extensions = get_options().no_extensions
     self.verbose = get_options().verbose
Пример #13
0
 def __init__(self):
     self.extension_errors = {}  # type: Dict[str, ExtRunError]
     self.extension_procs = {}
     self.dont_run_extensions = get_options().no_extensions
     self.verbose = get_options().verbose
 def webview_on_context_menu(self, *args):
     return bool(not get_options().dev)
 def webview_on_context_menu(self, *args):
     return bool(not get_options().dev)
Пример #16
0
 def __init__(self, extension_server):
     self.extensions_dir = EXTENSIONS_DIR
     self.extension_procs = {}
     self.extension_server = extension_server
     self.dont_run_extensions = get_options().no_extensions
     self.verbose = get_options().verbose
Пример #17
0
 def __init__(self, extension_server):
     self.extensions_dir = EXTENSIONS_DIR
     self.extension_procs = {}
     self.extension_server = extension_server
     self.dont_run_extensions = get_options().no_extensions
     self.verbose = get_options().verbose