update files from trunk

This commit is contained in:
Yann Leboulanger 2005-04-12 15:30:09 +00:00
parent 119ac50004
commit fbf6c84e52
8 changed files with 996 additions and 280 deletions

View File

@ -215,7 +215,9 @@ class Chat:
self.xmls[jid].get_widget('conversation_textview')
conversation_buffer = conversation_textview.get_buffer()
end_iter = conversation_buffer.get_end_iter()
conversation_buffer.create_mark('end', end_iter, 0)
conversation_buffer.create_mark('end', end_iter, False)
self.tagIn[jid] = conversation_buffer.create_tag('incoming')
color = self.plugin.config['inmsgcolor']
self.tagIn[jid].set_property('foreground', color)
@ -270,59 +272,79 @@ class Chat:
self.show_title()
def on_conversation_textview_key_press_event(self, widget, event):
"""Do not black these evnts and send them to the notebook"""
if event.keyval == gtk.keysyms.Tab and \
(event.state & gtk.gdk.CONTROL_MASK): # CTRL + TAB
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
"""Do not block these events and send them to the notebook"""
if (event.state & gtk.gdk.CONTROL_MASK) and \
(event.state & gtk.gdk.SHIFT_MASK):
if event.hardware_keycode == 23: # CTRL + SHIFT + TAB
self.notebook.emit('key_press_event', event)
elif event.keyval == gtk.keysyms.Page_Up: # PAGE UP
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE UP
elif event.state & gtk.gdk.CONTROL_MASK:
if event.keyval == gtk.keysyms.Tab: # CTRL + TAB
self.notebook.emit('key_press_event', event)
elif event.keyval == gtk.keysyms.Page_Down: # CTRL + PAGE DOWN
self.notebook.emit('key_press_event', event)
elif event.keyval == gtk.keysyms.Page_Up: # CTRL + PAGE UP
self.notebook.emit('key_press_event', event)
def on_chat_notebook_key_press_event(self, widget, event):
st = '1234567890' # zero is here cause humans count from 1, pc from 0 :P
jid = self.get_active_jid()
if event.keyval == gtk.keysyms.Escape: # ESCAPE
self.remove_tab(jid)
elif event.keyval == gtk.keysyms.F4 and \
(event.state & gtk.gdk.CONTROL_MASK): # CTRL + F4
self.remove_tab(jid)
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.Page_Down: # PAGE DOWN
if event.state & gtk.gdk.CONTROL_MASK:
elif event.keyval == gtk.keysyms.Page_Down:
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE DOWN
current = self.notebook.get_current_page()
if current > 0:
self.notebook.set_current_page(current-1)
elif event.state & gtk.gdk.SHIFT_MASK:
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE DOWN
conversation_textview = self.xmls[jid].\
get_widget('conversation_textview')
rect = conversation_textview.get_visible_rect()
iter = conversation_textview.get_iter_at_location(rect.x,\
rect.y + rect.height)
conversation_textview.scroll_to_iter(iter, 0.1, True, 0, 0)
elif event.keyval == gtk.keysyms.Page_Up: # PAGE UP
if event.state & gtk.gdk.CONTROL_MASK:
elif event.keyval == gtk.keysyms.Page_Up:
if event.state & gtk.gdk.CONTROL_MASK: # CTRL + PAGE UP
current = self.notebook.get_current_page()
if current < (self.notebook.get_n_pages()-1):
self.notebook.set_current_page(current+1)
elif event.state & gtk.gdk.SHIFT_MASK:
elif event.state & gtk.gdk.SHIFT_MASK: # SHIFT + PAGE UP
conversation_textview = self.xmls[jid].\
get_widget('conversation_textview')
rect = conversation_textview.get_visible_rect()
iter = conversation_textview.get_iter_at_location(rect.x, rect.y)
conversation_textview.scroll_to_iter(iter, 0.1, True, 0, 1)
elif event.keyval == gtk.keysyms.Tab and \
(event.state & gtk.gdk.CONTROL_MASK): # CTRL + TAB
current = self.notebook.get_current_page()
if current < (self.notebook.get_n_pages()-1):
self.notebook.set_current_page(current+1)
else:
self.notebook.set_current_page(0)
# or event.keyval == gtk.keysyms.KP_Up
elif event.keyval == gtk.keysyms.Up:
if event.state & gtk.gdk.SHIFT_MASK: # SHIFT + UP
print 'be' # FIXME: find a way to to keyUP in scrolledwindow
conversation_scrolledwindow = self.xml.get_widget\
('conversation_scrolledwindow')
conversation_scrolledwindow.emit('scroll-child', \
gtk.SCROLL_PAGE_BACKWARD, False)
elif event.hardware_keycode == 23: # TAB
if (event.state & gtk.gdk.CONTROL_MASK) and \
(event.state & gtk.gdk.SHIFT_MASK): # CTRL + SHIFT + TAB
current = self.notebook.get_current_page()
if current > 0:
self.notebook.set_current_page(current-1)
else:
self.notebook.set_current_page(self.notebook.get_n_pages()-1)
elif event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB
current = self.notebook.get_current_page()
if current < (self.notebook.get_n_pages()-1):
self.notebook.set_current_page(current+1)
else:
self.notebook.set_current_page(0)
elif (event.state & gtk.gdk.CONTROL_MASK) or (event.keyval ==\
gtk.keysyms.Control_L) or (event.keyval == gtk.keysyms.Control_R):
# we pressed a control key or ctrl+sth : we don't block the event
# in order to let ctrl+c do its work
# we pressed a control key or ctrl+sth: we don't block the event
# in order to let ctrl+c (copy text) and others do their default work
pass
else: # it's a normal key press make sure message_textview has focus
message_textview = self.xmls[jid].get_widget('message_textview')
@ -375,7 +397,10 @@ class Chat:
iter = widget.get_iter_at_location(x, y)
tags = iter.get_tags()
if tags:
return True
for tag in tags:
tag_name = tag.get_property('name')
if 'url' in tag_name or 'mail' in tag_name:
return True
def print_time_timeout(self, jid):
if not jid in self.xmls.keys():
@ -438,7 +463,7 @@ class Chat:
while not end_iter.ends_tag(texttag):
end_iter.forward_char()
word = begin_iter.get_text(end_iter)
if event.button == 3:
if event.button == 3: # right click
self.make_link_menu(event, kind, word)
else:
#we launch the correct application
@ -548,14 +573,26 @@ class Chat:
self.print_with_tag_list(conversation_buffer, special_text, end_iter, \
all_tags)
def scroll_to_end(self, textview):
buffer = textview.get_buffer()
textview.scroll_to_mark(buffer.get_mark('end'), 0, True, 0, 1)
return False
def print_conversation_line(self, text, jid, kind, name, tim, \
other_tags_for_name = []):
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
conversation_buffer = conversation_textview.get_buffer()
print_all_special = False
at_the_end = False
end_iter = conversation_buffer.get_end_iter()
end_rect = conversation_textview.get_iter_location(end_iter)
visible_rect = conversation_textview.get_visible_rect()
if end_rect.y <= (visible_rect.y + visible_rect.height):
at_the_end = True
if not text:
text = ''
end_iter = conversation_buffer.get_end_iter()
if conversation_buffer.get_char_count() > 0:
conversation_buffer.insert(end_iter, '\n')
if self.plugin.config['print_time'] == 'always':
if not tim:
tim = time.localtime()
@ -583,7 +620,6 @@ class Chat:
+ self.after_nickname_symbols + ' '
self.print_with_tag_list(conversation_buffer, format, end_iter, tags)
text += '\n'
# detect urls formatting and if the user has it on emoticons
index = self.detect_and_print_special_text(text, jid, \
tags, print_all_special)
@ -597,16 +633,12 @@ class Chat:
conversation_buffer.insert(end_iter, text[index:])
#scroll to the end of the textview
end_iter = conversation_buffer.get_end_iter()
end_rect = conversation_textview.get_iter_location(end_iter)
visible_rect = conversation_textview.get_visible_rect()
end = False
if end_rect.y <= (visible_rect.y + visible_rect.height) or \
(kind == 'outgoing'):
if at_the_end or (kind == 'outgoing'):
#we are at the end or we are sending something
end = True
conversation_textview.scroll_to_mark(conversation_buffer.\
get_mark('end'), 0.1, 0, 0, 0)
# We scroll to the end after the scrollbar has appeared
gobject.timeout_add(50, self.scroll_to_end, conversation_textview)
if ((jid != self.get_active_jid()) or (not self.window.is_active()) or \
(not end)) and kind == 'incoming':
self.nb_unread[jid] += 1

