From 29cc2d09392aa34ff6d6405726afa217d3357fcf Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 15 Sep 2007 10:11:46 +0000 Subject: [PATCH] add key shortcut to open history and information window. fixes #3233 --- src/chat_control.py | 41 ++++++++++++++++++++++++++++++++-------- src/common/helpers.py | 9 ++++----- src/groupchat_control.py | 18 +++++++++++++++--- src/message_window.py | 3 +++ 4 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 06a17cac7..721ae0562 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -392,6 +392,7 @@ class ChatControlBase(MessageControl): event.keyval == gtk.keysyms.Page_Up: self.parent_win.notebook.emit('key_press_event', event) return True + elif event.keyval == gtk.keysyms.m and \ (event.state & gtk.gdk.MOD1_MASK): # alt + m opens emoticons menu if gajim.config.get('emoticons_theme'): @@ -966,6 +967,12 @@ class ChatControl(ChatControlBase): id = widget.connect('clicked', self.on_actions_button_clicked) self.handlers[id] = widget + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + key, mod = gtk.accelerator_parse("h") + ag.connect_group(key, mod, gtk.ACCEL_VISIBLE, self.accel_group_func) + key, mod = gtk.accelerator_parse("i") + ag.connect_group(key, mod, gtk.ACCEL_VISIBLE, self.accel_group_func) + compact_view = gajim.config.get('compact_view') self.chat_buttons_set_visible(compact_view) self.widget_set_visible(self.xml.get_widget('banner_eventbox'), @@ -1570,7 +1577,7 @@ class ChatControl(ChatControlBase): ''' xml = gtkgui_helpers.get_glade('chat_control_popup_menu.glade') menu = xml.get_widget('chat_control_popup_menu') - + history_menuitem = xml.get_widget('history_menuitem') toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem') toggle_e2e_menuitem = xml.get_widget('toggle_e2e_menuitem') @@ -1578,14 +1585,16 @@ class ChatControl(ChatControlBase): send_file_menuitem = xml.get_widget('send_file_menuitem') information_menuitem = xml.get_widget('information_menuitem') convert_to_gc_menuitem = xml.get_widget('convert_to_groupchat') - + + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + history_menuitem.add_accelerator('activate', ag, gtk.keysyms.h, gtk.gdk.CONTROL_MASK, + gtk.ACCEL_VISIBLE) + information_menuitem.add_accelerator('activate', ag, gtk.keysyms.i, + gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + contact = self.parent_win.get_active_contact() jid = contact.jid - - # history_menuitem - if gajim.jid_is_transport(jid): - history_menuitem.set_sensitive(False) - + # check if gpg capabitlies or else make gpg toggle insensitive gpg_btn = self.xml.get_widget('gpg_togglebutton') isactive = gpg_btn.get_active() @@ -1643,9 +1652,25 @@ class ChatControl(ChatControlBase): id = convert_to_gc_menuitem.connect('activate', self._on_convert_to_gc_menuitem_activate) self.handlers[id] = convert_to_gc_menuitem - menu.connect('selection-done', lambda w:w.destroy()) + menu.connect('selection-done', self.destroy_menu, history_menuitem, + information_menuitem) return menu + def destroy_menu(self, menu, history_menuitem, information_menuitem): + # destroy accelerators + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + history_menuitem.remove_accelerator(ag, gtk.keysyms.h, gtk.gdk.CONTROL_MASK) + information_menuitem.remove_accelerator(ag, gtk.keysyms.i, gtk.gdk.CONTROL_MASK) + # destroy menu + menu.destroy() + + def accel_group_func(self, accel_group, acceleratable, keyval, modifier): + if modifier & gtk.gdk.CONTROL_MASK: + if keyval == gtk.keysyms.h: + self._on_history_menuitem_activate() + if keyval == gtk.keysyms.i: + self._on_contact_information_menuitem_activate(None) + def send_chatstate(self, state, contact = None): ''' sends OUR chatstate as STANDLONE chat state message (eg. no body) to contact only if new chatstate is different from the previous one diff --git a/src/common/helpers.py b/src/common/helpers.py index 178b51302..732c0be81 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -722,11 +722,10 @@ def get_os_info(): full_path_to_executable = is_in_path(executable, return_abs_path = True) if full_path_to_executable: command = executable + params - child_stdin, child_stdout = os.popen2(command) - output = temp_failure_retry(child_stdout.readline).strip() - child_stdout.close() - child_stdin.close() - os.wait() + p = Popen([command], shell=True, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, close_fds=True) + p.wait() + output = temp_failure_retry(p.stdout.readline).strip() # some distros put n/a in places, so remove those output = output.replace('n/a', '').replace('N/A', '') return output diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 602a90658..c51fcb994 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -193,6 +193,10 @@ class GroupchatControl(ChatControlBase): self.on_list_treeview_leave_notify_event) self.handlers[id] = widget + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + key, mod = gtk.accelerator_parse("h") + ag.connect_group(key, mod, gtk.ACCEL_VISIBLE, self.accel_group_func) + self.room_jid = self.contact.jid self.nick = contact.name self.name = self.room_jid.split('@')[0] @@ -250,9 +254,9 @@ class GroupchatControl(ChatControlBase): self._on_change_subject_menuitem_activate) self.handlers[id] = self.change_subject_menuitem - widget = xm.get_widget('history_menuitem') - id = widget.connect('activate', self._on_history_menuitem_activate) - self.handlers[id] = widget + self.history_menuitem = xm.get_widget('history_menuitem') + id = self.history_menuitem.connect('activate', self._on_history_menuitem_activate) + self.handlers[id] = self.history_menuitem self.minimize_menuitem = xm.get_widget('minimize_menuitem') id = self.minimize_menuitem.connect('toggled', @@ -507,6 +511,9 @@ class GroupchatControl(ChatControlBase): def prepare_context_menu(self): '''sets sensitivity state for configure_room''' + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + self.history_menuitem.add_accelerator('activate', ag, gtk.keysyms.h, + gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) if self.contact.jid in gajim.config.get_per('accounts', self.account, 'minimized_gc').split(' '): self.minimize_menuitem.set_active(True) @@ -533,6 +540,11 @@ class GroupchatControl(ChatControlBase): self.change_nick_menuitem.set_sensitive(False) return self.gc_popup_menu + def accel_group_func(self, accel_group, acceleratable, keyval, modifier): + if modifier & gtk.gdk.CONTROL_MASK: + if keyval == gtk.keysyms.h: + self._on_history_menuitem_activate() + def on_message(self, nick, msg, tim, has_timestamp = False, xhtml = None, status_code = []): if '100' in status_code: diff --git a/src/message_window.py b/src/message_window.py index b1deb10e1..36e40bc68 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -70,6 +70,9 @@ class MessageWindow: id = self.window.connect('focus-in-event', self._on_window_focus) self.handlers[id] = self.window + accel_group = gtk.AccelGroup() + self.window.add_accel_group(accel_group) + # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that self.window.add_events(gtk.gdk.POINTER_MOTION_MASK)