def reload_global(self, settings, key, user_data): value = settings.get_string(key) if value == 'disabled': return try: self.guake.hotkeys.unbind(self.globalhotkeys[key]) except Exception as e: pass self.globalhotkeys[key] = value if key == "show-hide": log.debug("reload_global: %r", value) if not self.guake.hotkeys.bind(value, self.guake.show_hide): keyval, mask = Gtk.accelerator_parse(value) label = Gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') notifier.showMessage( _('Guake Terminal'), _('A problem happened when binding <b>%s</b> key.\n' 'Please use Guake Preferences dialog to choose another ' 'key') % label, filename) elif key == "show-focus": if not self.guake.hotkeys.bind(value, self.guake.show_focus): log.warn("can't bind show-focus key") return
def reload_global(self, settings, key, user_data): value = settings.get_string(key) if value == 'disabled': return try: self.guake.hotkeys.unbind(self.globalhotkeys[key]) except Exception as e: pass self.globalhotkeys[key] = value if key == "show-hide": log.debug("reload_global: %r", value) if not self.guake.hotkeys.bind(value, self.guake.show_hide): keyval, mask = Gtk.accelerator_parse(value) label = Gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') notifier.showMessage( _('Guake Terminal'), _( 'A problem happened when binding <b>%s</b> key.\n' 'Please use Guake Preferences dialog to choose another ' 'key' ) % label, filename ) elif key == "show-focus": if not self.guake.hotkeys.bind(value, self.guake.show_focus): log.warn("can't bind show-focus key") return
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 g(mocker, fs): mocker.patch('guake.guake_app.Guake.get_xdg_config_directory', return_value=Path('/foobar')) mocker.patch('guake.guake_app.shutil.copy', create=True) mocker.patch('guake.guake_app.notifier.showMessage', create=True) mocker.patch('guake.guake_app.traceback.print_exc', create=True) fs.pause() g = Guake() fs.add_real_file(pixmapfile('guake-notification.png')) fs.resume() return g
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!') dialog.set_version(VERSION)
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(guake_version()) dialog.connect("response", lambda x, y: dialog.destroy())
def __init__(self): super().__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(guake_version()) dialog.connect("response", lambda x, y: dialog.destroy())
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 reload_global(self, settings, key, user_data): value = settings.get_string(key) if value == 'disabled': return try: self.guake.hotkeys.unbind(self.globalhotkeys[key]) except Exception as e: pass self.globalhotkeys[key] = value if not self.guake.hotkeys.bind(value, self.guake.show_hide): print("shit") # TODO port this return keyval, mask = Gtk.accelerator_parse(value) label = Gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') guake.notifier.showMessage( _('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 __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 __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): def load_schema(): return Gio.SettingsSchemaSource.new_from_directory( SCHEMA_DIR, Gio.SettingsSchemaSource.get_default(), False) try: schema_source = load_schema() except GLib.Error: # pylint: disable=catching-non-exception log.exception("Unable to load the GLib schema, try to compile it") try_to_compile_glib_schemas() schema_source = load_schema() self.settings = Settings(schema_source) super(Guake, self).__init__(gladefile('guake.glade')) select_gtk_theme(self.settings) patch_gtk_theme( self.get_widget("window-root").get_style_context(), self.settings) self.add_callbacks(self) self.debug_mode = self.settings.general.get_boolean('debug-mode') setupLogging(self.debug_mode) log.info('Guake Terminal %s', guake_version()) log.info('VTE %s', vte_version()) log.info('Gtk %s', gtk_version()) self.hidden = True self.forceHide = False # trayicon! Using SVG handles better different OS trays # img = pixmapfile('guake-tray.svg') # trayicon! img = pixmapfile('guake-tray.png') try: import appindicator except ImportError: self.tray_icon = Gtk.StatusIcon() self.tray_icon.set_from_file(img) self.tray_icon.set_tooltip_text(_("Guake Terminal")) self.tray_icon.connect('popup-menu', self.show_menu) self.tray_icon.connect('activate', self.show_hide) else: # TODO PORT test this on a system with app indicator self.tray_icon = appindicator.Indicator( _("guake-indicator"), _("guake-tray"), appindicator.CATEGORY_OTHER) self.tray_icon.set_icon(img) 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) # important widgets self.window = self.get_widget('window-root') self.window.set_keep_above(True) self.mainframe = self.get_widget('mainframe') self.mainframe.remove(self.get_widget('notebook-teminals')) self.notebook = TerminalNotebook(self) self.notebook.connect('terminal-spawned', self.terminal_spawned) self.notebook.connect('page-deleted', self.page_deleted) self.mainframe.add(self.notebook) self.set_tab_position() # check and set ARGB for real transparency color = self.window.get_style_context().get_background_color( Gtk.StateFlags.NORMAL) self.window.set_app_paintable(True) def draw_callback(widget, cr): if widget.transparency: cr.set_source_rgba(color.red, color.green, color.blue, 1) else: cr.set_source_rgb(0, 0, 0) cr.set_operator(cairo.OPERATOR_SOURCE) cr.paint() cr.set_operator(cairo.OPERATOR_OVER) screen = self.window.get_screen() visual = screen.get_rgba_visual() if visual and screen.is_composited(): self.window.set_visual(visual) self.window.transparency = True else: log.warn('System doesn\'t support transparency') self.window.transparency = False self.window.set_visual(screen.get_system_visual()) self.window.connect('draw', draw_callback) # 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 # Controls the transparency state needed for function accel_toggle_transparency self.transparency_toggled = False # store the default window title to reset it when update is not wanted self.default_window_title = self.window.get_title() self.abbreviate = False 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 def window_event(*args): return self.window_event(*args) self.window.connect('delete-event', destroy) self.window.connect('window-state-event', window_event) # this line is important to resize the main window and make it # smaller. # TODO PORT do we still need this? # 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(Gdk.WindowTypeHint.DOCK) # Restore back to normal behavior self.window.set_type_hint(Gdk.WindowTypeHint.NORMAL) # loading and setting up configuration stuff GSettingHandler(self) Keybinder.init() self.hotkeys = Keybinder Keybindings(self) self.load_config() # adding the first tab on guake self.add_tab() if self.settings.general.get_boolean('start-fullscreen'): self.fullscreen() refresh_user_start(self.settings) # Pop-up that shows that guake is working properly (if not # unset in the preferences windows) if self.settings.general.get_boolean('use-popup'): key = self.settings.keybindingsGlobal.get_string('show-hide') keyval, mask = Gtk.accelerator_parse(key) label = Gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') notifier.showMessage( _("Guake Terminal"), _("Guake is now running,\n" "press <b>{!s}</b> to use it.").format(xml_escape(label)), filename) log.info("Guake initialized")
def restore_tabs(self, filename='session.json', suppress_notify=False): path = self.get_xdg_config_directory() / filename if not path.exists(): log.info('Cannot found tabs session.json file') return with open(path) as f: try: config = json.load(f) except Exception: log.warning('session.json is broken') shutil.copy( path, self.get_xdg_config_directory() / f'{filename}.bak') img_filename = pixmapfile('guake-notification.png') notifier.showMessage( _('Guake Terminal'), _(f'Your session.json file is broken, backup to {filename}.bak' ), img_filename) return # Disable auto save tabs v = self.settings.general.get_boolean('save-tabs-when-changed') self.settings.general.set_boolean('save-tabs-when-changed', False) # Restore all tabs for all workspaces try: for key, frames in config['workspace'].items(): nb = self.notebook_manager.get_notebook(int(key)) current_pages = nb.get_n_pages() # Restore each frames' tabs from config # NOTE: If frame implement in future, we will need to update this code for tabs in frames: for index, tab in enumerate(tabs): nb.new_page_with_focus(tab['directory'], tab['label'], tab['custom_label_set']) # Remove original pages in notebook for i in range(current_pages): nb.delete_page(0) except KeyError: log.warning('session.json schema is broken') shutil.copy(path, self.get_xdg_config_directory() / f'{filename}.bak') with open(self.get_xdg_config_directory() / f'{filename}.log.err', 'w') as f: traceback.print_exc(file=f) img_filename = pixmapfile('guake-notification.png') notifier.showMessage( _('Guake Terminal'), _(f'Your session.json schema is broken, backup to {filename}.bak,' f'and error message has been saved to {filename}.log.err'), img_filename) # Reset auto save tabs self.settings.general.set_boolean('save-tabs-when-changed', v) # Notify the user if (self.settings.general.get_boolean('restore-tabs-notify') and not suppress_notify): filename = pixmapfile('guake-notification.png') notifier.showMessage(_("Guake Terminal"), _("Your tabs has been restored!"), filename) log.info('Guake tabs restored')
def __init__(self, settings): """Setup the preferences dialog interface, loading images, adding filters to file choosers and connecting some signals. """ self.hotkey_alread_used = False self.store = None 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) # Model format: # 0: the keybinding path in gsettings (str, hidden), # 1: label (str) # 2: human readable accelerator (str) # 3: gtk accelerator (str, hidden) self.store = Gtk.TreeStore(str, str, str, str) treeview = self.get_widget('treeview-keys') treeview.set_model(self.store) 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(_('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_accel_edited) renderer.connect('accel-cleared', self.on_accel_cleared) column = Gtk.TreeViewColumn(_('Shortcut'), renderer, text=2) column.pack_start(renderer, True) column.set_property('expand', False) column.add_attribute(renderer, "accel-mods", 0) column.add_attribute(renderer, "accel-key", 1) treeview.append_column(column) self.demo_terminal = GuakeTerminal(self.settings) self.demo_terminal_box = self.get_widget('demo_terminal_box') self.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 __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 restore_tabs(self, filename='session.json', suppress_notify=False): session_file = self.get_xdg_config_directory() / filename if not session_file.exists(): log.info('Cannot found tabs session.json file') return with session_file.open() as f: try: config = json.load(f) except Exception: log.warning('%s is broken', session_filen) shutil.copy( session_file, self.get_xdg_config_directory() / '{0}.bak'.format(filename) ) img_filename = pixmapfile('guake-notification.png') notifier.showMessage( _('Guake Terminal'), _('Your {session_filename} file is broken, backup to {session_filename}.bak' ).format(session_filename=filename), img_filename ) return # Disable auto save tabs v = self.settings.general.get_boolean('save-tabs-when-changed') self.settings.general.set_boolean('save-tabs-when-changed', False) # Restore all tabs for all workspaces try: for key, frames in config['workspace'].items(): nb = self.notebook_manager.get_notebook(int(key)) current_pages = nb.get_n_pages() # Restore each frames' tabs from config # NOTE: If frame implement in future, we will need to update this code for tabs in frames: for index, tab in enumerate(tabs): nb.new_page_with_focus( tab['directory'], tab['label'], tab['custom_label_set'] ) # Remove original pages in notebook for i in range(current_pages): nb.delete_page(0) except KeyError: log.warning('%s schema is broken', session_file) shutil.copy(path, self.get_xdg_config_directory() / '{}.bak'.format(filename)) with open(self.get_xdg_config_directory() / '{}.log.err'.format(filename), 'w') as f: traceback.print_exc(file=f) img_filename = pixmapfile('guake-notification.png') notifier.showMessage( _('Guake Terminal'), _( 'Your {session_filename} schema is broken, backup to {session_filename}.bak, ' 'and error message has been saved to {session_filename}.log.err.'.format( session_filename=filename ) ), img_filename ) # Reset auto save tabs self.settings.general.set_boolean('save-tabs-when-changed', v) # Notify the user if (self.settings.general.get_boolean('restore-tabs-notify') and not suppress_notify): filename = pixmapfile('guake-notification.png') notifier.showMessage(_("Guake Terminal"), _("Your tabs has been restored!"), filename) log.info('Guake tabs restored from %s', session_file)
def __init__(self, settings): """Setup the preferences dialog interface, loading images, adding filters to file choosers and connecting some signals. """ self.hotkey_alread_used = False self.store = None 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) # 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) # Model format: # 0: the keybinding path in gsettings (str, hidden), # 1: label (str) # 2: human readable accelerator (str) # 3: gtk accelerator (str, hidden) self.store = Gtk.TreeStore(str, str, str, str) treeview = self.get_widget('treeview-keys') treeview.set_model(self.store) 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(_('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_accel_edited) renderer.connect('accel-cleared', self.on_accel_cleared) column = Gtk.TreeViewColumn(_('Shortcut'), renderer, text=2) column.pack_start(renderer, True) column.set_property('expand', False) column.add_attribute(renderer, "accel-mods", 0) column.add_attribute(renderer, "accel-key", 1) treeview.append_column(column) self.demo_terminal = GuakeTerminal(self.settings) self.demo_terminal_box = self.get_widget('demo_terminal_box') self.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 __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)
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 __init__(self): def load_schema(): return Gio.SettingsSchemaSource.new_from_directory( SCHEMA_DIR, Gio.SettingsSchemaSource.get_default(), False ) try: schema_source = load_schema() except GLib.Error: # pylint: disable=catching-non-exception log.exception("Unable to load the GLib schema, try to compile it") try_to_compile_glib_schemas() schema_source = load_schema() self.settings = Settings(schema_source) super(Guake, self).__init__(gladefile('guake.glade')) select_gtk_theme(self.settings) patch_gtk_theme(self.get_widget("window-root").get_style_context(), self.settings) self.add_callbacks(self) log.info('Guake Terminal %s', guake_version()) log.info('VTE %s', vte_version()) log.info('Gtk %s', gtk_version()) self.hidden = True self.forceHide = False # trayicon! Using SVG handles better different OS trays # img = pixmapfile('guake-tray.svg') # trayicon! img = pixmapfile('guake-tray.png') try: import appindicator except ImportError: self.tray_icon = Gtk.StatusIcon() self.tray_icon.set_from_file(img) self.tray_icon.set_tooltip_text(_("Guake Terminal")) self.tray_icon.connect('popup-menu', self.show_menu) self.tray_icon.connect('activate', self.show_hide) else: # TODO PORT test this on a system with app indicator self.tray_icon = appindicator.Indicator( _("guake-indicator"), _("guake-tray"), appindicator.CATEGORY_OTHER ) self.tray_icon.set_icon(img) 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) # important widgets self.window = self.get_widget('window-root') self.window.set_keep_above(True) self.mainframe = self.get_widget('mainframe') self.mainframe.remove(self.get_widget('notebook-teminals')) # Workspace tracking self.notebook_manager = NotebookManager( self.window, self.mainframe, self.settings.general.get_boolean('workspace-specific-tab-sets'), self.terminal_spawned, self.page_deleted ) self.notebook_manager.connect('notebook-created', self.notebook_created) self.notebook_manager.set_workspace(0) self.set_tab_position() # check and set ARGB for real transparency color = self.window.get_style_context().get_background_color(Gtk.StateFlags.NORMAL) self.window.set_app_paintable(True) def draw_callback(widget, cr): if widget.transparency: cr.set_source_rgba(color.red, color.green, color.blue, 1) else: cr.set_source_rgb(0, 0, 0) cr.set_operator(cairo.OPERATOR_SOURCE) cr.paint() cr.set_operator(cairo.OPERATOR_OVER) screen = self.window.get_screen() visual = screen.get_rgba_visual() if visual and screen.is_composited(): self.window.set_visual(visual) self.window.transparency = True else: log.warn('System doesn\'t support transparency') self.window.transparency = False self.window.set_visual(screen.get_system_visual()) self.window.connect('draw', draw_callback) # Debounce accel_search_terminal self.prev_accel_search_terminal_time = 0.0 # 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 # Controls the transparency state needed for function accel_toggle_transparency self.transparency_toggled = False # store the default window title to reset it when update is not wanted self.default_window_title = self.window.get_title() self.abbreviate = False 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 def window_event(*args): return self.window_event(*args) self.window.connect('delete-event', destroy) self.window.connect('window-state-event', window_event) # this line is important to resize the main window and make it # smaller. # TODO PORT do we still need this? # 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(Gdk.WindowTypeHint.DOCK) # Restore back to normal behavior self.window.set_type_hint(Gdk.WindowTypeHint.NORMAL) # loading and setting up configuration stuff GSettingHandler(self) Keybinder.init() self.hotkeys = Keybinder Keybindings(self) self.load_config() if self.settings.general.get_boolean('start-fullscreen'): self.fullscreen() refresh_user_start(self.settings) # Restore tabs when startup if self.settings.general.get_boolean('restore-tabs-startup'): self.restore_tabs(suppress_notify=True) # Pop-up that shows that guake is working properly (if not # unset in the preferences windows) if self.settings.general.get_boolean('use-popup'): key = self.settings.keybindingsGlobal.get_string('show-hide') keyval, mask = Gtk.accelerator_parse(key) label = Gtk.accelerator_get_label(keyval, mask) filename = pixmapfile('guake-notification.png') notifier.showMessage( _("Guake Terminal"), _("Guake is now running,\n" "press <b>{!s}</b> to use it.").format(xml_escape(label)), filename ) log.info("Guake initialized")