View File

@ -42,11 +42,18 @@ class Preferences_window:
return True # do NOT destroy the window
def on_close_button_clicked(self, widget):
self.window.hide()
self.window.hide()
def on_preferences_window_show(self, widget):
self.notebook.set_current_page(0)
if os.name == 'nt': # if windows, player must not be visible
self.xml.get_widget('soundplayer_hbox').set_property('visible', False)
self.trayicon_checkbutton.set_property('visible', False)
def on_preferences_window_key_press_event(self, widget, event):
if event.keyval == gtk.keysyms.Escape: # ESCAPE
self.window.hide()
def on_checkbutton_toggled(self, widget, config_name, \
change_sensitivity_widgets = None):
if widget.get_active():
@ -56,8 +63,9 @@ class Preferences_window:
if change_sensitivity_widgets != None:
for w in change_sensitivity_widgets:
w.set_sensitive(widget.get_active())
self.plugin.save_config()
def on_tray_icon_checkbutton_toggled(self, widget):
def on_trayicon_checkbutton_toggled(self, widget):
if widget.get_active():
self.plugin.config['trayicon'] = 1
self.plugin.show_systray()
@ -67,12 +75,14 @@ class Preferences_window:
self.plugin.hide_systray()
self.plugin.send('CONFIG', None, ('GtkGui', self.plugin.config, 'GtkGui'))
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_save_position_checkbutton_toggled(self, widget):
if widget.get_active():
self.plugin.config['saveposition'] = 1
else:
self.plugin.config['saveposition'] = 0
self.plugin.save_config()
def on_merge_checkbutton_toggled(self, widget):
if widget.get_active():
@ -81,6 +91,7 @@ class Preferences_window:
self.plugin.config['mergeaccounts'] = 0
self.plugin.roster.regroup = self.plugin.config['mergeaccounts']
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_iconset_combobox_changed(self, widget):
model = widget.get_model()
@ -88,6 +99,7 @@ class Preferences_window:
icon_string = model[active][0]
self.plugin.config['iconset'] = icon_string
self.plugin.roster.reload_pixbufs()
self.plugin.save_config()
def on_account_text_colorbutton_color_set(self, widget):
"""Take The Color For The Account Text"""
@ -96,6 +108,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['accounttextcolor'] = color_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_group_text_colorbutton_color_set(self, widget):
"""Take The Color For The Group Text"""
@ -104,6 +117,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['grouptextcolor'] = color_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_user_text_colorbutton_color_set(self, widget):
"""Take The Color For The User Text"""
@ -112,6 +126,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['usertextcolor'] = color_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_account_text_bg_colorbutton_color_set(self, widget):
"""Take The Color For The Background Of Account Text"""
@ -120,6 +135,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['accountbgcolor'] = color_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_group_text_bg_colorbutton_color_set(self, widget):
"""Take The Color For The Background Of Group Text"""
@ -128,6 +144,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['groupbgcolor'] = color_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_user_text_bg_colorbutton_color_set(self, widget):
"""Take The Color For The Background Of User Text"""
@ -136,24 +153,28 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['userbgcolor'] = color_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_account_text_fontbutton_font_set(self, widget):
"""Take The Font For The User Text"""
font_string = widget.get_font_name()
self.plugin.config['accountfont'] = font_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_group_text_fontbutton_font_set(self, widget):
"""Take The Font For The Group Text"""
font_string = widget.get_font_name()
self.plugin.config['groupfont'] = font_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_user_text_fontbutton_font_set(self, widget):
"""Take The Font For The User Text"""
font_string = widget.get_font_name()
self.plugin.config['userfont'] = font_string
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_reset_colors_and_fonts_button_clicked(self, widget):
defaults = self.plugin.default_config
@ -185,6 +206,7 @@ class Preferences_window:
self.xml.get_widget('user_text_fontbutton').set_font_name(\
defaults['userfont'])
self.plugin.roster.draw_roster()
self.plugin.save_config()
def on_use_tabbed_chat_window_checkbutton_toggled(self, widget):
buf1 = {}
@ -239,6 +261,7 @@ class Preferences_window:
# buf1[acct][jid])
# self.plugin.windows[acct]['chats'][jid].xmls[jid].\
# get_widget('message_textview').set_buffer(buf2[acct][jid])
self.plugin.save_config()
def update_print_time(self):
"""Update time in Opened Chat Windows"""
@ -253,28 +276,35 @@ class Preferences_window:
if widget.get_active():
self.plugin.config['print_time'] = 'never'
self.update_print_time()
self.plugin.save_config()
def on_time_sometimes_radiobutton_toggled(self, widget):
if widget.get_active():
self.plugin.config['print_time'] = 'sometimes'
self.update_print_time()
self.plugin.save_config()
def on_time_always_radiobutton_toggled(self, widget):
if widget.get_active():
self.plugin.config['print_time'] = 'always'
self.update_print_time()
self.plugin.save_config()
def on_before_time_entry_focus_out_event(self, widget, event):
self.plugin.config['before_time'] = widget.get_text()
self.plugin.save_config()
def on_after_time_entry_focus_out_event(self, widget, event):
self.plugin.config['after_time'] = widget.get_text()
self.plugin.save_config()
def on_before_nickname_entry_focus_out_event(self, widget, event):
self.plugin.config['before_nickname'] = widget.get_text()
self.plugin.save_config()
def on_after_nickname_entry_focus_out_event(self, widget, event):
self.plugin.config['after_nickname'] = widget.get_text()
self.plugin.save_config()
def update_text_tags(self):
"""Update color tags in Opened Chat Windows"""
@ -292,6 +322,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['inmsgcolor'] = color_string
self.update_text_tags()
self.plugin.save_config()
def on_outgoing_msg_colorbutton_color_set(self, widget):
"""Take The Color For The Outgoing Messages"""
@ -300,6 +331,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['outmsgcolor'] = color_string
self.update_text_tags()
self.plugin.save_config()
def on_status_msg_colorbutton_color_set(self, widget):
"""Take The Color For The Status Messages"""
@ -308,6 +340,7 @@ class Preferences_window:
(hex(color.green) + '0')[2:4] + (hex(color.blue) + '0')[2:4]
self.plugin.config['statusmsgcolor'] = color_string
self.update_text_tags()
self.plugin.save_config()
def on_reset_colors_button_clicked(self, widget):
defaults = self.plugin.default_config
@ -321,6 +354,7 @@ class Preferences_window:
self.xml.get_widget('status_msg_colorbutton').set_color(\
gtk.gdk.color_parse(defaults['statusmsgcolor']))
self.update_text_tags()
self.plugin.save_config()
def on_use_emoticons_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'useemoticons', \
@ -345,13 +379,13 @@ class Preferences_window:
def on_play_sounds_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'sounds_on',\
[self.xml.get_widget('sound_player_hbox'),\
[self.xml.get_widget('soundplayer_hbox'),\
self.xml.get_widget('sounds_scrolledwindow'),\
self.xml.get_widget('browse_sounds_hbox')])
def on_soundplayer_entry_changed(self, widget):
self.plugin.config['soundplayer'] = widget.get_text()
self.plugin.save_config()
def on_prompt_online_status_message_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'ask_online_status')
@ -371,6 +405,7 @@ class Preferences_window:
self.plugin.config['sound_' + sound_event + '_file'] = \
model.get_value(iter, 2)
iter = model.iter_next(iter)
self.plugin.save_config()
def on_auto_away_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'autoaway', \
@ -382,6 +417,7 @@ class Preferences_window:
self.plugin.sleeper = common.sleepy.Sleepy(\
self.plugin.config['autoawaytime']*60, \
self.plugin.config['autoxatime']*60)
self.plugin.save_config()
def on_auto_xa_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'autoxa', \
@ -393,6 +429,7 @@ class Preferences_window:
self.plugin.sleeper = common.sleepy.Sleepy(\
self.plugin.config['autoawaytime']*60, \
self.plugin.config['autoxatime']*60)
self.plugin.save_config()
def on_msg_treemodel_row_changed(self, model, path, iter):
iter = model.get_iter_first()
@ -406,6 +443,7 @@ class Preferences_window:
del self.plugin.config['msg%i_name' % i]
del self.plugin.config['msg%i' % i]
i += 1
self.plugin.save_config()
def on_msg_treemodel_row_deleted(self, model, path, iter):
iter = model.get_iter_first()
@ -419,6 +457,7 @@ class Preferences_window:
del self.plugin.config['msg%i_name' % i]
del self.plugin.config['msg%i' % i]
i += 1
self.plugin.save_config()
def on_links_open_with_combobox_changed(self, widget):
if widget.get_active() == 2:
@ -430,12 +469,15 @@ class Preferences_window:
if widget.get_active() == 1:
self.plugin.config['openwith'] = 'kfmclient exec'
self.xml.get_widget('custom_apps_frame').set_sensitive(False)
self.plugin.save_config()
def on_custom_browser_entry_changed(self, widget):
self.plugin.config['custombrowser'] = widget.get_text()
self.plugin.save_config()
def on_custom_mail_client_entry_changed(self, widget):
self.plugin.config['custommailapp'] = widget.get_text()
self.plugin.save_config()
def on_log_in_contact_checkbutton_toggled(self, widget):
if widget.get_active():
@ -443,6 +485,7 @@ class Preferences_window:
else:
self.config_logger['lognotusr'] = 0
self.plugin.send('CONFIG', None, ('Logger', self.config_logger, 'GtkGui'))
self.plugin.save_config()
def on_log_in_extern_checkbutton_toggled(self, widget):
if widget.get_active():
@ -450,6 +493,7 @@ class Preferences_window:
else:
self.config_logger['lognotsep'] = 0
self.plugin.send('CONFIG', None, ('Logger', self.config_logger, 'GtkGui'))
self.plugin.save_config()
def on_do_not_send_os_info_checkbutton_toggled(self, widget):
if widget.get_active():
@ -457,6 +501,7 @@ class Preferences_window:
self.plugin.config['do_not_send_os_info'] = 1
else:
self.plugin.config['do_not_send_os_info'] = 0
self.plugin.save_config()
def fill_msg_treeview(self):
@ -590,15 +635,15 @@ class Preferences_window:
self.auto_xa_checkbutton = self.xml.get_widget('auto_xa_checkbutton')
self.auto_xa_time_spinbutton = self.xml.get_widget \
('auto_xa_time_spinbutton')
self.tray_icon_checkbutton = self.xml.get_widget('tray_icon_checkbutton')
self.trayicon_checkbutton = self.xml.get_widget('trayicon_checkbutton')
self.notebook = self.xml.get_widget('preferences_notebook')
#trayicon
if self.plugin.systray_capabilities:
st = self.plugin.config['trayicon']
self.tray_icon_checkbutton.set_active(st)
self.trayicon_checkbutton.set_active(st)
else:
self.tray_icon_checkbutton.set_sensitive(False)
self.trayicon_checkbutton.set_sensitive(False)
#Save position
st = self.plugin.config['saveposition']
@ -726,17 +771,19 @@ class Preferences_window:
self.xml.get_widget('ignore_events_from_unknown_contacts_checkbutton').\
set_active(self.plugin.config['ignore_unknown_contacts'])
if not self.plugin.config['sounds_on']:
self.xml.get_widget('sound_player_hbox').set_sensitive(False)
#sounds
if self.plugin.config['sounds_on']:
self.xml.get_widget('play_sounds_checkbutton').set_active(True)
else:
self.xml.get_widget('soundplayer_hbox').set_sensitive(False)
self.xml.get_widget('sounds_scrolledwindow').set_sensitive(False)
self.xml.get_widget('browse_sounds_hbox').set_sensitive(False)
#FIXME:
#sound player
self.xml.get_widget('soundplayer_entry').set_text(\
self.plugin.config['soundplayer'])
#sounds
#sounds treeview
self.sound_tree = self.xml.get_widget('sounds_treeview')
model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, \
gobject.TYPE_STRING)
@ -762,12 +809,6 @@ class Preferences_window:
col.pack_start(renderer)
col.set_attributes(renderer, text=2)
self.fill_sound_treeview()
if not os.name == 'posix':
self.xml.get_widget('soundplayer_entry').set_sensitive(False)
self.sound_tree.set_sensitive(False)
self.xml.get_widget('sounds_entry').set_sensitive(False)
self.xml.get_widget('sounds_button').set_sensitive(False)
#Autoaway
st = self.plugin.config['autoaway']
@ -857,13 +898,18 @@ class Account_modification_window:
def on_close_button_clicked(self, widget):
"""When Close button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def on_checkbutton_toggled(self, widget, widgets):
"""set or unset sensitivity of widgets when widget is toggled"""
for w in widgets:
w.set_sensitive(widget.get_active())
def on_use_proxy_checkbutton_toggled(self, widget):
proxyhost_entry = self.xml.get_widget('proxyhost_entry')
proxyport_entry = self.xml.get_widget('proxyport_entry')
self.on_checkbutton_toggled(widget, [proxyhost_entry, proxyport_entry])
def init_account(self, infos):
"""Initialize window with defaults values"""
if infos.has_key('accname'):
@ -882,14 +928,25 @@ class Account_modification_window:
self.xml.get_widget('resource_entry').set_text(infos['resource'])
if infos.has_key('priority'):
self.xml.get_widget('priority_spinbutton').set_value(infos['priority'])
use_proxy = False
if infos.has_key('use_proxy'):
if infos['use_proxy'] != 0:
use_proxy = True
self.xml.get_widget('use_proxy_checkbutton').\
set_active(infos['use_proxy'])
self.xml.get_widget('proxyhost_entry').set_sensitive(use_proxy)
self.xml.get_widget('proxyport_entry').set_sensitive(use_proxy)
if infos.has_key('proxyhost'):
self.xml.get_widget('proxyhost_entry').set_text(infos['proxyhost'])
if infos.has_key('proxyport'):
self.xml.get_widget('proxyport_entry').set_text(str(\
infos['proxyport']))
gpg_key_label = self.xml.get_widget('gpg_key_label')
if not self.plugin.config.has_key('usegpg'):
gpg_key_label.set_text('GPG is not usable on this computer')
@ -921,7 +978,7 @@ class Account_modification_window:
self.xml.get_widget('log_history_checkbutton').set_active(0)
def on_save_button_clicked(self, widget):
"""When save button is clicked : Save informations in config file"""
"""When save button is clicked: Save information in config file"""
save_password = 0
if self.xml.get_widget('save_password_checkbutton').get_active():
save_password = 1
@ -977,8 +1034,12 @@ class Account_modification_window:
except ValueError:
Error_dialog(_('Proxy Port must be a port number'))
return
else:
Error_dialog(_('You must enter a proxy port to use proxy'))
return
if proxyhost == '':
Error_dialog(_('You must enter a proxy host to use proxy'))
return
(login, hostname) = jid.split('@')
key_name = self.xml.get_widget('gpg_name_label').get_text()
@ -1045,7 +1106,7 @@ class Account_modification_window:
self.plugin.windows['accounts'].init_accounts()
#refresh roster
self.plugin.roster.draw_roster()
widget.get_toplevel().destroy()
self.window.destroy()
return
#if it's a new account
if name in self.plugin.accounts.keys():
@ -1082,7 +1143,7 @@ class Account_modification_window:
self.plugin.windows['accounts'].init_accounts()
#refresh roster
self.plugin.roster.draw_roster()
widget.get_toplevel().destroy()
self.window.destroy()
def on_change_password_button_clicked(self, widget):
dialog = Change_password_dialog(self.plugin, self.account)
@ -1213,6 +1274,7 @@ class Account_modification_window:
self.xml.get_widget('gpg_password_entry').set_sensitive(False)
self.xml.get_widget('password_entry').set_sensitive(False)
self.xml.get_widget('log_history_checkbutton').set_active(1)
#default is checked
self.xml.get_widget('sync_with_global_status_checkbutton').set_active(1)
self.xml.signal_autoconnect(self)
@ -1230,7 +1292,7 @@ class Accounts_window:
del self.plugin.windows['accounts']
def on_close_button_clicked(self, widget):
widget.get_toplevel().destroy()
self.window.destroy()
def init_accounts(self):
"""initialize listStore with existing accounts"""
@ -1325,7 +1387,7 @@ class Service_registration_window:
Window that appears when we want to subscribe to a service"""
def on_cancel_button_clicked(self, widget):
"""When Cancel button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def draw_table(self):
"""Draw the table in the window"""
@ -1355,7 +1417,7 @@ class Service_registration_window:
self.plugin.roster.contacts[self.account][self.service] = [user1]
self.plugin.roster.add_user_to_roster(self.service, self.account)
self.plugin.send('REG_AGENT', self.account, self.service)
widget.get_toplevel().destroy()
self.window.destroy()
def __init__(self, service, infos, plugin, account):
self.xml = gtk.glade.XML(GTKGUI_GLADE, 'service_registration_window', APP)
@ -1421,6 +1483,7 @@ class Add_remove_emoticons_window:
iter = model.iter_next(iter)
self.plugin.config['emoticons'] = '\t'.join(emots)
self.plugin.init_regexp()
self.plugin.save_config()
def on_emoticons_treemodel_row_changed(self, model, path, iter):
if model[path][1] != None and len(model[path][1]) != 0:
@ -1431,7 +1494,8 @@ class Add_remove_emoticons_window:
emots.append(model.get_value(iter, 1))
iter = model.iter_next(iter)
self.plugin.config['emoticons'] = '\t'.join(emots)
self.plugin.init_regexp()
self.plugin.init_regexp()
self.plugin.save_config()
def image_is_ok(self, image):
if not os.path.exists(image):
@ -1563,7 +1627,7 @@ class Service_discovery_window:
def on_close_button_clicked(self, widget):
"""When Close button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def browse(self, jid):
"""Send a request to the core to know the available services"""
@ -1733,7 +1797,7 @@ class Service_discovery_window:
return
service = model.get_value(iter, 1)
self.plugin.send('REG_AGENT_INFO', self.account, service)
widget.get_toplevel().destroy()
self.window.destroy()
def on_services_treeview_cursor_changed(self, widget):
"""When we select a row :
@ -1765,6 +1829,7 @@ class Service_discovery_window:
' '.join(self.latest_addresses)
self.services_treeview.get_model().clear()
self.browse(server_address)
self.plugin.save_config()
def __init__(self, plugin, account):
if plugin.connected[account] < 2:

View File

@ -31,7 +31,7 @@ import version
GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
class vcard_information_window:
class Vcard_information_window:
"""Class for user's information window"""
def on_user_information_window_destroy(self, widget=None):
"""close window"""
@ -39,12 +39,12 @@ class vcard_information_window:
def on_vcard_information_window_key_press_event(self, widget, event):
if event.keyval == gtk.keysyms.Escape: # ESCAPE
widget.destroy()
self.window.destroy()
def on_close_button_clicked(self, widget):
"""Save user's informations and update the roster on the Jabber server"""
if self.vcard:
widget.get_toplevel().destroy()
self.window.destroy()
return
#update user.name if it's not ""
name_entry = self.xml.get_widget('nickname_entry')
@ -73,7 +73,7 @@ class vcard_information_window:
self.plugin.accounts[self.account] = account_info
self.plugin.send('CONFIG', None, ('accounts', self.plugin.accounts, \
'Gtkgui'))
widget.get_toplevel().destroy()
self.window.destroy()
def set_value(self, entry_name, value):
try:
@ -115,13 +115,13 @@ class vcard_information_window:
resources = self.user.resource + ' (' + str(self.user.priority) + ')'
if not self.user.status:
self.user.status = ''
stats = self.user.show + ' : ' + self.user.status
stats = self.user.show + ': ' + self.user.status
for u in self.plugin.roster.contacts[self.account][self.user.jid]:
if u.resource != self.user.resource:
resources += '\n' + u.resource + ' (' + str(u.priority) + ')'
if not u.status:
u.status = ''
stats += '\n' + u.show + ' : ' + u.status
stats += '\n' + u.show + ': ' + u.status
self.xml.get_widget('resource_label').set_text(resources)
self.xml.get_widget('status_label').set_text(stats)
self.plugin.send('ASK_VCARD', self.account, self.user.jid)
@ -490,7 +490,7 @@ class Add_new_contact_window:
def on_cancel_button_clicked(self, widget):
"""When Cancel button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def on_subscribe_button_clicked(self, widget):
"""When Subscribe button is clicked"""
@ -510,7 +510,7 @@ class Add_new_contact_window:
nickname)
if self.xml.get_widget('auto_authorize_checkbutton').get_active():
self.plugin.send('AUTH', self.account, jid)
widget.get_toplevel().destroy()
self.window.destroy()
def fill_jid(self):
protocol_combobox = self.xml.get_widget('protocol_combobox')
@ -633,6 +633,7 @@ class Error_dialog:
class subscription_request_window:
def __init__(self, plugin, jid, text, account):
xml = gtk.glade.XML(GTKGUI_GLADE, 'subscription_request_window', APP)
self.window = xml.get_widget('subscription_request_window')
self.plugin = plugin
self.jid = jid
self.account = account
@ -646,19 +647,19 @@ class subscription_request_window:
window that appears when a user wants to add us to his/her roster"""
def on_close_button_clicked(self, widget):
"""When Close button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def on_authorize_button_clicked(self, widget):
"""Accept the request"""
self.plugin.send('AUTH', self.account, self.jid)
widget.get_toplevel().destroy()
self.window.destroy()
if not self.plugin.roster.contacts[self.account].has_key(self.jid):
Add_new_contact_window(self.plugin, self.account, self.jid)
def on_deny_button_clicked(self, widget):
"""refuse the request"""
self.plugin.send('DENY', self.account, self.jid)
widget.get_toplevel().destroy()
self.window.destroy()
class Join_groupchat_window:
def __init__(self, plugin, account, server='', room = ''):
@ -705,7 +706,7 @@ class Join_groupchat_window:
def on_cancel_button_clicked(self, widget):
"""When Cancel button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def on_join_button_clicked(self, widget):
"""When Join button is clicked"""
@ -725,7 +726,7 @@ class Join_groupchat_window:
self.plugin.send('GC_JOIN', self.account, (nickname, room, server, \
password))
widget.get_toplevel().destroy()
self.window.destroy()
class New_message_dialog:
def __init__(self, plugin, account):
@ -755,7 +756,7 @@ class New_message_dialog:
def on_cancel_button_clicked(self, widget):
"""When Cancel button is clicked"""
widget.get_toplevel().destroy()
self.window.destroy()
def on_chat_button_clicked(self, widget):
"""When Chat button is clicked"""
@ -763,6 +764,7 @@ class New_message_dialog:
if jid.find('@') == -1: # if no @ was given
Error_dialog(_('User ID is not valid'))
return
self.window.destroy()
# use User class, new_chat expects it that way
# is it in the roster?
if self.plugin.roster.contacts[self.account].has_key(jid):
@ -778,8 +780,6 @@ class New_message_dialog:
self.plugin.windows[self.account]['chats'][jid].active_tab(jid)
self.plugin.windows[self.account]['chats'][jid].window.present()
#FIXME: PROBLEM WITH FOCUS
widget.get_toplevel().destroy()
class Change_password_dialog:
def __init__(self, plugin, account):
@ -817,8 +817,10 @@ class Change_password_dialog:
return message
class Popup_window:
def __init__(self, plugin, event_type, event_desc):
def __init__(self, plugin, event_type, jid, account):
self.plugin = plugin
self.account = account
self.jid = jid
xml = gtk.glade.XML(GTKGUI_GLADE, 'popup_window', APP)
self.window = xml.get_widget('popup_window')
@ -828,7 +830,13 @@ class Popup_window:
eventbox = xml.get_widget('eventbox')
event_type_label.set_markup('<b>'+event_type+'</b>')
event_description_label.set_text(event_desc)
if self.jid in self.plugin.roster.contacts[account]:
txt = self.plugin.roster.contacts[account][self.jid][0].name
else:
txt = self.jid
event_description_label.set_text(txt)
# set colors [ http://www.w3schools.com/html/html_colornames.asp ]
self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('black'))
@ -841,28 +849,27 @@ class Popup_window:
elif event_type == 'New Message':
close_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('dodgerblue'))
eventbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('dodgerblue'))
txt = 'From ' + txt
# position the window to bottom-right of screen
window_width, window_height = self.window.get_size()
self.plugin.roster.popups_height += window_height
window_width, self.window_height = self.window.get_size()
self.plugin.roster.popups_height += self.window_height
self.window.move(gtk.gdk.screen_width() - window_width, \
gtk.gdk.screen_height() - self.plugin.roster.popups_height)
xml.signal_autoconnect(self)
close_button.connect('clicked', self.on_close_button_clicked, window_height)
self.window.show_all()
gobject.timeout_add(5000, self.on_timeout)
gobject.timeout_add(5000, self.on_timeout, window_height)
def on_close_button_clicked(self, widget):
self.adjust_height_and_move_popup_windows()
def on_close_button_clicked(self, widget, window_height):
self.adjust_height_and_move_popup_windows(window_height)
def on_timeout(self, window_height):
self.adjust_height_and_move_popup_windows(window_height)
def on_timeout(self):
self.adjust_height_and_move_popup_windows()
def adjust_height_and_move_popup_windows(self, window_height):
def adjust_height_and_move_popup_windows(self):
#remove
self.plugin.roster.popups_height -= window_height
self.plugin.roster.popups_height -= self.window_height
self.window.destroy()
if len(self.plugin.roster.popup_windows) > 0:
@ -878,4 +885,17 @@ class Popup_window:
gtk.gdk.screen_height() - self.plugin.roster.popups_height)
def on_popup_window_button_press_event(self, widget, event):
print 'IN YOUR DREAMS ONLY..'
# use User class, new_chat expects it that way
# is it in the roster?
if self.plugin.roster.contacts[self.account].has_key(self.jid):
user = self.plugin.roster.contacts[self.account][self.jid][0]
else:
user = gtkgui.User(self.jid, self.jid, ['not in the roster'], \
'not in the roster', 'not in the roster', 'none', None, '', 0, '')
self.plugin.roster.contacts[self.account][self.jid] = [user]
self.plugin.roster.add_user_to_roster(user.self.jid, self.account)
self.plugin.roster.new_chat(user, self.account)
self.plugin.windows[self.account]['chats'][self.jid].active_tab(self.jid)
self.plugin.windows[self.account]['chats'][self.jid].window.present()
self.adjust_height_and_move_popup_windows()

