From 88cd5c3a50765394e4234de5e784a3af97dec043 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 10 Oct 2007 16:13:16 +0000 Subject: [PATCH] [Davidov] use gtk.AccelGroup to handle key press. Fixes #1503. also fixes #3466 --- src/chat_control.py | 8 ++++ src/message_window.py | 99 +++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 50 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 1d5796779..5f7d2a99d 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -175,6 +175,9 @@ class ChatControlBase(MessageControl): # Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) + id = self.conv_textview.tv.connect('key_press_event', + self._conv_textview_key_press_event) + self.handlers[id] = self.conv_textview.tv # FIXME: DND on non editable TextView, find a better way self.drag_entered = False id = self.conv_textview.tv.connect('drag_data_received', @@ -397,6 +400,11 @@ class ChatControlBase(MessageControl): widget.modify_fg(gtk.STATE_NORMAL, fg_color) self.connect_style_event(widget, opts[0], opts[1]) + def _conv_textview_key_press_event(self, widget, event): + if event.state & (gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK): + return False + self.parent_win.notebook.emit('key_press_event', event) + def _on_keypress_event(self, widget, event): if event.state & gtk.gdk.CONTROL_MASK: # CTRL + l|L: clear conv_textview diff --git a/src/message_window.py b/src/message_window.py index 438977411..735374f4b 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -70,13 +70,15 @@ class MessageWindow: id = self.window.connect('focus-in-event', self._on_window_focus) self.handlers[id] = self.window + keys=['h', 'i', 'Tab', + 'Tab', 'F4', 'w', + 'Right', 'Left', 'c', 'Escape'] +\ + [''+str(i) for i in xrange(10)] accel_group = gtk.AccelGroup() - key, mod = gtk.accelerator_parse('h') - accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE, - self.accel_group_func) - key, mod = gtk.accelerator_parse('i') - accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE, - self.accel_group_func) + for key in keys: + keyval, mod = gtk.accelerator_parse(key) + accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + self.accel_group_func) self.window.add_accel_group(accel_group) # gtk+ doesn't make use of the motion notify on gtkwindow by default @@ -251,16 +253,50 @@ class MessageWindow: self.notebook.emit('key_press_event', event) def accel_group_func(self, accel_group, acceleratable, keyval, modifier): + st = '1234567890' # alt+1 means the first tab (tab 0) control = self.get_active_control() if not control: # No more control in this window return + + # CTRL mask if modifier & gtk.gdk.CONTROL_MASK: if keyval == gtk.keysyms.h: control._on_history_menuitem_activate() - if control.type_id == message_control.TYPE_CHAT and \ + elif control.type_id == message_control.TYPE_CHAT and \ keyval == gtk.keysyms.i: control._on_contact_information_menuitem_activate(None) + # Tab switch bindings + elif keyval == gtk.keysyms.ISO_Left_Tab: # CTRL + SHIFT + TAB + self.move_to_next_unread_tab(False) + elif keyval == gtk.keysyms.Tab: # CTRL + TAB + self.move_to_next_unread_tab(True) + elif keyval == gtk.keysyms.F4: # CTRL + F4 + self.remove_tab(control, self.CLOSE_CTRL_KEY) + elif keyval == gtk.keysyms.w: # CTRL + W + self.remove_tab(control, self.CLOSE_CTRL_KEY) + + # MOD1 (ALT) mask + elif modifier & gtk.gdk.MOD1_MASK: + # Tab switch bindings + if keyval == gtk.keysyms.Right: # ALT + RIGHT + new = self.notebook.get_current_page() + 1 + if new >= self.notebook.get_n_pages(): + new = 0 + self.notebook.set_current_page(new) + elif keyval == gtk.keysyms.Left: # ALT + LEFT + new = self.notebook.get_current_page() - 1 + if new < 0: + new = self.notebook.get_n_pages() - 1 + self.notebook.set_current_page(new) + elif chr(keyval) in st: # ALT + 1,2,3.. + self.notebook.set_current_page(st.index(chr(keyval))) + elif keyval == gtk.keysyms.c: # ALT + C toggles chat buttons + control.chat_buttons_set_visible(not control.hide_chat_buttons) + # Close tab bindings + elif keyval == gtk.keysyms.Escape and \ + gajim.config.get('escape_key_closes'): # Escape + self.remove_tab(control, self.CLOSE_ESC) def _on_close_button_clicked(self, button, control): '''When close button is pressed: close a tab''' @@ -541,49 +577,12 @@ class MessageWindow: self.show_title(control = new_ctrl) def _on_notebook_key_press(self, widget, event): - st = '1234567890' # alt+1 means the first tab (tab 0) - ctrl = self.get_active_control() - - # CTRL mask - if event.state & gtk.gdk.CONTROL_MASK: - # Tab switch bindings - if event.keyval == gtk.keysyms.ISO_Left_Tab: # CTRL + SHIFT + TAB - self.move_to_next_unread_tab(False) - elif event.keyval == gtk.keysyms.Tab: # CTRL + TAB - self.move_to_next_unread_tab(True) - elif event.keyval == gtk.keysyms.F4: # CTRL + F4 - self.remove_tab(ctrl, self.CLOSE_CTRL_KEY) - elif event.keyval == gtk.keysyms.w: # CTRL + W - self.remove_tab(ctrl, self.CLOSE_CTRL_KEY) - - # MOD1 (ALT) mask - elif event.state & gtk.gdk.MOD1_MASK: - # Tab switch bindings - if event.keyval == gtk.keysyms.Right: # ALT + RIGHT - new = self.notebook.get_current_page() + 1 - if new >= self.notebook.get_n_pages(): - new = 0 - self.notebook.set_current_page(new) - elif event.keyval == gtk.keysyms.Left: # ALT + LEFT - new = self.notebook.get_current_page() - 1 - if new < 0: - new = self.notebook.get_n_pages() - 1 - self.notebook.set_current_page(new) - elif event.string and event.string in st and \ - (event.state & gtk.gdk.MOD1_MASK): # ALT + 1,2,3.. - self.notebook.set_current_page(st.index(event.string)) - elif event.keyval == gtk.keysyms.c: # ALT + C toggles chat buttons - ctrl.chat_buttons_set_visible(not ctrl.hide_chat_buttons) - # Close tab bindings - elif event.keyval == gtk.keysyms.Escape and \ - gajim.config.get('escape_key_closes'): # Escape - self.remove_tab(ctrl, self.CLOSE_ESC) - else: - # If the active control has a message_textview pass the event to it - active_ctrl = self.get_active_control() - if isinstance(active_ctrl, ChatControlBase): - active_ctrl.msg_textview.emit('key_press_event', event) - active_ctrl.msg_textview.grab_focus() + control = self.get_active_control() + #when we get a key press event in conversation textview, + if isinstance(control, ChatControlBase): + #we forwarded it to message textview + control.msg_textview.emit('key_press_event', event) + control.msg_textview.grab_focus() def setup_tab_dnd(self, child): '''Set tab label as drag source and connect the drag_data_get signal'''