This commit is contained in:
parent
af681cc5ba
commit
88cd5c3a50
2 changed files with 57 additions and 50 deletions
|
@ -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
|
||||
|
|
|
@ -70,13 +70,15 @@ 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,
|
||||
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'''
|
||||
|
|
Loading…
Add table
Reference in a new issue