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
|
# Create textviews and connect signals
|
||||||
self.conv_textview = ConversationTextview(self.account)
|
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
|
# FIXME: DND on non editable TextView, find a better way
|
||||||
self.drag_entered = False
|
self.drag_entered = False
|
||||||
id = self.conv_textview.tv.connect('drag_data_received',
|
id = self.conv_textview.tv.connect('drag_data_received',
|
||||||
|
@ -397,6 +400,11 @@ class ChatControlBase(MessageControl):
|
||||||
widget.modify_fg(gtk.STATE_NORMAL, fg_color)
|
widget.modify_fg(gtk.STATE_NORMAL, fg_color)
|
||||||
self.connect_style_event(widget, opts[0], opts[1])
|
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):
|
def _on_keypress_event(self, widget, event):
|
||||||
if event.state & gtk.gdk.CONTROL_MASK:
|
if event.state & gtk.gdk.CONTROL_MASK:
|
||||||
# CTRL + l|L: clear conv_textview
|
# CTRL + l|L: clear conv_textview
|
||||||
|
|
|
@ -70,13 +70,15 @@ class MessageWindow:
|
||||||
id = self.window.connect('focus-in-event', self._on_window_focus)
|
id = self.window.connect('focus-in-event', self._on_window_focus)
|
||||||
self.handlers[id] = self.window
|
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()
|
accel_group = gtk.AccelGroup()
|
||||||
key, mod = gtk.accelerator_parse('<Control>h')
|
for key in keys:
|
||||||
accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE,
|
keyval, mod = gtk.accelerator_parse(key)
|
||||||
self.accel_group_func)
|
accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE,
|
||||||
key, mod = gtk.accelerator_parse('<Control>i')
|
self.accel_group_func)
|
||||||
accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE,
|
|
||||||
self.accel_group_func)
|
|
||||||
self.window.add_accel_group(accel_group)
|
self.window.add_accel_group(accel_group)
|
||||||
|
|
||||||
# gtk+ doesn't make use of the motion notify on gtkwindow by default
|
# 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)
|
self.notebook.emit('key_press_event', event)
|
||||||
|
|
||||||
def accel_group_func(self, accel_group, acceleratable, keyval, modifier):
|
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()
|
control = self.get_active_control()
|
||||||
if not control:
|
if not control:
|
||||||
# No more control in this window
|
# No more control in this window
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# CTRL mask
|
||||||
if modifier & gtk.gdk.CONTROL_MASK:
|
if modifier & gtk.gdk.CONTROL_MASK:
|
||||||
if keyval == gtk.keysyms.h:
|
if keyval == gtk.keysyms.h:
|
||||||
control._on_history_menuitem_activate()
|
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:
|
keyval == gtk.keysyms.i:
|
||||||
control._on_contact_information_menuitem_activate(None)
|
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):
|
def _on_close_button_clicked(self, button, control):
|
||||||
'''When close button is pressed: close a tab'''
|
'''When close button is pressed: close a tab'''
|
||||||
|
@ -541,49 +577,12 @@ class MessageWindow:
|
||||||
self.show_title(control = new_ctrl)
|
self.show_title(control = new_ctrl)
|
||||||
|
|
||||||
def _on_notebook_key_press(self, widget, event):
|
def _on_notebook_key_press(self, widget, event):
|
||||||
st = '1234567890' # alt+1 means the first tab (tab 0)
|
control = self.get_active_control()
|
||||||
ctrl = self.get_active_control()
|
#when we get a key press event in conversation textview,
|
||||||
|
if isinstance(control, ChatControlBase):
|
||||||
# CTRL mask
|
#we forwarded it to message textview
|
||||||
if event.state & gtk.gdk.CONTROL_MASK:
|
control.msg_textview.emit('key_press_event', event)
|
||||||
# Tab switch bindings
|
control.msg_textview.grab_focus()
|
||||||
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()
|
|
||||||
|
|
||||||
def setup_tab_dnd(self, child):
|
def setup_tab_dnd(self, child):
|
||||||
'''Set tab label as drag source and connect the drag_data_get signal'''
|
'''Set tab label as drag source and connect the drag_data_get signal'''
|
||||||
|
|
Loading…
Add table
Reference in a new issue