def on_delete_theme_button_clicked(self, event): theme = self.get_selected_theme() if theme and not theme.system: if self.get_hidden_theme(theme): question = _("Reset selected theme" " to Onboard defaults?") else: question = _("Delete selected theme file?") reply = show_confirmation_dialog(question, self.window) if reply == True: # be sure the file hasn't been deleted from outside already if os.path.exists(theme.filename): os.remove(theme.filename) # find a neighboring theme to select after deletion if not self.get_hidden_theme(theme): # will row disappear? near_theme = self.find_neighbor_theme(theme) config.theme_filename = near_theme.filename \ if near_theme else "" self.update_themeList() # notify gconf clients theme = self.get_selected_theme() if theme: theme.apply()
def check_gnome_accessibility(self, parent = None): if not self.xid_mode and \ not self.gdi.toolkit_accessibility: question = _("Enabling auto-show requires Gnome Accessibility.\n\n" "Onboard can turn on accessiblity now, however it is " "recommended that you log out and back in " "for it to reach its full potential.\n\n" "Enable accessibility now?") reply = show_confirmation_dialog(question, parent) if not reply == True: return False self.gdi.toolkit_accessibility = True return True
def on_new_theme_button_clicked(self, event): while True: new_name = show_ask_string_dialog( _("Please enter a name for the new theme"), self.window) if not new_name: return new_filename = Theme.build_user_filename(new_name) if not os.path.exists(new_filename): break question = _("The theme file already exists.\n'%s'" "\n\nOverwrite it anyway?" % new_filename) if show_confirmation_dialog(question, self.window): break theme = self.get_selected_theme() if not theme: theme = Theme() theme.save_as(new_name, new_name) config.theme_filename = theme.filename self.update_themeList()
def init(self): self.keyboard_state = None self.vk_timer = None self.reset_vk() self._connections = [] self._window = None self.status_icon = None # finish config initialization config.init() sys.path.append(os.path.join(config.install_dir, 'scripts')) # load the initial layout _logger.info("Loading initial layout") self.reload_layout() # create the main window if config.xid_mode: # XEmbed mode for gnome-screensaver? self._window = KbdPlugWindow() # write xid to stdout sys.stdout.write('%d\n' % self._window.get_id()) sys.stdout.flush() else: self._window = KbdWindow() self.do_connect(self._window, "quit-onboard", lambda x: self.do_quit_onboard()) self._window.application = self self._window.set_keyboard(self.keyboard) # Handle command line options x, y, size after window creation # because the rotation code needs the window's screen. if not config.xid_mode: rect = self._window.get_rect().copy() options = config.options if options.size: size = options.size.split("x") rect.w = int(size[0]) rect.h = int(size[1]) if not options.x is None: rect.x = options.x if not options.y is None: rect.y = options.y if rect != self._window.get_rect(): orientation = self._window.get_screen_orientation() self._window.write_window_rect(orientation, rect) self._window.restore_window_rect() # move/resize early # show/hide the window self.keyboard.set_startup_visibility() # connect notifications for keyboard map and group changes self.keymap = Gdk.Keymap.get_default() self.do_connect(self.keymap, "keys-changed", self.cb_keys_changed) # map changes Gdk.event_handler_set(cb_any_event, self) # group changes # connect config notifications here to keep config from holding # references to keyboard objects. once = CallOnce(50).enqueue # delay callbacks by 50ms reload_layout = lambda x: once(self.reload_layout_and_present) update_ui = lambda x: once(self._update_ui) redraw = lambda x: once(self.keyboard.redraw) update_transparency = lambda x: once(self.keyboard.update_transparency) update_inactive_transparency = \ lambda x: once(self.keyboard.update_inactive_transparency) # general config.auto_show.enabled_notify_add(lambda x: \ self.keyboard.update_auto_show()) # window config.window.window_state_sticky_notify_add(lambda x: \ self._window.update_sticky_state()) config.window.window_decoration_notify_add(self._update_window_options) config.window.force_to_top_notify_add(self._update_window_options) config.window.keep_aspect_ratio_notify_add(update_ui) config.window.transparency_notify_add(update_transparency) config.window.background_transparency_notify_add(update_transparency) config.window.transparent_background_notify_add(update_ui) config.window.enable_inactive_transparency_notify_add(update_transparency) config.window.inactive_transparency_notify_add(update_inactive_transparency) # layout config.layout_filename_notify_add(reload_layout) # theme #config.gdi.gtk_theme_notify_add(self.on_gtk_theme_changed) config.theme_notify_add(self.on_theme_changed) config.key_label_font_notify_add(reload_layout) config.key_label_overrides_notify_add(reload_layout) config.theme_settings.color_scheme_filename_notify_add(reload_layout) config.theme_settings.key_label_font_notify_add(reload_layout) config.theme_settings.key_label_overrides_notify_add(reload_layout) config.theme_settings.key_size_notify_add(update_ui) # for label size config.theme_settings.theme_attributes_notify_add(redraw) # snippets config.snippets_notify_add(reload_layout) # universal access config.scanner.enabled_notify_add(self.keyboard._on_scanner_enabled) GObject.idle_add(self.keyboard.enable_scanner, config.scanner.enabled) config.window.resize_handles_notify_add(lambda x: \ self.keyboard.update_resize_handles()) # misc config.keyboard.show_click_buttons_notify_add(update_ui) config.lockdown.lockdown_notify_add(update_ui) config.clickmapper.state_notify_add(update_ui) if config.mousetweaks: config.mousetweaks.state_notify_add(update_ui) # create status icon # Indicator is a singleton to allow recreating the keyboard # window on changes to the "force_to_top" setting. self.status_icon = Indicator() self.status_icon.set_keyboard_window(self._window) self.do_connect(self.status_icon, "quit-onboard", lambda x: self.do_quit_onboard()) # Callbacks to use when icp or status icon is toggled config.show_status_icon_notify_add(self.show_hide_status_icon) config.icp.in_use_notify_add(self.cb_icp_in_use_toggled) self.show_hide_status_icon(config.show_status_icon) # Minimize to IconPalette if running under GDM if 'RUNNING_UNDER_GDM' in os.environ: config.icp.in_use = True config.show_status_icon = False # unity-2d needs the skip-task-bar hint set before the first mapping. self.show_hide_taskbar() # Check gnome-screen-saver integration # onboard_xembed_enabled False True True True # config.gss.embedded_keyboard_enabled any False any False # config.gss.embedded_keyboard_command any empty !=onboard ==onboard # Action: nop enable Question1 Question2 # silently if not config.xid_mode and \ config.onboard_xembed_enabled: # If it appears, that nothing has touched the gss keys before, # silently enable gss integration with onboard. if not config.gss.embedded_keyboard_enabled and \ not config.gss.embedded_keyboard_command: config.enable_gss_embedding(True) # If onboard is configured to be embedded into the unlock screen # dialog, and the embedding command is different from onboard, ask # the user what to do elif not config.is_onboard_in_xembed_command_string(): question = _("Onboard is configured to appear with the dialog to " "unlock the screen; for example to dismiss the " "password-protected screensaver.\n\n" "However the system is not configured anymore to use " "Onboard to unlock the screen. A possible reason can " "be that another application configured the system to " "use something else.\n\n" "Would you like to reconfigure the system to show " "Onboard when unlocking the screen?") reply = show_confirmation_dialog(question) if reply == True: config.enable_gss_embedding(True) else: config.onboard_xembed_enabled = False else: if not config.gss.embedded_keyboard_enabled: question = _("Onboard is configured to appear with the dialog " "to unlock the screen; for example to dismiss " "the password-protected screensaver.\n\n" "However this function is disabled in the system.\n\n" "Would you like to activate it?") reply = show_confirmation_dialog(question) if reply == True: config.enable_gss_embedding(True) else: config.onboard_xembed_enabled = False # check if gnome accessibility is enabled for auto-show if config.auto_show.enabled and \ not config.check_gnome_accessibility(self._window): config.auto_show.enabled = False
def init(self): self.keyboard_state = None self.vk_timer = None self.reset_vk() self._connections = [] self._window = None self.status_icon = None self.service_keyboard = None # finish config initialization config.init() # Release pressed keys when onboard is killed. # Don't keep enter key stuck when being killed by lightdm. self._osk_util = osk.Util() self._osk_util.set_unix_signal_handler(signal.SIGTERM, self.on_sigterm) self._osk_util.set_unix_signal_handler(signal.SIGINT, self.on_sigint) sys.path.append(os.path.join(config.install_dir, 'scripts')) # Create the central keyboard model self.keyboard = Keyboard(self) # Create the initial keyboard widget # Care for toolkit independence only once there is another # supported one besides GTK. self.keyboard_widget = KeyboardWidget(self.keyboard) # create the main window if config.xid_mode: # XEmbed mode for gnome-screensaver? # no icp, don't flash the icon palette in lightdm self._window = KbdPlugWindow(self.keyboard_widget) # write xid to stdout sys.stdout.write('%d\n' % self._window.get_id()) sys.stdout.flush() else: icp = IconPalette() icp.set_layout_view(self.keyboard_widget) icp.connect("activated", self._on_icon_palette_acticated) self._window = KbdWindow(self.keyboard_widget, icp) self.do_connect(self._window, "quit-onboard", lambda x: self.do_quit_onboard()) #config.xid_mode = True self._window.application = self config.main_window = self._window # need this to access screen properties # load the initial layout _logger.info("Loading initial layout") self.reload_layout() # Handle command line options x, y, size after window creation # because the rotation code needs the window's screen. if not config.xid_mode: rect = self._window.get_rect().copy() options = config.options if options.size: size = options.size.split("x") rect.w = int(size[0]) rect.h = int(size[1]) if not options.x is None: rect.x = options.x if not options.y is None: rect.y = options.y # Make sure the keyboard fits on screen rect = self._window.limit_size(rect) if rect != self._window.get_rect(): orientation = self._window.get_screen_orientation() self._window.write_window_rect(orientation, rect) self._window.restore_window_rect() # move/resize early # export dbus service if not config.xid_mode and \ "dbus" in globals(): self.service_keyboard = ServiceOnboardKeyboard( self.keyboard_widget) # show/hide the window self.keyboard_widget.set_startup_visibility() # keep keyboard window and icon palette on top of dash if not config.xid_mode: # be defensive, not necessary when embedding self._osk_util.keep_windows_on_top( [self._window, self._window.icp]) # connect notifications for keyboard map and group changes self.keymap = Gdk.Keymap.get_default() self.do_connect(self.keymap, "keys-changed", self.cb_keys_changed) # map changes self.do_connect(self.keymap, "state-changed", self.cb_state_changed) Gdk.event_handler_set(cb_any_event, self) # group changes # connect config notifications here to keep config from holding # references to keyboard objects. once = CallOnce(50).enqueue # delay callbacks by 50ms reload_layout = lambda x: once(self.reload_layout_and_present) update_ui = lambda x: once(self._update_ui) update_ui_no_resize = lambda x: once(self._update_ui_no_resize) update_transparency = lambda x: once(self.keyboard_widget. update_transparency) update_inactive_transparency = \ lambda x: once(self.keyboard_widget.update_inactive_transparency) # general config.auto_show.enabled_notify_add(lambda x: \ self.keyboard_widget.update_auto_show()) # keyboard config.keyboard.key_synth_notify_add(reload_layout) config.keyboard.input_event_source_notify_add(lambda x: \ self.keyboard.update_input_event_source()) config.keyboard.show_secondary_labels_notify_add(update_ui) # window config.window.window_state_sticky_notify_add(lambda x: \ self._window.update_sticky_state()) config.window.window_decoration_notify_add( self._on_window_options_changed) config.window.force_to_top_notify_add(self._on_window_options_changed) config.window.keep_aspect_ratio_notify_add(update_ui) config.window.transparency_notify_add(update_transparency) config.window.background_transparency_notify_add(update_transparency) config.window.transparent_background_notify_add(update_ui) config.window.enable_inactive_transparency_notify_add( update_transparency) config.window.inactive_transparency_notify_add( update_inactive_transparency) config.window.docking_notify_add(self._update_docking) # layout config.layout_filename_notify_add(reload_layout) # theme #config.gdi.gtk_theme_notify_add(self.on_gtk_theme_changed) config.theme_notify_add(self.on_theme_changed) config.key_label_font_notify_add(reload_layout) config.key_label_overrides_notify_add(reload_layout) config.theme_settings.color_scheme_filename_notify_add(reload_layout) config.theme_settings.key_label_font_notify_add(reload_layout) config.theme_settings.key_label_overrides_notify_add(reload_layout) config.theme_settings.theme_attributes_notify_add(update_ui) # snippets config.snippets_notify_add(reload_layout) # word suggestions config.word_suggestions.show_context_line_notify_add(update_ui) config.word_suggestions.enabled_notify_add(lambda x: \ self.keyboard.on_word_suggestions_enabled(x)) config.word_suggestions.auto_learn_notify_add(update_ui_no_resize) config.typing_assistance.active_language_notify_add(lambda x: \ self.keyboard.on_active_lang_id_changed()) config.typing_assistance.spell_check_backend_notify_add(lambda x: \ self.keyboard.on_spell_checker_changed()) config.typing_assistance.auto_capitalization_notify_add(lambda x: \ self.keyboard.on_word_suggestions_enabled(x)) config.word_suggestions.spelling_suggestions_enabled_notify_add(lambda x: \ self.keyboard.on_spell_checker_changed()) config.word_suggestions.wordlist_buttons_notify_add( update_ui_no_resize) # universal access config.scanner.enabled_notify_add(self.keyboard._on_scanner_enabled) config.window.resize_handles_notify_add(lambda x: \ self.keyboard_widget.update_resize_handles()) # misc config.keyboard.show_click_buttons_notify_add(update_ui) config.lockdown.lockdown_notify_add(update_ui) if config.mousetweaks: config.mousetweaks.state_notify_add(update_ui_no_resize) # create status icon self.status_icon = Indicator() self.status_icon.set_keyboard_window(self._window) self.do_connect(self.status_icon, "quit-onboard", lambda x: self.do_quit_onboard()) # Callbacks to use when icp or status icon is toggled config.show_status_icon_notify_add(self.show_hide_status_icon) config.icp.in_use_notify_add(self.cb_icp_in_use_toggled) self.show_hide_status_icon(config.show_status_icon) # Minimize to IconPalette if running under GDM if 'RUNNING_UNDER_GDM' in os.environ: config.icp.in_use = True config.show_status_icon = False # unity-2d needs the skip-task-bar hint set before the first mapping. self.show_hide_taskbar() # Check gnome-screen-saver integration # onboard_xembed_enabled False True True True # config.gss.embedded_keyboard_enabled any False any False # config.gss.embedded_keyboard_command any empty !=onboard ==onboard # Action: nop enable Question1 Question2 # silently if not config.xid_mode and \ config.onboard_xembed_enabled: # If it appears, that nothing has touched the gss keys before, # silently enable gss integration with onboard. if not config.gss.embedded_keyboard_enabled and \ not config.gss.embedded_keyboard_command: config.enable_gss_embedding(True) # If onboard is configured to be embedded into the unlock screen # dialog, and the embedding command is different from onboard, ask # the user what to do elif not config.is_onboard_in_xembed_command_string(): question = _( "Onboard is configured to appear with the dialog to " "unlock the screen; for example to dismiss the " "password-protected screensaver.\n\n" "However the system is not configured anymore to use " "Onboard to unlock the screen. A possible reason can " "be that another application configured the system to " "use something else.\n\n" "Would you like to reconfigure the system to show " "Onboard when unlocking the screen?") _logger.warning("showing dialog: '{}'".format(question)) reply = show_confirmation_dialog(question, self._window, config.is_force_to_top()) if reply == True: config.enable_gss_embedding(True) else: config.onboard_xembed_enabled = False else: if not config.gss.embedded_keyboard_enabled: question = _( "Onboard is configured to appear with the dialog " "to unlock the screen; for example to dismiss " "the password-protected screensaver.\n\n" "However this function is disabled in the system.\n\n" "Would you like to activate it?") _logger.warning("showing dialog: '{}'".format(question)) reply = show_confirmation_dialog(question, self._window, config.is_force_to_top()) if reply == True: config.enable_gss_embedding(True) else: config.onboard_xembed_enabled = False # check if gnome accessibility is enabled for auto-show if (config.is_auto_show_enabled() or \ config.are_word_suggestions_enabled()) and \ not config.check_gnome_accessibility(self._window): config.auto_show.enabled = False
def init(self): self.keyboard_state = None self.vk_timer = None self.reset_vk() self._connections = [] self._window = None self.status_icon = None self.service_keyboard = None # finish config initialization config.init() # Release pressed keys when onboard is killed. # Don't keep enter key stuck when being killed by lightdm. self._osk_util = osk.Util() self._osk_util.set_unix_signal_handler(signal.SIGTERM, self.on_sigterm) self._osk_util.set_unix_signal_handler(signal.SIGINT, self.on_sigint) sys.path.append(os.path.join(config.install_dir, 'scripts')) # Create the central keyboard model self.keyboard = Keyboard() # Create the initial keyboard widget # Care for toolkit independence only once there is another # supported one besides GTK. self.keyboard_widget = KeyboardWidget(self.keyboard) # create the main window if config.xid_mode: # XEmbed mode for gnome-screensaver? # no icp, don't flash the icon palette in lightdm self._window = KbdPlugWindow(self.keyboard_widget) # write xid to stdout sys.stdout.write('%d\n' % self._window.get_id()) sys.stdout.flush() else: icp = IconPalette() icp.set_layout_view(self.keyboard_widget) icp.connect("activated", self._on_icon_palette_acticated) self._window = KbdWindow(self.keyboard_widget, icp) self.do_connect(self._window, "quit-onboard", lambda x: self.do_quit_onboard()) self._window.application = self config.main_window = self._window # need this to access screen properties # load the initial layout _logger.info("Loading initial layout") self.reload_layout() # Handle command line options x, y, size after window creation # because the rotation code needs the window's screen. if not config.xid_mode: rect = self._window.get_rect().copy() options = config.options if options.size: size = options.size.split("x") rect.w = int(size[0]) rect.h = int(size[1]) if not options.x is None: rect.x = options.x if not options.y is None: rect.y = options.y # Make sure the keyboard fits on screen rect = self._window.limit_size(rect) if rect != self._window.get_rect(): orientation = self._window.get_screen_orientation() self._window.write_window_rect(orientation, rect) self._window.restore_window_rect() # move/resize early # export dbus service if not config.xid_mode and \ "dbus" in globals(): self.service_keyboard = ServiceOnboardKeyboard(self.keyboard_widget) # show/hide the window self.keyboard_widget.set_startup_visibility() # keep keyboard window and icon palette on top of dash if not config.xid_mode: # be defensive, not necessary when embedding self._osk_util.keep_windows_on_top([self._window, self._window.icp]) # connect notifications for keyboard map and group changes self.keymap = Gdk.Keymap.get_default() self.do_connect(self.keymap, "keys-changed", self.cb_keys_changed) # map changes self.do_connect(self.keymap, "state-changed", self.cb_state_changed) Gdk.event_handler_set(cb_any_event, self) # group changes # connect config notifications here to keep config from holding # references to keyboard objects. once = CallOnce(50).enqueue # delay callbacks by 50ms reload_layout = lambda x: once(self.reload_layout_and_present) update_ui = lambda x: once(self._update_ui) update_ui_no_resize = lambda x: once(self._update_ui_no_resize) update_transparency = lambda x: once(self.keyboard_widget.update_transparency) update_inactive_transparency = \ lambda x: once(self.keyboard_widget.update_inactive_transparency) # general config.auto_show.enabled_notify_add(lambda x: \ self.keyboard_widget.update_auto_show()) # keyboard config.keyboard.key_synth_notify_add(reload_layout) config.keyboard.input_event_source_notify_add(lambda x: \ self.keyboard.update_input_event_source()) config.keyboard.show_secondary_labels_notify_add(update_ui) # window config.window.window_state_sticky_notify_add(lambda x: \ self._window.update_sticky_state()) config.window.window_decoration_notify_add(self._on_window_options_changed) config.window.force_to_top_notify_add(self._on_window_options_changed) config.window.keep_aspect_ratio_notify_add(update_ui) config.window.transparency_notify_add(update_transparency) config.window.background_transparency_notify_add(update_transparency) config.window.transparent_background_notify_add(update_ui) config.window.enable_inactive_transparency_notify_add(update_transparency) config.window.inactive_transparency_notify_add(update_inactive_transparency) config.window.docking_notify_add(self._update_docking) # layout config.layout_filename_notify_add(reload_layout) # theme #config.gdi.gtk_theme_notify_add(self.on_gtk_theme_changed) config.theme_notify_add(self.on_theme_changed) config.key_label_font_notify_add(reload_layout) config.key_label_overrides_notify_add(reload_layout) config.theme_settings.color_scheme_filename_notify_add(reload_layout) config.theme_settings.key_label_font_notify_add(reload_layout) config.theme_settings.key_label_overrides_notify_add(reload_layout) config.theme_settings.theme_attributes_notify_add(update_ui) # snippets config.snippets_notify_add(reload_layout) # word suggestions config.word_suggestions.show_context_line_notify_add(update_ui) config.word_suggestions.enabled_notify_add(lambda x: \ self.keyboard.on_word_suggestions_enabled(x)) config.typing_assistance.active_language_notify_add(lambda x: \ self.keyboard.on_active_lang_id_changed()) config.typing_assistance.spell_check_backend_notify_add(lambda x: \ self.keyboard.on_spell_checker_changed()) config.typing_assistance.auto_capitalization_notify_add(lambda x: \ self.keyboard.on_word_suggestions_enabled(x)) config.word_suggestions.spelling_suggestions_enabled_notify_add(lambda x: \ self.keyboard.on_spell_checker_changed()) # universal access config.scanner.enabled_notify_add(self.keyboard._on_scanner_enabled) config.window.resize_handles_notify_add(lambda x: \ self.keyboard_widget.update_resize_handles()) # misc config.keyboard.show_click_buttons_notify_add(update_ui) config.lockdown.lockdown_notify_add(update_ui) config.clickmapper.state_notify_add(update_ui) if config.mousetweaks: config.mousetweaks.state_notify_add(update_ui_no_resize) # create status icon self.status_icon = Indicator() self.status_icon.set_keyboard_window(self._window) self.do_connect(self.status_icon, "quit-onboard", lambda x: self.do_quit_onboard()) # Callbacks to use when icp or status icon is toggled config.show_status_icon_notify_add(self.show_hide_status_icon) config.icp.in_use_notify_add(self.cb_icp_in_use_toggled) self.show_hide_status_icon(config.show_status_icon) # Minimize to IconPalette if running under GDM if 'RUNNING_UNDER_GDM' in os.environ: config.icp.in_use = True config.show_status_icon = False # unity-2d needs the skip-task-bar hint set before the first mapping. self.show_hide_taskbar() # Check gnome-screen-saver integration # onboard_xembed_enabled False True True True # config.gss.embedded_keyboard_enabled any False any False # config.gss.embedded_keyboard_command any empty !=onboard ==onboard # Action: nop enable Question1 Question2 # silently if not config.xid_mode and \ config.onboard_xembed_enabled: # If it appears, that nothing has touched the gss keys before, # silently enable gss integration with onboard. if not config.gss.embedded_keyboard_enabled and \ not config.gss.embedded_keyboard_command: config.enable_gss_embedding(True) # If onboard is configured to be embedded into the unlock screen # dialog, and the embedding command is different from onboard, ask # the user what to do elif not config.is_onboard_in_xembed_command_string(): question = _("Onboard is configured to appear with the dialog to " "unlock the screen; for example to dismiss the " "password-protected screensaver.\n\n" "However the system is not configured anymore to use " "Onboard to unlock the screen. A possible reason can " "be that another application configured the system to " "use something else.\n\n" "Would you like to reconfigure the system to show " "Onboard when unlocking the screen?") reply = show_confirmation_dialog(question) if reply == True: config.enable_gss_embedding(True) else: config.onboard_xembed_enabled = False else: if not config.gss.embedded_keyboard_enabled: question = _("Onboard is configured to appear with the dialog " "to unlock the screen; for example to dismiss " "the password-protected screensaver.\n\n" "However this function is disabled in the system.\n\n" "Would you like to activate it?") reply = show_confirmation_dialog(question) if reply == True: config.enable_gss_embedding(True) else: config.onboard_xembed_enabled = False # check if gnome accessibility is enabled for auto-show if config.auto_show.enabled and \ not config.check_gnome_accessibility(self._window): config.auto_show.enabled = False
def __init__(self, main=True): sys.path.append(os.path.join(config.install_dir, 'scripts')) self.keyboard_state = None self.vk_timer = None self.reset_vk() # create main window if config.xid_mode: # XEmbed mode for gnome-screensaver? self._window = KbdPlugWindow() # write xid to stdout sys.stdout.write('%d\n' % self._window.get_id()) sys.stdout.flush() else: self._window = KbdWindow() self._window.connect_object("quit-onboard", self.do_quit_onboard, None) _logger.info("Getting user settings") # load the initial layout self.update_layout() # connect notifications for keyboard map and group changes self.keymap = gtk.gdk.keymap_get_default() self.keymap.connect("keys-changed", self.cb_keys_changed) # map changes gtk.gdk.event_handler_set(cb_any_event, self) # group changes # connect config notifications here to keep config from holding # references to keyboard objects. once = CallOnce(20).enqueue # delay callbacks 50ms theme_change = lambda x: once(self.cb_theme_changed, x) update_layout = lambda x: once(self.update_layout, True) queue_draw = lambda x: once(self.keyboard.queue_draw) config.layout_filename_notify_add(update_layout) config.color_scheme_filename_notify_add(update_layout) config.key_label_overrides_notify_add(update_layout) config.theme_attributes_notify_add(queue_draw) config.snippets_notify_add(update_layout) config.scanning_notify_add(lambda x: \ self.keyboard.reset_scan()) # create status icon self.status_icon = Indicator(self._window) self.status_icon.connect("quit-onboard", self.do_quit_onboard) # Callbacks to use when icp or status icon is toggled config.show_status_icon_notify_add(self.show_hide_status_icon) config.icp_in_use_change_notify_add(self.cb_icp_in_use_toggled) self.show_hide_status_icon(config.show_status_icon) self.show_hide_taskbar() # Minimize to IconPalette if running under GDM if os.environ.has_key('RUNNING_UNDER_GDM'): config.icp_in_use = True config.show_status_icon = False self.show_hide_taskbar() # If onboard is configured to be embedded into the unlock screen # dialog, and the embedding command is not set to onboard, ask # the user what to do if config.onboard_xembed_enabled: if not config.is_onboard_in_xembed_command_string(): question = _("Onboard is configured to appear with the dialog to " "unlock the screen; for example to dismiss the " "password-protected screensaver.\n\n" "However the system is not configured anymore to use " "Onboard to unlock the screen. A possible reason can " "be that another application configured the system to " "use something else.\n\n" "Would you like to reconfigure the system to show " "Onboard when unlocking the screen?") reply = show_confirmation_dialog(question) if reply == True: config.onboard_xembed_enabled = True config.gss_xembed_enabled = True config.set_xembed_command_string_to_onboard() else: config.onboard_xembed_enabled = False else: if not config.gss_xembed_enabled: question = _("Onboard is configured to appear with the dialog " "to unlock the screen; for example to dismiss " "the password-protected screensaver.\n\n" "However this function is disabled in the system.\n\n" "Would you like to activate it?") reply = show_confirmation_dialog(question) if reply == True: config.onboard_xembed_enabled = True config.gss_xembed_enabled = True config.set_xembed_command_string_to_onboard() else: config.onboard_xembed_enabled = False if main: _logger.info("Entering mainloop of onboard") gtk.main() self.clean()