if gtk has default action for a widget, bindings never work, so we must use key_press_event for those and return True after we do the job in key_press_event CB
This commit is contained in:
parent
f130ce29c0
commit
1ab95cdc6a
87
src/chat.py
87
src/chat.py
|
@ -22,11 +22,13 @@ import gtk.glade
|
||||||
import pango
|
import pango
|
||||||
import gobject
|
import gobject
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import dialogs
|
import dialogs
|
||||||
import history_window
|
import history_window
|
||||||
import gtkgui_helpers
|
import gtkgui_helpers
|
||||||
import tooltips
|
import tooltips
|
||||||
import conversation_textview
|
import conversation_textview
|
||||||
|
import message_textview
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import gtkspell
|
import gtkspell
|
||||||
|
@ -55,7 +57,8 @@ class Chat:
|
||||||
self.account = account
|
self.account = account
|
||||||
self.change_cursor = None
|
self.change_cursor = None
|
||||||
self.xmls = {}
|
self.xmls = {}
|
||||||
self.conversation_textviews = {}
|
self.conversation_textviews = {} # holds per jid conversation textview
|
||||||
|
self.message_textviews = {} # holds per jid message (where we write) textview
|
||||||
self.nb_unread = {}
|
self.nb_unread = {}
|
||||||
self.print_time_timeout_id = {}
|
self.print_time_timeout_id = {}
|
||||||
self.names = {} # what is printed in the tab (eg. contact.name)
|
self.names = {} # what is printed in the tab (eg. contact.name)
|
||||||
|
@ -96,8 +99,8 @@ class Chat:
|
||||||
self.conversation_textviews[jid].modify_font(font)
|
self.conversation_textviews[jid].modify_font(font)
|
||||||
message_scrolledwindow = self.xmls[jid].get_widget(
|
message_scrolledwindow = self.xmls[jid].get_widget(
|
||||||
'message_scrolledwindow')
|
'message_scrolledwindow')
|
||||||
message_textview = message_scrolledwindow.get_children()[0]
|
msg_textview = message_scrolledwindow.get_children()[0]
|
||||||
message_textview.modify_font(font)
|
msg_textview.modify_font(font)
|
||||||
|
|
||||||
def update_tags(self):
|
def update_tags(self):
|
||||||
for jid in self.conversation_textviews:
|
for jid in self.conversation_textviews:
|
||||||
|
@ -560,10 +563,10 @@ class Chat:
|
||||||
textview.scroll_to_iter(end_iter, 0, False, 1, 1)
|
textview.scroll_to_iter(end_iter, 0, False, 1, 1)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def size_request(self, message_textview , requisition, xml_top):
|
def size_request(self, msg_textview , requisition, xml_top):
|
||||||
''' When message_textview changes its size. If the new height
|
''' When message_textview changes its size. If the new height
|
||||||
will enlarge the window, enable the scrollbar automatic policy'''
|
will enlarge the window, enable the scrollbar automatic policy'''
|
||||||
if message_textview.window is None:
|
if msg_textview.window is None:
|
||||||
return
|
return
|
||||||
message_scrolledwindow = xml_top.get_widget('message_scrolledwindow')
|
message_scrolledwindow = xml_top.get_widget('message_scrolledwindow')
|
||||||
|
|
||||||
|
@ -573,7 +576,7 @@ class Chat:
|
||||||
|
|
||||||
min_height = conversation_scrolledwindow.get_property('height-request')
|
min_height = conversation_scrolledwindow.get_property('height-request')
|
||||||
conversation_height = conv_textview.window.get_size()[1]
|
conversation_height = conv_textview.window.get_size()[1]
|
||||||
message_height = message_textview.window.get_size()[1]
|
message_height = msg_textview.window.get_size()[1]
|
||||||
# new tab is not exposed yet
|
# new tab is not exposed yet
|
||||||
if conversation_height < 2:
|
if conversation_height < 2:
|
||||||
return
|
return
|
||||||
|
@ -591,7 +594,7 @@ class Chat:
|
||||||
gtk.POLICY_AUTOMATIC)
|
gtk.POLICY_AUTOMATIC)
|
||||||
message_scrolledwindow.set_property('height-request',
|
message_scrolledwindow.set_property('height-request',
|
||||||
message_height + conversation_height - min_height)
|
message_height + conversation_height - min_height)
|
||||||
self.bring_scroll_to_end(message_textview)
|
self.bring_scroll_to_end(msg_textview)
|
||||||
else:
|
else:
|
||||||
message_scrolledwindow.set_property('vscrollbar-policy',
|
message_scrolledwindow.set_property('vscrollbar-policy',
|
||||||
gtk.POLICY_NEVER)
|
gtk.POLICY_NEVER)
|
||||||
|
@ -613,6 +616,7 @@ class Chat:
|
||||||
'underline_togglebutton'):
|
'underline_togglebutton'):
|
||||||
self.xmls[jid].get_widget(w).set_no_show_all(True)
|
self.xmls[jid].get_widget(w).set_no_show_all(True)
|
||||||
|
|
||||||
|
# add ConversationTextView to UI and connect signals
|
||||||
conv_textview = self.conversation_textviews[jid] = \
|
conv_textview = self.conversation_textviews[jid] = \
|
||||||
conversation_textview.ConversationTextview(self.account)
|
conversation_textview.ConversationTextview(self.account)
|
||||||
conv_textview.show_all()
|
conv_textview.show_all()
|
||||||
|
@ -621,17 +625,25 @@ class Chat:
|
||||||
conversation_scrolledwindow.add(conv_textview)
|
conversation_scrolledwindow.add(conv_textview)
|
||||||
conv_textview.connect('key_press_event', self.on_conversation_textview_key_press_event)
|
conv_textview.connect('key_press_event', self.on_conversation_textview_key_press_event)
|
||||||
|
|
||||||
|
# add MessageTextView to UI and connect signals
|
||||||
|
message_scrolledwindow = self.xmls[jid].get_widget(
|
||||||
|
'message_scrolledwindow')
|
||||||
|
msg_textview = self.message_textviews[jid] = \
|
||||||
|
message_textview.MessageTextView()
|
||||||
|
msg_textview.connect('mykeypress',
|
||||||
|
self.on_message_textview_mykeypress_event)
|
||||||
|
message_scrolledwindow.add(msg_textview)
|
||||||
|
msg_textview.connect('key_press_event',
|
||||||
|
self.on_message_textview_key_press_event)
|
||||||
|
|
||||||
self.set_compact_view(self.always_compact_view)
|
self.set_compact_view(self.always_compact_view)
|
||||||
self.nb_unread[jid] = 0
|
self.nb_unread[jid] = 0
|
||||||
gajim.last_message_time[self.account][jid] = 0
|
gajim.last_message_time[self.account][jid] = 0
|
||||||
font = pango.FontDescription(gajim.config.get('conversation_font'))
|
font = pango.FontDescription(gajim.config.get('conversation_font'))
|
||||||
|
|
||||||
if gajim.config.get('use_speller') and 'gtkspell' in globals():
|
if gajim.config.get('use_speller') and 'gtkspell' in globals():
|
||||||
message_scrolledwindow = self.xmls[jid].get_widget(
|
|
||||||
'message_scrolledwindow')
|
|
||||||
message_textview = message_scrolledwindow.get_children()[0]
|
|
||||||
try:
|
try:
|
||||||
gtkspell.Spell(message_textview)
|
gtkspell.Spell(msg_textview)
|
||||||
except gobject.GError, msg:
|
except gobject.GError, msg:
|
||||||
#FIXME: add a ui for this use spell.set_language()
|
#FIXME: add a ui for this use spell.set_language()
|
||||||
dialogs.ErrorDialog(unicode(msg), _('If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n\nHighlighting misspelled words feature will not be used')).get_response()
|
dialogs.ErrorDialog(unicode(msg), _('If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n\nHighlighting misspelled words feature will not be used')).get_response()
|
||||||
|
@ -665,10 +677,10 @@ class Chat:
|
||||||
self.notebook.append_page(child, tab_hbox)
|
self.notebook.append_page(child, tab_hbox)
|
||||||
message_scrolledwindow = self.xmls[jid].get_widget(
|
message_scrolledwindow = self.xmls[jid].get_widget(
|
||||||
'message_scrolledwindow')
|
'message_scrolledwindow')
|
||||||
message_textview = message_scrolledwindow.get_children()[0]
|
msg_textview = message_scrolledwindow.get_children()[0]
|
||||||
|
|
||||||
message_textview.modify_font(font)
|
msg_textview.modify_font(font)
|
||||||
message_textview.connect('size-request', self.size_request,
|
msg_textview.connect('size-request', self.size_request,
|
||||||
self.xmls[jid])
|
self.xmls[jid])
|
||||||
# init new sent history for this conversation
|
# init new sent history for this conversation
|
||||||
self.sent_history[jid] = []
|
self.sent_history[jid] = []
|
||||||
|
@ -678,6 +690,27 @@ class Chat:
|
||||||
|
|
||||||
self.show_title()
|
self.show_title()
|
||||||
|
|
||||||
|
def on_message_textview_key_press_event(self, widget, event):
|
||||||
|
jid = self.get_active_jid()
|
||||||
|
conv_textview = self.conversation_textviews[jid]
|
||||||
|
|
||||||
|
if self.widget_name == 'groupchat_window':
|
||||||
|
if event.keyval not in (gtk.keysyms.ISO_Left_Tab, gtk.keysyms.Tab):
|
||||||
|
room_jid = self.get_active_jid()
|
||||||
|
self.last_key_tabs[room_jid] = False
|
||||||
|
|
||||||
|
if event.keyval == gtk.keysyms.Page_Down: # PAGE DOWN
|
||||||
|
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE DOWN
|
||||||
|
self.notebook.emit('key_press_event', event)
|
||||||
|
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE DOWN
|
||||||
|
conv_textview.emit('key_press_event', event)
|
||||||
|
elif event.keyval == gtk.keysyms.Page_Up: # PAGE UP
|
||||||
|
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE UP
|
||||||
|
self.notebook.emit('key_press_event', event)
|
||||||
|
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE UP
|
||||||
|
conv_textview.emit('key_press_event', event)
|
||||||
|
|
||||||
|
|
||||||
def on_conversation_textview_key_press_event(self, widget, event):
|
def on_conversation_textview_key_press_event(self, widget, event):
|
||||||
'''Do not block these events and send them to the notebook'''
|
'''Do not block these events and send them to the notebook'''
|
||||||
if event.state & gtk.gdk.CONTROL_MASK:
|
if event.state & gtk.gdk.CONTROL_MASK:
|
||||||
|
@ -698,10 +731,10 @@ class Chat:
|
||||||
jid = self.get_active_jid()
|
jid = self.get_active_jid()
|
||||||
message_scrolledwindow = self.xmls[jid].get_widget(
|
message_scrolledwindow = self.xmls[jid].get_widget(
|
||||||
'message_scrolledwindow')
|
'message_scrolledwindow')
|
||||||
message_textview = message_scrolledwindow.get_children()[0]
|
msg_textview = message_scrolledwindow.get_children()[0]
|
||||||
if not message_textview.is_focus():
|
if not msg_textview.is_focus():
|
||||||
message_textview.grab_focus()
|
msg_textview.grab_focus()
|
||||||
message_textview.emit('key_press_event', event)
|
msg_textview.emit('key_press_event', event)
|
||||||
|
|
||||||
def on_chat_notebook_key_press_event(self, widget, event):
|
def on_chat_notebook_key_press_event(self, widget, event):
|
||||||
st = '1234567890' # alt+1 means the first tab (tab 0)
|
st = '1234567890' # alt+1 means the first tab (tab 0)
|
||||||
|
@ -763,10 +796,10 @@ class Chat:
|
||||||
jid = self.get_active_jid()
|
jid = self.get_active_jid()
|
||||||
message_scrolledwindow = self.xmls[jid].get_widget(
|
message_scrolledwindow = self.xmls[jid].get_widget(
|
||||||
'message_scrolledwindow')
|
'message_scrolledwindow')
|
||||||
message_textview = message_scrolledwindow.get_children()[0]
|
msg_textview = message_scrolledwindow.get_children()[0]
|
||||||
if not message_textview.is_focus():
|
if not msg_textview.is_focus():
|
||||||
message_textview.grab_focus()
|
msg_textview.grab_focus()
|
||||||
message_textview.emit('key_press_event', event)
|
msg_textview.emit('key_press_event', event)
|
||||||
elif event.state & gtk.gdk.CONTROL_MASK or \
|
elif event.state & gtk.gdk.CONTROL_MASK or \
|
||||||
(event.keyval == gtk.keysyms.Control_L) or \
|
(event.keyval == gtk.keysyms.Control_L) or \
|
||||||
(event.keyval == gtk.keysyms.Control_R):
|
(event.keyval == gtk.keysyms.Control_R):
|
||||||
|
@ -777,11 +810,11 @@ class Chat:
|
||||||
else: # it's a normal key press make sure message_textview has focus
|
else: # it's a normal key press make sure message_textview has focus
|
||||||
message_scrolledwindow = self.xmls[jid].get_widget(
|
message_scrolledwindow = self.xmls[jid].get_widget(
|
||||||
'message_scrolledwindow')
|
'message_scrolledwindow')
|
||||||
message_textview = message_scrolledwindow.get_children()[0]
|
msg_textview = message_scrolledwindow.get_children()[0]
|
||||||
if message_textview.get_property('sensitive'):
|
if msg_textview.get_property('sensitive'):
|
||||||
if not message_textview.is_focus():
|
if not msg_textview.is_focus():
|
||||||
message_textview.grab_focus()
|
msg_textview.grab_focus()
|
||||||
message_textview.emit('key_press_event', event)
|
msg_textview.emit('key_press_event', event)
|
||||||
|
|
||||||
def on_conversation_vadjustment_value_changed(self, widget):
|
def on_conversation_vadjustment_value_changed(self, widget):
|
||||||
jid = self.get_active_jid()
|
jid = self.get_active_jid()
|
||||||
|
|
|
@ -31,7 +31,6 @@ import cell_renderer_image
|
||||||
import gtkgui_helpers
|
import gtkgui_helpers
|
||||||
import history_window
|
import history_window
|
||||||
import tooltips
|
import tooltips
|
||||||
import message_textview
|
|
||||||
|
|
||||||
from gajim import Contact
|
from gajim import Contact
|
||||||
from common import gajim
|
from common import gajim
|
||||||
|
@ -577,10 +576,8 @@ class GroupchatWindow(chat.Chat):
|
||||||
|
|
||||||
def on_message_textview_key_press_event(self, widget, event):
|
def on_message_textview_key_press_event(self, widget, event):
|
||||||
'''we use this cb instead of my_key_press to catch everything else
|
'''we use this cb instead of my_key_press to catch everything else
|
||||||
that is not registred as binding (see message_textview.py)'''
|
that is not registered as binding (see message_textview.py)'''
|
||||||
if event.keyval not in (gtk.keysyms.ISO_Left_Tab, gtk.keysyms.Tab):
|
chat.Chat.on_chat_notebook_key_press_event(self, widget, event)
|
||||||
room_jid = self.get_active_jid()
|
|
||||||
self.last_key_tabs[room_jid] = False
|
|
||||||
|
|
||||||
def on_message_textview_mykeypress_event(self, widget, event_keyval,
|
def on_message_textview_mykeypress_event(self, widget, event_keyval,
|
||||||
event_keymod):
|
event_keymod):
|
||||||
|
@ -681,16 +678,6 @@ class GroupchatWindow(chat.Chat):
|
||||||
return True
|
return True
|
||||||
self.last_key_tabs[room_jid] = False
|
self.last_key_tabs[room_jid] = False
|
||||||
return False
|
return False
|
||||||
elif event.keyval == gtk.keysyms.Page_Down: # PAGE DOWN
|
|
||||||
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE DOWN
|
|
||||||
self.notebook.emit('key_press_event', event)
|
|
||||||
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE DOWN
|
|
||||||
conv_textview.emit('key_press_event', event)
|
|
||||||
elif event.keyval == gtk.keysyms.Page_Up: # PAGE UP
|
|
||||||
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE UP
|
|
||||||
self.notebook.emit('key_press_event', event)
|
|
||||||
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE UP
|
|
||||||
conv_textview.emit('key_press_event', event)
|
|
||||||
elif event.keyval == gtk.keysyms.Return or \
|
elif event.keyval == gtk.keysyms.Return or \
|
||||||
event.keyval == gtk.keysyms.KP_Enter: # ENTER
|
event.keyval == gtk.keysyms.KP_Enter: # ENTER
|
||||||
if (event.state & gtk.gdk.SHIFT_MASK):
|
if (event.state & gtk.gdk.SHIFT_MASK):
|
||||||
|
@ -1328,17 +1315,6 @@ current room topic.') % command, room_jid)
|
||||||
'list_treeview')
|
'list_treeview')
|
||||||
self.subject_tooltip[room_jid] = gtk.Tooltips()
|
self.subject_tooltip[room_jid] = gtk.Tooltips()
|
||||||
|
|
||||||
# add MessageTextView to UI
|
|
||||||
message_scrolledwindow = self.xmls[room_jid].get_widget(
|
|
||||||
'message_scrolledwindow')
|
|
||||||
|
|
||||||
msg_textview = message_textview.MessageTextView()
|
|
||||||
msg_textview.connect('mykeypress',
|
|
||||||
self.on_message_textview_mykeypress_event)
|
|
||||||
msg_textview.connect('key_press_event',
|
|
||||||
self.on_message_textview_key_press_event)
|
|
||||||
message_scrolledwindow.add(msg_textview)
|
|
||||||
|
|
||||||
chat.Chat.new_tab(self, room_jid)
|
chat.Chat.new_tab(self, room_jid)
|
||||||
|
|
||||||
# we want to know when the the widget resizes, because that is
|
# we want to know when the the widget resizes, because that is
|
||||||
|
|
|
@ -29,7 +29,6 @@ import os
|
||||||
import dialogs
|
import dialogs
|
||||||
import chat
|
import chat
|
||||||
import gtkgui_helpers
|
import gtkgui_helpers
|
||||||
import message_textview
|
|
||||||
|
|
||||||
from common import gajim
|
from common import gajim
|
||||||
from common import helpers
|
from common import helpers
|
||||||
|
@ -454,15 +453,6 @@ class TabbedChatWindow(chat.Chat):
|
||||||
self.childs[contact.jid] = self.xmls[contact.jid].get_widget('chats_vbox')
|
self.childs[contact.jid] = self.xmls[contact.jid].get_widget('chats_vbox')
|
||||||
self.contacts[contact.jid] = contact
|
self.contacts[contact.jid] = contact
|
||||||
|
|
||||||
# add MessageTextView to UI
|
|
||||||
message_scrolledwindow = self.xmls[contact.jid].get_widget(
|
|
||||||
'message_scrolledwindow')
|
|
||||||
|
|
||||||
msg_textview = message_textview.MessageTextView()
|
|
||||||
msg_textview.connect('mykeypress',
|
|
||||||
self.on_message_textview_mykeypress_event)
|
|
||||||
message_scrolledwindow.add(msg_textview)
|
|
||||||
|
|
||||||
self.show_avatar(contact.jid, contact.resource)
|
self.show_avatar(contact.jid, contact.resource)
|
||||||
|
|
||||||
self.childs[contact.jid].connect('drag_data_received',
|
self.childs[contact.jid].connect('drag_data_received',
|
||||||
|
@ -471,6 +461,9 @@ class TabbedChatWindow(chat.Chat):
|
||||||
gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP,
|
gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP,
|
||||||
self.dnd_list, gtk.gdk.ACTION_COPY)
|
self.dnd_list, gtk.gdk.ACTION_COPY)
|
||||||
|
|
||||||
|
chat.Chat.new_tab(self, contact.jid)
|
||||||
|
|
||||||
|
msg_textview = self.message_textviews[contact.jid]
|
||||||
message_tv_buffer = msg_textview.get_buffer()
|
message_tv_buffer = msg_textview.get_buffer()
|
||||||
message_tv_buffer.connect('changed',
|
message_tv_buffer.connect('changed',
|
||||||
self.on_message_tv_buffer_changed, contact)
|
self.on_message_tv_buffer_changed, contact)
|
||||||
|
@ -482,7 +475,6 @@ class TabbedChatWindow(chat.Chat):
|
||||||
xm.signal_autoconnect(self)
|
xm.signal_autoconnect(self)
|
||||||
self.tabbed_chat_popup_menu = xm.get_widget('tabbed_chat_popup_menu')
|
self.tabbed_chat_popup_menu = xm.get_widget('tabbed_chat_popup_menu')
|
||||||
|
|
||||||
chat.Chat.new_tab(self, contact.jid)
|
|
||||||
self.redraw_tab(contact.jid)
|
self.redraw_tab(contact.jid)
|
||||||
self.draw_widgets(contact)
|
self.draw_widgets(contact)
|
||||||
|
|
||||||
|
@ -613,16 +605,6 @@ class TabbedChatWindow(chat.Chat):
|
||||||
if event.keyval == gtk.keysyms.Tab:
|
if event.keyval == gtk.keysyms.Tab:
|
||||||
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB
|
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB
|
||||||
self.notebook.emit('key_press_event', event)
|
self.notebook.emit('key_press_event', event)
|
||||||
elif event.keyval == gtk.keysyms.Page_Down: # PAGE DOWN
|
|
||||||
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE DOWN
|
|
||||||
self.notebook.emit('key_press_event', event)
|
|
||||||
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE DOWN
|
|
||||||
conv_textview.emit('key_press_event', event)
|
|
||||||
elif event.keyval == gtk.keysyms.Page_Up: # PAGE UP
|
|
||||||
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE UP
|
|
||||||
self.notebook.emit('key_press_event', event)
|
|
||||||
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE UP
|
|
||||||
conv_textview.emit('key_press_event', event)
|
|
||||||
elif event.keyval == gtk.keysyms.Up:
|
elif event.keyval == gtk.keysyms.Up:
|
||||||
if event.state & gtk.gdk.CONTROL_MASK: # Ctrl+UP
|
if event.state & gtk.gdk.CONTROL_MASK: # Ctrl+UP
|
||||||
self.sent_messages_scroll(jid, 'up', widget.get_buffer())
|
self.sent_messages_scroll(jid, 'up', widget.get_buffer())
|
||||||
|
|
Loading…
Reference in New Issue