def reload_global(self, client, connection_id, entry, data): """Unbind all global hotkeys and rebind the show_hide method. If more global hotkeys should be added, just connect the gconf key to the watch system and add. """ gkey = entry.get_key() key = entry.get_value().get_string() if key == 'disabled': return try: self.guake.hotkeys.unbind(self.globalhotkeys[gkey]) except KeyError: pass self.globalhotkeys[gkey] = key if not self.guake.hotkeys.bind(key, self.guake.show_hide): keyval, mask = gtk.accelerator_parse(key) label = gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') guake.notifier.show_message( _('Guake Terminal'), _('A problem happened when binding <b>%s</b> key.\n' 'Please use Guake Preferences dialog to choose another ' 'key') % xml_escape(label), filename)
def each_key(model, path, subiter): keyentry = model.get_value(subiter, 2) if keyentry and keyentry == hotkey: msg = _("The shortcut \"%s\" is already in use.") % keylabel ShowableError(self.window, _('Error setting keybinding.'), msg, -1) raise Exception( 'This is ok, we just use it to break the foreach loop!')
def exec_main(): if not test_gconf(): raise ShowableError(_('Guake can not init!'), _('Gconf Error.\n' 'Have you installed <b>guake.schemas</b> properly?')) if not main(): gtk.main()
def reload_globals(self, client, connection_id, entry, data): """Unbind all global hotkeys and rebind the show_hide method. If more global hotkeys should be added, just connect the gconf key to the watch system and add. """ self.guake.hotkeys.unbind_all() key = entry.get_value().get_string() if not self.guake.hotkeys.bind(key, self.guake.show_hide): raise ShowableError(_("key binding error"), _("Unable to bind global <b>%s</b> key") % xml_escape(key), -1)
def reload_globals(self, client, connection_id, entry, data): """Unbind all global hotkeys and rebind the show_hide method. If more global hotkeys should be added, just connect the gconf key to the watch system and add. """ self.guake.hotkeys.unbind_all() key = entry.get_value().get_string() if not self.guake.hotkeys.bind(key, self.guake.show_hide): raise ShowableError(_('key binding error'), _('Unable to bind global <b>%s</b> key') % xml_escape(key), -1)
def __init__(self, parent, running_procs): super(PromptQuitDialog, self).__init__(parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO) self.set_keep_above(True) self.set_markup(_('Do you really want to quit Guake!?')) if running_procs == 1: self.format_secondary_markup( _("<b>There is one process still running.</b>")) elif running_procs > 1: self.format_secondary_markup( _("<b>There are %d processes running.</b>" % running_procs))
def max_tab_name_length_changed(self, client, connection_id, entry, data): """If the gconf var max_tab_name_length be changed, this method will be called and will set the tab name length limit. """ # avoid get window title before terminal is ready if self.guake.notebook.get_current_terminal().get_window_title( ) is None: return max_name_length = client.get_int(KEY("/general/max_tab_name_length")) if max_name_length == 0: max_name_length = None vte_titles_on = client.get_bool(KEY("/general/use_vte_titles")) tab_name = self.guake.notebook.get_current_terminal().get_window_title( ) if vte_titles_on else _("Terminal") for tab in self.guake.tabs.get_children(): if not getattr(tab, 'custom_label_set', False): tab.set_label(tab_name[:max_name_length]) else: # retrieve the custom tab name to restore it tab_custom_name = getattr(tab, 'custom_label_text', False) tab.set_label(tab_custom_name[:max_name_length])
def on_key_edited(self, renderer, path, keycode, mask, keyval, model): """Callback that handles key edition in cellrenderer. It makes some tests to validate the key, like looking for already in use keys and look for [A-Z][a-z][0-9] to avoid problems with these common keys. If all tests are ok, the value will be stored in gconf. """ giter = model.get_iter(path) gconf_path = model.get_value(giter, 0) oldkey = model.get_value(giter, 2) hotkey = KeyEntry(keycode, mask) key = Gtk.accelerator_name(keycode, mask) keylabel = Gtk.accelerator_get_label(keycode, mask) # we needn't to change anything, the user is trying to set the # same key that is already set. if oldkey == hotkey: return False # looking for already used keybindings def each_key(model, path, subiter): keyentry = model.get_value(subiter, 2) if keyentry and keyentry == hotkey: msg = _("The shortcut \"%s\" is already in use.") % keylabel ShowableError(self.window, _('Error setting keybinding.'), msg, -1) raise Exception( 'This is ok, we just use it to break the foreach loop!') model.foreach(each_key) # avoiding problems with common keys if ((mask == 0 and keycode != 0) and ((keycode >= ord('a') and keycode <= ord('z')) or (keycode >= ord('A') and keycode <= ord('Z')) or (keycode >= ord('0') and keycode <= ord('9')))): dialog = Gtk.MessageDialog( self.get_widget('config-window'), Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, _("The shortcut \"%s\" cannot be used " "because it will become impossible to " "type using this key.\n\n" "Please try with a key such as " "Control, Alt or Shift at the same " "time.\n") % key) dialog.run() dialog.destroy() return False # setting new value in ui giter = model.get_iter(path) model.set_value(giter, 2, hotkey) # setting the new value in gconf if gconf_path == "show-hide": self.settings.keybindingsGlobal.set_string(gconf_path, key) else: self.settings.keybindingsLocal.set_string(gconf_path, key)
def on_key_edited(self, renderer, path, keycode, mask, keyval, model): """Callback that handles key edition in cellrenderer. It makes some tests to validate the key, like looking for already in use keys and look for [A-Z][a-z][0-9] to avoid problems with these common keys. If all tests are ok, the value will be stored in gconf. """ giter = model.get_iter(path) gconf_path = model.get_value(giter, 0) oldkey = model.get_value(giter, 2) hotkey = KeyEntry(keycode, mask) key = gtk.accelerator_name(keycode, mask) keylabel = gtk.accelerator_get_label(keycode, mask) # we needn't to change anything, the user is trying to set the # same key that is already set. if oldkey == hotkey: return False # looking for already used keybindings def each_key(model, path, subiter): keyentry = model.get_value(subiter, 2) if keyentry and keyentry == hotkey: msg = _('The shortcut "%s" is already in use.') % keylabel raise ShowableError(_("Error setting keybinding."), msg, -1) model.foreach(each_key) # avoiding problems with common keys if (mask == 0 and keycode != 0) and ( (keycode >= ord("a") and keycode <= ord("z")) or (keycode >= ord("A") and keycode <= ord("Z")) or (keycode >= ord("0") and keycode <= ord("9")) ): dialog = gtk.MessageDialog( self.get_widget("config-window"), gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _( 'The shortcut "%s" cannot be used ' "because it will become impossible to " "type using this key.\n\n" "Please try with a key such as " "Control, Alt or Shift at the same " "time.\n" ) % key, ) dialog.run() dialog.destroy() return False # setting new value in ui giter = model.get_iter(path) model.set_value(giter, 2, hotkey) # setting the new value in gconf self.client.set_string(gconf_path, key)
def __init__(self, parent, running_procs): super(PromptQuitDialog, self).__init__( parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO) self.set_keep_above(True) self.set_markup(_('Do you really want to quit Guake!?')) if running_procs == 1: self.format_secondary_markup( _("<b>There is one process still running.</b>") ) elif running_procs > 1: self.format_secondary_markup( _("<b>There are %d processes running.</b>" % running_procs) )
def populate_keys_tree(self): """Reads the HOTKEYS global variable and insert all data in the TreeStore used by the preferences window treeview. """ model = self.get_widget("treeview-keys").get_model() for group in HOTKEYS: giter = model.append(None) model.set(giter, 0, "", 1, _(group["label"])) for item in group["keys"]: child = model.append(giter) accel = self.client.get_string(item["key"]) if accel: params = gtk.accelerator_parse(accel) hotkey = KeyEntry(*params) else: hotkey = KeyEntry(0, 0) model.set(child, 0, item["key"], 1, _(item["label"]), 2, hotkey, 3, True) self.get_widget("treeview-keys").expand_all()
def populate_keys_tree(self): """Reads the HOTKEYS global variable and insert all data in the TreeStore used by the preferences window treeview. """ model = self.get_widget('treeview-keys').get_model() for group in HOTKEYS: giter = model.append(None) model.set(giter, 0, '', 1, _(group['label'])) for item in group['keys']: child = model.append(giter) accel = self.client.get_string(item['key']) if accel: params = gtk.accelerator_parse(accel) hotkey = KeyEntry(*params) else: hotkey = KeyEntry(0, 0) model.set(child, 0, item['key'], 1, _(item['label']), 2, hotkey, 3, True) self.get_widget('treeview-keys').expand_all()
def on_palette_color_set(self, btn): """Changes the value of palette in gconf """ palette = [] for i in range(18): palette.append(hexify_color( self.get_widget('palette_%d' % i).get_color())) palette = ':'.join(palette) self.client.set_string(KEY('/style/font/palette'), palette) self.client.set_string(KEY('/style/font/palette_name'), _('Custom')) self.set_palette_name('Custom') self.update_demo_palette(palette)
def __init__(self): super(AboutDialog, self).__init__(gladefile('about.glade'), root='aboutdialog') dialog = self.get_widget('aboutdialog') # images ipath = pixmapfile('guake-notification.png') img = gtk.gdk.pixbuf_new_from_file(ipath) dialog.set_property('logo', img) dialog.set_name(_('Guake Terminal')) dialog.set_version(VERSION)
def show_context_menu(self, terminal, event): """Show the context menu, only with a right click on a vte Terminal. """ if event.button != 3: return False self.showing_context_menu = True guake_clipboard = gtk.clipboard_get() if not guake_clipboard.wait_is_text_available(): self.get_widget('context_paste').set_sensitive(False) else: self.get_widget('context_paste').set_sensitive(True) current_selection = '' current_term = self.notebook.get_current_terminal() if current_term.get_has_selection(): current_term.copy_clipboard() guake_clipboard = gtk.clipboard_get() current_selection = guake_clipboard.wait_for_text().rstrip() if len(current_selection) > 20: current_selection = current_selection[:17] + "..." if current_selection: self.get_widget('context_search_on_web').set_label( _("Search on Web: '%s'") % current_selection) self.get_widget('context_search_on_web').set_sensitive(True) else: self.get_widget('context_search_on_web').set_label( _("Search on Web (no selection)")) self.get_widget('context_search_on_web').set_sensitive(False) context_menu = self.get_widget('context-menu') context_menu.popup(None, None, None, 3, gtk.get_current_event_time()) return True
def show_context_menu(self, terminal, event): """Show the context menu, only with a right click on a vte Terminal. """ if event.button != 3: return False self.showing_context_menu = True guake_clipboard = gtk.clipboard_get() if not guake_clipboard.wait_is_text_available(): self.get_widget('context_paste').set_sensitive(False) else: self.get_widget('context_paste').set_sensitive(True) current_selection = '' current_term = self.notebook.get_current_terminal() if current_term.get_has_selection(): current_term.copy_clipboard() guake_clipboard = gtk.clipboard_get() current_selection = guake_clipboard.wait_for_text().rstrip() if len(current_selection) > 20: current_selection = current_selection[:17] + "..." if current_selection: self.get_widget('context_search_on_web').set_label( _("Search on Web: '%s'") % current_selection) self.get_widget('context_search_on_web').set_sensitive(True) else: self.get_widget('context_search_on_web').set_label(_("Search on Web (no selection)")) self.get_widget('context_search_on_web').set_sensitive(False) context_menu = self.get_widget('context-menu') context_menu.popup(None, None, None, 3, gtk.get_current_event_time()) return True
def __init__(self): super(AboutDialog, self).__init__(gladefile('about.glade'), root='aboutdialog') dialog = self.get_widget('aboutdialog') # images # ipath = pixmapfile('guake-notification.png') # img = gtk.gdk.pixbuf_new_from_file(ipath) # img = pixmapfile('guake-notification.png') image = Gtk.Image() image.set_from_file(pixmapfile('guake-notification.png')) pixbuf = image.get_pixbuf() dialog.set_property('logo', pixbuf) dialog.set_name(_('Guake Terminal')) dialog.set_version(VERSION) dialog.connect("response", lambda x, y: dialog.destroy())
def on_rename_current_tab_activate(self, *args): """Shows a dialog to rename the current tab. """ entry = gtk.Entry() entry.set_text(self.selected_tab.get_label()) entry.set_property('can-default', True) entry.show() vbox = gtk.VBox() vbox.set_border_width(6) vbox.show() dialog = gtk.Dialog(_("Rename tab"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) dialog.set_size_request(300, -1) dialog.vbox.pack_start(vbox) dialog.set_border_width(4) dialog.set_has_separator(False) dialog.set_default_response(gtk.RESPONSE_ACCEPT) dialog.add_action_widget(entry, gtk.RESPONSE_ACCEPT) entry.reparent(vbox) # don't hide on lose focus until the rename is finished current_hide_setting = self.disable_losefocus_hiding self.disable_losefocus_hiding = True response = dialog.run() self.disable_losefocus_hiding = current_hide_setting if response == gtk.RESPONSE_ACCEPT: new_text = entry.get_text() self.selected_tab.set_label(new_text) # if user sets empty name, consider he wants default behavior. setattr(self.selected_tab, 'custom_label_set', bool(new_text)) # trigger titling handler in case that custom label has been reset current_vte = self.notebook.get_current_terminal() current_vte.emit('window-title-changed') dialog.destroy() self.set_terminal_focus()
def max_tab_name_length_changed(self, client, connection_id, entry, data): """If the gconf var max_tab_name_length be changed, this method will be called and will set the tab name length limit. """ # avoid get window title before terminal is ready if self.guake.notebook.get_current_terminal().get_window_title() is None: return max_name_length = client.get_int(KEY("/general/max_tab_name_length")) if max_name_length == 0: max_name_length = None vte_titles_on = client.get_bool(KEY("/general/use_vte_titles")) tab_name = self.guake.notebook.get_current_terminal( ).get_window_title() if vte_titles_on else _("Terminal") for tab in self.guake.tabs.get_children(): if not getattr(tab, 'custom_label_set', False): tab.set_label(tab_name[:max_name_length]) else: # retrieve the custom tab name to restore it tab_custom_name = getattr(tab, 'custom_label_text', False) tab.set_label(tab_custom_name[:max_name_length])
def load_configs(self): """Load configurations for all widgets in General, Scrolling and Appearance tabs from gconf. """ # default_shell combo = self.get_widget('default_shell') # get the value for defualt shell. If unset, set to USER_SHELL_VALUE. value = self.client.get_string(KEY('/general/default_shell')) or USER_SHELL_VALUE for i in combo.get_model(): if i[0] == value: combo.set_active_iter(i.iter) # login shell value = self.client.get_bool(KEY('/general/use_login_shell')) self.get_widget('use_login_shell').set_active(value) # tray icon value = self.client.get_bool(KEY('/general/use_trayicon')) self.get_widget('use_trayicon').set_active(value) # popup value = self.client.get_bool(KEY('/general/use_popup')) self.get_widget('use_popup').set_active(value) # prompt on quit value = self.client.get_bool(KEY('/general/prompt_on_quit')) self.get_widget('prompt_on_quit').set_active(value) # prompt on close_tab value = self.client.get_int(KEY('/general/prompt_on_close_tab')) self.get_widget('prompt_on_close_tab').set_active(value) self.get_widget('prompt_on_quit').set_sensitive(value != 2) # ontop value = self.client.get_bool(KEY('/general/window_ontop')) self.get_widget('window_ontop').set_active(value) # tab ontop value = self.client.get_bool(KEY('/general/tab_ontop')) self.get_widget('tab_ontop').set_active(value) # losefocus value = self.client.get_bool(KEY('/general/window_losefocus')) self.get_widget('window_losefocus').set_active(value) # use VTE titles value = self.client.get_bool(KEY('/general/use_vte_titles')) self.get_widget('use_vte_titles').set_active(value) # max tab name length value = self.client.get_int(KEY('/general/max_tab_name_length')) self.get_widget('max_tab_name_length').set_value(value) value = self.client.get_float(KEY('/general/window_height_f')) if not value: value = self.client.get_int(KEY('/general/window_height')) self.get_widget('window_height').set_value(value) value = self.client.get_float(KEY('/general/window_width_f')) if not value: value = self.client.get_int(KEY('/general/window_width')) self.get_widget('window_width').set_value(value) value = self.client.get_int(KEY('/general/window_halignment')) which_button = { ALIGN_RIGHT: 'radiobutton_align_right', ALIGN_LEFT: 'radiobutton_align_left', ALIGN_CENTER: 'radiobutton_align_center' } self.get_widget(which_button[value]).set_active(True) value = self.client.get_bool(KEY('/general/open_tab_cwd')) self.get_widget('open_tab_cwd').set_active(value) # tab bar value = self.client.get_bool(KEY('/general/window_tabbar')) self.get_widget('window_tabbar').set_active(value) # start fullscreen value = self.client.get_bool(KEY('/general/start_fullscreen')) self.get_widget('start_fullscreen').set_active(value) # use visible bell value = self.client.get_bool(KEY('/general/use_visible_bell')) self.get_widget('use_visible_bell').set_active(value) # use audible bell value = self.client.get_bool(KEY('/general/use_audible_bell')) self.get_widget('use_audible_bell').set_active(value) # display number / use primary display combo = self.get_widget('display_n') dest_screen = self.client.get_int(KEY('/general/display_n')) value = self.client.get_bool(KEY('/general/quick_open_enable')) self.get_widget('quick_open_enable').set_active(value) self.get_widget('quick_open_command_line').set_sensitive(value) self.get_widget('quick_open_in_current_terminal').set_sensitive(value) text = gtk.TextBuffer() text = self.get_widget('quick_open_supported_patterns').get_buffer() for title, matcher, _useless in QUICK_OPEN_MATCHERS: text.insert_at_cursor("%s: %s\n" % (title, matcher)) self.get_widget('quick_open_supported_patterns').set_buffer(text) value = self.client.get_string(KEY('/general/quick_open_command_line')) if value is None: value = "subl %(file_path)s:%(line_number)s" self.get_widget('quick_open_command_line').set_text(value) value = self.client.get_bool(KEY('/general/quick_open_in_current_terminal')) self.get_widget('quick_open_in_current_terminal').set_active(value) value = self.client.get_string(KEY('/general/startup_script')) self.get_widget('startup_script').set_text(value) # If Guake is configured to use a screen that is not currently attached, # default to 'primary display' option. screen = self.get_widget('config-window').get_screen() n_screens = screen.get_n_monitors() if dest_screen > n_screens - 1: self.client.set_bool(KEY('/general/mouse_display'), False) dest_screen = screen.get_primary_monitor() self.client.set_int(KEY('/general/display_n'), dest_screen) if dest_screen == ALWAYS_ON_PRIMARY: first_item = combo.get_model().get_iter_first() combo.set_active_iter(first_item) else: seen_first = False # first item "always on primary" is special for i in combo.get_model(): if seen_first: i_int = int(i[0].split()[0]) # extracts 1 from '1' or from '1 (primary)' if i_int == dest_screen: combo.set_active_iter(i.iter) else: seen_first = True # use display where the mouse is currently value = self.client.get_bool(KEY('/general/mouse_display')) self.get_widget('mouse_display').set_active(value) # scrollbar value = self.client.get_bool(KEY('/general/use_scrollbar')) self.get_widget('use_scrollbar').set_active(value) # history size value = self.client.get_int(KEY('/general/history_size')) self.get_widget('history_size').set_value(value) # scroll output value = self.client.get_bool(KEY('/general/scroll_output')) self.get_widget('scroll_output').set_active(value) # scroll keystroke value = self.client.get_bool(KEY('/general/scroll_keystroke')) self.get_widget('scroll_keystroke').set_active(value) # default font value = self.client.get_bool(KEY('/general/use_default_font')) self.get_widget('use_default_font').set_active(value) self.get_widget('font_style').set_sensitive(not value) # use font and background color value = self.client.get_bool(KEY('/general/use_palette_font_and_background_color')) self.get_widget('use_palette_font_and_background_color').set_active(value) self.get_widget('palette_16').set_sensitive(value) self.get_widget('palette_17').set_sensitive(value) # font value = self.client.get_string(KEY('/style/font/style')) if value: self.get_widget('font_style').set_font_name(value) # font color val = self.client.get_string(KEY('/style/font/color')) try: color = gtk.gdk.color_parse(val) self.get_widget('font_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # background color value = self.client.get_string(KEY('/style/background/color')) try: color = gtk.gdk.color_parse(value) self.get_widget('background_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # allow bold font value = self.client.get_bool(KEY('/style/font/allow_bold')) self.get_widget('allow_bold').set_active(value) # palette self.fill_palette_names() value = self.client.get_string(KEY('/style/font/palette_name')) self.set_palette_name(value) value = self.client.get_string(KEY('/style/font/palette')) self.set_palette_colors(value) self.update_demo_palette(value) # cursor shape value = self.client.get_int(KEY('/style/cursor_shape')) self.set_cursor_shape(value) # cursor blink value = self.client.get_int(KEY('/style/cursor_blink_mode')) self.set_cursor_blink_mode(value) # background image value = self.client.get_string(KEY('/style/background/image')) if os.path.isfile(value or ''): self.get_widget('background_image').set_filename(value) value = self.client.get_int(KEY('/style/background/transparency')) self.get_widget('background_transparency').set_value(value) value = self.client.get_int(KEY('/general/window_valignment')) self.get_widget('top_align').set_active(value) # it's a separated method, to be reused. self.reload_erase_combos() # custom command context-menu configuration file custom_command_file = self.client.get_string(KEY('/general/custom_command_file')) if custom_command_file: custom_command_file_name = os.path.expanduser(custom_command_file) else: custom_command_file_name = None custom_cmd_filter = gtk.FileFilter() custom_cmd_filter.set_name(_("JSON files")) custom_cmd_filter.add_pattern("*.json") self.get_widget('custom_command_file_chooser').add_filter(custom_cmd_filter) all_files_filter = gtk.FileFilter() all_files_filter.set_name(_("All files")) all_files_filter.add_pattern("*") self.get_widget('custom_command_file_chooser').add_filter(all_files_filter) if custom_command_file_name: self.get_widget('custom_command_file_chooser').set_filename(custom_command_file_name)
def __init__(self, settings): """Setup the preferences dialog interface, loading images, adding filters to file choosers and connecting some signals. """ super(PrefsDialog, self).__init__(gladefile('prefs.glade'), root='config-window') self.settings = settings self.add_callbacks(PrefsCallbacks(self)) # window cleanup handler self.window = self.get_widget('config-window') self.get_widget('config-window').connect('destroy', self.on_destroy) # setting evtbox title bg eventbox = self.get_widget('eventbox-title') eventbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(255, 255, 255, 255)) # images ipath = pixmapfile('guake-notification.png') self.get_widget('image_logo').set_from_file(ipath) ipath = pixmapfile('quick-open.png') self.get_widget('image_quick_open').set_from_file(ipath) # the first position in tree will store the keybinding path in gconf, # and the user doesn't worry with this, let's hide that =D model = Gtk.TreeStore(str, str, object, bool) treeview = self.get_widget('treeview-keys') treeview.set_model(model) treeview.set_rules_hint(True) # TODO PORT this is killing the editing of the accl # treeview.connect('button-press-event', self.start_editing) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn('keypath', renderer, text=0) column.set_visible(False) treeview.append_column(column) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(_('Action'), renderer, text=1) column.set_property('expand', True) treeview.append_column(column) renderer = Gtk.CellRendererAccel() renderer.set_property('editable', True) renderer.connect('accel-edited', self.on_key_edited, model) renderer.connect('accel-cleared', self.on_key_cleared, model) column = Gtk.TreeViewColumn(_('Shortcut'), renderer) column.set_cell_data_func(renderer, self.cell_data_func) column.set_property('expand', False) treeview.append_column(column) self.demo_terminal = GuakeTerminal(self.settings) demo_terminal_box = self.get_widget('demo_terminal_box') demo_terminal_box.add(self.demo_terminal) pid = self.spawn_sync_pid(None, self.demo_terminal) self.demo_terminal.pid = pid self.populate_shell_combo() self.populate_keys_tree() self.populate_display_n() self.load_configs() self.get_widget('config-window').hide()
def fill_palette_names(self): combo = self.get_widget('palette_name') for palette_name in sorted(PALETTES.keys()): combo.append_text(palette_name) self.custom_palette_index = len(PALETTES) combo.append_text(_('Custom'))
def each_key(model, path, subiter): keyentry = model.get_value(subiter, 2) if keyentry and keyentry == hotkey: msg = _("The shortcut \"%s\" is already in use.") % keylabel raise ShowableError(_('Error setting keybinding.'), msg, -1)
def __init__(self): """Setup the preferences dialog interface, loading images, adding filters to file choosers and connecting some signals. """ super(PrefsDialog, self).__init__(gladefile('prefs.glade'), root='config-window') self.add_callbacks(PrefsCallbacks()) self.client = gconf.client_get_default() # setting evtbox title bg eventbox = self.get_widget('eventbox-title') eventbox.modify_bg(gtk.STATE_NORMAL, eventbox.get_colormap().alloc_color("#ffffff")) # images ipath = pixmapfile('guake-notification.png') self.get_widget('image_logo').set_from_file(ipath) ipath = pixmapfile('quick-open.png') self.get_widget('image_quick_open').set_from_file(ipath) # the first position in tree will store the keybinding path in gconf, # and the user doesn't worry with this, let's hide that =D model = gtk.TreeStore(str, str, object, bool) treeview = self.get_widget('treeview-keys') treeview.set_model(model) treeview.set_rules_hint(True) treeview.connect('button-press-event', self.start_editing) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn('keypath', renderer, text=0) column.set_visible(False) treeview.append_column(column) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Action'), renderer, text=1) column.set_property('expand', True) treeview.append_column(column) renderer = gtk.CellRendererAccel() renderer.set_property('editable', True) renderer.connect('accel-edited', self.on_key_edited, model) renderer.connect('accel-cleared', self.on_key_cleared, model) column = gtk.TreeViewColumn(_('Shortcut'), renderer) column.set_cell_data_func(renderer, self.cell_data_func) column.set_property('expand', False) treeview.append_column(column) self.demo_terminal = GuakeTerminal() demo_terminal_box = self.get_widget('demo_terminal_box') demo_terminal_box.add(self.demo_terminal) default_params = {} pid = self.demo_terminal.fork_command(**default_params) self.demo_terminal.pid = pid self.populate_shell_combo() self.populate_keys_tree() self.populate_display_n() self.load_configs() self.get_widget('config-window').hide() # Preview when selecting a bgimage self.selection_preview = gtk.Image() self.file_filter = gtk.FileFilter() self.file_filter.add_pattern("*.jpg") self.file_filter.add_pattern("*.png") self.file_filter.add_pattern("*.svg") self.file_filter.add_pattern("*.jpeg") self.bgfilechooser = self.get_widget('background_image') self.bgfilechooser.set_preview_widget(self.selection_preview) self.bgfilechooser.set_filter(self.file_filter) self.bgfilechooser.connect('update-preview', self.update_preview, self.selection_preview)
def __init__(self): super(Guake, self).__init__(gladefile('guake.glade')) self.client = gconf.client_get_default() # setting global hotkey and showing a pretty notification =) guake.globalhotkeys.init() # Cannot use "getattr(gtk.Window().get_style(), "base")[int(gtk.STATE_SELECTED)]" # since theme has not been applied before first show_all self.selected_color = None self.isPromptQuitDialogOpened = False self.hidden = True self.forceHide = False # trayicon! try: import appindicator except ImportError: img = pixmapfile('guake-tray.png') self.tray_icon = gtk.status_icon_new_from_file(img) self.tray_icon.set_tooltip(_('Guake Terminal')) self.tray_icon.connect('popup-menu', self.show_menu) self.tray_icon.connect('activate', self.show_hide) else: self.tray_icon = appindicator.Indicator( _("guake-indicator"), _("guake-tray"), appindicator.CATEGORY_OTHER) self.tray_icon.set_icon("guake-tray") self.tray_icon.set_status(appindicator.STATUS_ACTIVE) menu = self.get_widget('tray-menu') show = gtk.MenuItem(_('Show')) show.set_sensitive(True) show.connect('activate', self.show_hide) show.show() menu.prepend(show) self.tray_icon.set_menu(menu) # adding images from a different path. ipath = pixmapfile('guake.png') self.get_widget('image1').set_from_file(ipath) ipath = pixmapfile('add_tab.png') self.get_widget('image2').set_from_file(ipath) # important widgets self.window = self.get_widget('window-root') self.mainframe = self.get_widget('mainframe') self.mainframe.remove(self.get_widget('notebook-teminals')) self.notebook = GuakeNotebook() self.notebook.set_name("notebook-teminals") self.notebook.set_property("tab_pos", "bottom") self.notebook.set_property("show_tabs", False) self.notebook.set_property("show_border", False) self.notebook.set_property("visible", True) self.notebook.set_property("has_focus", True) self.notebook.set_property("can_focus", True) self.notebook.set_property("is_focus", True) self.notebook.set_property("enable_popup", True) self.notebook.connect("switch_page", self.select_current_tab) self.mainframe.add(self.notebook) self.set_tab_position() self.tabs = self.get_widget('hbox-tabs') self.toolbar = self.get_widget('toolbar') self.mainframe = self.get_widget('mainframe') self.resizer = self.get_widget('resizer') # check and set ARGB for real transparency screen = self.window.get_screen() colormap = screen.get_rgba_colormap() if colormap is None: self.has_argb = False else: self.window.set_colormap(colormap) self.has_argb = self.window.get_screen().is_composited() def composited_changed(screen): self.has_argb = screen.is_composited() self.set_background_transparency( self.client.get_int(KEY('/style/background/transparency'))) self.set_background_image( self.client.get_string(KEY('/style/background/image'))) self.window.get_screen().connect("composited-changed", composited_changed) # It's intended to know which tab was selected to # close/rename. This attribute will be set in # self.show_tab_menu self.selected_tab = None # holds fullscreen status self.is_fullscreen = False # holds the timestamp of the losefocus event self.losefocus_time = 0 # holds the timestamp of the previous show/hide action self.prev_showhide_time = 0 # double click stuff def double_click(hbox, event): """Handles double clicks on tabs area and when receive one, calls add_tab. """ if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS: self.add_tab() evtbox = self.get_widget('event-tabs') evtbox.connect('button-press-event', double_click) # Flag to prevent guake hide when window_losefocus is true and # user tries to use the context menu. self.showing_context_menu = False def hide_context_menu(menu): """Turn context menu flag off to make sure it is not being shown. """ self.showing_context_menu = False self.get_widget('context-menu').connect('hide', hide_context_menu) self.get_widget('tab-menu').connect('hide', hide_context_menu) self.window.connect('focus-out-event', self.on_window_losefocus) # Handling the delete-event of the main window to avoid # problems when closing it. def destroy(*args): self.hide() return True self.window.connect('delete-event', destroy) # Flag to completely disable losefocus hiding self.disable_losefocus_hiding = False # this line is important to resize the main window and make it # smaller. self.window.set_geometry_hints(min_width=1, min_height=1) # special trick to avoid the "lost guake on Ubuntu 'Show Desktop'" problem. # DOCK makes the window foundable after having being "lost" after "Show Desktop" self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK) # Restore back to normal behavior self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL) # resizer stuff self.resizer.connect('motion-notify-event', self.on_resizer_drag) # adding the first tab on guake self.add_tab() # loading and setting up configuration stuff GConfHandler(self) GConfKeyHandler(self) self.hotkeys = guake.globalhotkeys.GlobalHotkey() self.load_config() key = self.client.get_string(GKEY('show_hide')) keyval, mask = gtk.accelerator_parse(key) label = gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') if self.client.get_bool(KEY('/general/start_fullscreen')): self.fullscreen() if not self.hotkeys.bind(key, self.show_hide): guake.notifier.show_message( _('Guake!'), _('A problem happened when binding <b>%s</b> key.\n' 'Please use Guake Preferences dialog to choose another ' 'key') % xml_escape(label), filename) self.client.set_bool(KEY('/general/use_trayicon'), True) elif self.client.get_bool(KEY('/general/use_popup')): # Pop-up that shows that guake is working properly (if not # unset in the preferences windows) guake.notifier.show_message( _('Guake!'), _('Guake is now running,\n' 'press <b>%s</b> to use it.') % xml_escape(label), filename)
def __init__(self): """Setup the preferences dialog interface, loading images, adding filters to file choosers and connecting some signals. """ super(PrefsDialog, self).__init__(gladefile("prefs.glade"), root="config-window") self.add_callbacks(PrefsCallbacks()) self.client = gconf.client_get_default() # setting evtbox title bg eventbox = self.get_widget("eventbox-title") eventbox.modify_bg(gtk.STATE_NORMAL, eventbox.get_colormap().alloc_color("#ffffff")) # images ipath = pixmapfile("guake-notification.png") self.get_widget("image_logo").set_from_file(ipath) ipath = pixmapfile("quick-open.png") self.get_widget("image_quick_open").set_from_file(ipath) # the first position in tree will store the keybinding path in gconf, # and the user doesn't worry with this, let's hide that =D model = gtk.TreeStore(str, str, object, bool) treeview = self.get_widget("treeview-keys") treeview.set_model(model) treeview.set_rules_hint(True) treeview.connect("button-press-event", self.start_editing) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn("keypath", renderer, text=0) column.set_visible(False) treeview.append_column(column) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_("Action"), renderer, text=1) column.set_property("expand", True) treeview.append_column(column) renderer = gtk.CellRendererAccel() renderer.set_property("editable", True) renderer.connect("accel-edited", self.on_key_edited, model) renderer.connect("accel-cleared", self.on_key_cleared, model) column = gtk.TreeViewColumn(_("Shortcut"), renderer) column.set_cell_data_func(renderer, self.cell_data_func) column.set_property("expand", False) treeview.append_column(column) self.populate_shell_combo() self.populate_keys_tree() self.populate_display_n() self.load_configs() self.get_widget("config-window").hide() # Preview when selecting a bgimage self.selection_preview = gtk.Image() self.file_filter = gtk.FileFilter() self.file_filter.add_pattern("*.jpg") self.file_filter.add_pattern("*.png") self.file_filter.add_pattern("*.svg") self.file_filter.add_pattern("*.jpeg") self.bgfilechooser = self.get_widget("background_image") self.bgfilechooser.set_preview_widget(self.selection_preview) self.bgfilechooser.set_filter(self.file_filter) self.bgfilechooser.connect("update-preview", self.update_preview, self.selection_preview)
from guake.terminal import GuakeTerminal from guake.terminal import QUICK_OPEN_MATCHERS log = logging.getLogger(__name__) # A regular expression to match possible python interpreters when # filling interpreters combo in preferences (including bpython and ipython) PYTHONS = re.compile(r'^[a-z]python$|^python\d\.\d$') # Path to the shells file, it will be used to start to populate # interpreters combo, see the next variable, its important to fill the # rest of the combo too. SHELLS_FILE = '/etc/shells' # string to show in prefereces dialog for user shell option USER_SHELL_VALUE = _('<user shell>') # translating our types to vte types ERASE_BINDINGS = { 'ASCII DEL': 'ascii-delete', 'Escape sequence': 'delete-sequence', 'Control-H': 'ascii-backspace' } HOTKEYS = [ { 'label': _('General'), 'keys': [ { 'key': GKEY('show_hide'),
from guake.terminal import GuakeTerminal from guake.terminal import QUICK_OPEN_MATCHERS log = logging.getLogger(__name__) # A regular expression to match possible python interpreters when # filling interpreters combo in preferences (including bpython and ipython) PYTHONS = re.compile(r'^[a-z]python$|^python\d\.\d$') # Path to the shells file, it will be used to start to populate # interpreters combo, see the next variable, its important to fill the # rest of the combo too. SHELLS_FILE = '/etc/shells' # string to show in prefereces dialog for user shell option USER_SHELL_VALUE = _('<user shell>') # translating our types to vte types ERASE_BINDINGS = {'ASCII DEL': 'ascii-delete', 'Escape sequence': 'delete-sequence', 'Control-H': 'ascii-backspace'} HOTKEYS = [ {'label': _('General'), 'keys': [{'key': GKEY('show_hide'), 'label': _('Toggle Guake visibility')}, {'key': LKEY('toggle_fullscreen'), 'label': _('Toggle Fullscreen')}, {'key': LKEY('toggle_hide_on_lose_focus'), 'label': _('Toggle Hide on Lose Focus')}, {'key': LKEY('quit'),
def main(): """Parses the command line parameters and decide if dbus methods should be called or not. If there is already a guake instance running it will be used and a True value will be returned, otherwise, false will be returned. """ setupLogging(True) # COLORTERM is an environment variable set by some terminal emulators such as gnome-terminal. # To avoid confusing applications running inside Guake, clean up COLORTERM at startup. if "COLORTERM" in os.environ: del os.environ['COLORTERM'] # Force to xterm-256 colors for compatibility with some old command line programs os.environ["TERM"] = "xterm-256color" parser = OptionParser(version='Guake Terminal %s' % VERSION) parser.add_option('-f', '--fullscreen', dest='fullscreen', action='store_true', default=False, help=_('Put Guake in fullscreen mode')) parser.add_option('-t', '--toggle-visibility', dest='show_hide', action='store_true', default=False, help=_('Toggles the visibility of the terminal window')) parser.add_option('--show', dest="show", action='store_true', default=False, help=_('Shows Guake main window')) parser.add_option('--hide', dest='hide', action='store_true', default=False, help=_('Hides Guake main window')) parser.add_option('-p', '--preferences', dest='show_preferences', action='store_true', default=False, help=_('Shows Guake preference window')) parser.add_option('-a', '--about', dest='show_about', action='store_true', default=False, help=_('Shows Guake\'s about info')) parser.add_option( '-n', '--new-tab', dest='new_tab', action='store', default='', help=_('Add a new tab (with current directory set to NEW_TAB)')) parser.add_option( '-s', '--select-tab', dest='select_tab', action='store', default='', help=_('Select a tab (SELECT_TAB is the index of the tab)')) parser.add_option('-g', '--selected-tab', dest='selected_tab', action='store_true', default=False, help=_('Return the selected tab index.')) parser.add_option('-l', '--selected-tablabel', dest='selected_tablabel', action='store_true', default=False, help=_('Return the selected tab label.')) parser.add_option( '-e', '--execute-command', dest='command', action='store', default='', help=_('Execute an arbitrary command in the selected tab.')) parser.add_option('-i', '--tab-index', dest='tab_index', action='store', default='0', help=_('Specify the tab to rename. Default is 0.')) parser.add_option('--bgcolor', dest='bgcolor', action='store', default='', help=_( 'Set the hexadecimal (#rrggbb) background color of ' 'the selected tab.')) parser.add_option( '--fgcolor', dest='fgcolor', action='store', default='', help=_('Set the hexadecimal (#rrggbb) foreground color of the ' 'selected tab.')) parser.add_option( '--rename-tab', dest='rename_tab', metavar='TITLE', action='store', default='', help=_('Rename the specified tab. Reset to default if TITLE is ' 'a single dash "-".')) parser.add_option( '-r', '--rename-current-tab', dest='rename_current_tab', metavar='TITLE', action='store', default='', help=_('Rename the current tab. Reset to default if TITLE is a ' 'single dash "-".')) parser.add_option('-q', '--quit', dest='quit', action='store_true', default=False, help=_('Says to Guake go away =(')) parser.add_option('-u', '--no-startup-script', dest='execute_startup_script', action='store_false', default=True, help=_('Do not execute the start up script')) options = parser.parse_args()[0] instance = None # Trying to get an already running instance of guake. If it is not # possible, lets create a new instance. This function will return # a boolean value depending on this decision. try: bus = dbus.SessionBus() remote_object = bus.get_object(DBUS_NAME, DBUS_PATH) already_running = True except dbus.DBusException: log.debug("DBus not running, starting it") instance = Guake() remote_object = DbusManager(instance) already_running = False only_show_hide = True if options.fullscreen: remote_object.fullscreen() if options.show: remote_object.show_from_remote() if options.hide: remote_object.hide_from_remote() if options.show_preferences: remote_object.show_prefs() only_show_hide = False if options.new_tab: remote_object.add_tab(options.new_tab) only_show_hide = False if options.select_tab: selected = int(options.select_tab) i = remote_object.select_tab(selected) if i is None: sys.stdout.write('invalid index: %d\n' % selected) only_show_hide = False if options.selected_tab: selected = remote_object.get_selected_tab() sys.stdout.write('%d\n' % selected) only_show_hide = False if options.selected_tablabel: selectedlabel = remote_object.get_selected_tablabel() sys.stdout.write('%s\n' % selectedlabel) only_show_hide = False if options.command: remote_object.execute_command(options.command) only_show_hide = False if options.tab_index and options.rename_tab: try: remote_object.rename_tab_uuid(str(uuid.UUID(options.tab_index)), options.rename_tab) except ValueError: remote_object.rename_tab(int(options.tab_index), options.rename_tab) only_show_hide = False if options.bgcolor: remote_object.set_bgcolor(options.bgcolor) only_show_hide = False if options.fgcolor: remote_object.set_fgcolor(options.fgcolor) only_show_hide = False if options.rename_current_tab: remote_object.rename_current_tab(options.rename_current_tab) only_show_hide = False if options.show_about: remote_object.show_about() only_show_hide = False if options.quit: try: remote_object.quit() return True except dbus.DBusException: return True if already_running and only_show_hide: # here we know that guake was called without any parameter and # it is already running, so, lets toggle its visibility. remote_object.show_hide() # TODO PORT remove the next line it only exists for testing... remote_object.show_hide() # TODO PORT remove the next line it only exists for testing... # remote_object.show_prefs() if options.execute_startup_script: if not already_running: startup_script = instance.settings.general.get_string( "startup-script") if startup_script: log.info("Calling startup script: %s", startup_script) pid = subprocess.Popen([startup_script], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) log.info("Startup script started with pid: %s", pid) # Please ensure this is the last line !!!! else: log.info( "--no-startup-script argument defined, so don't execute the startup script" ) if already_running: log.info("Guake is already running") return already_running
def load_configs(self): """Load configurations for all widgets in General, Scrolling and Appearance tabs from gconf. """ self._load_default_shell_settings() # login shell value = self.client.get_bool(KEY('/general/use_login_shell')) self.get_widget('use_login_shell').set_active(value) # tray icon value = self.client.get_bool(KEY('/general/use_trayicon')) self.get_widget('use_trayicon').set_active(value) # popup value = self.client.get_bool(KEY('/general/use_popup')) self.get_widget('use_popup').set_active(value) # prompt on quit value = self.client.get_bool(KEY('/general/prompt_on_quit')) self.get_widget('prompt_on_quit').set_active(value) # prompt on close_tab value = self.client.get_int(KEY('/general/prompt_on_close_tab')) self.get_widget('prompt_on_close_tab').set_active(value) self.get_widget('prompt_on_quit').set_sensitive(value != 2) # ontop value = self.client.get_bool(KEY('/general/window_ontop')) self.get_widget('window_ontop').set_active(value) # tab ontop value = self.client.get_bool(KEY('/general/tab_ontop')) self.get_widget('tab_ontop').set_active(value) # losefocus value = self.client.get_bool(KEY('/general/window_losefocus')) self.get_widget('window_losefocus').set_active(value) # use VTE titles value = self.client.get_bool(KEY('/general/use_vte_titles')) self.get_widget('use_vte_titles').set_active(value) # abbreviate tab names self.get_widget('abbreviate_tab_names').set_sensitive(value) value = self.client.get_bool(KEY('/general/abbreviate_tab_names')) self.get_widget('abbreviate_tab_names').set_active(value) # max tab name length value = self.client.get_int(KEY('/general/max_tab_name_length')) self.get_widget('max_tab_name_length').set_value(value) self.update_vte_subwidgets_states() value = self.client.get_float(KEY('/general/window_height_f')) if not value: value = self.client.get_int(KEY('/general/window_height')) self.get_widget('window_height').set_value(value) value = self.client.get_float(KEY('/general/window_width_f')) if not value: value = self.client.get_int(KEY('/general/window_width')) self.get_widget('window_width').set_value(value) value = self.client.get_int(KEY('/general/window_halignment')) which_button = { ALIGN_RIGHT: 'radiobutton_align_right', ALIGN_LEFT: 'radiobutton_align_left', ALIGN_CENTER: 'radiobutton_align_center' } self.get_widget(which_button[value]).set_active(True) value = self.client.get_bool(KEY('/general/open_tab_cwd')) self.get_widget('open_tab_cwd').set_active(value) # tab bar value = self.client.get_bool(KEY('/general/window_tabbar')) self.get_widget('window_tabbar').set_active(value) # start fullscreen value = self.client.get_bool(KEY('/general/start_fullscreen')) self.get_widget('start_fullscreen').set_active(value) # use visible bell value = self.client.get_bool(KEY('/general/use_visible_bell')) self.get_widget('use_visible_bell').set_active(value) # use audible bell value = self.client.get_bool(KEY('/general/use_audible_bell')) self.get_widget('use_audible_bell').set_active(value) self._load_screen_settings() value = self.client.get_bool(KEY('/general/quick_open_enable')) self.get_widget('quick_open_enable').set_active(value) self.get_widget('quick_open_command_line').set_sensitive(value) self.get_widget('quick_open_in_current_terminal').set_sensitive(value) text = gtk.TextBuffer() text = self.get_widget('quick_open_supported_patterns').get_buffer() for title, matcher, _useless in QUICK_OPEN_MATCHERS: text.insert_at_cursor("%s: %s\n" % (title, matcher)) self.get_widget('quick_open_supported_patterns').set_buffer(text) value = self.client.get_string(KEY('/general/quick_open_command_line')) if value is None: value = "subl %(file_path)s:%(line_number)s" self.get_widget('quick_open_command_line').set_text(value) value = self.client.get_bool(KEY('/general/quick_open_in_current_terminal')) self.get_widget('quick_open_in_current_terminal').set_active(value) value = self.client.get_string(KEY('/general/startup_script')) self.get_widget('startup_script').set_text(value) # use display where the mouse is currently value = self.client.get_bool(KEY('/general/mouse_display')) self.get_widget('mouse_display').set_active(value) # scrollbar value = self.client.get_bool(KEY('/general/use_scrollbar')) self.get_widget('use_scrollbar').set_active(value) # history size value = self.client.get_int(KEY('/general/history_size')) self.get_widget('history_size').set_value(value) # scroll output value = self.client.get_bool(KEY('/general/scroll_output')) self.get_widget('scroll_output').set_active(value) # scroll keystroke value = self.client.get_bool(KEY('/general/scroll_keystroke')) self.get_widget('scroll_keystroke').set_active(value) # default font value = self.client.get_bool(KEY('/general/use_default_font')) self.get_widget('use_default_font').set_active(value) self.get_widget('font_style').set_sensitive(not value) # resizer visibility value = self.client.get_bool(KEY('/general/show_resizer')) self.get_widget('show_resizer').set_active(value) # use font and background color value = self.client.get_bool(KEY('/general/use_palette_font_and_background_color')) self.get_widget('use_palette_font_and_background_color').set_active(value) self.get_widget('palette_16').set_sensitive(value) self.get_widget('palette_17').set_sensitive(value) # font value = self.client.get_string(KEY('/style/font/style')) if value: self.get_widget('font_style').set_font_name(value) # font color val = self.client.get_string(KEY('/style/font/color')) try: color = gtk.gdk.color_parse(val) self.get_widget('font_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # background color value = self.client.get_string(KEY('/style/background/color')) try: color = gtk.gdk.color_parse(value) self.get_widget('background_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # allow bold font value = self.client.get_bool(KEY('/style/font/allow_bold')) self.get_widget('allow_bold').set_active(value) # palette self.fill_palette_names() value = self.client.get_string(KEY('/style/font/palette_name')) self.set_palette_name(value) value = self.client.get_string(KEY('/style/font/palette')) self.set_palette_colors(value) self.update_demo_palette(value) # cursor shape value = self.client.get_int(KEY('/style/cursor_shape')) self.set_cursor_shape(value) # cursor blink value = self.client.get_int(KEY('/style/cursor_blink_mode')) self.set_cursor_blink_mode(value) # background image value = self.client.get_string(KEY('/style/background/image')) if os.path.isfile(value or ''): self.get_widget('background_image').set_filename(value) value = self.client.get_int(KEY('/style/background/transparency')) self.get_widget('background_transparency').set_value(value) value = self.client.get_int(KEY('/general/window_valignment')) self.get_widget('top_align').set_active(value) # it's a separated method, to be reused. self.reload_erase_combos() # custom command context-menu configuration file custom_command_file = self.client.get_string(KEY('/general/custom_command_file')) if custom_command_file: custom_command_file_name = os.path.expanduser(custom_command_file) else: custom_command_file_name = None custom_cmd_filter = gtk.FileFilter() custom_cmd_filter.set_name(_("JSON files")) custom_cmd_filter.add_pattern("*.json") self.get_widget('custom_command_file_chooser').add_filter(custom_cmd_filter) all_files_filter = gtk.FileFilter() all_files_filter.set_name(_("All files")) all_files_filter.add_pattern("*") self.get_widget('custom_command_file_chooser').add_filter(all_files_filter) if custom_command_file_name: self.get_widget('custom_command_file_chooser').set_filename(custom_command_file_name) # hooks self._load_hooks_settings() return
from guake.globals import NAME from guake.simplegladeapp import SimpleGladeApp from guake.simplegladeapp import bindtextdomain from guake.terminal import QUICK_OPEN_MATCHERS # A regular expression to match possible python interpreters when # filling interpreters combo in preferences (including bpython and ipython) PYTHONS = re.compile(r"^[a-z]python$|^python\d\.\d$") # Path to the shells file, it will be used to start to populate # interpreters combo, see the next variable, its important to fill the # rest of the combo too. SHELLS_FILE = "/etc/shells" # string to show in prefereces dialog for user shell option USER_SHELL_VALUE = _("<user shell>") # translating our types to vte types ERASE_BINDINGS = {"ASCII DEL": "ascii-delete", "Escape sequence": "delete-sequence", "Control-H": "ascii-backspace"} HOTKEYS = [ { "label": "General", "keys": [ {"key": GKEY("show_hide"), "label": "Toggle Guake visibility"}, {"key": LKEY("toggle_fullscreen"), "label": "Toggle Fullscreen"}, {"key": LKEY("toggle_hide_on_lose_focus"), "label": "Toggle Hide on Lose Focus"}, {"key": LKEY("quit"), "label": "Quit"}, ], }, {
def add_tab(self, directory=None): """Adds a new tab to the terminal notebook. """ box = GuakeTerminalBox() box.terminal.grab_focus() box.terminal.drag_dest_set(gtk.DEST_DEFAULT_MOTION | gtk.DEST_DEFAULT_DROP | gtk.DEST_DEFAULT_HIGHLIGHT, [('text/uri-list', gtk.TARGET_OTHER_APP, 0)], gtk.gdk.ACTION_COPY ) box.terminal.connect('button-press-event', self.show_context_menu) box.terminal.connect('child-exited', self.on_terminal_exited, box) box.terminal.connect('window-title-changed', self.on_terminal_title_changed, box) box.terminal.connect('drag-data-received', self.on_drag_data_received, box) # -- Ubuntu has a patch to libvte which disables mouse scrolling in apps # -- like vim and less by default. If this is the case, enable it back. if hasattr(box.terminal, "set_alternate_screen_scroll"): box.terminal.set_alternate_screen_scroll(True) box.show() self.notebook.append_tab(box.terminal) # We can choose the directory to vte launch. It is important # to be used by dbus interface. I'm testing if directory is a # string because when binded to a signal, the first param can # be a button not a directory. default_params = {} if isinstance(directory, basestring): default_params['directory'] = directory final_params = self.get_fork_params(default_params) pid = box.terminal.fork_command(**final_params) if libutempter is not None: # After the fork_command we add this new tty to utmp ! libutempter.utempter_add_record(box.terminal.get_pty(), os.uname()[1]) box.terminal.pid = pid # Adding a new radio button to the tabbar label = box.terminal.get_window_title() or _("Terminal") tabs = self.tabs.get_children() parent = tabs and tabs[0] or None bnt = gtk.RadioButton(group=parent, label=label, use_underline=False) bnt.set_property('can-focus', False) bnt.set_property('draw-indicator', False) bnt.connect('button-press-event', self.show_tab_menu) bnt.connect('button-press-event', self.show_rename_current_tab_dialog) bnt.connect('clicked', lambda *x: self.notebook.set_current_page( self.notebook.page_num(box) )) if self.selected_color is not None: bnt.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.Color(str(self.selected_color))) drag_drop_type = ("text/plain", gtk.TARGET_SAME_APP, 80) bnt.drag_dest_set(gtk.DEST_DEFAULT_ALL, [drag_drop_type], gtk.gdk.ACTION_MOVE) bnt.connect("drag_data_received", self.on_drop_tab) bnt.drag_source_set(gtk.gdk.BUTTON1_MASK, [drag_drop_type], gtk.gdk.ACTION_MOVE) bnt.connect("drag_data_get", self.on_drag_tab) bnt.show() self.tabs.pack_start(bnt, expand=False, padding=1) self.notebook.append_page(box, None) self.notebook.set_current_page(self.notebook.page_num(box)) box.terminal.grab_focus() self.load_config() if self.is_fullscreen: self.fullscreen()
from guake.terminal import GuakeTerminal from guake.terminal import QUICK_OPEN_MATCHERS log = logging.getLogger(__name__) # A regular expression to match possible python interpreters when # filling interpreters combo in preferences (including bpython and ipython) PYTHONS = re.compile(r'^[a-z]python$|^python\d\.\d$') # Path to the shells file, it will be used to start to populate # interpreters combo, see the next variable, its important to fill the # rest of the combo too. SHELLS_FILE = '/etc/shells' # string to show in prefereces dialog for user shell option USER_SHELL_VALUE = _('<user shell>') # translating our types to vte types ERASE_BINDINGS = {'ASCII DEL': 'ascii-delete', 'Escape sequence': 'delete-sequence', 'Control-H': 'ascii-backspace'} HOTKEYS = [ {'label': 'General', 'keys': [{'key': GKEY('show_hide'), 'label': 'Toggle Guake visibility'}, {'key': LKEY('toggle_fullscreen'), 'label': 'Toggle Fullscreen'}, {'key': LKEY('toggle_hide_on_lose_focus'), 'label': 'Toggle Hide on Lose Focus'}, {'key': LKEY('quit'),
def __init__(self): """Setup the preferences dialog interface, loading images, adding filters to file choosers and connecting some signals. """ super(PrefsDialog, self).__init__(gladefile('prefs.glade'), root='config-window') self.add_callbacks(PrefsCallbacks(self)) self.client = gconf.client_get_default() # window cleanup handler self.get_widget('config-window').connect('destroy', self.on_destroy) # setting evtbox title bg eventbox = self.get_widget('eventbox-title') eventbox.modify_bg(gtk.STATE_NORMAL, eventbox.get_colormap().alloc_color("#ffffff")) # images ipath = pixmapfile('guake-notification.png') self.get_widget('image_logo').set_from_file(ipath) ipath = pixmapfile('quick-open.png') self.get_widget('image_quick_open').set_from_file(ipath) # the first position in tree will store the keybinding path in gconf, # and the user doesn't worry with this, let's hide that =D model = gtk.TreeStore(str, str, object, bool) treeview = self.get_widget('treeview-keys') treeview.set_model(model) treeview.set_rules_hint(True) treeview.connect('button-press-event', self.start_editing) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn('keypath', renderer, text=0) column.set_visible(False) treeview.append_column(column) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Action'), renderer, text=1) column.set_property('expand', True) treeview.append_column(column) renderer = gtk.CellRendererAccel() renderer.set_property('editable', True) renderer.connect('accel-edited', self.on_key_edited, model) renderer.connect('accel-cleared', self.on_key_cleared, model) column = gtk.TreeViewColumn(_('Shortcut'), renderer) column.set_cell_data_func(renderer, self.cell_data_func) column.set_property('expand', False) treeview.append_column(column) self.demo_terminal = GuakeTerminal() demo_terminal_box = self.get_widget('demo_terminal_box') demo_terminal_box.add(self.demo_terminal) default_params = {} pid = self.demo_terminal.fork_command(**default_params) self.demo_terminal.pid = pid self.populate_shell_combo() self.populate_keys_tree() self.populate_display_n() self.load_configs() self.get_widget('config-window').hide() # Preview when selecting a bgimage self.selection_preview = gtk.Image() self.file_filter = gtk.FileFilter() self.file_filter.add_pattern("*.jpg") self.file_filter.add_pattern("*.png") self.file_filter.add_pattern("*.svg") self.file_filter.add_pattern("*.jpeg") self.bgfilechooser = self.get_widget('background_image') self.bgfilechooser.set_preview_widget(self.selection_preview) self.bgfilechooser.set_filter(self.file_filter) self.bgfilechooser.connect('update-preview', self.update_preview, self.selection_preview)
def main(): """Parses the command line parameters and decide if dbus methods should be called or not. If there is already a guake instance running it will be used and a True value will be returned, otherwise, false will be returned. """ # COLORTERM is an environment variable set by some terminal emulators such as gnome-terminal. # To avoid confusing applications running inside Guake, clean up COLORTERM at startup. if "COLORTERM" in os.environ: del os.environ['COLORTERM'] # Force to xterm-256 colors for compatibility with some old command line programs os.environ["TERM"] = "xterm-256color" parser = OptionParser(version='Guake Terminal %s' % VERSION) parser.add_option('-f', '--fullscreen', dest='fullscreen', action='store_true', default=False, help=_('Put Guake in fullscreen mode')) parser.add_option('-t', '--toggle-visibility', dest='show_hide', action='store_true', default=False, help=_('Toggles the visibility of the terminal window')) parser.add_option('--show', dest="show", action='store_true', default=False, help=_('Shows Guake main window')) parser.add_option('--hide', dest='hide', action='store_true', default=False, help=_('Hides Guake main window')) parser.add_option('-p', '--preferences', dest='show_preferences', action='store_true', default=False, help=_('Shows Guake preference window')) parser.add_option('-a', '--about', dest='show_about', action='store_true', default=False, help=_('Shows Guake\'s about info')) parser.add_option('-n', '--new-tab', dest='new_tab', action='store', default='', help=_('Add a new tab (with current directory set to NEW_TAB)')) parser.add_option('-s', '--select-tab', dest='select_tab', action='store', default='', help=_('Select a tab (SELECT_TAB is the index of the tab)')) parser.add_option('-g', '--selected-tab', dest='selected_tab', action='store_true', default=False, help=_('Return the selected tab index.')) parser.add_option('-e', '--execute-command', dest='command', action='store', default='', help=_('Execute an arbitrary command in the selected tab.')) parser.add_option('-i', '--tab-index', dest='tab_index', action='store', default='0', help=_('Specify the tab to rename. Default is 0.')) parser.add_option('--bgimg', dest='bgimg', action='store', default='', help=_('Set the background image of ' 'the selected tab.')) parser.add_option('--bgcolor', dest='bgcolor', action='store', default='', help=_('Set the hexadecimal (#rrggbb) background color of ' 'the selected tab.')) parser.add_option('--fgcolor', dest='fgcolor', action='store', default='', help=_('Set the hexadecimal (#rrggbb) foreground color of the ' 'selected tab.')) parser.add_option('--rename-tab', dest='rename_tab', metavar='TITLE', action='store', default='', help=_('Rename the specified tab. Reset to default if TITLE is ' 'a single dash "-".')) parser.add_option('-r', '--rename-current-tab', dest='rename_current_tab', metavar='TITLE', action='store', default='', help=_('Rename the current tab. Reset to default if TITLE is a ' 'single dash "-".')) parser.add_option('-q', '--quit', dest='quit', action='store_true', default=False, help=_('Says to Guake go away =(')) parser.add_option('-u', '--no-startup-script', dest='execute_startup_script', action='store_false', default=True, help=_('Do not execute the start up script')) options = parser.parse_args()[0] instance = None # Trying to get an already running instance of guake. If it is not # possible, lets create a new instance. This function will return # a boolean value depending on this decision. try: bus = dbus.SessionBus() remote_object = bus.get_object(DBUS_NAME, DBUS_PATH) already_running = True except dbus.DBusException: instance = Guake() remote_object = DbusManager(instance) already_running = False only_show_hide = True if options.fullscreen: remote_object.fullscreen() if options.show: remote_object.show_from_remote() if options.hide: remote_object.hide_from_remote() if options.show_preferences: remote_object.show_prefs() only_show_hide = False if options.new_tab: remote_object.add_tab(options.new_tab) only_show_hide = False if options.select_tab: selected = int(options.select_tab) i = remote_object.select_tab(selected) if i is None: sys.stdout.write('invalid index: %d\n' % selected) only_show_hide = False if options.selected_tab: selected = remote_object.get_selected_tab() sys.stdout.write('%d\n' % selected) only_show_hide = False if options.command: remote_object.execute_command(options.command) only_show_hide = False if options.tab_index and options.rename_tab: try: remote_object.rename_tab_uuid(str(uuid.UUID(options.tab_index)), options.rename_tab) except ValueError: remote_object.rename_tab(int(options.tab_index), options.rename_tab) only_show_hide = False if options.bgimg: remote_object.set_bg_image(options.bgimg) only_show_hide = False if options.bgcolor: remote_object.set_bgcolor(options.bgcolor) only_show_hide = False if options.fgcolor: remote_object.set_fgcolor(options.fgcolor) only_show_hide = False if options.rename_current_tab: remote_object.rename_current_tab(options.rename_current_tab) only_show_hide = False if options.show_about: remote_object.show_about() only_show_hide = False if already_running and only_show_hide: # here we know that guake was called without any parameter and # it is already running, so, lets toggle its visibility. remote_object.show_hide() if options.execute_startup_script: if not already_running: startup_script = instance.client.get_string(KEY("/general/startup_script")) if startup_script: log.info("Calling startup script: %s", startup_script) pid = subprocess.Popen([startup_script], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) log.info("Startup script started with pid: %s", pid) # Please ensure this is the last line !!!! else: log.info("--no-startup-script argument defined, so don't execute the startup script") return already_running
def load_configs(self): """Load configurations for all widgets in General, Scrolling and Appearance tabs from gconf. """ self._load_default_shell_settings() # login shell value = self.settings.general.get_boolean('use-login-shell') self.get_widget('use_login_shell').set_active(value) # tray icon value = self.settings.general.get_boolean('use-trayicon') self.get_widget('use_trayicon').set_active(value) # popup value = self.settings.general.get_boolean('use-popup') self.get_widget('use_popup').set_active(value) # prompt on quit value = self.settings.general.get_boolean('prompt-on-quit') self.get_widget('prompt_on_quit').set_active(value) # prompt on close_tab value = self.settings.general.get_int('prompt-on-close-tab') self.get_widget('prompt_on_close_tab').set_active(value) self.get_widget('prompt_on_quit').set_sensitive(value != 2) # ontop value = self.settings.general.get_boolean('window-ontop') self.get_widget('window_ontop').set_active(value) # tab ontop value = self.settings.general.get_boolean('tab-ontop') self.get_widget('tab_ontop').set_active(value) # refocus value = self.settings.general.get_boolean('window-refocus') self.get_widget('window_refocus').set_active(value) # losefocus value = self.settings.general.get_boolean('window-losefocus') self.get_widget('window_losefocus').set_active(value) # use VTE titles value = self.settings.general.get_boolean('use-vte-titles') self.get_widget('use_vte_titles').set_active(value) # set window title value = self.settings.general.get_boolean('set-window-title') self.get_widget('set_window_title').set_active(value) # abbreviate tab names self.get_widget('abbreviate_tab_names').set_sensitive(value) value = self.settings.general.get_boolean('abbreviate-tab-names') self.get_widget('abbreviate_tab_names').set_active(value) # max tab name length value = self.settings.general.get_int('max-tab-name-length') self.get_widget('max_tab_name_length').set_value(value) self.update_vte_subwidgets_states() value = self.settings.general.get_double('window-height-f') if not value: value = self.settings.general.get_int('window-height') self.get_widget('window_height').set_value(value) value = self.settings.general.get_double('window-width-f') if not value: value = self.settings.general.get_int('window-width') self.get_widget('window_width').set_value(value) value = self.settings.general.get_int('window-halignment') which_button = { ALIGN_RIGHT: 'radiobutton_align_right', ALIGN_LEFT: 'radiobutton_align_left', ALIGN_CENTER: 'radiobutton_align_center' } self.get_widget(which_button[value]).set_active(True) value = self.settings.general.get_boolean('open-tab-cwd') self.get_widget('open_tab_cwd').set_active(value) # tab bar value = self.settings.general.get_boolean('window-tabbar') self.get_widget('window_tabbar').set_active(value) # start fullscreen value = self.settings.general.get_boolean('start-fullscreen') self.get_widget('start_fullscreen').set_active(value) # use visible bell # TODO PORT remove this. the new vte has now visual bell feature value = self.settings.general.get_boolean('use-visible-bell') self.get_widget('use_visible_bell').set_active(value) # use audible bell value = self.settings.general.get_boolean('use-audible-bell') self.get_widget('use_audible_bell').set_active(value) self._load_screen_settings() value = self.settings.general.get_boolean('quick-open-enable') self.get_widget('quick_open_enable').set_active(value) self.get_widget('quick_open_command_line').set_sensitive(value) self.get_widget('quick_open_in_current_terminal').set_sensitive(value) text = Gtk.TextBuffer() text = self.get_widget('quick_open_supported_patterns').get_buffer() for title, matcher, _useless in QUICK_OPEN_MATCHERS: text.insert_at_cursor("%s: %s\n" % (title, matcher)) self.get_widget('quick_open_supported_patterns').set_buffer(text) value = self.settings.general.get_string('quick-open-command-line') if value is None: value = "subl %(file_path)s:%(line_number)s" self.get_widget('quick_open_command_line').set_text(value) value = self.settings.general.get_boolean( 'quick-open-in-current-terminal') self.get_widget('quick_open_in_current_terminal').set_active(value) value = self.settings.general.get_string('startup-script') if value: self.get_widget('startup_script').set_text(value) # use display where the mouse is currently value = self.settings.general.get_boolean('mouse-display') self.get_widget('mouse_display').set_active(value) # scrollbar value = self.settings.general.get_boolean('use-scrollbar') self.get_widget('use_scrollbar').set_active(value) # history size value = self.settings.general.get_int('history-size') self.get_widget('history_size').set_value(value) # scroll output value = self.settings.general.get_boolean('scroll-output') self.get_widget('scroll_output').set_active(value) # scroll keystroke value = self.settings.general.get_boolean('scroll-keystroke') self.get_widget('scroll_keystroke').set_active(value) # default font value = self.settings.general.get_boolean('use-default-font') self.get_widget('use_default_font').set_active(value) self.get_widget('font_style').set_sensitive(not value) # font value = self.settings.styleFont.get_string('style') if value: self.get_widget('font_style').set_font_name(value) # allow bold font value = self.settings.styleFont.get_boolean('allow-bold') self.get_widget('allow_bold').set_active(value) # palette self.fill_palette_names() value = self.settings.styleFont.get_string('palette-name') self.set_palette_name(value) value = self.settings.styleFont.get_string('palette') self.set_palette_colors(value) self.update_demo_palette(value) # cursor shape value = self.settings.style.get_int('cursor-shape') self.set_cursor_shape(value) # cursor blink value = self.settings.style.get_int('cursor-blink-mode') self.set_cursor_blink_mode(value) value = self.settings.styleBackground.get_int('transparency') self.get_widget('background_transparency').set_value(value) value = self.settings.general.get_int('window-valignment') self.get_widget('top_align').set_active(value) # it's a separated method, to be reused. self.reload_erase_combos() # custom command context-menu configuration file custom_command_file = self.settings.general.get_string( 'custom-command-file') if custom_command_file: custom_command_file_name = os.path.expanduser(custom_command_file) else: custom_command_file_name = None custom_cmd_filter = Gtk.FileFilter() custom_cmd_filter.set_name(_("JSON files")) custom_cmd_filter.add_pattern("*.json") self.get_widget('custom_command_file_chooser').add_filter( custom_cmd_filter) all_files_filter = Gtk.FileFilter() all_files_filter.set_name(_("All files")) all_files_filter.add_pattern("*") self.get_widget('custom_command_file_chooser').add_filter( all_files_filter) if custom_command_file_name: self.get_widget('custom_command_file_chooser').set_filename( custom_command_file_name) # hooks self._load_hooks_settings()
def load_configs(self): """Load configurations for all widgets in General, Scrolling and Appearance tabs from gconf. """ self._load_default_shell_settings() # login shell value = self.client.get_bool(KEY('/general/use_login_shell')) self.get_widget('use_login_shell').set_active(value) # tray icon value = self.client.get_bool(KEY('/general/use_trayicon')) self.get_widget('use_trayicon').set_active(value) # popup value = self.client.get_bool(KEY('/general/use_popup')) self.get_widget('use_popup').set_active(value) # prompt on quit value = self.client.get_bool(KEY('/general/prompt_on_quit')) self.get_widget('prompt_on_quit').set_active(value) # prompt on close_tab value = self.client.get_int(KEY('/general/prompt_on_close_tab')) self.get_widget('prompt_on_close_tab').set_active(value) self.get_widget('prompt_on_quit').set_sensitive(value != 2) # ontop value = self.client.get_bool(KEY('/general/window_ontop')) self.get_widget('window_ontop').set_active(value) # tab ontop value = self.client.get_bool(KEY('/general/tab_ontop')) self.get_widget('tab_ontop').set_active(value) # losefocus value = self.client.get_bool(KEY('/general/window_losefocus')) self.get_widget('window_losefocus').set_active(value) # use VTE titles value = self.client.get_bool(KEY('/general/use_vte_titles')) self.get_widget('use_vte_titles').set_active(value) # abbreviate tab names self.get_widget('abbreviate_tab_names').set_sensitive(value) value = self.client.get_bool(KEY('/general/abbreviate_tab_names')) self.get_widget('abbreviate_tab_names').set_active(value) # max tab name length value = self.client.get_int(KEY('/general/max_tab_name_length')) self.get_widget('max_tab_name_length').set_value(value) self.update_vte_subwidgets_states() value = self.client.get_float(KEY('/general/window_height_f')) if not value: value = self.client.get_int(KEY('/general/window_height')) self.get_widget('window_height').set_value(value) value = self.client.get_float(KEY('/general/window_width_f')) if not value: value = self.client.get_int(KEY('/general/window_width')) self.get_widget('window_width').set_value(value) value = self.client.get_int(KEY('/general/window_halignment')) which_button = { ALIGN_RIGHT: 'radiobutton_align_right', ALIGN_LEFT: 'radiobutton_align_left', ALIGN_CENTER: 'radiobutton_align_center' } self.get_widget(which_button[value]).set_active(True) value = self.client.get_bool(KEY('/general/open_tab_cwd')) self.get_widget('open_tab_cwd').set_active(value) # tab bar value = self.client.get_bool(KEY('/general/window_tabbar')) self.get_widget('window_tabbar').set_active(value) # start fullscreen value = self.client.get_bool(KEY('/general/start_fullscreen')) self.get_widget('start_fullscreen').set_active(value) # use visible bell value = self.client.get_bool(KEY('/general/use_visible_bell')) self.get_widget('use_visible_bell').set_active(value) # use audible bell value = self.client.get_bool(KEY('/general/use_audible_bell')) self.get_widget('use_audible_bell').set_active(value) self._load_screen_settings() value = self.client.get_bool(KEY('/general/quick_open_enable')) self.get_widget('quick_open_enable').set_active(value) self.get_widget('quick_open_command_line').set_sensitive(value) self.get_widget('quick_open_in_current_terminal').set_sensitive(value) text = gtk.TextBuffer() text = self.get_widget('quick_open_supported_patterns').get_buffer() for title, matcher, _useless in QUICK_OPEN_MATCHERS: text.insert_at_cursor("%s: %s\n" % (title, matcher)) self.get_widget('quick_open_supported_patterns').set_buffer(text) value = self.client.get_string(KEY('/general/quick_open_command_line')) if value is None: value = "subl %(file_path)s:%(line_number)s" self.get_widget('quick_open_command_line').set_text(value) value = self.client.get_bool( KEY('/general/quick_open_in_current_terminal')) self.get_widget('quick_open_in_current_terminal').set_active(value) value = self.client.get_string(KEY('/general/startup_script')) self.get_widget('startup_script').set_text(value) # use display where the mouse is currently value = self.client.get_bool(KEY('/general/mouse_display')) self.get_widget('mouse_display').set_active(value) # scrollbar value = self.client.get_bool(KEY('/general/use_scrollbar')) self.get_widget('use_scrollbar').set_active(value) # history size value = self.client.get_int(KEY('/general/history_size')) self.get_widget('history_size').set_value(value) # scroll output value = self.client.get_bool(KEY('/general/scroll_output')) self.get_widget('scroll_output').set_active(value) # scroll keystroke value = self.client.get_bool(KEY('/general/scroll_keystroke')) self.get_widget('scroll_keystroke').set_active(value) # default font value = self.client.get_bool(KEY('/general/use_default_font')) self.get_widget('use_default_font').set_active(value) self.get_widget('font_style').set_sensitive(not value) # use font and background color value = self.client.get_bool( KEY('/general/use_palette_font_and_background_color')) self.get_widget('use_palette_font_and_background_color').set_active( value) self.get_widget('palette_16').set_sensitive(value) self.get_widget('palette_17').set_sensitive(value) # font value = self.client.get_string(KEY('/style/font/style')) if value: self.get_widget('font_style').set_font_name(value) # font color val = self.client.get_string(KEY('/style/font/color')) try: color = gtk.gdk.color_parse(val) self.get_widget('font_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # background color value = self.client.get_string(KEY('/style/background/color')) try: color = gtk.gdk.color_parse(value) self.get_widget('background_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # allow bold font value = self.client.get_bool(KEY('/style/font/allow_bold')) self.get_widget('allow_bold').set_active(value) # palette self.fill_palette_names() value = self.client.get_string(KEY('/style/font/palette_name')) self.set_palette_name(value) value = self.client.get_string(KEY('/style/font/palette')) self.set_palette_colors(value) self.update_demo_palette(value) # cursor shape value = self.client.get_int(KEY('/style/cursor_shape')) self.set_cursor_shape(value) # cursor blink value = self.client.get_int(KEY('/style/cursor_blink_mode')) self.set_cursor_blink_mode(value) # background image value = self.client.get_string(KEY('/style/background/image')) if os.path.isfile(value or ''): self.get_widget('background_image').set_filename(value) value = self.client.get_int(KEY('/style/background/transparency')) self.get_widget('background_transparency').set_value(value) value = self.client.get_int(KEY('/general/window_valignment')) self.get_widget('top_align').set_active(value) # it's a separated method, to be reused. self.reload_erase_combos() # custom command context-menu configuration file custom_command_file = self.client.get_string( KEY('/general/custom_command_file')) if custom_command_file: custom_command_file_name = os.path.expanduser(custom_command_file) else: custom_command_file_name = None custom_cmd_filter = gtk.FileFilter() custom_cmd_filter.set_name(_("JSON files")) custom_cmd_filter.add_pattern("*.json") self.get_widget('custom_command_file_chooser').add_filter( custom_cmd_filter) all_files_filter = gtk.FileFilter() all_files_filter.set_name(_("All files")) all_files_filter.add_pattern("*") self.get_widget('custom_command_file_chooser').add_filter( all_files_filter) if custom_command_file_name: self.get_widget('custom_command_file_chooser').set_filename( custom_command_file_name) # hooks self._load_hooks_settings() return
def main(): """Parses the command line parameters and decide if dbus methods should be called or not. If there is already a guake instance running it will be used and a True value will be returned, otherwise, false will be returned. """ parser = OptionParser() parser.add_option('-f', '--fullscreen', dest='fullscreen', action='store_true', default=False, help=_('Put Guake in fullscreen mode')) parser.add_option('-t', '--toggle-visibility', dest='show_hide', action='store_true', default=False, help=_('Toggles the visibility of the terminal window')) parser.add_option('--show', dest="show", action='store_true', default=False, help=_('Shows Guake main window')) parser.add_option('--hide', dest='hide', action='store_true', default=False, help=_('Hides Guake main window')) parser.add_option('-p', '--preferences', dest='show_preferences', action='store_true', default=False, help=_('Shows Guake preference window')) parser.add_option('-a', '--about', dest='show_about', action='store_true', default=False, help=_('Shows Guake\'s about info')) parser.add_option( '-n', '--new-tab', dest='new_tab', action='store', default='', help=_('Add a new tab (with current directory set to NEW_TAB)')) parser.add_option( '-s', '--select-tab', dest='select_tab', action='store', default='', help=_('Select a tab (SELECT_TAB is the index of the tab)')) parser.add_option('-g', '--selected-tab', dest='selected_tab', action='store_true', default=False, help=_('Return the selected tab index.')) parser.add_option( '-e', '--execute-command', dest='command', action='store', default='', help=_('Execute an arbitrary command in the selected tab.')) parser.add_option('-i', '--tab-index', dest='tab_index', action='store', default='0', help=_('Specify the tab to rename. Default is 0.')) parser.add_option('--bgcolor', dest='bgcolor', action='store', default='', help=_( 'Set the hexadecimal (#rrggbb) background color of ' 'the selected tab.')) parser.add_option( '--fgcolor', dest='fgcolor', action='store', default='', help=_('Set the hexadecimal (#rrggbb) foreground color of the ' 'selected tab.')) parser.add_option( '--rename-tab', dest='rename_tab', metavar='TITLE', action='store', default='', help=_('Rename the specified tab. Reset to default if TITLE is ' 'a single dash "-".')) parser.add_option( '-r', '--rename-current-tab', dest='rename_current_tab', metavar='TITLE', action='store', default='', help=_('Rename the current tab. Reset to default if TITLE is a ' 'single dash "-".')) parser.add_option('-q', '--quit', dest='quit', action='store_true', default=False, help=_('Says to Guake go away =(')) options = parser.parse_args()[0] instance = None # Trying to get an already running instance of guake. If it is not # possible, lets create a new instance. This function will return # a boolean value depending on this decision. try: bus = dbus.SessionBus() remote_object = bus.get_object(DBUS_NAME, DBUS_PATH) already_running = True except dbus.DBusException: instance = Guake() remote_object = DbusManager(instance) already_running = False only_show_hide = True if options.fullscreen: remote_object.fullscreen() if options.show: remote_object.show_from_remote() if options.hide: remote_object.hide_from_remote() if options.show_preferences: remote_object.show_prefs() only_show_hide = False if options.new_tab: remote_object.add_tab(options.new_tab) only_show_hide = False if options.select_tab: selected = int(options.select_tab) i = remote_object.select_tab(selected) if i is None: sys.stdout.write('invalid index: %d\n' % selected) only_show_hide = False if options.selected_tab: selected = remote_object.get_selected_tab() sys.stdout.write('%d\n' % selected) only_show_hide = False if options.command: remote_object.execute_command(options.command) only_show_hide = False if options.tab_index and options.rename_tab: remote_object.rename_tab(int(options.tab_index), options.rename_tab) only_show_hide = False if options.bgcolor: remote_object.set_bgcolor(options.bgcolor) only_show_hide = False if options.fgcolor: remote_object.set_fgcolor(options.fgcolor) only_show_hide = False if options.rename_current_tab: remote_object.rename_current_tab(options.rename_current_tab) only_show_hide = False if options.show_about: remote_object.show_about() only_show_hide = False if options.quit: remote_object.quit() only_show_hide = False if already_running and only_show_hide: # here we know that guake was called without any parameter and # it is already running, so, lets toggle its visibility. remote_object.show_hide() if not already_running: startup_script = instance.client.get_string( KEY("/general/startup_script")) if startup_script: print "Calling startup script: ", startup_script pid = subprocess.Popen([startup_script], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) print "Script started with pid", pid # Please ensure this is the last line !!!! return already_running
def load_configs(self): """Load configurations for all widgets in General, Scrolling and Appearance tabs from gconf. """ # default_shell combo = self.get_widget('default_shell') # get the value for defualt shell. If unset, set to USER_SHELL_VALUE. value = self.client.get_string(KEY('/general/default_shell')) or USER_SHELL_VALUE for i in combo.get_model(): if i[0] == value: combo.set_active_iter(i.iter) # login shell value = self.client.get_bool(KEY('/general/use_login_shell')) self.get_widget('use_login_shell').set_active(value) # tray icon value = self.client.get_bool(KEY('/general/use_trayicon')) self.get_widget('use_trayicon').set_active(value) # popup value = self.client.get_bool(KEY('/general/use_popup')) self.get_widget('use_popup').set_active(value) # prompt on quit value = self.client.get_bool(KEY('/general/prompt_on_quit')) self.get_widget('prompt_on_quit').set_active(value) # prompt on close_tab value = self.client.get_int(KEY('/general/prompt_on_close_tab')) self.get_widget('prompt_on_close_tab').set_active(value) self.get_widget('prompt_on_quit').set_sensitive(value != 2) # ontop value = self.client.get_bool(KEY('/general/window_ontop')) self.get_widget('window_ontop').set_active(value) # tab ontop value = self.client.get_bool(KEY('/general/tab_ontop')) self.get_widget('tab_ontop').set_active(value) # losefocus value = self.client.get_bool(KEY('/general/window_losefocus')) self.get_widget('window_losefocus').set_active(value) # use VTE titles value = self.client.get_bool(KEY('/general/use_vte_titles')) self.get_widget('use_vte_titles').set_active(value) # abbreviate tab names self.get_widget('abbreviate_tab_names').set_sensitive(value) value = self.client.get_bool(KEY('/general/abbreviate_tab_names')) self.get_widget('abbreviate_tab_names').set_active(value) # max tab name length value = self.client.get_int(KEY('/general/max_tab_name_length')) self.get_widget('max_tab_name_length').set_value(value) self.update_vte_subwidgets_states() value = self.client.get_float(KEY('/general/window_height_f')) if not value: value = self.client.get_int(KEY('/general/window_height')) self.get_widget('window_height').set_value(value) value = self.client.get_float(KEY('/general/window_width_f')) if not value: value = self.client.get_int(KEY('/general/window_width')) self.get_widget('window_width').set_value(value) value = self.client.get_int(KEY('/general/window_halignment')) which_button = { ALIGN_RIGHT: 'radiobutton_align_right', ALIGN_LEFT: 'radiobutton_align_left', ALIGN_CENTER: 'radiobutton_align_center' } self.get_widget(which_button[value]).set_active(True) value = self.client.get_bool(KEY('/general/open_tab_cwd')) self.get_widget('open_tab_cwd').set_active(value) # tab bar value = self.client.get_bool(KEY('/general/window_tabbar')) self.get_widget('window_tabbar').set_active(value) # start fullscreen value = self.client.get_bool(KEY('/general/start_fullscreen')) self.get_widget('start_fullscreen').set_active(value) # use visible bell value = self.client.get_bool(KEY('/general/use_visible_bell')) self.get_widget('use_visible_bell').set_active(value) # use audible bell value = self.client.get_bool(KEY('/general/use_audible_bell')) self.get_widget('use_audible_bell').set_active(value) # display number / use primary display combo = self.get_widget('display_n') dest_screen = self.client.get_int(KEY('/general/display_n')) value = self.client.get_bool(KEY('/general/quick_open_enable')) self.get_widget('quick_open_enable').set_active(value) self.get_widget('quick_open_command_line').set_sensitive(value) self.get_widget('quick_open_in_current_terminal').set_sensitive(value) text = gtk.TextBuffer() text = self.get_widget('quick_open_supported_patterns').get_buffer() for title, matcher, _useless in QUICK_OPEN_MATCHERS: text.insert_at_cursor("%s: %s\n" % (title, matcher)) self.get_widget('quick_open_supported_patterns').set_buffer(text) value = self.client.get_string(KEY('/general/quick_open_command_line')) if value is None: value = "subl %(file_path)s:%(line_number)s" self.get_widget('quick_open_command_line').set_text(value) value = self.client.get_bool(KEY('/general/quick_open_in_current_terminal')) self.get_widget('quick_open_in_current_terminal').set_active(value) value = self.client.get_string(KEY('/general/startup_script')) self.get_widget('startup_script').set_text(value) # If Guake is configured to use a screen that is not currently attached, # default to 'primary display' option. screen = self.get_widget('config-window').get_screen() n_screens = screen.get_n_monitors() if dest_screen > n_screens - 1: self.client.set_bool(KEY('/general/mouse_display'), False) dest_screen = screen.get_primary_monitor() self.client.set_int(KEY('/general/display_n'), dest_screen) if dest_screen == ALWAYS_ON_PRIMARY: first_item = combo.get_model().get_iter_first() combo.set_active_iter(first_item) else: seen_first = False # first item "always on primary" is special for i in combo.get_model(): if seen_first: i_int = int(i[0].split()[0]) # extracts 1 from '1' or from '1 (primary)' if i_int == dest_screen: combo.set_active_iter(i.iter) else: seen_first = True # use display where the mouse is currently value = self.client.get_bool(KEY('/general/mouse_display')) self.get_widget('mouse_display').set_active(value) # scrollbar value = self.client.get_bool(KEY('/general/use_scrollbar')) self.get_widget('use_scrollbar').set_active(value) # history size value = self.client.get_int(KEY('/general/history_size')) self.get_widget('history_size').set_value(value) # scroll output value = self.client.get_bool(KEY('/general/scroll_output')) self.get_widget('scroll_output').set_active(value) # scroll keystroke value = self.client.get_bool(KEY('/general/scroll_keystroke')) self.get_widget('scroll_keystroke').set_active(value) # default font value = self.client.get_bool(KEY('/general/use_default_font')) self.get_widget('use_default_font').set_active(value) self.get_widget('font_style').set_sensitive(not value) # use font and background color value = self.client.get_bool(KEY('/general/use_palette_font_and_background_color')) self.get_widget('use_palette_font_and_background_color').set_active(value) self.get_widget('palette_16').set_sensitive(value) self.get_widget('palette_17').set_sensitive(value) # font value = self.client.get_string(KEY('/style/font/style')) if value: self.get_widget('font_style').set_font_name(value) # font color val = self.client.get_string(KEY('/style/font/color')) try: color = gtk.gdk.color_parse(val) self.get_widget('font_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # background color value = self.client.get_string(KEY('/style/background/color')) try: color = gtk.gdk.color_parse(value) self.get_widget('background_color').set_color(color) except (ValueError, TypeError): warnings.warn('Unable to parse color %s' % val, Warning) # allow bold font value = self.client.get_bool(KEY('/style/font/allow_bold')) self.get_widget('allow_bold').set_active(value) # palette self.fill_palette_names() value = self.client.get_string(KEY('/style/font/palette_name')) self.set_palette_name(value) value = self.client.get_string(KEY('/style/font/palette')) self.set_palette_colors(value) self.update_demo_palette(value) # cursor shape value = self.client.get_int(KEY('/style/cursor_shape')) self.set_cursor_shape(value) # cursor blink value = self.client.get_int(KEY('/style/cursor_blink_mode')) self.set_cursor_blink_mode(value) # background image value = self.client.get_string(KEY('/style/background/image')) if os.path.isfile(value or ''): self.get_widget('background_image').set_filename(value) value = self.client.get_int(KEY('/style/background/transparency')) self.get_widget('background_transparency').set_value(value) value = self.client.get_int(KEY('/general/window_valignment')) self.get_widget('top_align').set_active(value) # it's a separated method, to be reused. self.reload_erase_combos() # custom command context-menu configuration file custom_command_file = self.client.get_string(KEY('/general/custom_command_file')) if custom_command_file: custom_command_file_name = os.path.expanduser(custom_command_file) else: custom_command_file_name = None custom_cmd_filter = gtk.FileFilter() custom_cmd_filter.set_name(_("JSON files")) custom_cmd_filter.add_pattern("*.json") self.get_widget('custom_command_file_chooser').add_filter(custom_cmd_filter) all_files_filter = gtk.FileFilter() all_files_filter.set_name(_("All files")) all_files_filter.add_pattern("*") self.get_widget('custom_command_file_chooser').add_filter(all_files_filter) if custom_command_file_name: self.get_widget('custom_command_file_chooser').set_filename(custom_command_file_name)
def main(): """Parses the command line parameters and decide if dbus methods should be called or not. If there is already a guake instance running it will be used and a True value will be returned, otherwise, false will be returned. """ parser = OptionParser() parser.add_option('-f', '--fullscreen', dest='fullscreen', action='store_true', default=False, help=_('Put Guake in fullscreen mode')) parser.add_option('-t', '--toggle-visibility', dest='show_hide', action='store_true', default=False, help=_('Toggles the visibility of the terminal window')) parser.add_option('--show', dest="show", action='store_true', default=False, help=_('Shows Guake main window')) parser.add_option('--hide', dest='hide', action='store_true', default=False, help=_('Hides Guake main window')) parser.add_option('-p', '--preferences', dest='show_preferences', action='store_true', default=False, help=_('Shows Guake preference window')) parser.add_option('-a', '--about', dest='show_about', action='store_true', default=False, help=_('Shows Guake\'s about info')) parser.add_option('-n', '--new-tab', dest='new_tab', action='store', default='', help=_('Add a new tab (with current directory set to NEW_TAB)')) parser.add_option('-s', '--select-tab', dest='select_tab', action='store', default='', help=_('Select a tab (SELECT_TAB is the index of the tab)')) parser.add_option('-g', '--selected-tab', dest='selected_tab', action='store_true', default=False, help=_('Return the selected tab index.')) parser.add_option('-e', '--execute-command', dest='command', action='store', default='', help=_('Execute an arbitrary command in the selected tab.')) parser.add_option('-i', '--tab-index', dest='tab_index', action='store', default='0', help=_('Specify the tab to rename. Default is 0.')) parser.add_option('--bgcolor', dest='bgcolor', action='store', default='', help=_('Set the hexadecimal (#rrggbb) background color of ' 'the selected tab.')) parser.add_option('--fgcolor', dest='fgcolor', action='store', default='', help=_('Set the hexadecimal (#rrggbb) foreground color of the ' 'selected tab.')) parser.add_option('--rename-tab', dest='rename_tab', metavar='TITLE', action='store', default='', help=_('Rename the specified tab. Reset to default if TITLE is ' 'a single dash "-".')) parser.add_option('-r', '--rename-current-tab', dest='rename_current_tab', metavar='TITLE', action='store', default='', help=_('Rename the current tab. Reset to default if TITLE is a ' 'single dash "-".')) parser.add_option('-q', '--quit', dest='quit', action='store_true', default=False, help=_('Says to Guake go away =(')) options = parser.parse_args()[0] instance = None # Trying to get an already running instance of guake. If it is not # possible, lets create a new instance. This function will return # a boolean value depending on this decision. try: bus = dbus.SessionBus() remote_object = bus.get_object(DBUS_NAME, DBUS_PATH) already_running = True except dbus.DBusException: instance = Guake() remote_object = DbusManager(instance) already_running = False only_show_hide = True if options.fullscreen: remote_object.fullscreen() if options.show: remote_object.show_from_remote() if options.hide: remote_object.hide_from_remote() if options.show_preferences: remote_object.show_prefs() only_show_hide = False if options.new_tab: remote_object.add_tab(options.new_tab) only_show_hide = False if options.select_tab: selected = int(options.select_tab) i = remote_object.select_tab(selected) if i is None: sys.stdout.write('invalid index: %d\n' % selected) only_show_hide = False if options.selected_tab: selected = remote_object.get_selected_tab() sys.stdout.write('%d\n' % selected) only_show_hide = False if options.command: remote_object.execute_command(options.command) only_show_hide = False if options.tab_index and options.rename_tab: remote_object.rename_tab(int(options.tab_index), options.rename_tab) only_show_hide = False if options.bgcolor: remote_object.set_bgcolor(options.bgcolor) only_show_hide = False if options.fgcolor: remote_object.set_fgcolor(options.fgcolor) only_show_hide = False if options.rename_current_tab: remote_object.rename_current_tab(options.rename_current_tab) only_show_hide = False if options.show_about: remote_object.show_about() only_show_hide = False if options.quit: remote_object.quit() only_show_hide = False if already_running and only_show_hide: # here we know that guake was called without any parameter and # it is already running, so, lets toggle its visibility. remote_object.show_hide() if not already_running: startup_script = instance.client.get_string(KEY("/general/startup_script")) if startup_script: print "Calling startup script: ", startup_script pid = subprocess.Popen([startup_script], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) print "Script started with pid", pid # Please ensure this is the last line !!!! return already_running