Changeset 9b24711b8ff4fe277caef294beaccd2898780923

Show
Ignore:
Timestamp:
12/11/08 15:29:55 (3 years ago)
Author:
Lincoln de Sousa <lincoln@…>
Children:
1503e706459f7a847c8170fde4d130f49c11823f
Parents:
0ae1f9c55ae47651f6d7bc4803d9aef914318319
git-committer:
Lincoln de Sousa <lincoln@…> (12/11/08 15:29:55)
Message:

A code cleanup.

Preferences stuff were moved from guake.py to prefs.py file to improve
code organization. Some other little things, like imports were
changed.

Location:
src
Files:
1 added
1 modified

Legend:

Unmodified
Added
Removed
  • src/guake.py

    rfa86415 r9b24711  
    22""" 
    33Copyright (C) 2007 Gabriel Falcão <gabrielteratos@gmail.com> 
    4 Copyright (C) 2007 Lincoln de Sousa <lincoln@minaslivre.org> 
     4Copyright (C) 2007,2008 Lincoln de Sousa <lincoln@minaslivre.org> 
    55 
    66This program is free software; you can redistribute it and/or 
     
    3131import dbus 
    3232 
    33 import re 
    3433import os 
    3534import signal 
     
    3837from thread import start_new_thread 
    3938from time import sleep 
    40 import common 
    41 from common import _ 
     39 
     40import dbusiface 
     41import globalhotkeys 
    4242from simplegladeapp import SimpleGladeApp, bindtextdomain 
    4343from statusicon import GuakeStatusIcon 
    44 import dbusiface 
    45 import globalhotkeys 
    46 import guake_globals 
     44from prefs import PrefsDialog, GHOTKEYS 
     45from common import * 
     46from guake_globals import * 
    4747 
    4848pynotify.init('Guake!') 
    4949 
    5050# Loading translation 
    51 bindtextdomain(guake_globals.name, guake_globals.locale_dir) 
    52  
    53 # Path to the shells file, it will be used to start to populate 
    54 # interpreters combo, see the next variable, its important to fill the 
    55 # rest of the combo too. 
    56  
    57 SHELLS_FILE = '/etc/shells' 
    58  
    59 # A regular expression to match possible python interpreters when 
    60 # filling interpreters combo in preferences 
    61  
    62 PYTHONS = re.compile('^python\d\.\d$') 
    63  
    64 # Sconf stuff 
    65  
    66 GCONF_PATH = '/apps/guake/' 
    67 GCONF_KEYS = GCONF_PATH + 'keybindings/' 
    68  
    69 GHOTKEYS = ((GCONF_KEYS+'global/show_hide', _('Toggle terminal visibility')),) 
    70  
    71 LHOTKEYS = ((GCONF_KEYS+'local/new_tab', _('New tab'),), 
    72             (GCONF_KEYS+'local/close_tab', _('Close tab')), 
    73             (GCONF_KEYS+'local/previous_tab', _('Go to previous tab')), 
    74             (GCONF_KEYS+'local/next_tab', _('Go to next tab'),), 
    75             (GCONF_KEYS+'local/clipboard_copy', _('Copy text to clipboard'),), 
    76             (GCONF_KEYS+'local/clipboard_paste', _('Paste text from clipboard'),), 
    77             (GCONF_KEYS+'local/toggle_fullscreen', _('Toggle Fullscreen'),), 
    78 ) 
    79  
    80 # translating our types to vte types 
    81  
    82 ERASE_BINDINGS = {'ASCII DEL': 'ascii-delete', 
    83                   'Escape sequence': 'delete-sequence', 
    84                   'Control-H': 'ascii-backspace'} 
     51bindtextdomain(name, locale_dir) 
    8552 
    8653class GuakeGConf(object): 
     
    10673            self.guake.toolbar.hide() 
    10774 
    108 class KeyEntry(object): 
    109     def __init__(self, keycode, mask): 
    110         self.keycode = keycode 
    111         self.mask = mask 
    112  
    113     def __repr__(self): 
    114         return u'KeyEntry(%d, %d)' % ( 
    115             self.keycode, self.mask) 
    116  
    117     def __eq__(self, rval): 
    118         return self.keycode == rval.keycode and \ 
    119             self.mask == rval.mask 
    12075 
    12176class AboutDialog(SimpleGladeApp): 
    12277    def __init__(self): 
    123         super(AboutDialog, self).__init__(common.gladefile('about.glade'), 
     78        super(AboutDialog, self).__init__(gladefile('about.glade'), 
    12479                                          root='aboutdialog') 
    12580        ad = self.get_widget('aboutdialog') 
     
    13085 
    13186        # images 
    132         ipath = common.pixmapfile('guake-notification.png') 
     87        ipath = pixmapfile('guake-notification.png') 
    13388        img = gtk.gdk.pixbuf_new_from_file(ipath) 
    13489        ad.set_property('logo', img) 
    13590 
    13691        ad.set_name('Guake!') 
    137         ad.set_version(guake_globals.version) 
    138  
    139  
    140 class PrefsDialog(SimpleGladeApp): 
    141     def __init__(self, guakeinstance): 
    142         super(PrefsDialog, self).__init__(common.gladefile('prefs.glade'), 
    143                                           root='config-window') 
    144  
    145         self.guake = guakeinstance 
    146         self.client = gconf.client_get_default() 
    147  
    148         # setting evtbox title bg 
    149         eventbox = self.get_widget('eventbox-title') 
    150         eventbox.modify_bg(gtk.STATE_NORMAL, 
    151                            eventbox.get_colormap().alloc_color("#ffffff")) 
    152  
    153         # images 
    154         ipath = common.pixmapfile('guake-notification.png') 
    155         self.get_widget('image_logo').set_from_file(ipath) 
    156         ipath = common.pixmapfile('tabdown.svg') 
    157         self.get_widget('image1').set_from_file(ipath) 
    158         ipath = common.pixmapfile('tabup.svg') 
    159         self.get_widget('image2').set_from_file(ipath) 
    160  
    161         # the first position in tree will store the keybinding path in gconf, 
    162         # and the user doesn't worry with this, lest hide that =D 
    163         model = gtk.TreeStore(str, str, object, bool) 
    164         treeview = self.get_widget('treeview-keys') 
    165         treeview.set_model(model) 
    166         treeview.set_rules_hint(True) 
    167         treeview.connect('button-press-event', self.start_editing_cb) 
    168  
    169         renderer = gtk.CellRendererText() 
    170         column = gtk.TreeViewColumn('keypath', renderer, text=0) 
    171         column.set_visible(False) 
    172         treeview.append_column(column) 
    173  
    174         renderer = gtk.CellRendererText() 
    175         column = gtk.TreeViewColumn(_('Action'), renderer, text=1) 
    176         column.set_property('expand', True) 
    177         treeview.append_column(column) 
    178  
    179         renderer = gtk.CellRendererAccel() 
    180         renderer.set_property('editable', True) 
    181  
    182         renderer.connect('accel-edited', self.on_key_edited, model) 
    183         renderer.connect('accel-cleared', self.on_key_cleared, model) 
    184  
    185         column = gtk.TreeViewColumn(_('Shortcut'), renderer) 
    186         column.set_cell_data_func(renderer, self.cell_data_func) 
    187         column.set_property('expand', False) 
    188         treeview.append_column(column) 
    189  
    190         self.populate_shell_combo() 
    191         self.populate_keys_tree() 
    192         self.load_configs() 
    193         self.get_widget('config-window').hide() 
    194  
    195         # Preview when selecting a bgimage 
    196         self.selection_preview = gtk.Image() 
    197         self.file_filter = gtk.FileFilter() 
    198         self.file_filter.add_pattern("*.jpg") 
    199         self.file_filter.add_pattern("*.png") 
    200         self.file_filter.add_pattern("*.svg") 
    201         self.file_filter.add_pattern("*.jpeg") 
    202         self.bgfilechooser = self.get_widget('bgimage-filechooserbutton') 
    203         self.bgfilechooser.set_preview_widget(self.selection_preview) 
    204         self.bgfilechooser.set_filter(self.file_filter) 
    205         self.bgfilechooser.connect('update-preview', self.update_preview_cb, 
    206                                    self.selection_preview) 
    207  
    208     def show(self): 
    209         self.get_widget('config-window').show_all() 
    210         self.get_widget('config-window').present() 
    211  
    212     def hide(self): 
    213         self.get_widget('config-window').hide() 
    214  
    215     def reload_erase_combos(self): 
    216         # backspace erase binding 
    217         combo = self.get_widget('backspace-binding-combobox') 
    218         binding = self.client.get_string(GCONF_PATH+'general/compat_backspace') 
    219         model = combo.get_model() 
    220         bindex = ERASE_BINDINGS.values().index(binding) 
    221         for i in model: 
    222             value = model.get_value(i.iter, 0) 
    223             if ERASE_BINDINGS.keys().index(value) == bindex: 
    224                 combo.set_active_iter(i.iter) 
    225  
    226         # delete erase binding 
    227         combo = self.get_widget('delete-binding-combobox') 
    228         binding = self.client.get_string(GCONF_PATH+'general/compat_delete') 
    229         model = combo.get_model() 
    230         bindex = ERASE_BINDINGS.values().index(binding) 
    231         for i in model: 
    232             value = model.get_value(i.iter, 0) 
    233             if ERASE_BINDINGS.keys().index(value) == bindex: 
    234                 combo.set_active_iter(i.iter) 
    235  
    236     def load_configs(self): 
    237         # shells list 
    238         default = self.client.get_string(GCONF_PATH + 'general/default_shell') 
    239         combo = self.get_widget('shells-combobox') 
    240         model = combo.get_model() 
    241         for i in model: 
    242             value = model.get_value(i.iter, 0) 
    243             if value == default: 
    244                 combo.set_active_iter(i.iter) 
    245  
    246         # history size 
    247         val = self.client.get_int(GCONF_PATH+'general/history_size') 
    248         self.get_widget('historysize-spinbutton').set_value(val) 
    249  
    250         # scrollbar 
    251         ac = self.client.get_bool(GCONF_PATH + 'general/use_scrollbar') 
    252         self.get_widget('show-scrollbar-checkbutton').set_active(ac) 
    253  
    254         # hide on lost focus 
    255         ac = self.client.get_bool(GCONF_PATH + 'general/hide_on_lost_focus') 
    256         self.get_widget('hide-onlostfocus-checkbutton').set_active(ac) 
    257  
    258         # animate flag 
    259         #ac = self.client.get_bool(GCONF_PATH + 'general/window_animate') 
    260         #self.get_widget('animate-checkbutton').set_active(ac) 
    261  
    262         # on top flag 
    263         ac = self.client.get_bool(GCONF_PATH + 'general/window_ontop') 
    264         self.get_widget('ontop-checkbutton').set_active(ac) 
    265  
    266         # winsize 
    267         val = float(self.client.get_int(GCONF_PATH + 'general/window_size')) 
    268         self.get_widget('winsize-hscale').set_value(val) 
    269  
    270         # tab pos 
    271         val = self.client.get_string(GCONF_PATH + 'general/tabpos') 
    272         if val == 'bottom': 
    273             self.get_widget('tabbottom-radiobutton').set_active(True) 
    274         else: 
    275             self.get_widget('tabtop-radiobutton').set_active(True) 
    276  
    277         # font 
    278         val = self.client.get_string(GCONF_PATH + 'style/font/style') 
    279         self.get_widget('fontbutton').set_font_name(val) 
    280  
    281         val = self.client.get_string(GCONF_PATH + 'style/font/color') 
    282         try: 
    283             color = gtk.gdk.color_parse(val) 
    284             self.get_widget('font-colorbutton').set_color(color) 
    285         except (ValueError, TypeError): 
    286             warnings.warn('Unable to parse color %s' % val, Warning) 
    287  
    288         # background 
    289         val = self.client.get_string(GCONF_PATH+'style/background/color') 
    290         try: 
    291             color = gtk.gdk.color_parse(val) 
    292             self.get_widget('bg-colorbutton').set_color(color) 
    293         except (ValueError, TypeError): 
    294             warnings.warn('Unable to parse color %s' % val, Warning) 
    295              
    296         use_bgimage = self.client.get_bool(GCONF_PATH+'general/use_bgimage') 
    297         self.get_widget('chk_bg_transparent').set_active(not use_bgimage) 
    298         self.get_widget('chk_bg_transparent').connect('toggled', self.on_chk_bg_transparent_toggled) 
    299          
    300         val = self.client.get_string(GCONF_PATH+'style/background/image') 
    301         self.get_widget('bgimage-filechooserbutton').set_filename(val) 
    302  
    303         val = self.client.get_int(GCONF_PATH+'style/background/transparency') 
    304         self.get_widget('transparency-hscale').set_value(val) 
    305  
    306         # it's a separated method, to be reused. 
    307         self.reload_erase_combos() 
    308  
    309         # the terminal window can be opened and the user *must* see this window 
    310         self.get_widget('config-window').set_keep_above(True) 
    311  
    312     # -- populate functions -- 
    313  
    314     def populate_shell_combo(self): 
    315         cb = self.get_widget('shells-combobox') 
    316         if os.path.exists(SHELLS_FILE): 
    317             lines = open(SHELLS_FILE).readlines() 
    318             for i in lines: 
    319                 possible = i.strip() 
    320                 if possible and not possible.startswith('#') and \ 
    321                    os.path.exists(possible): 
    322                     cb.append_text(possible) 
    323  
    324         for i in os.environ.get('PATH', '').split(os.pathsep): 
    325             if os.path.isdir(i): 
    326                 for j in os.listdir(i): 
    327                     if PYTHONS.match(j): 
    328                         cb.append_text(os.path.join(i, j)) 
    329  
    330     def populate_keys_tree(self): 
    331         model = self.get_widget('treeview-keys').get_model() 
    332  
    333         giter = model.append(None) 
    334         model.set(giter, 0, '', 1, _('Global hotkeys')) 
    335  
    336         for i in GHOTKEYS: 
    337             child = model.append(giter) 
    338             accel = self.client.get_string(i[0]) 
    339             if accel: 
    340                 params = gtk.accelerator_parse(accel) 
    341                 hotkey = KeyEntry(*params) 
    342             else: 
    343                 hotkey = KeyEntry(0, 0) 
    344  
    345             model.set(child, 
    346                       0, i[0], 
    347                       1, i[1], 
    348                       2, hotkey, 
    349                       3, True) 
    350  
    351         giter = model.append(None) 
    352         model.set(giter, 0, '', 1, _('Local hotkeys')) 
    353  
    354         for i in LHOTKEYS: 
    355             child = model.append(giter) 
    356             accel = self.client.get_string(i[0]) 
    357             if accel: 
    358                 params = gtk.accelerator_parse(accel) 
    359                 hotkey = KeyEntry(*params) 
    360             else: 
    361                 hotkey = KeyEntry(0, 0) 
    362  
    363             model.set(child, 
    364                       0, i[0], 
    365                       1, i[1], 
    366                       2, hotkey, 
    367                       3, True) 
    368  
    369         self.get_widget('treeview-keys').expand_all() 
    370          
    371     # -- callbacks -- 
    372  
    373     def on_historysize_spinbutton_value_changed(self, spin): 
    374         val = int(spin.get_value()) 
    375         self.client.set_int(GCONF_PATH + 'general/history_size', val) 
    376          
    377     def on_show_scrollbar_checkbutton_toggled(self, chk): 
    378         fbool = chk.get_active() 
    379         self.client.set_bool(GCONF_PATH + 'general/use_scrollbar', fbool) 
    380         self.guake.toggle_scrollbars() 
    381          
    382     def on_chk_lostfocus_toggled(self, chk): 
    383         fbool = chk.get_active() 
    384         self.client.set_bool(GCONF_PATH + 'general/hide_on_lost_focus', fbool) 
    385          
    386     def on_shells_combobox_changed(self, combo): 
    387         citer = combo.get_active_iter() 
    388         if not citer: 
    389             return 
    390         shell = combo.get_model().get_value(citer, 0) 
    391         self.client.set_string(GCONF_PATH + 'general/default_shell', shell) 
    392  
    393     def on_animate_checkbutton_toggled(self, bnt): 
    394         self.client.set_bool(GCONF_PATH + 'general/window_animate', 
    395                 bnt.get_active()) 
    396  
    397     def on_ontop_checkbutton_toggled(self, bnt): 
    398         self.client.set_bool(GCONF_PATH + 'general/window_ontop', 
    399                              bnt.get_active()) 
    400         self.guake.toggle_ontop() 
    401  
    402     def on_winsize_hscale_value_changed(self, hscale): 
    403         val = hscale.get_value() 
    404         self.client.set_int(GCONF_PATH + 'general/window_size', int(val)) 
    405         self.guake.resize(*self.guake.get_final_window_size()) 
    406  
    407     def on_tabbottom_radiobutton_toggled(self, bnt): 
    408         st = bnt.get_active() and 'bottom' or 'top' 
    409         self.client.set_string(GCONF_PATH + 'general/tabpos', st) 
    410         self.guake.set_tabpos() 
    411          
    412     def on_tabtop_radiobutton_toggled(self, bnt): 
    413         st = bnt.get_active() and 'top' or 'bottom' 
    414         self.client.set_string(GCONF_PATH + 'general/tabpos', st) 
    415         self.guake.set_tabpos() 
    416  
    417     def on_fontbutton_font_set(self, fb): 
    418         self.client.set_string(GCONF_PATH + 'style/font/style', 
    419                 fb.get_font_name()) 
    420         self.guake.set_font() 
    421  
    422     def on_font_colorbutton_color_set(self, bnt): 
    423         c = common.hexify_color(bnt.get_color()) 
    424         self.client.set_string(GCONF_PATH + 'style/font/color', c) 
    425         self.guake.set_fgcolor() 
    426  
    427     def on_bg_colorbutton_color_set(self, bnt): 
    428         c = common.hexify_color(bnt.get_color()) 
    429         self.client.set_string(GCONF_PATH + 'style/background/color', c) 
    430         self.guake.set_bgcolor() 
    431  
    432     def on_bgimage_filechooserbutton_selection_changed(self, bnt): 
    433         f = bnt.get_filename() 
    434         if f: 
    435             self.client.set_string(GCONF_PATH + 'style/background/image', f) 
    436             self.guake.set_bgimage() 
    437  
    438     def on_chk_bg_transparent_toggled(self, togglebutton): 
    439         value = togglebutton.get_active() 
    440         self.client.set_bool(GCONF_PATH + 'general/use_bgimage', not value) 
    441         self.guake.set_bgimage() 
    442              
    443     def on_transparency_hscale_value_changed(self, hscale): 
    444         val = hscale.get_value() 
    445         self.client.set_int(GCONF_PATH + 'style/background/transparency', 
    446                 int(val)) 
    447         self.guake.set_alpha() 
    448  
    449     def on_backspace_binding_combobox_changed(self, combo): 
    450         val = combo.get_active_text() 
    451         self.client.set_string(GCONF_PATH+'general/compat_backspace', 
    452                                ERASE_BINDINGS[val]) 
    453         self.guake.set_erasebindings() 
    454  
    455     def on_delete_binding_combobox_changed(self, combo): 
    456         val = combo.get_active_text() 
    457         self.client.set_string(GCONF_PATH+'general/compat_delete', 
    458                                ERASE_BINDINGS[val]) 
    459         self.guake.set_erasebindings() 
    460  
    461     def on_reset_compat_defaults_button_clicked(self, bnt): 
    462         # default values were defined in guake.schemas file 
    463         self.client.unset(GCONF_PATH+'general/compat_backspace') 
    464         self.client.unset(GCONF_PATH+'general/compat_delete') 
    465         self.reload_erase_combos() 
    466         self.guake.set_erasebindings() 
    467  
    468     def on_key_edited(self, renderer, path, keycode, mask, keyval, model): 
    469         giter = model.get_iter(path) 
    470         gconf_path = model.get_value(giter, 0) 
    471  
    472         oldkey = model.get_value(giter, 2) 
    473         hotkey = KeyEntry(keycode, mask) 
    474         key = gtk.accelerator_name(keycode, mask) 
    475         keylabel = gtk.accelerator_get_label(keycode, mask) 
    476  
    477         # we needn't to change anything, the user is trying to set the 
    478         # same key that is already set. 
    479         if oldkey == hotkey: 
    480             return False 
    481  
    482         # looking for already used keybindings 
    483         def each_key(model, path, subiter): 
    484             keyentry = model.get_value(subiter, 2) 
    485             if keyentry and keyentry == hotkey: 
    486                 msg = _("The shortcut \"%s\" is already in use.") % keylabel 
    487                 raise ShowableError(_('Error setting keybinding.'), msg, -1) 
    488         model.foreach(each_key) 
    489  
    490         # avoiding problems with common keys 
    491         if ((mask == 0 and keycode != 0) and ( 
    492             (keycode >= ord('a') and keycode <= ord('z')) or 
    493             (keycode >= ord('A') and keycode <= ord('Z')) or 
    494             (keycode >= ord('0') and keycode <= ord('9')))): 
    495             parent = self.get_widget('config-window') 
    496             dialog = gtk.MessageDialog(parent, 
    497                                        gtk.DIALOG_MODAL | 
    498                                        gtk.DIALOG_DESTROY_WITH_PARENT, 
    499                                        gtk.MESSAGE_WARNING, 
    500                                        gtk.BUTTONS_OK, 
    501                                        _("The shortcut \"%s\" cannot be used " 
    502                                          "because it will become impossible to " 
    503                                          "type using this key.\n\n" 
    504                                          "Please try with a key such as " 
    505                                          "Control, Alt or Shift at the same " 
    506                                          "time.\n") % key) 
    507             dialog.run() 
    508             dialog.destroy() 
    509             return False 
    510  
    511         giter = model.get_iter(path) 
    512         model.set_value(giter, 2, hotkey) 
    513  
    514         # old key, used only to disconnect current shortcuts 
    515         accel = self.client.get_string(gconf_path) 
    516         if gconf_path in [x[0] for x in GHOTKEYS]: 
    517             # ungrabing global keys 
    518             globalhotkeys.unbind(accel) 
    519             if not globalhotkeys.bind(key, self.guake.show_hide): 
    520                 globalhotkeys.bind(accel, self.guake.show_hide) 
    521                 model.set(giter, 2, accel) 
    522                 raise ShowableError(_('key binding error'), 
    523                         _('Unable to bind %s key') % key, -1) 
    524         else: 
    525             # ungrabing local keys 
    526             if accel != 'disabled': 
    527                 keynum, mask = gtk.accelerator_parse(accel) 
    528                 self.guake.accel_group.disconnect_key(keynum, mask) 
    529  
    530         # setting the new value on gconf 
    531         self.client.set_string(gconf_path, key) 
    532         self.guake.load_accelerators() 
    533  
    534     def on_key_cleared(self, renderer, path, model): 
    535         giter = model.get_iter(path) 
    536         gconf_path = model.get_value(giter, 0) 
    537         accel = self.client.get_string(gconf_path) 
    538         model.set_value(giter, 2, KeyEntry(0, 0)) 
    539  
    540         # cleared accel must be unbinded 
    541         accel = self.client.get_string(gconf_path) 
    542         if gconf_path in [x[0] for x in GHOTKEYS]: 
    543             globalhotkeys.unbind(accel) 
    544  
    545         keynum, mask = gtk.accelerator_parse(accel) 
    546         if keynum: 
    547             self.guake.accel_group.disconnect_key(keynum, mask) 
    548  
    549         self.client.set_string(gconf_path, 'disabled') 
    550         self.guake.load_accelerators() 
    551  
    552     def cell_data_func(self, column, renderer, model, giter): 
    553         obj = model.get_value(giter, 2) 
    554         if obj: 
    555             renderer.set_property('visible', True) 
    556             renderer.set_property('accel-key', obj.keycode) 
    557             renderer.set_property('accel-mods', obj.mask) 
    558         else: 
    559             renderer.set_property('visible', False) 
    560             renderer.set_property('accel-key', 0) 
    561             renderer.set_property('accel-mods', 0) 
    562  
    563     def update_preview_cb(self,file_chooser, preview): 
    564         """ 
    565         Used by filechooser to preview image files 
    566         """ 
    567         filename = file_chooser.get_preview_filename() 
    568         if filename: 
    569             try: 
    570                 mkpb = gtk.gdk.pixbuf_new_from_file_at_size 
    571                 pixbuf = mkpb(filename, 256, 256) 
    572                 preview.set_from_pixbuf(pixbuf) 
    573                 file_chooser.set_preview_widget_active(True) 
    574             except gobject.GError: 
    575                 # this exception is raised when user chooses a non-image 
    576                 # file or a directory 
    577                 pass 
    578         else: 
    579             file_chooser.set_preview_widget_active(False) 
    580  
    581     def start_editing_cb(self, treeview, event): 
    582         """Make the treeview grab the focus and start editing the cell 
    583         that the user has clicked to avoid confusion with two or three 
    584         clicks before editing a keybinding. 
    585  
    586         Thanks to gnome-keybinding-properties.c =) 
    587         """ 
    588         if event.window != treeview.get_bin_window(): 
    589             return False 
    590  
    591         x, y = int(event.x), int(event.y) 
    592         ret = treeview.get_path_at_pos(x, y) 
    593         if not ret: 
    594             return False 
    595  
    596         path, column, cellx, celly = ret 
    597         if path and len(path) > 1: 
    598             def real_cb(): 
    599                 treeview.grab_focus() 
    600                 treeview.set_cursor(path, column, True) 
    601             treeview.stop_emission('button-press-event') 
    602             gobject.idle_add(real_cb) 
    603  
    604         return True 
     92        ad.set_version(version) 
     93 
    60594 
    60695class Guake(SimpleGladeApp): 
    60796    def __init__(self): 
    608         super(Guake, self).__init__(common.gladefile('guake.glade')) 
     97        super(Guake, self).__init__(gladefile('guake.glade')) 
    60998        self.client = gconf.client_get_default() 
    61099        self.gconf = GuakeGConf(self) 
     
    615104        label = gtk.accelerator_get_label(keyval, mask) 
    616105 
    617         filename = common.pixmapfile('guake-notification.png') 
     106        filename = pixmapfile('guake-notification.png') 
    618107        if not globalhotkeys.bind(key, self.show_hide): 
    619108            n = pynotify.Notification(_('Guake!'), 
     
    634123 
    635124        # adding images from a different path. 
    636         ipath = common.pixmapfile('guake.png') 
     125        ipath = pixmapfile('guake.png') 
    637126        self.get_widget('image1').set_from_file(ipath) 
    638         ipath = common.pixmapfile('add_tab.png') 
     127        ipath = pixmapfile('add_tab.png') 
    639128        self.get_widget('image2').set_from_file(ipath) 
    640129 
     
    814303        if height > max_height: 
    815304            height = max_height 
     305 
    816306        # get the width just from the first/default monitor 
    817307        # in the future we might create a field to select which monitor you wanna use 
    818308        width = screen.get_monitor_geometry(0).width 
    819  
    820  
    821309        return width, height 
    822310 
     
    1262750if __name__ == '__main__': 
    1263751    from dbusiface import dbus_init 
    1264     from common import test_gconf, ShowableError 
    1265752    main() 
    1266753