View File

@ -45,6 +45,7 @@ class Groupchat_window(Chat):
self.subjects = {}
self.new_group(room_jid, nick)
self.show_title()
print "self.xml.get_widget('message_textview') is", self.xml.get_widget('message_textview'), "!!"
self.xml.signal_connect('on_groupchat_window_destroy', \
self.on_groupchat_window_destroy)
self.xml.signal_connect('on_groupchat_window_delete_event', \
@ -240,9 +241,12 @@ class Groupchat_window(Chat):
and printed in the conversation. Tab does autocompete in nickames"""
jid = self.get_active_jid()
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
if event.keyval == gtk.keysyms.Tab and \
(event.state & gtk.gdk.CONTROL_MASK): # CTRL + TAB
self.notebook.emit('key_press_event', event)
if event.hardware_keycode == 23: # TAB
if (event.state & gtk.gdk.CONTROL_MASK) and \
(event.state & gtk.gdk.SHIFT_MASK): # CTRL + SHIFT + TAB
self.notebook.emit('key_press_event', event)
elif event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB
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)
@ -256,7 +260,7 @@ class Groupchat_window(Chat):
elif event.keyval == gtk.keysyms.Return or \
event.keyval == gtk.keysyms.KP_Enter: # ENTER
if (event.state & gtk.gdk.SHIFT_MASK):
return 0
return False
message_buffer = widget.get_buffer()
start_iter = message_buffer.get_start_iter()
end_iter = message_buffer.get_end_iter()
@ -266,7 +270,7 @@ class Groupchat_window(Chat):
self.plugin.send('GC_MSG', self.account, (room_jid, txt))
message_buffer.set_text('', -1)
widget.grab_focus()
return 1
return True
elif event.keyval == gtk.keysyms.Tab: # TAB
room_jid = self.get_active_jid()
list_nick = self.get_nick_list(room_jid)
@ -276,18 +280,18 @@ class Groupchat_window(Chat):
end_iter = message_buffer.get_iter_at_mark(cursor_position)
text = message_buffer.get_text(start_iter, end_iter, 0)
if not text:
return 0
splited_text = text.split()
begin = splited_text[-1]
return False
splitted_text = text.split()
begin = splitted_text[-1] # begining of the latest word we typed
for nick in list_nick:
if nick.find(begin) == 0:
if len(splited_text) == 1:
if nick.find(begin) == 0: # the word is the begining of a nick
if len(splitted_text) == 1: # This is the 1st word of the line ?
add = ': '
else:
add = ' '
message_buffer.insert_at_cursor(nick[len(begin):] + add)
return 1
return 0
return True
return False
def print_conversation(self, text, room_jid, contact = '', tim = None):
"""Print a line in the conversation :
@ -371,8 +375,10 @@ class Groupchat_window(Chat):
"""Call vcard_information_window class to display user's information"""
if not self.plugin.windows[self.account]['infos'].has_key(jid):
self.plugin.windows[self.account]['infos'][jid] = \
vcard_information_window(jid, self.plugin, self.account, True)
Vcard_information_window(jid, self.plugin, self.account, True)
self.plugin.send('ASK_VCARD', self.account, jid)
#FIXME: maybe use roster.on_info above?
#FIXME: we need the resource but it's not saved
#self.plugin.send('ASK_OS_INFO', self.account, jid, resource)

File diff suppressed because it is too large Load Diff

View File

@ -64,6 +64,11 @@ import Queue
import sre
import common.sleepy
try:
import winsound # windows-only built-in module for playing wav
except ImportError:
pass
class CellRendererImage(gtk.GenericCellRenderer):
__gproperties__ = {
@ -273,24 +278,25 @@ class plugin:
def play_timeout(self, pid):
pidp, r = os.waitpid(pid, os.WNOHANG)
return 0
def play_sound(self, event):
if os.name != 'posix':
if not self.config['sounds_on']:
return
if self.config['soundplayer'] == '':
path_to_soundfile = self.config[event + '_file']
if not os.path.exists(path_to_soundfile):
return
if not self.config[event]:
return
file = self.config[event + '_file']
if not os.path.exists(file):
return
argv = self.config['soundplayer'].split()
argv.append(file)
pid = os.spawnvp(os.P_NOWAIT, argv[0], argv)
pidp, r = os.waitpid(pid, os.WNOHANG)
if pidp == 0:
gobject.timeout_add(10000, self.play_timeout, pid)
if os.name == 'nt':
winsound.PlaySound(path_to_soundfile, \
winsound.SND_FILENAME|winsound.SND_ASYNC)
elif os.name == 'posix':
if self.config['soundplayer'] == '':
return
argv = self.config['soundplayer'].split()
argv.append(path_to_soundfile)
pid = os.spawnvp(os.P_NOWAIT, argv[0], argv)
pidp, r = os.waitpid(pid, os.WNOHANG)
if pidp == 0:
gobject.timeout_add(10000, self.play_timeout, pid)
def send(self, event, account, data):
self.queueOUT.put((event, account, data))
@ -334,6 +340,7 @@ class plugin:
# role, affiliation, real_jid, reason, actor, statusCode))
statuss = ['offline', 'error', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible']
old_show = 0
new_show = statuss.index(array[1])
jid = array[0].split('/')[0]
keyID = array[5]
resource = array[3]
@ -370,18 +377,23 @@ class plugin:
user1.priority, user1.keyID)
luser.append(user1)
user1.resource = resource
if old_show == 0 and statuss.index(array[1]) > 1:
if not user1.jid in self.roster.newly_added[account]:
self.roster.newly_added[account].append(user1.jid)
if user1.jid in self.roster.to_be_removed[account]:
self.roster.to_be_removed[account].remove(user1.jid)
gobject.timeout_add(5000, self.roster.remove_newly_added, user1.jid, account)
if old_show > 1 and statuss.index(array[1]) == 0 and self.connected[account] > 1:
if not user1.jid in self.roster.to_be_removed[account]:
self.roster.to_be_removed[account].append(user1.jid)
if user1.jid in self.roster.newly_added[account]:
self.roster.newly_added[account].remove(user1.jid)
gobject.timeout_add(5000, self.roster.really_remove_user, user1, account)
if user1.jid.find('@') > 0: # It's not an agent
if old_show == 0 and new_show > 1:
if not user1.jid in self.roster.newly_added[account]:
self.roster.newly_added[account].append(user1.jid)
if user1.jid in self.roster.to_be_removed[account]:
self.roster.to_be_removed[account].remove(user1.jid)
gobject.timeout_add(5000, self.roster.remove_newly_added, \
user1.jid, account)
if old_show > 1 and new_show == 0 and self.connected[account] > 1:
if not user1.jid in self.roster.to_be_removed[account]:
self.roster.to_be_removed[account].append(user1.jid)
if user1.jid in self.roster.newly_added[account]:
self.roster.newly_added[account].remove(user1.jid)
self.roster.redraw_jid(user1.jid, account)
if not self.queues[account].has_key(jid):
gobject.timeout_add(5000, self.roster.really_remove_user, \
user1, account)
user1.show = array[1]
user1.status = array[2]
user1.priority = priority
@ -395,21 +407,29 @@ class plugin:
#It isn't an agent
self.roster.chg_user_status(user1, array[1], array[2], account)
#play sound
if old_show < 2 and statuss.index(user1.show) > 1 and \
if old_show < 2 and new_show > 1 and \
self.config['sound_contact_connected']:
self.play_sound('sound_contact_connected')
if not self.windows[account]['chats'].has_key(jid) and \
not self.queues[account].has_key(jid) and \
not self.config['autopopup']:
instance = Popup_window(self, 'Contact Online', jid )
#FIXME:
#DOES NOT ALWAYS WORK WHY?
#I control nkour@lagaule in jabber
# have nkour@lagaul in nkour@jabber.org
#go online from psi in lagaule
#gajim doesn't give a shit
# WHY? same with offline
# new message works
instance = Popup_window(self, 'Contact Online', jid, account)
self.roster.popup_windows.append(instance)
elif old_show > 1 and statuss.index(user1.show) < 2 and \
elif old_show > 1 and new_show < 2 and \
self.config['sound_contact_disconnected']:
self.play_sound('sound_contact_disconnected')
if not self.windows[account]['chats'].has_key(jid) and \
not self.queues[account].has_key(jid) and \
not self.config['autopopup']:
instance = Popup_window(self, 'Contact Offline', jid )
instance = Popup_window(self, 'Contact Offline', jid, account)
self.roster.popup_windows.append(instance)
elif self.windows[account]['gc'].has_key(ji):
@ -432,7 +452,7 @@ class plugin:
not self.queues[account].has_key(jid):
first = True
if not self.config['autopopup']:
instance = Popup_window(self, 'New Message', 'From '+ jid )
instance = Popup_window(self, 'New Message', jid, account)
self.roster.popup_windows.append(instance)
self.roster.on_message(jid, array[1], array[2], account)
if self.config['sound_first_message_received'] and first:
@ -450,7 +470,8 @@ class plugin:
def handle_event_msgsent(self, account, array):
#('MSG', account, (jid, msg, keyID))
self.play_sound('sound_message_sent')
if self.config['sound_message_sent']:
self.play_sound('sound_message_sent')
def handle_event_subscribe(self, account, array):
#('SUBSCRIBE', account, (jid, text))
@ -536,7 +557,12 @@ class plugin:
self.roster.draw_roster()
def handle_event_quit(self, p1, p2):
self.roster.on_quit()
self.roster.on_quit() # SUCH FUNCTION DOES NOT EXIST!!
def save_config(self):
hidden_lines = self.config['hiddenlines'].split('\t')
self.config['hiddenlines'] = '\t'.join(hidden_lines)
self.send('CONFIG', None, ('GtkGui', self.config, 'GtkGui'))
def handle_event_myvcard(self, account, array):
nick = ''
@ -927,7 +953,7 @@ class plugin:
#2:autoaway and use sleeper
#3:autoxa and use sleeper
self.send('ASK_ROSTER', a, self.queueIN)
#in pygtk2.4 FIXME: (nk) WHAT DO YOU MEAN?
iconset = self.config['iconset']
if not iconset:
iconset = 'sun'

View File

@ -204,7 +204,9 @@ class Roster_window:
prio = u.priority
user = u
for iter in iters:
if self.plugin.queues[account].has_key(jid):
if jid.find("@") <= 0: # It's an agent
img = self.pixbufs[user.show]
elif self.plugin.queues[account].has_key(jid):
img = self.pixbufs['message']
else:
if user.sub != 'both':
@ -392,9 +394,11 @@ class Roster_window:
def on_info(self, widget, user, account):
"""Call vcard_information_window class to display user's information"""
if not self.plugin.windows[account]['infos'].has_key(user.jid):
if self.plugin.windows[account]['infos'].has_key(user.jid):
self.plugin.windows[account]['infos'][user.jid].window.present()
else:
self.plugin.windows[account]['infos'][user.jid] = \
vcard_information_window(user, self.plugin, account)
Vcard_information_window(user, self.plugin, account)
def on_agent_logging(self, widget, jid, state, account):
"""When an agent is requested to log in or off"""
@ -921,8 +925,6 @@ class Roster_window:
def on_about_menuitem_activate(self, widget):
About_dialog()
#inst = Popup_window(self.plugin, 'Fake Message', 'nkour@')
#self.popup_windows.append( inst )
def on_accounts_menuitem_activate(self, widget):
if self.plugin.windows.has_key('accounts'):
@ -969,8 +971,7 @@ class Roster_window:
self.plugin.config['width'], self.plugin.config['height'] = \
self.window.get_size()
self.plugin.config['hiddenlines'] = '\t'.join(self.hidden_lines)
self.plugin.send('CONFIG', None, ('GtkGui', self.plugin.config, 'GtkGui'))
self.plugin.save_config()
self.plugin.send('QUIT', None, ('gtkgui', 1))
print _("plugin gtkgui stopped")
self.close_all(self.plugin.windows)

View File

@ -150,14 +150,17 @@ class Tabbed_chat_window(Chat):
self.print_time_timeout, user.jid)
def on_message_textview_key_press_event(self, widget, event):
"""When a key is pressed :
"""When a key is pressed:
if enter is pressed without the shit key, message (if not empty) is sent
and printed in the conversation"""
jid = self.get_active_jid()
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
if event.keyval == gtk.keysyms.Tab and \
(event.state & gtk.gdk.CONTROL_MASK): # CTRL + TAB
self.notebook.emit('key_press_event', event)
if event.hardware_keycode == 23: # TAB
if (event.state & gtk.gdk.CONTROL_MASK) and \
(event.state & gtk.gdk.SHIFT_MASK): # CTRL + SHIFT + TAB
self.notebook.emit('key_press_event', event)
elif event.state & gtk.gdk.CONTROL_MASK: # CTRL + TAB
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)
@ -212,7 +215,7 @@ class Tabbed_chat_window(Chat):
if (user.show == 'offline' or user.show == 'error') and \
not showOffline:
if len(self.plugin.roster.contacts[self.account][jid]) == 1:
self.plugin.roster.remove_user(user, self.account)
self.plugin.roster.really_remove_user(user, self.account)
def print_conversation(self, text, jid, contact = '', tim = None):
"""Print a line in the conversation :