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())
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()
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())
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())
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()
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()
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')
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')
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
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 __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