[Davidov] use gtk.AccelGroup to handle key press. Fixes #1503. also fixes #3466

This commit is contained in:
Yann Leboulanger 2007-10-10 16:13:16 +00:00
parent af681cc5ba
commit 88cd5c3a50
2 changed files with 57 additions and 50 deletions

View file

@ -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

View file

@ -70,12 +70,14 @@ class MessageWindow:
id = self.window.connect('focus-in-event', self._on_window_focus)
self.handlers[id] = self.window
keys=['<Control>h', '<Control>i', '<Control><Shift>Tab',
'<Control>Tab', '<Control>F4', '<Control>w',
'<Alt>Right', '<Alt>Left', '<Alt>c', 'Escape'] +\
['<Alt>'+str(i) for i in xrange(10)]
accel_group = gtk.AccelGroup()
key, mod = gtk.accelerator_parse('<Control>h')
accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE,
self.accel_group_func)
key, mod = gtk.accelerator_parse('<Control>i')
accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE,
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)
@ -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'''