From 8f71d9f21955d30cd47fabdf0b95869603887cb9 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 23 Dec 2012 16:23:43 +0100 Subject: [PATCH 001/592] start porting Gajim to gobject introspection and GTK3 --- data/gui/account_creation_wizard_window.ui | 245 ++++++-- data/gui/message_window.ui | 1 - setup_win32.py | 2 +- src/adhoc_commands.py | 20 +- src/advanced_configuration_window.py | 20 +- src/atom_window.py | 18 +- src/cell_renderer_image.py | 73 ++- src/chat_control.py | 342 ++++++----- .../implementation/middleware.py | 4 +- src/command_system/tools.py | 12 +- src/common/config.py | 4 +- src/common/gajim.py | 2 + src/common/jingle_rtp.py | 6 +- src/common/jingle_transport.py | 1 + src/common/logger.py | 4 +- src/common/pep.py | 27 +- src/common/protocol/bytestream.py | 6 +- src/common/resolver.py | 22 +- src/common/zeroconf/connection_zeroconf.py | 4 +- src/config.py | 304 +++++---- src/conversation_textview.py | 189 +++--- src/dataforms_widget.py | 102 ++-- src/dialogs.py | 479 +++++++-------- src/disco.py | 217 +++---- src/features_window.py | 20 +- src/filetransfers_window.py | 147 ++--- src/gajim.py | 103 ++-- src/gajim_themes_window.py | 34 +- src/groupchat_control.py | 153 ++--- src/groups.py | 2 +- src/gtkexcepthook.py | 28 +- src/gtkgui_helpers.py | 146 ++--- src/gui_interface.py | 98 +-- src/gui_menu_builder.py | 24 +- src/history_manager.py | 86 +-- src/history_window.py | 34 +- src/htmltextview.py | 182 +++--- src/ipython_view.py | 55 +- src/message_control.py | 4 +- src/message_textview.py | 147 ++--- src/message_window.py | 160 ++--- src/music_track_listener.py | 8 +- src/negotiation.py | 2 +- src/notify.py | 20 +- src/plugins/gui.py | 59 +- src/profile_window.py | 45 +- src/remote_control.py | 22 +- src/roster_window.py | 578 +++++++++--------- src/search_window.py | 36 +- src/statusicon.py | 67 +- src/tooltips.py | 129 ++-- src/vcard.py | 44 +- 52 files changed, 2365 insertions(+), 2172 deletions(-) diff --git a/data/gui/account_creation_wizard_window.ui b/data/gui/account_creation_wizard_window.ui index 41b6a87a9..ea32887cc 100644 --- a/data/gui/account_creation_wizard_window.ui +++ b/data/gui/account_creation_wizard_window.ui @@ -1,31 +1,51 @@ - + - - + + + + + + + + + None + + + + + server_liststore + 0 + + + server_liststore + 0 + + False 12 Gajim: Account Creation Wizard False dialog - + True - vertical + False 6 True - False + False False True - vertical + False 12 True + False 0 You need to have an account in order to connect to the Jabber network. @@ -39,26 +59,31 @@ to the Jabber network. True + False 0 none True + False 5 12 True + False 6 - vertical 6 I already have an account I want to _use + False True True False + False True + 0 True @@ -70,10 +95,13 @@ to the Jabber network. I want to _register for a new account + False True True False + False True + 0 True use_existing_account_radiobutton @@ -90,6 +118,7 @@ to the Jabber network. True + False <b>Please choose one of the options below:</b> True @@ -106,6 +135,7 @@ to the Jabber network. True + False False @@ -114,12 +144,13 @@ to the Jabber network. True + False 6 - vertical 12 True + False 0 <b>Please fill in the data for your existing account</b> True @@ -133,25 +164,30 @@ to the Jabber network. True + False 3 4 12 6 + + + True True - + 1 2 - + True + False 0 _Password: True @@ -161,21 +197,24 @@ to the Jabber network. 2 3 GTK_FILL - + Save pass_word + False True True False If checked, Gajim will remember the password for this account + False True False + 0.5 True True - + 2 @@ -183,7 +222,7 @@ to the Jabber network. 2 3 GTK_FILL - + @@ -198,12 +237,13 @@ to the Jabber network. 2 2 3 - + True + False 0 _Jabber ID: True @@ -211,41 +251,34 @@ to the Jabber network. GTK_FILL - + True + False 0 @ 2 3 - - - - - - True - - - 3 - 4 - GTK_FILL - GTK_FILL + Anon_ymous authentication + False True True False + False True + 0.5 True - + 1 @@ -255,11 +288,29 @@ to the Jabber network. - + + True + False + True + 0 + 1 + + + True + + server_entrycompletion + + + + + 3 + 4 + False + True 1 @@ -271,6 +322,7 @@ to the Jabber network. True + False 1 @@ -280,12 +332,13 @@ to the Jabber network. True + False 6 - vertical 12 True + False 0 <b>Please select a server</b> True @@ -299,10 +352,12 @@ to the Jabber network. True + False 6 True + False 0 _Server: True @@ -314,10 +369,22 @@ to the Jabber network. - + True + False + True + 0 + 1 + + + True + server_entrycompletion1 + + + True + True 1 @@ -331,14 +398,18 @@ to the Jabber network. Anon_ymous authentication + False True True False + False True + 0.5 True False + True 2 @@ -349,6 +420,7 @@ to the Jabber network. True + False 5 3 3 @@ -357,18 +429,20 @@ to the Jabber network. True + False 0 Prox_y: True GTK_FILL - + True + False liststore1 @@ -386,44 +460,51 @@ to the Jabber network. Manage... + False True True False + False True - + 2 3 - - + + Use custom hostname/port + False True True False + False True + 0.5 True - + 3 1 2 - + True False + False 6 True + False 0 _Hostname: True @@ -441,12 +522,15 @@ to the Jabber network. True + True + True 1 True + False 0 _Port: True @@ -467,6 +551,7 @@ to the Jabber network. False + True 3 @@ -484,12 +569,15 @@ to the Jabber network. True + False _Advanced True + True + True 3 @@ -501,6 +589,7 @@ to the Jabber network. True + False 2 @@ -510,34 +599,41 @@ to the Jabber network. True - vertical + False True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-dialog-warning 5 False + True 0 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + True 1 + True False 0 @@ -547,13 +643,17 @@ to the Jabber network. Add this certificate to the list of trusted certificates. SHA1 fingerprint of the certificate: + False True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + 0.5 True + True False 1 @@ -566,6 +666,7 @@ SHA1 fingerprint of the certificate: True + False 3 @@ -575,7 +676,7 @@ SHA1 fingerprint of the certificate: True - vertical + False @@ -587,6 +688,7 @@ SHA1 fingerprint of the certificate: True + False 4 @@ -596,10 +698,11 @@ SHA1 fingerprint of the certificate: True - vertical + False True + False <b>Connecting to server</b> Please wait... @@ -607,6 +710,7 @@ Please wait... center + True False 0 @@ -614,6 +718,7 @@ Please wait... True + False 0.10000000149 @@ -630,6 +735,7 @@ Please wait... True + False 5 @@ -639,14 +745,16 @@ Please wait... True - vertical + False True + False 12 True + False gtk-missing-image @@ -658,26 +766,34 @@ Please wait... True + False 0.10000000149011612 True True + True + True 1 + True + True 0 Connect when I press Finish + False True True False + False True + 0.5 True True @@ -690,10 +806,13 @@ Please wait... Set my profile when I connect + False True True False + False True + 0.5 True True @@ -711,6 +830,7 @@ Please wait... True + False 6 @@ -719,23 +839,28 @@ Please wait... + True + True 0 True + False 12 end gtk-cancel + False True True True False + False True - + False @@ -746,13 +871,15 @@ Please wait... gtk-go-back + False True False True True False + False True - + False @@ -763,13 +890,15 @@ Please wait... gtk-go-forward + False True True True True False + False True - + False @@ -779,23 +908,28 @@ Please wait... + False True True False True - + False + True + False 0 0 True + False 2 True + False gtk-preferences @@ -807,6 +941,7 @@ Please wait... True + False _Advanced True @@ -829,23 +964,28 @@ Please wait... + False True True False True - + False + True + False 0 0 True + False 2 True + False gtk-apply @@ -857,6 +997,7 @@ Please wait... True + False _Finish True @@ -880,21 +1021,17 @@ Please wait... False + True 1 - + - + - - - None - - diff --git a/data/gui/message_window.ui b/data/gui/message_window.ui index b801f8290..5e97df69e 100644 --- a/data/gui/message_window.ui +++ b/data/gui/message_window.ui @@ -13,7 +13,6 @@ True True - 0 diff --git a/setup_win32.py b/setup_win32.py index 00c53e831..04d05f1db 100644 --- a/setup_win32.py +++ b/setup_win32.py @@ -31,7 +31,7 @@ if 'gtk' in os.listdir('.'): options = { 'build_exe': { - 'includes': ['gtk.keysyms', 'dumbdbm', 'dbhash', 'bsddb', 'new', + 'includes': ['Gdk.KEY_, 'dumbdbm', 'dbhash', 'bsddb', 'new', 'goocanvas', 'Crypto.PublicKey.DSA', 'Crypto.Hash.HMAC', 'numbers'], 'base': 'Win32GUI', diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index f2edcd3ef..8fd2559aa 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -25,8 +25,8 @@ # FIXME: think if we need caching command list. it may be wrong if there will # be entities that often change the list, it may be slow to fetch it every time -import gobject -import gtk +from gi.repository import GObject +from gi.repository import Gtk import nbxmpp from common import gajim @@ -91,7 +91,7 @@ class CommandWindow: self.data_form_widget.destroy() self.data_form_widget = dataforms_widget.DataFormWidget() self.data_form_widget.show() - self.sending_form_stage_vbox.pack_start(self.data_form_widget) + self.sending_form_stage_vbox.pack_start(self.data_form_widget, True, True, 0) if self.commandnode: # Execute command @@ -236,13 +236,13 @@ class CommandWindow: # build the commands list radiobuttons first_radio = None for (commandnode, commandname) in self.commandlist: - radio = gtk.RadioButton(first_radio, label=commandname) + radio = Gtk.RadioButton(first_radio, label=commandname) radio.connect("toggled", self.on_command_radiobutton_toggled, commandnode) if not first_radio: first_radio = radio self.commandnode = commandnode - self.command_list_vbox.pack_start(radio, expand=False) + self.command_list_vbox.pack_start(radio, False, True, 0) self.command_list_vbox.show_all() self.stage_finish = self.stage2_finish @@ -321,8 +321,8 @@ class CommandWindow: dialog.destroy() cb() - dialog = dialogs.HigDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT \ - | gtk.DIALOG_MODAL, gtk.BUTTONS_YES_NO, _('Cancel confirmation'), + dialog = dialogs.HigDialog(self.window, Gtk.DialogFlags.DESTROY_WITH_PARENT \ + | Gtk.DialogFlags.MODAL, Gtk.ButtonsType.YES_NO, _('Cancel confirmation'), _('You are in process of executing command. Do you really want to ' 'cancel it?'), on_response_yes=on_yes) dialog.popup() @@ -550,21 +550,21 @@ class CommandWindow: progressbar.pulse() method """ assert not self.pulse_id - assert isinstance(progressbar, gtk.ProgressBar) + assert isinstance(progressbar, Gtk.ProgressBar) def callback(): progressbar.pulse() return True # important to keep callback be called back! # 12 times per second (80 miliseconds) - self.pulse_id = gobject.timeout_add(80, callback) + self.pulse_id = GObject.timeout_add(80, callback) def remove_pulsing(self): """ Stop pulsing, useful when especially when removing widget """ if self.pulse_id: - gobject.source_remove(self.pulse_id) + GObject.source_remove(self.pulse_id) self.pulse_id = None # handling xml stanzas diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index c76f3afa5..3df0ebf4b 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -23,9 +23,9 @@ ## along with Gajim. If not, see . ## -import gtk +from gi.repository import Gtk import gtkgui_helpers -import gobject +from gi.repository import GObject from common import gajim @@ -50,12 +50,12 @@ def rate_limit(rate): timeout = [None] def f(*args, **kwargs): if timeout[0] is not None: - gobject.source_remove(timeout[0]) + GObject.source_remove(timeout[0]) timeout[0] = None def timeout_func(): func(*args, **kwargs) timeout[0] = None - timeout[0] = gobject.timeout_add(int(1000.0 / rate), timeout_func) + timeout[0] = GObject.timeout_add(int(1000.0 / rate), timeout_func) return f return decorator @@ -76,7 +76,7 @@ class AdvancedConfigurationWindow(object): def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('advanced_configuration_window.ui') self.window = self.xml.get_object('advanced_configuration_window') - self.window.set_transient_for( + self.set_transient_for( gajim.interface.instances['preferences'].window) self.entry = self.xml.get_object('advanced_entry') self.desc_label = self.xml.get_object('advanced_desc_label') @@ -98,18 +98,18 @@ class AdvancedConfigurationWindow(object): treeview = self.xml.get_object('advanced_treeview') self.treeview = treeview - self.model = gtk.TreeStore(str, str, str) + self.model = Gtk.TreeStore(str, str, str) self.fill_model() - self.model.set_sort_column_id(0, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.modelfilter = self.model.filter_new() self.modelfilter.set_visible_func(self.visible_func) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() col = treeview.insert_column_with_attributes(-1, _('Preference Name'), renderer_text, text = 0) col.set_resizable(True) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() renderer_text.connect('edited', self.on_config_edited) col = treeview.insert_column_with_attributes(-1, _('Value'), renderer_text, text = 1) @@ -118,7 +118,7 @@ class AdvancedConfigurationWindow(object): col.props.resizable = True col.set_max_width(250) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() treeview.insert_column_with_attributes(-1, _('Type'), renderer_text, text = 2) diff --git a/src/atom_window.py b/src/atom_window.py index 6c9f9ec52..f0cb83f76 100644 --- a/src/atom_window.py +++ b/src/atom_window.py @@ -22,8 +22,8 @@ ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject import gtkgui_helpers from common import helpers @@ -70,8 +70,8 @@ class AtomWindow: self.xml.connect_signals(self) self.window.show_all() - self.entry_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) - self.feed_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) + self.entry_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.feed_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) def displayNextEntry(self): """ @@ -85,23 +85,23 @@ class AtomWindow: if newentry.feed_link is not None: self.feed_title_label.set_markup( u'%s' % \ - gobject.markup_escape_text(newentry.feed_title)) + GObject.markup_escape_text(newentry.feed_title)) else: self.feed_title_label.set_markup( - gobject.markup_escape_text(newentry.feed_title)) + GObject.markup_escape_text(newentry.feed_title)) self.feed_tagline_label.set_markup( u'%s' % \ - gobject.markup_escape_text(newentry.feed_tagline)) + GObject.markup_escape_text(newentry.feed_tagline)) if newentry.title: if newentry.uri is not None: self.entry_title_label.set_markup( u'%s' % \ - gobject.markup_escape_text(newentry.title)) + GObject.markup_escape_text(newentry.title)) else: self.entry_title_label.set_markup( - gobject.markup_escape_text(newentry.title)) + GObject.markup_escape_text(newentry.title)) else: self.entry_title_label.set_markup('') diff --git a/src/cell_renderer_image.py b/src/cell_renderer_image.py index d2e6c4a8b..873c323e4 100644 --- a/src/cell_renderer_image.py +++ b/src/cell_renderer_image.py @@ -22,18 +22,19 @@ ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject -class CellRendererImage(gtk.GenericCellRenderer): +class CellRendererImage(Gtk.CellRendererPixbuf): __gproperties__ = { - 'image': (gobject.TYPE_OBJECT, 'Image', - 'Image', gobject.PARAM_READWRITE), + 'image': (GObject.TYPE_OBJECT, 'Image', + 'Image', GObject.PARAM_READWRITE), } def __init__(self, col_index, tv_index): - self.__gobject_init__() + super(CellRendererImage, self).__init__() self.image = None self.col_index = col_index self.tv_index = tv_index @@ -45,6 +46,14 @@ class CellRendererImage(gtk.GenericCellRenderer): def do_get_property(self, pspec): return getattr(self, pspec.name) + def do_activate(event, widget, path, bg_area, cell_area, flags): + """Renderers cannot be activated; always return True.""" + return True + + def do_editing_started(event, widget, path, fb_area, cell_area, flags): + """Renderers cannot be edited; always return None.""" + return None + def func(self, model, path, iter_, image_tree): image, tree = image_tree if model.get_value(iter_, self.tv_index) != image: @@ -57,7 +66,7 @@ class CellRendererImage(gtk.GenericCellRenderer): cell_area.width, cell_area.height) def animation_timeout(self, tree, image): - if image.get_storage_type() != gtk.IMAGE_ANIMATION: + if image.get_storage_type() != Gtk.ImageType.ANIMATION: return self.redraw = 0 iter_ = self.iters[image] @@ -66,58 +75,48 @@ class CellRendererImage(gtk.GenericCellRenderer): if model: model.foreach(self.func, (image, tree)) if self.redraw: - gobject.timeout_add(iter_.get_delay_time(), + GObject.timeout_add(iter_.get_delay_time(), self.animation_timeout, tree, image) elif image in self.iters: del self.iters[image] - def on_render(self, window, widget, background_area, cell_area, - expose_area, flags): + def do_render(self, ctx, widget, background_area, cell_area, flags): if not self.image: return - pix_rect = gtk.gdk.Rectangle() - pix_rect.x, pix_rect.y, pix_rect.width, pix_rect.height = \ - self.on_get_size(widget, cell_area) - pix_rect.x += cell_area.x - pix_rect.y += cell_area.y - pix_rect.width -= 2 * self.get_property('xpad') - pix_rect.height -= 2 * self.get_property('ypad') - - draw_rect = cell_area.intersect(pix_rect) - draw_rect = expose_area.intersect(draw_rect) - - if self.image.get_storage_type() == gtk.IMAGE_ANIMATION: + if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: if self.image not in self.iters: - if not isinstance(widget, gtk.TreeView): + if not isinstance(widget, Gtk.TreeView): return animation = self.image.get_animation() iter_ = animation.get_iter() self.iters[self.image] = iter_ - gobject.timeout_add(iter_.get_delay_time(), - self.animation_timeout, widget, self.image) + GObject.timeout_add(iter_.get_delay_time(), + self.animation_timeout, widget, self.image) pix = self.iters[self.image].get_pixbuf() - elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF: + elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return - if draw_rect.x < 1: - return - window.draw_pixbuf(widget.style.black_gc, pix, - draw_rect.x - pix_rect.x, - draw_rect.y - pix_rect.y, - draw_rect.x, draw_rect.y, - draw_rect.width, draw_rect.height, - gtk.gdk.RGB_DITHER_NONE, 0, 0) - def on_get_size(self, widget, cell_area): + Gdk.cairo_set_source_pixbuf(ctx, pix, cell_area.x, cell_area.y) + ctx.paint() + + def do_get_size(self, widget, cell_area): + """ + Return the size we need for this cell. + + Each cell is drawn individually and is only as wide as it needs + to be, we let the TreeViewColumn take care of making them all + line up. + """ if not self.image: return 0, 0, 0, 0 - if self.image.get_storage_type() == gtk.IMAGE_ANIMATION: + if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: animation = self.image.get_animation() pix = animation.get_iter().get_pixbuf() - elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF: + elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return 0, 0, 0, 0 diff --git a/src/chat_control.py b/src/chat_control.py index 466ce7ba0..39335ea74 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -29,9 +29,11 @@ import os import time -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject import gtkgui_helpers import gui_menu_builder import message_control @@ -97,7 +99,7 @@ langs = {_('English'): 'en', _('Belarusian'): 'be', _('Bulgarian'): 'bg', if gajim.config.get('use_speller') and HAS_GTK_SPELL: # loop removing non-existent dictionaries # iterating on a copy - tv = gtk.TextView() + tv = Gtk.TextView() spell = gtkspell.Spell(tv) for lang in dict(langs): try: @@ -115,13 +117,13 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): A base class containing a banner, ConversationTextview, MessageTextView """ - keymap = gtk.gdk.keymap_get_default() + keymap = Gdk.Keymap.get_default() try: - keycode_c = keymap.get_entries_for_keyval(gtk.keysyms.c)[0][0] + keycode_c = keymap.get_entries_for_keyval(Gdk.KEY_c)[0][0] except TypeError: keycode_c = 54 try: - keycode_ins = keymap.get_entries_for_keyval(gtk.keysyms.Insert)[0][0] + keycode_ins = keymap.get_entries_for_keyval(Gdk.KEY_Insert)[0][0] except TypeError: keycode_ins = 118 @@ -142,22 +144,22 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): bannerfontattrs = gajim.config.get_per('themes', theme, 'bannerfontattrs') if bannerfont: - font = pango.FontDescription(bannerfont) + font = Pango.FontDescription(bannerfont) else: - font = pango.FontDescription('Normal') + font = Pango.FontDescription('Normal') if bannerfontattrs: # B attribute is set by default if 'B' in bannerfontattrs: - font.set_weight(pango.WEIGHT_HEAVY) + font.set_weight(Pango.Weight.HEAVY) if 'I' in bannerfontattrs: - font.set_style(pango.STYLE_ITALIC) + font.set_style(Pango.Style.ITALIC) font_attrs = 'font_desc="%s"' % font.to_string() # in case there is no font specified we use x-large font size if font.get_size() == 0: font_attrs = '%s size="x-large"' % font_attrs - font.set_weight(pango.WEIGHT_NORMAL) + font.set_weight(Pango.Weight.NORMAL) font_attrs_small = 'font_desc="%s" size="small"' % font.to_string() return (font_attrs, font_attrs_small) @@ -253,7 +255,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): Derives types SHOULD implement this, rather than connection to the even itself """ - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event = Gdk.Event(Gdk.KEY_PRESS) event.keyval = event_keyval event.state = event_keymod event.time = 0 @@ -261,7 +263,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): _buffer = widget.get_buffer() start, end = _buffer.get_bounds() - if event.keyval -- gtk.keysyms.Tab: + if event.keyval -- Gdk.KEY_Tab: position = _buffer.get_insert() end = _buffer.get_iter_at_mark(position) @@ -308,9 +310,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.seclabel_combo = combo self.seclabel_combo.hide() self.seclabel_combo.set_no_show_all(True) - lb = gtk.ListStore(str) + lb = Gtk.ListStore(str) self.seclabel_combo.set_model(lb) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() cell.set_property('xpad', 5) # padding for status text self.seclabel_combo.pack_start(cell, True) # text to show is in in first column of liststore @@ -376,15 +378,15 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # Init DND self.TARGET_TYPE_URI_LIST = 80 - self.dnd_list = [('text/uri-list', 0, self.TARGET_TYPE_URI_LIST), - ('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_APP, 0)] + self.dnd_list = [Gtk.TargetEntry.new('text/uri-list', 0, + self.TARGET_TYPE_URI_LIST), Gtk.TargetEntry.new('MY_TREE_MODEL_ROW', + Gtk.TargetFlags.SAME_APP, 0)] id_ = self.widget.connect('drag_data_received', - self._on_drag_data_received) + self._on_drag_data_received) self.handlers[id_] = self.widget - self.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | - gtk.DEST_DEFAULT_DROP, - self.dnd_list, gtk.gdk.ACTION_COPY) + self.widget.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, + self.dnd_list, Gdk.DragAction.COPY) # Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) @@ -402,10 +404,10 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.handlers[id_] = self.conv_textview.tv id_ = self.conv_textview.tv.connect('drag_leave', self._on_drag_leave) self.handlers[id_] = self.conv_textview.tv - self.conv_textview.tv.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | - gtk.DEST_DEFAULT_DROP, - self.dnd_list, gtk.gdk.ACTION_COPY) + self.conv_textview.tv.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT | + Gtk.DestDefaults.DROP, + self.dnd_list, Gdk.DragAction.COPY) self.conv_scrolledwindow = self.xml.get_object( 'conversation_scrolledwindow') @@ -424,24 +426,24 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.msg_scrolledwindow = self.xml.get_object('message_scrolledwindow') self.msg_textview = MessageTextView() id_ = self.msg_textview.connect('mykeypress', - self._on_message_textview_mykeypress_event) + self._on_message_textview_mykeypress_event) self.handlers[id_] = self.msg_textview self.msg_scrolledwindow.add(self.msg_textview) id_ = self.msg_textview.connect('key_press_event', - self._on_message_textview_key_press_event) + self._on_message_textview_key_press_event) self.handlers[id_] = self.msg_textview - id_ = self.msg_textview.connect('size-request', self.size_request) + id_ = self.msg_textview.connect('configure-event', + self.on_configure_event) self.handlers[id_] = self.msg_textview id_ = self.msg_textview.connect('populate_popup', - self.on_msg_textview_populate_popup) + self.on_msg_textview_populate_popup) self.handlers[id_] = self.msg_textview # Setup DND id_ = self.msg_textview.connect('drag_data_received', - self._on_drag_data_received) + self._on_drag_data_received) self.handlers[id_] = self.msg_textview - self.msg_textview.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT, - self.dnd_list, gtk.gdk.ACTION_COPY) + self.msg_textview.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT, self.dnd_list, Gdk.DragAction.COPY) self.update_font() @@ -466,7 +468,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # (so toggle works ok) img = self.xml.get_object('emoticons_button_image') img.set_from_file(os.path.join(gajim.DATA_DIR, 'emoticons', 'static', - 'smile.png')) + 'smile.png')) self.toggle_emoticons() # Attach speller @@ -516,14 +518,14 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): try: gtkspell.Spell(self.msg_textview, lang) self.msg_textview.lang = lang - except (gobject.GError, RuntimeError, TypeError, OSError): + except (GObject.GError, RuntimeError, TypeError, OSError): dialogs.AspellDictError(lang) def on_banner_label_populate_popup(self, label, menu): """ Override the default context menu and add our own menutiems """ - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() menu.prepend(item) menu2 = self.prepare_context_menu() @@ -566,26 +568,26 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): spell.set_language(lang) widget.set_active(True) - item = gtk.ImageMenuItem(gtk.STOCK_UNDO) + item = Gtk.ImageMenuItem(Gtk.STOCK_UNDO) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.undo) self.handlers[id_] = item - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() menu.prepend(item) - item = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + item = Gtk.ImageMenuItem(Gtk.STOCK_CLEAR) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.clear) self.handlers[id_] = item if gajim.config.get('use_speller') and HAS_GTK_SPELL: - item = gtk.MenuItem(_('Spelling language')) + item = Gtk.MenuItem(_('Spelling language')) menu.prepend(item) - submenu = gtk.Menu() + submenu = Gtk.Menu() item.set_submenu(submenu) for lang in sorted(langs): - item = gtk.CheckMenuItem(lang) + item = Gtk.CheckMenuItem(lang) if langs[lang] == self.msg_textview.lang: item.set_active(True) submenu.append(item) @@ -618,7 +620,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): message_buffer = self.msg_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter, 0).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, False).decode('utf-8') xhtml = self.msg_textview.get_xhtml() # send the message @@ -638,23 +640,23 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.disconnect_style_event(banner_name_label) self.disconnect_style_event(self.banner_status_label) if bgcolor: - banner_eventbox.modify_bg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(bgcolor)) + banner_eventbox.modify_bg(Gtk.StateType.NORMAL, + Gdk.color_parse(bgcolor)) default_bg = False else: default_bg = True if textcolor: - banner_name_label.modify_fg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(textcolor)) - self.banner_status_label.modify_fg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(textcolor)) + banner_name_label.modify_fg(Gtk.StateType.NORMAL, + Gdk.color_parse(textcolor)) + self.banner_status_label.modify_fg(Gtk.StateType.NORMAL, + Gdk.color_parse(textcolor)) default_fg = False else: default_fg = True if default_bg or default_fg: self._on_style_set_event(banner_name_label, None, default_fg, default_bg) - if self.banner_status_label.flags() & gtk.REALIZED: + if self.banner_status_label.get_realized(): # Widget is realized self._on_style_set_event(self.banner_status_label, None, default_fg, default_bg) @@ -682,20 +684,20 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): banner_eventbox = self.xml.get_object('banner_eventbox') self.disconnect_style_event(widget) if opts[1]: - bg_color = widget.style.bg[gtk.STATE_SELECTED] - banner_eventbox.modify_bg(gtk.STATE_NORMAL, bg_color) + bg_color = widget.get_style().bg[Gtk.StateType.SELECTED] + banner_eventbox.modify_bg(Gtk.StateType.NORMAL, bg_color) if opts[0]: - fg_color = widget.style.fg[gtk.STATE_SELECTED] - widget.modify_fg(gtk.STATE_NORMAL, fg_color) + fg_color = widget.get_style().fg[Gtk.StateType.SELECTED] + widget.modify_fg(Gtk.StateType.NORMAL, fg_color) self.connect_style_event(widget, opts[0], opts[1]) def _conv_textview_key_press_event(self, widget, event): # translate any layout to latin_layout - keymap = gtk.gdk.keymap_get_default() + keymap = Gdk.keymap_get_default() keycode = keymap.get_entries_for_keyval(event.keyval)[0][0] - if (event.state & gtk.gdk.CONTROL_MASK and keycode in (self.keycode_c, - self.keycode_ins)) or (event.state & gtk.gdk.SHIFT_MASK and \ - event.keyval in (gtk.keysyms.Page_Down, gtk.keysyms.Page_Up)): + if (event.get_state() & Gdk.ModifierType.CONTROL_MASK and keycode in (self.keycode_c, + self.keycode_ins)) or (event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up)): return False self.parent_win.notebook.emit('key_press_event', event) return True @@ -705,7 +707,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return def set_emoticons_menu_position(w, msg_tv=self.msg_textview): - window = msg_tv.get_window(gtk.TEXT_WINDOW_WIDGET) + window = msg_tv.get_window(Gtk.TextWindowType.WIDGET) # get the window position origin = window.get_origin() size = window.get_size() @@ -713,7 +715,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # get the cursor position cursor = msg_tv.get_iter_location(buf.get_iter_at_mark( buf.get_insert())) - cursor = msg_tv.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, + cursor = msg_tv.buffer_to_window_coords(Gtk.TextWindowType.TEXT, cursor.x, cursor.y) x = origin[0] + cursor[0] y = origin[1] + size[1] @@ -724,7 +726,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # then go show just above the current cursor line for up # or just below the current cursor line for down #TEST with having 3 lines and writing in the 2nd - if y + menu_height > gtk.gdk.screen_height(): + if y + menu_height > Gdk.Screen.height(): # move menu just above cursor y -= menu_height + (msg_tv.allocation.height / buf.get_line_count()) #else: # move menu just below cursor @@ -735,37 +737,37 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): set_emoticons_menu_position, 1, 0) def _on_message_textview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.space: + if event.keyval == Gdk.KEY_space: self.space_pressed = True elif (self.space_pressed or self.msg_textview.undo_pressed) and \ - event.keyval not in (gtk.keysyms.Control_L, gtk.keysyms.Control_R) and \ - not (event.keyval == gtk.keysyms.z and event.state & gtk.gdk.CONTROL_MASK): + event.keyval not in (Gdk.KEY_Control_L, Gdk.KEY_Control_R) and \ + not (event.keyval == Gdk.KEY_z and event.get_state() & Gdk.ModifierType.CONTROL_MASK): # If the space key has been pressed and now it hasnt, # we save the buffer into the undo list. But be carefull we're not # pressiong Control again (as in ctrl+z) _buffer = widget.get_buffer() start_iter, end_iter = _buffer.get_bounds() - self.msg_textview.save_undo(_buffer.get_text(start_iter, end_iter)) + self.msg_textview.save_undo(_buffer.get_text(start_iter, end_iter, True)) self.space_pressed = False # Ctrl [+ Shift] + Tab are not forwarded to notebook. We handle it here if self.widget_name == 'groupchat_control': - if event.keyval not in (gtk.keysyms.ISO_Left_Tab, gtk.keysyms.Tab): + if event.keyval not in (Gdk.KEY_ISO_Left_Tab, Gdk.KEY_Tab): self.last_key_tabs = False - if event.state & gtk.gdk.SHIFT_MASK: + if event.get_state() & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT + TAB - if event.state & gtk.gdk.CONTROL_MASK and \ - event.keyval == gtk.keysyms.ISO_Left_Tab: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ + event.keyval == Gdk.KEY_ISO_Left_Tab: self.parent_win.move_to_next_unread_tab(False) return True # SHIFT + PAGE_[UP|DOWN]: send to conv_textview - elif event.keyval == gtk.keysyms.Page_Down or \ - event.keyval == gtk.keysyms.Page_Up: + elif event.keyval == Gdk.KEY_Page_Down or \ + event.keyval == Gdk.KEY_Page_Up: self.conv_textview.tv.emit('key_press_event', event) return True - elif event.state & gtk.gdk.CONTROL_MASK: - if event.keyval == gtk.keysyms.Tab: # CTRL + TAB + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: + if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.parent_win.move_to_next_unread_tab(True) return True return False @@ -786,25 +788,25 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): xhtml = self.msg_textview.get_xhtml() # construct event instance from binding - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time - if event.keyval == gtk.keysyms.Up: - if event.state == gtk.gdk.CONTROL_MASK: # Ctrl+UP + if event.keyval == Gdk.KEY_Up: + if event.get_state() == Gdk.ModifierType.CONTROL_MASK: # Ctrl+UP self.scroll_messages('up', message_buffer, 'sent') # Ctrl+Shift+UP - elif event.state == (gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK): + elif event.get_state() == (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK): self.scroll_messages('up', message_buffer, 'received') - elif event.keyval == gtk.keysyms.Down: - if event.state == gtk.gdk.CONTROL_MASK: # Ctrl+Down + elif event.keyval == Gdk.KEY_Down: + if event.get_state() == Gdk.ModifierType.CONTROL_MASK: # Ctrl+Down self.scroll_messages('down', message_buffer, 'sent') # Ctrl+Shift+Down - elif event.state == (gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK): + elif event.get_state() == (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK): self.scroll_messages('down', message_buffer, 'received') - elif event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: # ENTER + elif event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: # ENTER # NOTE: SHIFT + ENTER is not needed to be emulated as it is not # binding at all (textview's default action is newline) @@ -812,14 +814,14 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # here, we emulate GTK default action on ENTER (add new line) # normally I would add in keypress but it gets way to complex # to get instant result on changing this advanced setting - if event.state == 0: # no ctrl, no shift just ENTER add newline + if event.get_state() == 0: # no ctrl, no shift just ENTER add newline end_iter = message_buffer.get_end_iter() message_buffer.insert_at_cursor('\n') send_message = False - elif event.state & gtk.gdk.CONTROL_MASK: # CTRL + ENTER + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: # CTRL + ENTER send_message = True else: # send on Enter, do newline on Ctrl Enter - if event.state & gtk.gdk.CONTROL_MASK: # Ctrl + ENTER + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Ctrl + ENTER end_iter = message_buffer.get_end_iter() message_buffer.insert_at_cursor('\n') send_message = False @@ -834,8 +836,8 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): if send_message: self.send_message(message, xhtml=xhtml) # send the message - elif event.keyval == gtk.keysyms.z: # CTRL+z - if event.state & gtk.gdk.CONTROL_MASK: + elif event.keyval == Gdk.KEY_z: # CTRL+z + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: self.msg_textview.undo() else: # Give the control itself a chance to process @@ -1045,7 +1047,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ Popup formattings menu """ - menu = gtk.Menu() + menu = Gtk.Menu() menuitems = ((_('Bold'), 'bold'), (_('Italic'), 'italic'), @@ -1055,7 +1057,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): active_tags = self.msg_textview.get_active_tags() for menuitem in menuitems: - item = gtk.CheckMenuItem(menuitem[0]) + item = Gtk.CheckMenuItem(menuitem[0]) if menuitem[1] in active_tags: item.set_active(True) else: @@ -1064,26 +1066,26 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): menuitem[1]) menu.append(item) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) - item = gtk.ImageMenuItem(_('Color')) - icon = gtk.image_new_from_stock(gtk.STOCK_SELECT_COLOR, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Color')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_SELECT_COLOR, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_color_menuitem_activale) menu.append(item) - item = gtk.ImageMenuItem(_('Font')) - icon = gtk.image_new_from_stock(gtk.STOCK_SELECT_FONT, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Font')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_SELECT_FONT, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_font_menuitem_activale) menu.append(item) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) - item = gtk.ImageMenuItem(_('Clear formating')) - icon = gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Clear formating')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_CLEAR, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.msg_textview.clear_tags) menu.append(item) @@ -1093,13 +1095,13 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.parent_win) def on_color_menuitem_activale(self, widget): - color_dialog = gtk.ColorSelectionDialog('Select a color') + color_dialog = Gtk.ColorSelectionDialog('Select a color') color_dialog.connect('response', self.msg_textview.color_set, color_dialog.colorsel) color_dialog.show_all() def on_font_menuitem_activale(self, widget): - font_dialog = gtk.FontSelectionDialog('Select a font') + font_dialog = Gtk.FontSelectionDialog('Select a font') font_dialog.connect('response', self.msg_textview.font_set, font_dialog.fontsel) font_dialog.show_all() @@ -1114,7 +1116,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.parent_win) def update_font(self): - font = pango.FontDescription(gajim.config.get('conversation_font')) + font = Pango.FontDescription(gajim.config.get('conversation_font')) self.conv_textview.tv.modify_font(font) self.msg_textview.modify_font(font) @@ -1214,7 +1216,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): visible_rect = textview.get_visible_rect() # scroll only if expected end is not visible if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): - self.scroll_to_end_id = gobject.idle_add(self.scroll_to_end_iter, + self.scroll_to_end_id = GObject.idle_add(self.scroll_to_end_iter, textview) def scroll_to_end_iter(self, textview): @@ -1224,20 +1226,20 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.scroll_to_end_id = None return False - def size_request(self, msg_textview, requisition): + def on_configure_event(self, msg_textview, event): """ When message_textview changes its size: if the new height will enlarge the window, enable the scrollbar automatic policy. Also enable scrollbar automatic policy for horizontal scrollbar if message we have in message_textview is too big """ - if msg_textview.window is None: + if msg_textview.get_window() is None: return min_height = self.conv_scrolledwindow.get_property('height-request') - conversation_height = self.conv_textview.tv.window.get_size()[1] - message_height = msg_textview.window.get_size()[1] - message_width = msg_textview.window.get_size()[0] + conversation_height = self.conv_textview.tv.get_window().get_size()[1] + message_height = msg_textview.get_window().get_size()[1] + message_width = msg_textview.get_window().get_size()[0] # new tab is not exposed yet if conversation_height < 2: return @@ -1250,31 +1252,31 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # but we also want to avoid window resizing so if we reach that # minimum for conversation_textview and maximum for message_textview # we set to automatic the scrollbar policy - diff_y = message_height - requisition.height + diff_y = message_height - event.height if diff_y != 0: if conversation_height + diff_y < min_height: if message_height + conversation_height - min_height > min_height: policy = self.msg_scrolledwindow.get_property( 'vscrollbar-policy') - if policy != gtk.POLICY_AUTOMATIC: + if policy != Gtk.PolicyType.AUTOMATIC: self.msg_scrolledwindow.set_property('vscrollbar-policy', - gtk.POLICY_AUTOMATIC) + Gtk.PolicyType.AUTOMATIC) self.msg_scrolledwindow.set_property('height-request', message_height + conversation_height - min_height) else: self.msg_scrolledwindow.set_property('vscrollbar-policy', - gtk.POLICY_NEVER) + Gtk.PolicyType.NEVER) self.msg_scrolledwindow.set_property('height-request', -1) self.smooth = True # reinit the flag # enable scrollbar automatic policy for horizontal scrollbar # if message we have in message_textview is too big - if requisition.width > message_width: + if event.width > message_width: self.msg_scrolledwindow.set_property('hscrollbar-policy', - gtk.POLICY_AUTOMATIC) + Gtk.PolicyType.AUTOMATIC) else: self.msg_scrolledwindow.set_property('hscrollbar-policy', - gtk.POLICY_NEVER) + Gtk.PolicyType.NEVER) return True @@ -1283,13 +1285,15 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # textview. if self.was_at_the_end: self.conv_textview.bring_scroll_to_end(-18) - self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18 + self.was_at_the_end = (adjustment.get_upper() - adjustment.get_value() \ + - adjustment.get_page_size()) < 18 def on_conversation_vadjustment_value_changed(self, adjustment): # stop automatic scroll when we manually scroll if not self.conv_textview.auto_scrolling: self.conv_textview.stop_scrolling() - self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18 + self.was_at_the_end = (adjustment.get_upper() - adjustment.get_value() \ + - adjustment.page_size) < 18 if self.resource: jid = self.contact.get_full_jid() else: @@ -1361,7 +1365,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # whatever is already typed start_iter = msg_buf.get_start_iter() end_iter = msg_buf.get_end_iter() - self.orig_msg = msg_buf.get_text(start_iter, end_iter, 0).decode( + self.orig_msg = msg_buf.get_text(start_iter, end_iter, False).decode( 'utf-8') pos += -1 if direction == 'up' else +1 if pos == -1: @@ -1394,7 +1398,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ # make the last message visible, when changing to "full view" if not state: - gobject.idle_add(self.conv_textview.scroll_to_end_iter) + GObject.idle_add(self.conv_textview.scroll_to_end_iter) widget.set_no_show_all(state) if state: @@ -1480,7 +1484,7 @@ class ChatControl(ChatControlBase): self._send_file_button = self.xml.get_object('send_file_button') # add a special img for send file button path_to_upload_img = gtkgui_helpers.get_icon_path('gajim-upload') - img = gtk.Image() + img = Gtk.Image() img.set_from_file(path_to_upload_img) self._send_file_button.set_image(img) id_ = self._send_file_button.connect('clicked', @@ -1600,15 +1604,15 @@ class ChatControl(ChatControlBase): id_ = widget.connect('value_changed', self.on_sound_hscale_value_changed) self.handlers[id_] = widget - self.info_bar = gtk.InfoBar() + self.info_bar = Gtk.InfoBar() content_area = self.info_bar.get_content_area() - self.info_bar_label = gtk.Label() + self.info_bar_label = Gtk.Label() self.info_bar_label.set_use_markup(True) self.info_bar_label.set_alignment(0, 0) content_area.add(self.info_bar_label) self.info_bar.set_no_show_all(True) widget = self.xml.get_object('vbox2') - widget.pack_start(self.info_bar, expand=False, padding=5) + widget.pack_start(self.info_bar, False, True, 5) widget.reorder_child(self.info_bar, 1) # List of waiting infobar messages @@ -1811,16 +1815,16 @@ class ChatControl(ChatControlBase): banner_image.show() if state == self.JINGLE_STATE_CONNECTING: banner_image.set_from_stock( - gtk.STOCK_CONVERT, 1) + Gtk.STOCK_CONVERT, 1) elif state == self.JINGLE_STATE_CONNECTION_RECEIVED: banner_image.set_from_stock( - gtk.STOCK_NETWORK, 1) + Gtk.STOCK_NETWORK, 1) elif state == self.JINGLE_STATE_CONNECTED: banner_image.set_from_stock( - gtk.STOCK_CONNECT, 1) + Gtk.STOCK_CONNECT, 1) elif state == self.JINGLE_STATE_ERROR: banner_image.set_from_stock( - gtk.STOCK_DIALOG_WARNING, 1) + Gtk.STOCK_DIALOG_WARNING, 1) self.update_toolbar() def update_audio(self): @@ -1948,8 +1952,8 @@ class ChatControl(ChatControlBase): if avatar_w > scaled_buf_w or avatar_h > scaled_buf_h: # wait for 0.5 sec in case we leave earlier if self.show_bigger_avatar_timeout_id is not None: - gobject.source_remove(self.show_bigger_avatar_timeout_id) - self.show_bigger_avatar_timeout_id = gobject.timeout_add(500, + GObject.source_remove(self.show_bigger_avatar_timeout_id) + self.show_bigger_avatar_timeout_id = GObject.timeout_add(500, self.show_bigger_avatar, widget) def on_avatar_eventbox_leave_notify_event(self, widget, event): @@ -1958,7 +1962,7 @@ class ChatControl(ChatControlBase): """ # did we add a timeout? if yes remove it if self.show_bigger_avatar_timeout_id is not None: - gobject.source_remove(self.show_bigger_avatar_timeout_id) + GObject.source_remove(self.show_bigger_avatar_timeout_id) self.show_bigger_avatar_timeout_id = None def on_avatar_eventbox_button_press_event(self, widget, event): @@ -1966,8 +1970,8 @@ class ChatControl(ChatControlBase): If right-clicked, show popup """ if event.button == 3: # right click - menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menu = Gtk.Menu() + menuitem = Gtk.ImageMenuItem(Gtk.STOCK_SAVE_AS) id_ = menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.jid, self.contact.get_shown_name()) @@ -1999,9 +2003,9 @@ class ChatControl(ChatControlBase): self.mouse_over_in_last_30_secs = True def _schedule_activity_timers(self): - self.possible_paused_timeout_id = gobject.timeout_add_seconds(5, + self.possible_paused_timeout_id = GObject.timeout_add_seconds(5, self.check_for_possible_paused_chatstate, None) - self.possible_inactive_timeout_id = gobject.timeout_add_seconds(30, + self.possible_inactive_timeout_id = GObject.timeout_add_seconds(30, self.check_for_possible_inactive_chatstate, None) def update_ui(self): @@ -2032,7 +2036,7 @@ class ChatControl(ChatControlBase): use_size_32 = False banner_status_img = self.xml.get_object('banner_status_image') - if banner_image.get_storage_type() == gtk.IMAGE_ANIMATION: + if banner_image.get_storage_type() == Gtk.ImageType.ANIMATION: banner_status_img.set_from_animation(banner_image.get_animation()) else: pix = banner_image.get_pixbuf() @@ -2041,7 +2045,7 @@ class ChatControl(ChatControlBase): banner_status_img.set_from_pixbuf(pix) else: # we need to scale 16x16 to 32x32 scaled_pix = pix.scale_simple(32, 32, - gtk.gdk.INTERP_BILINEAR) + GdkPixbuf.InterpType.BILINEAR) banner_status_img.set_from_pixbuf(scaled_pix) def draw_banner_text(self): @@ -2060,7 +2064,7 @@ class ChatControl(ChatControlBase): if self.TYPE_ID == message_control.TYPE_PM: name = _('%(nickname)s from group chat %(room_name)s') %\ {'nickname': name, 'room_name': self.room_name} - name = gobject.markup_escape_text(name) + name = GObject.markup_escape_text(name) # We know our contacts nick, but if another contact has the same nick # in another account we need to also display the account. @@ -2076,17 +2080,17 @@ class ChatControl(ChatControlBase): gajim.contacts.get_first_contact_from_jid(account, jid) if other_contact_.get_shown_name() == self.contact.get_shown_name(): acct_info = ' (%s)' % \ - gobject.markup_escape_text(self.account) + GObject.markup_escape_text(self.account) break status = contact.status if status is not None: - banner_name_label.set_ellipsize(pango.ELLIPSIZE_END) - self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) + banner_name_label.set_ellipsize(Pango.EllipsizeMode.END) + self.banner_status_label.set_ellipsize(Pango.EllipsizeMode.END) status_reduced = helpers.reduce_chars_newlines(status, max_lines=1) else: status_reduced = '' - status_escaped = gobject.markup_escape_text(status_reduced) + status_escaped = GObject.markup_escape_text(status_reduced) font_attrs, font_attrs_small = self.get_font_attrs() st = gajim.config.get('displayed_chat_state_notifications') @@ -2287,8 +2291,8 @@ class ChatControl(ChatControlBase): chatstate_to_send = 'active' contact.our_chatstate = 'active' - gobject.source_remove(self.possible_paused_timeout_id) - gobject.source_remove(self.possible_inactive_timeout_id) + GObject.source_remove(self.possible_paused_timeout_id) + GObject.source_remove(self.possible_inactive_timeout_id) self._schedule_activity_timers() def _on_sent(id_, contact, message, encrypted, xhtml, label): @@ -2523,19 +2527,21 @@ class ChatControl(ChatControlBase): 'state_paused_color') if color: # We set the color for when it's the current tab or not - color = gtk.gdk.colormap_get_system().alloc_color(color) + ok, color = Gdk.Color.parse(color) + if not ok: + color = self.parent_win.notebook.get_style().fg[Gtk.StateType.ACTIVE] # In inactive tab color to be lighter against the darker inactive # background if chatstate in ('inactive', 'gone') and\ self.parent_win.get_active_control() != self: color = self.lighten_color(color) else: # active or not chatstate, get color from gtk - color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] + color = self.parent_win.notebook.get_style().fg[Gtk.StateType.ACTIVE] name = self.contact.get_shown_name() if self.resource: name += '/' + self.resource - label_str = gobject.markup_escape_text(name) + label_str = GObject.markup_escape_text(name) if num_unread: # if unread, text in the label becomes bold label_str = '' + unread + label_str + '' return (label_str, color) @@ -2673,8 +2679,8 @@ class ChatControl(ChatControlBase): self.session.control = None # Disconnect timer callbacks - gobject.source_remove(self.possible_paused_timeout_id) - gobject.source_remove(self.possible_inactive_timeout_id) + GObject.source_remove(self.possible_paused_timeout_id) + GObject.source_remove(self.possible_inactive_timeout_id) # Remove bigger avatar window if self.bigger_avatar_window: self.bigger_avatar_window.destroy() @@ -2757,8 +2763,8 @@ class ChatControl(ChatControlBase): else: self.send_chatstate('active', self.contact) self.reset_kbd_mouse_timeout_vars() - gobject.source_remove(self.possible_paused_timeout_id) - gobject.source_remove(self.possible_inactive_timeout_id) + GObject.source_remove(self.possible_paused_timeout_id) + GObject.source_remove(self.possible_inactive_timeout_id) self._schedule_activity_timers() else: self.send_chatstate('inactive', self.contact) @@ -3017,8 +3023,8 @@ class ChatControl(ChatControlBase): pixbuf.fill(0xffffff00L) # RGBA image.queue_draw() - screen_w = gtk.gdk.screen_width() - screen_h = gtk.gdk.screen_height() + screen_w = Gdk.Screen.width() + screen_h = Gdk.Screen.height() avatar_w = avatar_pixbuf.get_width() avatar_h = avatar_pixbuf.get_height() half_scr_w = screen_w / 2 @@ -3027,16 +3033,16 @@ class ChatControl(ChatControlBase): avatar_w = half_scr_w if avatar_h > half_scr_h: avatar_h = half_scr_h - window = gtk.Window(gtk.WINDOW_POPUP) + window = Gtk.Window(Gtk.WindowType.POPUP) self.bigger_avatar_window = window pixmap, mask = avatar_pixbuf.render_pixmap_and_mask() window.set_size_request(avatar_w, avatar_h) # we should make the cursor visible # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that - window.set_events(gtk.gdk.POINTER_MOTION_MASK) + window.set_events(Gdk.EventMask.POINTER_MOTION_MASK) window.set_app_paintable(True) - window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) + window.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) window.realize() window.window.set_back_pixmap(pixmap, False) # make it transparent @@ -3075,7 +3081,7 @@ class ChatControl(ChatControlBase): """ Just moved the mouse so show the cursor """ - cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) + cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR) self.bigger_avatar_window.window.set_cursor(cursor) def _on_send_file_menuitem_activate(self, widget): @@ -3196,7 +3202,7 @@ class ChatControl(ChatControlBase): self.info_bar.show_all() def _add_info_bar_message(self, markup, buttons, args, - type_=gtk.MESSAGE_INFO): + type_=Gtk.MessageType.INFO): self.info_bar_queue.append((markup, buttons, args, type_)) self._info_bar_show_message() @@ -3229,12 +3235,12 @@ class ChatControl(ChatControlBase): markup += ' (%s)' % file_props.desc markup += '\n%s: %s' % (_('Size'), helpers.convert_bytes( file_props.size)) - b1 = gtk.Button(_('_Accept')) + b1 = Gtk.Button(_('_Accept')) b1.connect('clicked', self._on_accept_file_request, file_props) - b2 = gtk.Button(stock=gtk.STOCK_CANCEL) + b2 = Gtk.Button(stock=Gtk.STOCK_CANCEL) b2.connect('clicked', self._on_cancel_file_request, file_props) self._add_info_bar_message(markup, [b1, b2], file_props, - gtk.MESSAGE_QUESTION) + Gtk.MessageType.QUESTION) def _on_open_ft_folder(self, widget, file_props): path = os.path.split(file_props.file_name)[0] @@ -3254,17 +3260,17 @@ class ChatControl(ChatControlBase): file_props.name) if file_props.desc: markup += ' (%s)' % file_props.desc - b1 = gtk.Button(_('_Open Containing Folder')) + b1 = Gtk.Button(_('_Open Containing Folder')) b1.connect('clicked', self._on_open_ft_folder, file_props) - b2 = gtk.Button(stock=gtk.STOCK_OK) + b2 = Gtk.Button(stock=Gtk.STOCK_OK) b2.connect('clicked', self._on_ok, file_props, 'file-completed') self._add_info_bar_message(markup, [b1, b2], file_props) def _got_file_error(self, file_props, type_, pri_txt, sec_txt): markup = '%s: %s' % (pri_txt, sec_txt) - b = gtk.Button(stock=gtk.STOCK_OK) + b = Gtk.Button(stock=Gtk.STOCK_OK) b.connect('clicked', self._on_ok, file_props, type_) - self._add_info_bar_message(markup, [b], file_props, gtk.MESSAGE_ERROR) + self._add_info_bar_message(markup, [b], file_props, Gtk.MessageType.ERROR) def _on_accept_gc_invitation(self, widget, event): room_jid = event.parameters[0] @@ -3289,12 +3295,12 @@ class ChatControl(ChatControlBase): markup = '%s: %s' % (_('Groupchat Invitation'), room_jid) if comment: markup += ' (%s)' % comment - b1 = gtk.Button(_('_Join')) + b1 = Gtk.Button(_('_Join')) b1.connect('clicked', self._on_accept_gc_invitation, event) - b2 = gtk.Button(stock=gtk.STOCK_CANCEL) + b2 = Gtk.Button(stock=Gtk.STOCK_CANCEL) b2.connect('clicked', self._on_cancel_gc_invitation, event) self._add_info_bar_message(markup, [b1, b2], event.parameters, - gtk.MESSAGE_QUESTION) + Gtk.MessageType.QUESTION) def on_event_added(self, event): if event.account != self.account: @@ -3350,6 +3356,6 @@ class ChatControl(ChatControlBase): self.info_bar.set_no_show_all(True) self.info_bar.hide() # show next one? - gobject.idle_add(self._info_bar_show_message) + GObject.idle_add(self._info_bar_show_message) break i += 1 diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index 7c517ea51..494444a32 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -34,7 +34,7 @@ don't need to dig up the code itself to write basic commands. from types import StringTypes from traceback import print_exc -from pango import FontDescription +from gi.repository import Pango from common import gajim from ..framework import CommandProcessor @@ -117,7 +117,7 @@ class CommandTools: name = gconf("/desktop/gnome/interface/monospace_font_name") name = name if name else "Monospace" - font = FontDescription(name) + font = Pango.FontDescription(name) command_ok_tag = buffer.create_tag("command_ok") command_ok_tag.set_property("font-desc", font) diff --git a/src/command_system/tools.py b/src/command_system/tools.py index a5030792c..775744073 100644 --- a/src/command_system/tools.py +++ b/src/command_system/tools.py @@ -25,7 +25,7 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from types import * -from glib import GError +#from glib import GError def remove(sequence, target): if isinstance(sequence, ListType): @@ -36,9 +36,9 @@ def remove(sequence, target): del sequence[target] def gconf(path): - try: - from gconf import client_get_default - client = client_get_default() - return client.get_string(path) - except ImportError, GError: +# try: +# from gconf import client_get_default +# client = client_get_default() +# return client.get_string(path) +# except ImportError, GError: pass \ No newline at end of file diff --git a/src/common/config.py b/src/common/config.py index 928912f9e..c31003f45 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -36,7 +36,7 @@ import sys import re import copy import defs -import gobject +from gi.repository import GObject ( OPT_TYPE, @@ -807,7 +807,7 @@ class Config: def _timeout_save(self): if self.save_timeout_id: return - self.save_timeout_id = gobject.timeout_add(1000, self._really_save) + self.save_timeout_id = GObject.timeout_add(1000, self._really_save) def __init__(self): #init default values diff --git a/src/common/gajim.py b/src/common/gajim.py index 27df4e379..f6c129bc6 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -174,6 +174,7 @@ else: HAVE_FARSTREAM = True try: + raise ImportError farstream = __import__('farstream') import gst import glib @@ -190,6 +191,7 @@ except ImportError: HAVE_UPNP_IGD = True try: + raise ImportError import gupnp.igd gupnp_igd = gupnp.igd.Simple() except ImportError: diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index 8717c2105..c28a48457 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -17,7 +17,7 @@ Handles Jingle RTP sessions (XEP 0167) from collections import deque -import gobject +from gi.repository import GObject import socket import nbxmpp @@ -129,13 +129,13 @@ class JingleRTPContent(JingleContent): events = deque(events) self._dtmf_running = True self._start_dtmf(events.popleft()) - gobject.timeout_add(500, self._next_dtmf, events) + GObject.timeout_add(500, self._next_dtmf, events) def _next_dtmf(self, events): self._stop_dtmf() if events: self._start_dtmf(events.popleft()) - gobject.timeout_add(500, self._next_dtmf, events) + GObject.timeout_add(500, self._next_dtmf, events) else: self._dtmf_running = False diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index b812fe471..cb289ddfe 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -329,6 +329,7 @@ class JingleTransportIBB(JingleTransport): return transport try: + raise ImportError import farstream except Exception: pass diff --git a/src/common/logger.py b/src/common/logger.py index 8e929c4a5..4c0d2bb67 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -34,7 +34,7 @@ import time import datetime from gzip import GzipFile from cStringIO import StringIO -import gobject +from gi.repository import GObject import exceptions import gajim @@ -176,7 +176,7 @@ class Logger: def _timeout_commit(self): if self.commit_timout_id: return - self.commit_timout_id = gobject.timeout_add(500, self._really_commit) + self.commit_timout_id = GObject.timeout_add(500, self._really_commit) def simple_commit(self, sql_to_commit): """ diff --git a/src/common/pep.py b/src/common/pep.py index ab14c2212..a2cb84c8f 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -214,8 +214,9 @@ LOCATION_DATA = { 'timestamp': _('timestamp'), 'uri': _('uri')} -import gobject -import gtk +from gi.repository import GObject +from gi.repository import Gtk +from gi.repository import GdkPixbuf import logging log = logging.getLogger('gajim.c.pep') @@ -310,10 +311,10 @@ class UserMoodPEP(AbstractPEP): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] mood = self._translate_mood(untranslated_mood) - markuptext = '%s' % gobject.markup_escape_text(mood) + markuptext = '%s' % GObject.markup_escape_text(mood) if 'text' in self._pep_specific_data: text = self._pep_specific_data['text'] - markuptext += ' (%s)' % gobject.markup_escape_text(text) + markuptext += ' (%s)' % GObject.markup_escape_text(text) return markuptext def _translate_mood(self, mood): @@ -348,20 +349,20 @@ class UserTunePEP(AbstractPEP): def asPixbufIcon(self): import os path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') - return gtk.gdk.pixbuf_new_from_file(path) + return GdkPixbuf.Pixbuf.new_from_file(path) def asMarkupText(self): assert not self._retracted tune = self._pep_specific_data artist = tune.get('artist', _('Unknown Artist')) - artist = gobject.markup_escape_text(artist) + artist = GObject.markup_escape_text(artist) title = tune.get('title', _('Unknown Title')) - title = gobject.markup_escape_text(title) + title = GObject.markup_escape_text(title) source = tune.get('source', _('Unknown Source')) - source = gobject.markup_escape_text(source) + source = GObject.markup_escape_text(source) tune_string = _('"%(title)s" by %(artist)s\n' 'from %(source)s') % {'title': title, @@ -426,12 +427,12 @@ class UserActivityPEP(AbstractPEP): subactivity = ACTIVITIES[activity][subactivity] activity = ACTIVITIES[activity]['category'] - markuptext = '' + gobject.markup_escape_text(activity) + markuptext = '' + GObject.markup_escape_text(activity) if subactivity: - markuptext += ': ' + gobject.markup_escape_text(subactivity) + markuptext += ': ' + GObject.markup_escape_text(subactivity) markuptext += '' if text: - markuptext += ' (%s)' % gobject.markup_escape_text(text) + markuptext += ' (%s)' % GObject.markup_escape_text(text) return markuptext @@ -492,7 +493,7 @@ class UserLocationPEP(AbstractPEP): def asPixbufIcon(self): path = gtkgui_helpers.get_icon_path('gajim-earth') - return gtk.gdk.pixbuf_new_from_file(path) + return GdkPixbuf.Pixbuf.new_from_file(path) def asMarkupText(self): assert not self._retracted @@ -501,7 +502,7 @@ class UserLocationPEP(AbstractPEP): for entry in location.keys(): text = location[entry] - text = gobject.markup_escape_text(text) + text = GObject.markup_escape_text(text) # Translate standart location tag tag = LOCATION_DATA.get(entry, entry) location_string += '\n%(tag)s: %(text)s' % \ diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index 4f6df6f8a..e362dec5c 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -30,7 +30,7 @@ import socket import base64 -import gobject +from gi.repository import GObject import time import nbxmpp @@ -442,7 +442,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def cleanup_gupnp(): if self.no_gupnp_reply_id: - gobject.source_remove(self.no_gupnp_reply_id) + GObject.source_remove(self.no_gupnp_reply_id) self.no_gupnp_reply_id = 0 gajim.gupnp_igd.disconnect(self.ok_id) gajim.gupnp_igd.disconnect(self.fail_id) @@ -482,7 +482,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): self.fail_id = gajim.gupnp_igd.connect('error-mapping-port', fail) port = gajim.config.get('file_transfers_port') - self.no_gupnp_reply_id = gobject.timeout_add_seconds(10, no_upnp_reply) + self.no_gupnp_reply_id = GObject.timeout_add_seconds(10, no_upnp_reply) gajim.gupnp_igd.add_port('TCP', 0, my_ip, port, 3600, 'Gajim file transfer') diff --git a/src/common/resolver.py b/src/common/resolver.py index 10ed614e8..5c8fc3571 100644 --- a/src/common/resolver.py +++ b/src/common/resolver.py @@ -318,8 +318,8 @@ class NsLookup(IdleCommand): # below lines is on how to use API and assist in testing if __name__ == '__main__': - import gobject - import gtk + from gi.repository import GObject + from gi.repository import Gtk from nbxmpp import idlequeue idlequeue = idlequeue.get_idlequeue() @@ -331,19 +331,19 @@ if __name__ == '__main__': def on_result(host, result_array): print 'Result:\n' + repr(result_array) resolver.resolve(host, on_result) - win = gtk.Window() + win = Gtk.Window() win.set_border_width(6) - text_view = gtk.Entry() + text_view = Gtk.Entry() text_view.set_text('_xmpp-client._tcp.jabber.org') - hbox = gtk.HBox() + hbox = Gtk.HBox() hbox.set_spacing(3) - but = gtk.Button(' Lookup SRV ') - hbox.pack_start(text_view, 5) - hbox.pack_start(but, 0) + but = Gtk.Button(' Lookup SRV ') + hbox.pack_start(text_view, 5, True, 0) + hbox.pack_start(but, 0, True, 0) but.connect('clicked', clicked) win.add(hbox) win.show_all() - gobject.timeout_add(200, idlequeue.process) + GObject.timeout_add(200, idlequeue.process) if USE_LIBASYNCNS: - gobject.timeout_add(200, resolver.process) - gtk.main() + GObject.timeout_add(200, resolver.process) + Gtk.main() diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 5f2c8d2a5..2b7967a67 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -39,7 +39,7 @@ import signal if os.name != 'nt': signal.signal(signal.SIGPIPE, signal.SIG_DFL) import getpass -import gobject +from gi.repository import GObject from common.connection import CommonConnection from common import gajim @@ -240,7 +240,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): # refresh all contacts data every five seconds self.call_resolve_timeout = True - gobject.timeout_add_seconds(5, self._on_resolve_timeout) + GObject.timeout_add_seconds(5, self._on_resolve_timeout) return True def disconnect(self, on_purpose=False): diff --git a/src/config.py b/src/config.py index 8a140ca00..0a6178ccd 100644 --- a/src/config.py +++ b/src/config.py @@ -31,9 +31,10 @@ ## along with Gajim. If not, see . ## -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import Pango +from gi.repository import GObject import os, sys import common.config import common.sleepy @@ -63,6 +64,7 @@ from common import gpg from common import ged try: + raise ImportError from common.multimedia_helpers import AudioInputManager, AudioOutputManager from common.multimedia_helpers import VideoInputManager, VideoOutputManager HAS_GST = True @@ -158,10 +160,10 @@ class PreferencesWindow: # user themes if os.path.isdir(gajim.MY_EMOTS_PATH): emoticons_list += os.listdir(gajim.MY_EMOTS_PATH) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() emoticons_combobox.pack_start(renderer_text, True) emoticons_combobox.add_attribute(renderer_text, 'text', 0) - model = gtk.ListStore(str) + model = Gtk.ListStore(str) emoticons_combobox.set_model(model) l = [] for dir_ in emoticons_list: @@ -213,7 +215,7 @@ class PreferencesWindow: ### Style tab ### # Themes theme_combobox = self.xml.get_object('theme_combobox') - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() theme_combobox.pack_start(cell, True) theme_combobox.add_attribute(cell, 'text', 0) self.update_theme_list() @@ -223,13 +225,13 @@ class PreferencesWindow: if os.path.isdir(gajim.MY_ICONSETS_PATH): iconsets_list += os.listdir(gajim.MY_ICONSETS_PATH) # new model, image in 0, string in 1 - model = gtk.ListStore(gtk.Image, str) + model = Gtk.ListStore(Gtk.Image, str) renderer_image = cell_renderer_image.CellRendererImage(0, 0) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() renderer_text.set_property('xpad', 5) - self.iconset_combobox.pack_start(renderer_image, expand = False) - self.iconset_combobox.pack_start(renderer_text, expand = True) - self.iconset_combobox.set_attributes(renderer_text, text = 1) + self.iconset_combobox.pack_start(renderer_image, False) + self.iconset_combobox.pack_start(renderer_text, True) + self.iconset_combobox.add_attribute(renderer_text, 'text', 1) self.iconset_combobox.add_attribute(renderer_image, 'image', 0) self.iconset_combobox.set_model(model) l = [] @@ -242,7 +244,7 @@ class PreferencesWindow: if l.count == 0: l.append(' ') for i in xrange(len(l)): - preview = gtk.Image() + preview = Gtk.Image() files = [] files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', 'online.png')) @@ -395,45 +397,45 @@ class PreferencesWindow: # Default Status messages self.default_msg_tree = self.xml.get_object('default_msg_treeview') - col2 = self.default_msg_tree.rc_get_style().bg[gtk.STATE_ACTIVE].\ + col2 = self.default_msg_tree.get_style().bg[Gtk.StateType.ACTIVE].\ to_string() # (status, translated_status, message, enabled) - model = gtk.ListStore(str, str, str, bool) + model = Gtk.ListStore(str, str, str, bool) self.default_msg_tree.set_model(model) - col = gtk.TreeViewColumn(_('Status')) + col = Gtk.TreeViewColumn(_('Status')) col.set_resizable(True) self.default_msg_tree.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, False) - col.set_attributes(renderer, text = 1) - col = gtk.TreeViewColumn(_('Default Message')) + col.add_attribute(renderer, 'text', 1) + col = Gtk.TreeViewColumn(_('Default Message')) col.set_resizable(True) self.default_msg_tree.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, True) - col.set_attributes(renderer, text = 2) + col.add_attribute(renderer, 'text', 2) renderer.connect('edited', self.on_default_msg_cell_edited) renderer.set_property('editable', True) renderer.set_property('cell-background', col2) - col = gtk.TreeViewColumn(_('Enabled')) + col = Gtk.TreeViewColumn(_('Enabled')) col.set_resizable(True) self.default_msg_tree.append_column(col) - renderer = gtk.CellRendererToggle() + renderer = Gtk.CellRendererToggle() col.pack_start(renderer, False) - col.set_attributes(renderer, active = 3) + col.add_attribute(renderer, 'active', 3) renderer.set_property('activatable', True) renderer.connect('toggled', self.default_msg_toggled_cb) self.fill_default_msg_treeview() # Status messages self.msg_tree = self.xml.get_object('msg_treeview') - model = gtk.ListStore(str, str, str, str, str, str, str) + model = Gtk.ListStore(str, str, str, str, str, str, str) self.msg_tree.set_model(model) - col = gtk.TreeViewColumn('name') + col = Gtk.TreeViewColumn('name') self.msg_tree.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, True) - col.set_attributes(renderer, text = 0) + col.add_attribute(renderer, 'text', 0) renderer.connect('edited', self.on_msg_cell_edited) renderer.set_property('editable', True) self.fill_msg_treeview() @@ -444,12 +446,12 @@ class PreferencesWindow: def create_av_combobox(opt_name, device_dict, config_name=None, key=None): combobox = self.xml.get_object(opt_name + '_combobox') - cell = gtk.CellRendererText() - cell.set_property('ellipsize', pango.ELLIPSIZE_END) + cell = Gtk.CellRendererText() + cell.set_property('ellipsize', Pango.EllipsizeMode.END) cell.set_property('ellipsize-set', True) combobox.pack_start(cell, True) combobox.add_attribute(cell, 'text', 0) - model = gtk.ListStore(str, str) + model = Gtk.ListStore(str, str) combobox.set_model(model) if config_name: config = gajim.config.get(config_name) @@ -589,10 +591,10 @@ class PreferencesWindow: gtkgui_helpers.possibly_move_window_in_current_desktop(self.window) def on_preferences_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('close_button').grab_focus) + GObject.idle_add(self.xml.get_object('close_button').grab_focus) def on_preferences_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.hide() def get_per_account_option(self, opt): @@ -751,7 +753,7 @@ class PreferencesWindow: lang = gajim.config.get('speller_language') if not lang: lang = gajim.LANG - tv = gtk.TextView() + tv = Gtk.TextView() try: gtkspell.Spell(tv, lang) except (TypeError, RuntimeError, OSError): @@ -781,7 +783,7 @@ class PreferencesWindow: def update_theme_list(self): theme_combobox = self.xml.get_object('theme_combobox') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) theme_combobox.set_model(model) i = 0 for config_theme in gajim.config.get_per('themes'): @@ -958,21 +960,21 @@ class PreferencesWindow: if col: if isinstance(col_to_widget[c], list): self.xml.get_object(col_to_widget[c][0]).set_color( - gtk.gdk.color_parse(col)) + Gdk.color_parse(col)) self.xml.get_object(col_to_widget[c][0]).set_sensitive(True) self.xml.get_object(col_to_widget[c][1]).set_active(True) else: self.xml.get_object(col_to_widget[c]).set_color( - gtk.gdk.color_parse(col)) + Gdk.color_parse(col)) else: if isinstance(col_to_widget[c], list): self.xml.get_object(col_to_widget[c][0]).set_color( - gtk.gdk.color_parse('#000000')) + Gdk.color_parse('#000000')) self.xml.get_object(col_to_widget[c][0]).set_sensitive(False) self.xml.get_object(col_to_widget[c][1]).set_active(False) else: self.xml.get_object(col_to_widget[c]).set_color( - gtk.gdk.color_parse('#000000')) + Gdk.color_parse('#000000')) def on_reset_colors_button_clicked(self, widget): col_to_widget = {'inmsgcolor': 'incoming_nick_colorbutton', @@ -1078,7 +1080,7 @@ class PreferencesWindow: eventbox = self.xml.get_object('default_status_eventbox') vbox = self.xml.get_object('status_vbox') vbox.set_child_packing(eventbox, not expander.get_expanded(), True, 0, - gtk.PACK_START) + Gtk.PACK_START) def save_status_messages(self, model): for msg in gajim.config.get_per('statusmsg'): @@ -1242,10 +1244,10 @@ class PreferencesWindow: return buf = self.xml.get_object('msg_textview').get_buffer() first_iter, end_iter = buf.get_bounds() - model.set_value(iter_, 1, buf.get_text(first_iter, end_iter)) + model.set_value(iter_, 1, buf.get_text(first_iter, end_iter, True)) def on_msg_treeview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self.on_delete_msg_button_clicked(widget) def on_proxies_combobox_changed(self, widget): @@ -1288,7 +1290,7 @@ class ManageProxiesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_proxies_window.ui') self.window = self.xml.get_object('manage_proxies_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.proxies_treeview = self.xml.get_object('proxies_treeview') self.proxyname_entry = self.xml.get_object('proxyname_entry') self.proxytype_combobox = self.xml.get_object('proxytype_combobox') @@ -1327,12 +1329,12 @@ class ManageProxiesWindow: self.xml.get_object('remove_proxy_button').set_sensitive(False) self.proxytype_combobox.set_sensitive(False) self.xml.get_object('proxy_table').set_sensitive(False) - model = gtk.ListStore(str) + model = Gtk.ListStore(str) self.proxies_treeview.set_model(model) - col = gtk.TreeViewColumn('Proxies') + col = Gtk.TreeViewColumn('Proxies') self.proxies_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer, True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 0) self.fill_proxies_treeview() self.xml.get_object('proxytype_combobox').set_active(0) @@ -1455,7 +1457,7 @@ class ManageProxiesWindow: self.block_signal = False def on_proxies_treeview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self.on_remove_proxy_button_clicked(widget) def on_proxyname_entry_changed(self, widget): @@ -1547,12 +1549,15 @@ class AccountsWindow: img.set_from_file(path_to_kbd_input_img) self.notebook = self.xml.get_object('notebook') # Name - model = gtk.ListStore(str) + model = Gtk.ListStore(str) self.accounts_treeview.set_model(model) # column - renderer = gtk.CellRendererText() - self.accounts_treeview.insert_column_with_attributes(-1, _('Name'), - renderer, text=0) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn() + col.set_title(_('Name')) + col.pack_start(renderer, False) + col.add_attribute(renderer, 'text', 0) + self.accounts_treeview.insert_column(col, -1) self.current_account = None # When we fill info, we don't want to handle the changed signals @@ -1582,13 +1587,13 @@ class AccountsWindow: self.xml.get_object('close_button').grab_focus() def on_accounts_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.check_resend_relog() self.window.destroy() def select_account(self, account): model = self.accounts_treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: acct = model[iter_][0].decode('utf-8') if account == acct: @@ -1610,7 +1615,7 @@ class AccountsWindow: model.set(iter_, 0, account) self.selection = self.accounts_treeview.get_selection() - self.selection.select_iter(model.get_iter_root()) + self.selection.select_iter(model.get_iter_first()) def resend(self, account): if not account in gajim.connections: @@ -1643,7 +1648,7 @@ class AccountsWindow: status_before = gajim.connections[account].status gajim.interface.roster.send_status(account, 'offline', _('Be right back.')) - gobject.timeout_add(500, login, account, show_before, status_before) + GObject.timeout_add(500, login, account, show_before, status_before) def on_yes(checked, account): relog(account) @@ -1667,11 +1672,14 @@ class AccountsWindow: Activate modify buttons when a row is selected, update accounts info """ sel = self.accounts_treeview.get_selection() - (model, iter_) = sel.get_selected() - if iter_: - account = model[iter_][0].decode('utf-8') + if sel: + (model, iter_) = sel.get_selected() + if iter_: + account = model[iter_][0].decode('utf-8') + else: + account = None else: - account = None + iter_ = account = None if self.current_account and self.current_account == account: # We're comming back to our current account, no need to update widgets return @@ -1738,7 +1746,7 @@ class AccountsWindow: if not our_proxy: our_proxy = _('None') proxy_combobox = self.xml.get_object('proxies_combobox1') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) proxy_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) @@ -2141,7 +2149,7 @@ class AccountsWindow: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) - gobject.idle_add(lambda: widget.grab_focus()) + GObject.idle_add(lambda: widget.grab_focus()) return True jid_splited = jid.split('@', 1) @@ -2151,7 +2159,7 @@ class AccountsWindow: pritext = _('Invalid Jabber ID') sectext = _('A Jabber ID must be in the form "user@servername".') dialogs.ErrorDialog(pritext, sectext) - gobject.idle_add(lambda: widget.grab_focus()) + GObject.idle_add(lambda: widget.grab_focus()) return True @@ -2218,7 +2226,7 @@ class AccountsWindow: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) - gobject.idle_add(lambda: widget.grab_focus()) + GObject.idle_add(lambda: widget.grab_focus()) return True if self.option_changed('resource', resource): @@ -2374,7 +2382,7 @@ class AccountsWindow: if not widget.is_focus(): dialogs.ErrorDialog(_('Invalid entry'), _('Custom port must be a port number.')) - gobject.idle_add(lambda: widget.grab_focus()) + GObject.idle_add(lambda: widget.grab_focus()) return True if self.option_changed('custom_port', custom_port): self.need_relogin = True @@ -2662,14 +2670,14 @@ class AccountsWindow: gajim.config.set_per('accounts', self.current_account, 'zeroconf_email', email) -class FakeDataForm(gtk.Table, object): +class FakeDataForm(Gtk.Table, object): """ Class for forms that are in XML format value1 infos in a table {entry1: value1} """ def __init__(self, infos): - gtk.Table.__init__(self) + GObject.GObject.__init__(self) self.infos = infos self.entries = {} self._draw_table() @@ -2682,7 +2690,7 @@ class FakeDataForm(gtk.Table, object): if 'instructions' in self.infos: nbrow = 1 self.resize(rows = nbrow, columns = 2) - label = gtk.Label(self.infos['instructions']) + label = Gtk.Label(label=self.infos['instructions']) self.attach(label, 0, 2, 0, 1, 0, 0, 0, 0) for name in self.infos.keys(): if name in ('key', 'instructions', 'x', 'registered'): @@ -2692,9 +2700,9 @@ class FakeDataForm(gtk.Table, object): nbrow = nbrow + 1 self.resize(rows = nbrow, columns = 2) - label = gtk.Label(name.capitalize() + ':') + label = Gtk.Label(label=name.capitalize() + ':') self.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) - entry = gtk.Entry() + entry = Gtk.Entry() entry.set_activates_default(True) if self.infos[name]: entry.set_text(self.infos[name]) @@ -2722,7 +2730,7 @@ class ServiceRegistrationWindow: self.is_form = is_form self.xml = gtkgui_helpers.get_gtk_builder('service_registration_window.ui') self.window = self.xml.get_object('service_registration_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) if self.is_form: dataform = dataforms.ExtendForm(node = infos) self.data_form_widget = dataforms_widget.DataFormWidget(dataform) @@ -2777,7 +2785,7 @@ class GroupchatConfigWindow: self.xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'data_form_window') self.window = self.xml.get_object('data_form_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) if self.form: config_vbox = self.xml.get_object('config_vbox') @@ -2786,7 +2794,7 @@ class GroupchatConfigWindow: # widget sw = self.data_form_widget.xml.get_object( 'single_form_scrolledwindow') - sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) + sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) if self.form.title: self.xml.get_object('title_label').set_text(self.form.title) else: @@ -2794,7 +2802,7 @@ class GroupchatConfigWindow: self.xml.get_object('title_hseparator').hide() self.data_form_widget.show() - config_vbox.pack_start(self.data_form_widget) + config_vbox.pack_start(self.data_form_widget, True, True, 0) else: self.xml.get_object('title_label').set_no_show_all(True) self.xml.get_object('title_label').hide() @@ -2808,67 +2816,67 @@ class GroupchatConfigWindow: for affiliation in self.affiliation_labels.keys(): self.start_users_dict[affiliation] = {} - hbox = gtk.HBox(spacing=5) - add_on_vbox.pack_start(hbox, False) + hbox = Gtk.HBox(spacing=5) + add_on_vbox.pack_start(hbox, False, True, 0) - label = gtk.Label(self.affiliation_labels[affiliation]) - hbox.pack_start(label, False) + label = Gtk.Label(label=self.affiliation_labels[affiliation]) + hbox.pack_start(label, False, True, 0) - bb = gtk.HButtonBox() - bb.set_layout(gtk.BUTTONBOX_END) + bb = Gtk.HButtonBox() + bb.set_layout(Gtk.ButtonBoxStyle.END) bb.set_spacing(5) - hbox.pack_start(bb) - add_button = gtk.Button(stock=gtk.STOCK_ADD) + hbox.pack_start(bb, True, True, 0) + add_button = Gtk.Button(stock=Gtk.STOCK_ADD) add_button.connect('clicked', self.on_add_button_clicked, affiliation) - bb.pack_start(add_button) - self.remove_button[affiliation] = gtk.Button(stock=gtk.STOCK_REMOVE) + bb.pack_start(add_button, True, True, 0) + self.remove_button[affiliation] = Gtk.Button(stock=Gtk.STOCK_REMOVE) self.remove_button[affiliation].set_sensitive(False) self.remove_button[affiliation].connect('clicked', self.on_remove_button_clicked, affiliation) - bb.pack_start(self.remove_button[affiliation]) + bb.pack_start(self.remove_button[affiliation], True, True, 0) # jid, reason, nick, role - liststore = gtk.ListStore(str, str, str, str) - self.affiliation_treeview[affiliation] = gtk.TreeView(liststore) + liststore = Gtk.ListStore(str, str, str, str) + self.affiliation_treeview[affiliation] = Gtk.TreeView(liststore) self.affiliation_treeview[affiliation].get_selection().set_mode( - gtk.SELECTION_MULTIPLE) + Gtk.SelectionMode.MULTIPLE) self.affiliation_treeview[affiliation].connect('cursor-changed', self.on_affiliation_treeview_cursor_changed, affiliation) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('JID'), renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('JID'), renderer) col.add_attribute(renderer, 'text', 0) col.set_resizable(True) col.set_sort_column_id(0) self.affiliation_treeview[affiliation].append_column(col) if affiliation == 'outcast': - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', self.on_cell_edited) - col = gtk.TreeViewColumn(_('Reason'), renderer) + col = Gtk.TreeViewColumn(_('Reason'), renderer) col.add_attribute(renderer, 'text', 1) col.set_resizable(True) col.set_sort_column_id(1) self.affiliation_treeview[affiliation].append_column(col) elif affiliation == 'member': - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Nick'), renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Nick'), renderer) col.add_attribute(renderer, 'text', 2) col.set_resizable(True) col.set_sort_column_id(2) self.affiliation_treeview[affiliation].append_column(col) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Role'), renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Role'), renderer) col.add_attribute(renderer, 'text', 3) col.set_resizable(True) col.set_sort_column_id(3) self.affiliation_treeview[affiliation].append_column(col) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) sw.add(self.affiliation_treeview[affiliation]) - add_on_vbox.pack_start(sw) + add_on_vbox.pack_start(sw, True, True, 0) gajim.connections[self.account].get_affiliation_list(self.room_jid, affiliation) @@ -2917,7 +2925,7 @@ class GroupchatConfigWindow: model, paths = selection.get_selected_rows() row_refs = [] for path in paths: - row_refs.append(gtk.TreeRowReference(model, path)) + row_refs.append(Gtk.TreeRowReference(model, path)) for row_ref in row_refs: path = row_ref.get_path() iter_ = model.get_iter(path) @@ -2996,7 +3004,7 @@ class RemoveAccountWindow: self.account = account xml = gtkgui_helpers.get_gtk_builder('remove_account_window.ui') self.window = xml.get_object('remove_account_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.remove_and_unregister_radiobutton = xml.get_object( 'remove_and_unregister_radiobutton') self.window.set_title(_('Removing %s account') % self.account) @@ -3103,12 +3111,12 @@ class ManageBookmarksWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_bookmarks_window.ui') self.window = self.xml.get_object('manage_bookmarks_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) # Account-JID, RoomName, Room-JID, Autojoin, Minimize, Passowrd, Nick, # Show_Status - self.treestore = gtk.TreeStore(str, str, str, bool, bool, str, str, str) - self.treestore.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.treestore = Gtk.TreeStore(str, str, str, bool, bool, str, str, str) + self.treestore.set_sort_column_id(1, Gtk.SortType.ASCENDING) # Store bookmarks in treeview. for account in gajim.connections: @@ -3149,7 +3157,7 @@ class ManageBookmarksWindow: print_status ]) self.print_status_combobox = self.xml.get_object('print_status_combobox') - model = gtk.ListStore(str, str) + model = Gtk.ListStore(str, str) self.option_list = {'': _('Default'), 'all': Q_('?print_status:All'), 'in_and_out': _('Enter and leave only'), @@ -3165,8 +3173,8 @@ class ManageBookmarksWindow: self.view.set_model(self.treestore) self.view.expand_all() - renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Bookmarks', renderer, text=1) + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn('Bookmarks', renderer, text=1) self.view.append_column(column) self.selection = self.view.get_selection() @@ -3189,7 +3197,7 @@ class ManageBookmarksWindow: self.xml.connect_signals(self) self.window.show_all() # select root iter - self.selection.select_iter(self.treestore.get_iter_root()) + self.selection.select_iter(self.treestore.get_iter_first()) def on_add_bookmark_button_clicked(self, widget): """ @@ -3456,39 +3464,23 @@ class AccountCreationWizardWindow: self.window = self.xml.get_object('account_creation_wizard_window') self.window.set_transient_for(gajim.interface.roster.window) - completion = gtk.EntryCompletion() - completion1 = gtk.EntryCompletion() - # Connect events from comboboxentry.child + # Connect events from comboboxentry.get_child() server_comboboxentry = self.xml.get_object('server_comboboxentry') - entry = server_comboboxentry.child + entry = server_comboboxentry.get_child() entry.connect('key_press_event', self.on_server_comboboxentry_key_press_event, server_comboboxentry) - entry.set_completion(completion) # Do the same for the other server comboboxentry server_comboboxentry1 = self.xml.get_object('server_comboboxentry1') - entry = server_comboboxentry1.child - entry.set_completion(completion1) self.update_proxy_list() # parse servers.xml servers_xml = os.path.join(gajim.DATA_DIR, 'other', 'servers.xml') servers = gtkgui_helpers.parse_server_xml(servers_xml) - servers_model = gtk.ListStore(str) + servers_model = self.xml.get_object('server_liststore') for server in servers: servers_model.append((server,)) - completion.set_model(servers_model) - completion.set_text_column(0) - completion1.set_model(servers_model) - completion1.set_text_column(0) - - # Put servers into comboboxentries - server_comboboxentry.set_model(servers_model) - server_comboboxentry.set_text_column(0) - server_comboboxentry1.set_model(servers_model) - server_comboboxentry1.set_text_column(0) - # Generic widgets self.notebook = self.xml.get_object('notebook') self.cancel_button = self.xml.get_object('cancel_button') @@ -3597,7 +3589,7 @@ class AccountCreationWizardWindow: self.go_online_checkbutton.show() img = self.xml.get_object('finish_image') if self.modify: - img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG) + img.set_from_stock(Gtk.STOCK_APPLY, Gtk.IconSize.DIALOG) else: path_to_file = gtkgui_helpers.get_icon_path('gajim', 48) img.set_from_file(path_to_file) @@ -3630,7 +3622,7 @@ class AccountCreationWizardWindow: 'You must provide a username to configure this account.') dialogs.ErrorDialog(pritext, sectext) return - server = self.xml.get_object('server_comboboxentry').child.\ + server = self.xml.get_object('server_comboboxentry').get_child().\ get_text().decode('utf-8').strip() savepass = self.xml.get_object('save_password_checkbutton').\ get_active() @@ -3664,7 +3656,7 @@ class AccountCreationWizardWindow: self.show_finish_page() elif cur_page == 2: # We are creating a new account - server = self.xml.get_object('server_comboboxentry1').child.\ + server = self.xml.get_object('server_comboboxentry1').get_child().\ get_text().decode('utf-8') if not server: @@ -3707,7 +3699,7 @@ class AccountCreationWizardWindow: self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GObject.timeout_add(100, self.update_progressbar) # Get form from serveur con = connection.Connection(self.account) @@ -3749,12 +3741,12 @@ class AccountCreationWizardWindow: self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GObject.timeout_add(100, self.update_progressbar) def update_proxy_list(self): proxies_combobox = self.xml.get_object('proxies_combobox') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) proxies_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) @@ -3785,7 +3777,7 @@ class AccountCreationWizardWindow: if obj.conn.name != self.account: return if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) self.back_button.show() self.forward_button.show() self.is_form = obj.is_form @@ -3802,7 +3794,7 @@ class AccountCreationWizardWindow: empty_config = False break self.data_form_widget.show_all() - self.xml.get_object('form_vbox').pack_start(self.data_form_widget) + self.xml.get_object('form_vbox').pack_start(self.data_form_widget, True, True, 0) if empty_config: self.forward_button.set_sensitive(False) self.notebook.set_current_page(4) # show form page @@ -3841,7 +3833,7 @@ class AccountCreationWizardWindow: if self.account not in gajim.connections: return if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) del gajim.connections[self.account] if self.account in gajim.config.get_per('accounts'): gajim.config.del_per('accounts', self.account) @@ -3850,7 +3842,7 @@ class AccountCreationWizardWindow: self.go_online_checkbutton.hide() self.show_vcard_checkbutton.hide() img = self.xml.get_object('finish_image') - img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) + img.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.DIALOG) finish_text = '%s\n\n%s' % ( _('An error occurred during account creation'), obj.reason) self.finish_label.set_markup(finish_text) @@ -3867,7 +3859,7 @@ class AccountCreationWizardWindow: self.show_finish_page() if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) def _nec_acc_is_not_ok(self, obj): """ @@ -3884,14 +3876,14 @@ class AccountCreationWizardWindow: if self.account in gajim.config.get_per('accounts'): gajim.config.del_per('accounts', self.account) img = self.xml.get_object('finish_image') - img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) + img.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.DIALOG) finish_text = '%s\n\n%s' % (_( 'An error occurred during account creation'), obj.reason) self.finish_label.set_markup(finish_text) self.notebook.set_current_page(6) # show finish page if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) def on_advanced_button_clicked(self, widget): if 'accounts' in gajim.interface.instances: @@ -3912,15 +3904,15 @@ class AccountCreationWizardWindow: def on_username_entry_key_press_event(self, widget, event): # Check for pressed @ and jump to combobox if found - if event.keyval == gtk.keysyms.at: + if event.keyval == Gdk.KEY_at: combobox = self.xml.get_object('server_comboboxentry') combobox.grab_focus() - combobox.child.set_position(-1) + combobox.get_child().set_position(-1) return True def on_server_comboboxentry_key_press_event(self, widget, event, combobox): # If backspace is pressed in empty field, return to the nick entry field - backspace = event.keyval == gtk.keysyms.BackSpace + backspace = event.keyval == Gdk.KEY_BackSpace empty = len(combobox.get_active_text()) == 0 if backspace and empty and self.modify: username_entry = self.xml.get_object('username_entry') @@ -4014,7 +4006,7 @@ class ManagePEPServicesWindow: def __init__(self, account): self.xml = gtkgui_helpers.get_gtk_builder('manage_pep_services_window.ui') self.window = self.xml.get_object('manage_pep_services_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.xml.get_object('configure_button').set_sensitive(False) self.xml.get_object('delete_button').set_sensitive(False) self.xml.connect_signals(self) @@ -4049,14 +4041,14 @@ class ManagePEPServicesWindow: def init_services(self): self.treeview = self.xml.get_object('services_treeview') # service, access_model, group - self.treestore = gtk.ListStore(str) + self.treestore = Gtk.ListStore(str) self.treeview.set_model(self.treestore) - col = gtk.TreeViewColumn('Service') + col = Gtk.TreeViewColumn('Service') self.treeview.append_column(col) - cellrenderer_text = gtk.CellRendererText() - col.pack_start(cellrenderer_text) + cellrenderer_text = Gtk.CellRendererText() + col.pack_start(cellrenderer_text, True, True, 0) col.add_attribute(cellrenderer_text, 'text', 0) our_jid = gajim.get_jid_from_account(self.account) @@ -4072,7 +4064,7 @@ class ManagePEPServicesWindow: if jid != gajim.get_jid_from_account(self.account): return model = self.treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: if model[iter_][0] == node: model.remove(iter_) @@ -4124,21 +4116,21 @@ class ManageSoundsWindow: self.sound_tree = self.xml.get_object('sounds_treeview') # active, event ui name, path to sound file, event_config_name - model = gtk.ListStore(bool, str, str, str) + model = Gtk.ListStore(bool, str, str, str) self.sound_tree.set_model(model) - col = gtk.TreeViewColumn(_('Active')) + col = Gtk.TreeViewColumn(_('Active')) self.sound_tree.append_column(col) - renderer = gtk.CellRendererToggle() + renderer = Gtk.CellRendererToggle() renderer.set_property('activatable', True) renderer.connect('toggled', self.sound_toggled_cb) - col.pack_start(renderer) + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, active = 0) - col = gtk.TreeViewColumn(_('Event')) + col = Gtk.TreeViewColumn(_('Event')) self.sound_tree.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 1) self.fill_sound_treeview() @@ -4164,7 +4156,7 @@ class ManageSoundsWindow: def fill_sound_treeview(self): model = self.sound_tree.get_model() model.clear() - model.set_sort_column_id(1, gtk.SORT_ASCENDING) + model.set_sort_column_id(1, Gtk.SortType.ASCENDING) # NOTE: sounds_ui_names MUST have all items of # sounds = gajim.config.get_per('soundevents') as keys diff --git a/src/conversation_textview.py b/src/conversation_textview.py index f7fbbe272..778c4686e 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -29,9 +29,10 @@ from threading import Timer # for smooth scrolling -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject import time import os import tooltips @@ -63,9 +64,9 @@ def is_selection_modified(mark): return False def has_focus(widget): - return widget.flags() & gtk.HAS_FOCUS == gtk.HAS_FOCUS + return widget.flags() & Gtk.HAS_FOCUS == Gtk.HAS_FOCUS -class TextViewImage(gtk.Image): +class TextViewImage(Gtk.Image): def __init__(self, anchor, text): super(TextViewImage, self).__init__() @@ -91,14 +92,14 @@ class TextViewImage(gtk.Image): def get_state(self): parent = self.get_parent() if not parent: - return gtk.STATE_NORMAL + return Gtk.StateType.NORMAL if self._selected: if has_focus(parent): - return gtk.STATE_SELECTED + return Gtk.StateType.SELECTED else: - return gtk.STATE_ACTIVE + return Gtk.StateType.ACTIVE else: - return gtk.STATE_NORMAL + return Gtk.StateType.NORMAL def _update_selected(self): selected = self._get_selected() @@ -149,21 +150,21 @@ class TextViewImage(gtk.Image): def on_expose(self, widget, event): state = self.get_state() - if state != gtk.STATE_NORMAL: + if state != Gtk.StateType.NORMAL: gc = widget.get_style().base_gc[state] area = widget.allocation - widget.window.draw_rectangle(gc, True, area.x, area.y, - area.width, area.height) + widget.get_window(Gtk.TextWindowType.TEXT).draw_rectangle(gc, True, + area.x, area.y, area.width, area.height) return False -class ConversationTextview(gobject.GObject): +class ConversationTextview(GObject.GObject): """ Class for the conversation textview (where user reads already said messages) for chat/groupchat windows """ __gsignals__ = dict( - quote = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, + quote = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, # return value (str, ) # arguments ) @@ -182,7 +183,7 @@ class ConversationTextview(gobject.GObject): If used_in_history_window is True, then we do not show Clear menuitem in context menu """ - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self.used_in_history_window = used_in_history_window self.fc = FuzzyClock() @@ -197,7 +198,7 @@ class ConversationTextview(gobject.GObject): self.tv.set_accepts_tab(True) self.tv.set_editable(False) self.tv.set_cursor_visible(False) - self.tv.set_wrap_mode(gtk.WRAP_WORD_CHAR) + self.tv.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.tv.set_left_margin(2) self.tv.set_right_margin(2) self.handlers = {} @@ -219,8 +220,7 @@ class ConversationTextview(gobject.GObject): self.on_textview_button_press_event) self.handlers[id_] = self.tv - id_ = self.tv.connect('expose-event', - self.on_textview_expose_event) + id_ = self.tv.connect('draw', self.on_textview_draw) self.handlers[id_] = self.tv @@ -228,7 +228,7 @@ class ConversationTextview(gobject.GObject): self.change_cursor = False self.last_time_printout = 0 - font = pango.FontDescription(gajim.config.get('conversation_font')) + font = Pango.FontDescription(gajim.config.get('conversation_font')) self.tv.modify_font(font) buffer_ = self.tv.get_buffer() end_iter = buffer_.get_end_iter() @@ -236,25 +236,25 @@ class ConversationTextview(gobject.GObject): self.tagIn = buffer_.create_tag('incoming') color = gajim.config.get('inmsgcolor') - font = pango.FontDescription(gajim.config.get('inmsgfont')) + font = Pango.FontDescription(gajim.config.get('inmsgfont')) self.tagIn.set_property('foreground', color) self.tagIn.set_property('font-desc', font) self.tagOut = buffer_.create_tag('outgoing') color = gajim.config.get('outmsgcolor') - font = pango.FontDescription(gajim.config.get('outmsgfont')) + font = Pango.FontDescription(gajim.config.get('outmsgfont')) self.tagOut.set_property('foreground', color) self.tagOut.set_property('font-desc', font) self.tagStatus = buffer_.create_tag('status') color = gajim.config.get('statusmsgcolor') - font = pango.FontDescription(gajim.config.get('satusmsgfont')) + font = Pango.FontDescription(gajim.config.get('satusmsgfont')) self.tagStatus.set_property('foreground', color) self.tagStatus.set_property('font-desc', font) self.tagInText = buffer_.create_tag('incomingtxt') color = gajim.config.get('inmsgtxtcolor') - font = pango.FontDescription(gajim.config.get('inmsgtxtfont')) + font = Pango.FontDescription(gajim.config.get('inmsgtxtfont')) if color: self.tagInText.set_property('foreground', color) self.tagInText.set_property('font-desc', font) @@ -262,7 +262,7 @@ class ConversationTextview(gobject.GObject): self.tagOutText = buffer_.create_tag('outgoingtxt') color = gajim.config.get('outmsgtxtcolor') if color: - font = pango.FontDescription(gajim.config.get('outmsgtxtfont')) + font = Pango.FontDescription(gajim.config.get('outmsgtxtfont')) self.tagOutText.set_property('foreground', color) self.tagOutText.set_property('font-desc', font) @@ -276,15 +276,17 @@ class ConversationTextview(gobject.GObject): tag = buffer_.create_tag('marked') color = gajim.config.get('markedmsgcolor') tag.set_property('foreground', color) - tag.set_property('weight', pango.WEIGHT_BOLD) + tag.set_property('weight', Pango.Weight.BOLD) tag = buffer_.create_tag('time_sometimes') tag.set_property('foreground', 'darkgrey') - tag.set_property('scale', pango.SCALE_SMALL) - tag.set_property('justification', gtk.JUSTIFY_CENTER) + #Pango.SCALE_SMALL + tag.set_property('scale', 0.8333333333333) + tag.set_property('justification', Gtk.Justification.CENTER) tag = buffer_.create_tag('small') - tag.set_property('scale', pango.SCALE_SMALL) + #Pango.SCALE_SMALL + tag.set_property('scale', 0.8333333333333) tag = buffer_.create_tag('restored_message') color = gajim.config.get('restored_messages_color') @@ -293,39 +295,39 @@ class ConversationTextview(gobject.GObject): self.tagURL = buffer_.create_tag('url') color = gajim.config.get('urlmsgcolor') self.tagURL.set_property('foreground', color) - self.tagURL.set_property('underline', pango.UNDERLINE_SINGLE) + self.tagURL.set_property('underline', Pango.Underline.SINGLE) id_ = self.tagURL.connect('event', self.hyperlink_handler, 'url') self.handlers[id_] = self.tagURL self.tagMail = buffer_.create_tag('mail') self.tagMail.set_property('foreground', color) - self.tagMail.set_property('underline', pango.UNDERLINE_SINGLE) + self.tagMail.set_property('underline', Pango.Underline.SINGLE) id_ = self.tagMail.connect('event', self.hyperlink_handler, 'mail') self.handlers[id_] = self.tagMail self.tagXMPP = buffer_.create_tag('xmpp') self.tagXMPP.set_property('foreground', color) - self.tagXMPP.set_property('underline', pango.UNDERLINE_SINGLE) + self.tagXMPP.set_property('underline', Pango.Underline.SINGLE) id_ = self.tagXMPP.connect('event', self.hyperlink_handler, 'xmpp') self.handlers[id_] = self.tagXMPP self.tagSthAtSth = buffer_.create_tag('sth_at_sth') self.tagSthAtSth.set_property('foreground', color) - self.tagSthAtSth.set_property('underline', pango.UNDERLINE_SINGLE) + self.tagSthAtSth.set_property('underline', Pango.Underline.SINGLE) id_ = self.tagSthAtSth.connect('event', self.hyperlink_handler, 'sth_at_sth') self.handlers[id_] = self.tagSthAtSth tag = buffer_.create_tag('bold') - tag.set_property('weight', pango.WEIGHT_BOLD) + tag.set_property('weight', Pango.Weight.BOLD) tag = buffer_.create_tag('italic') - tag.set_property('style', pango.STYLE_ITALIC) + tag.set_property('style', Pango.Style.ITALIC) tag = buffer_.create_tag('underline') - tag.set_property('underline', pango.UNDERLINE_SINGLE) + tag.set_property('underline', Pango.Underline.SINGLE) - buffer_.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER) + buffer_.create_tag('focus-out-line', justification = Gtk.Justification.CENTER) self.displaymarking_tags = {} tag = buffer_.create_tag('xep0184-warning') @@ -378,7 +380,7 @@ class ConversationTextview(gobject.GObject): if not parent: return False vadj = parent.get_vadjustment() - max_val = vadj.upper - vadj.page_size + 1 + max_val = vadj.get_upper() - vadj.get_page_size() + 1 cur_val = vadj.get_value() # scroll by 1/3rd of remaining distance onethird = cur_val + ((max_val - cur_val) / 3.0) @@ -392,26 +394,26 @@ class ConversationTextview(gobject.GObject): return True def smooth_scroll_timeout(self): - gobject.idle_add(self.do_smooth_scroll_timeout) + GObject.idle_add(self.do_smooth_scroll_timeout) return def do_smooth_scroll_timeout(self): if not self.smooth_id: # we finished scrolling return - gobject.source_remove(self.smooth_id) + GObject.source_remove(self.smooth_id) self.smooth_id = None parent = self.tv.get_parent() if parent: vadj = parent.get_vadjustment() self.auto_scrolling = True - vadj.set_value(vadj.upper - vadj.page_size + 1) + vadj.set_value(vadj.get_upper() - vadj.get_page_size() + 1) self.auto_scrolling = False def smooth_scroll_to_end(self): if None != self.smooth_id: # already scrolling return False - self.smooth_id = gobject.timeout_add(self.SCROLL_DELAY, + self.smooth_id = GObject.timeout_add(self.SCROLL_DELAY, self.smooth_scroll) self.smooth_scroll_timer = Timer(self.MAX_SCROLL_TIME, self.smooth_scroll_timeout) @@ -441,9 +443,9 @@ class ConversationTextview(gobject.GObject): # scroll only if expected end is not visible if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): if use_smooth: - gobject.idle_add(self.smooth_scroll_to_end) + GObject.idle_add(self.smooth_scroll_to_end) else: - gobject.idle_add(self.scroll_to_end_iter) + GObject.idle_add(self.scroll_to_end_iter) def scroll_to_end_iter(self): buffer_ = self.tv.get_buffer() @@ -455,7 +457,7 @@ class ConversationTextview(gobject.GObject): def stop_scrolling(self): if self.smooth_id: - gobject.source_remove(self.smooth_id) + GObject.source_remove(self.smooth_id) self.smooth_id = None self.smooth_scroll_timer.cancel() @@ -491,7 +493,7 @@ class ConversationTextview(gobject.GObject): self.xep0184_shown[id_] = SHOWN return False - gobject.timeout_add_seconds(3, show_it) + GObject.timeout_add_seconds(3, show_it) buffer_.end_user_action() @@ -583,12 +585,12 @@ class ConversationTextview(gobject.GObject): if scroll: # scroll to the end (via idle in case the scrollbar has # appeared) - gobject.idle_add(self.scroll_to_end) + GObject.idle_add(self.scroll_to_end) def show_xep0184_warning_tooltip(self): pointer = self.tv.get_pointer() - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer[0], pointer[1]) + x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, + pointer[1], pointer[2]) tags = self.tv.get_iter_at_location(x, y).get_tags() tag_table = self.tv.get_buffer().get_tag_table() xep0184_warning = False @@ -598,16 +600,16 @@ class ConversationTextview(gobject.GObject): break if xep0184_warning and not self.xep0184_warning_tooltip.win: # check if the current pointer is still over the line - position = self.tv.window.get_origin() + position = self.tv.get_window(Gtk.TextWindowType.TEXT).get_origin() self.xep0184_warning_tooltip.show_tooltip(_('This icon indicates that ' 'this message has not yet\nbeen received by the remote end. ' "If this icon stays\nfor a long time, it's likely the message got " - 'lost.'), 8, position[1] + pointer[1]) + 'lost.'), 8, position[1] + pointer[2]) def show_line_tooltip(self): pointer = self.tv.get_pointer() - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer[0], pointer[1]) + x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, + pointer[0], pointer[2]) tags = self.tv.get_iter_at_location(x, y).get_tags() tag_table = self.tv.get_buffer().get_tag_table() over_line = False @@ -617,12 +619,14 @@ class ConversationTextview(gobject.GObject): break if over_line and not self.line_tooltip.win: # check if the current pointer is still over the line - position = self.tv.window.get_origin() + position = self.tv.get_window(Gtk.TextWindowType.TEXT).get_origin() self.line_tooltip.show_tooltip(_('Text below this line is what has ' 'been said since the\nlast time you paid attention to this group ' - 'chat'), 8, position[1] + pointer[1]) + 'chat'), 8, position[1] + pointer[2]) - def on_textview_expose_event(self, widget, event): + def on_textview_draw(self, widget, ctx): + return + #TODO expalloc = event.area exp_x0 = expalloc.x exp_y0 = expalloc.y @@ -652,13 +656,14 @@ class ConversationTextview(gobject.GObject): """ Change the cursor to a hand when we are over a mail or an url """ - pointer_x, pointer_y = self.tv.window.get_pointer()[0:2] - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer_x, pointer_y) + pointer_x, pointer_y = self.tv.get_window(Gtk.TextWindowType.TEXT).\ + get_pointer()[1:3] + x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, + pointer_x, pointer_y) tags = self.tv.get_iter_at_location(x, y).get_tags() if self.change_cursor: - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.XTERM)) + self.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor.new(Gdk.XTERM)) self.change_cursor = False tag_table = self.tv.get_buffer().get_tag_table() over_line = False @@ -666,8 +671,8 @@ class ConversationTextview(gobject.GObject): for tag in tags: if tag in (tag_table.lookup('url'), tag_table.lookup('mail'), \ tag_table.lookup('xmpp'), tag_table.lookup('sth_at_sth')): - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.HAND2)) + self.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor.new(Gdk.HAND2)) self.change_cursor = True elif tag == tag_table.lookup('focus-out-line'): over_line = True @@ -683,16 +688,16 @@ class ConversationTextview(gobject.GObject): if not xep0184_warning: self.xep0184_warning_tooltip.hide_tooltip() if over_line and not self.line_tooltip.win: - self.line_tooltip.timeout = gobject.timeout_add(500, + self.line_tooltip.timeout = GObject.timeout_add(500, self.show_line_tooltip) - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + self.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) self.change_cursor = True if xep0184_warning and not self.xep0184_warning_tooltip.win: - self.xep0184_warning_tooltip.timeout = gobject.timeout_add(500, + self.xep0184_warning_tooltip.timeout = GObject.timeout_add(500, self.show_xep0184_warning_tooltip) - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + self.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) self.change_cursor = True def clear(self, tv = None): @@ -723,31 +728,31 @@ class ConversationTextview(gobject.GObject): """ separator_menuitem_was_added = False if not self.used_in_history_window: - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() menu.prepend(item) separator_menuitem_was_added = True - item = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + item = Gtk.ImageMenuItem(Gtk.STOCK_CLEAR) menu.prepend(item) id_ = item.connect('activate', self.clear) self.handlers[id_] = item if self.selected_phrase: if not separator_menuitem_was_added: - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() menu.prepend(item) if not self.used_in_history_window: - item = gtk.MenuItem(_('_Quote')) + item = Gtk.MenuItem(_('_Quote')) id_ = item.connect('activate', self.on_quote) self.handlers[id_] = item menu.prepend(item) _selected_phrase = helpers.reduce_chars_newlines( self.selected_phrase, 25, 2) - item = gtk.MenuItem(_('_Actions for "%s"') % _selected_phrase) + item = Gtk.MenuItem(_('_Actions for "%s"') % _selected_phrase) menu.prepend(item) - submenu = gtk.Menu() + submenu = Gtk.Menu() item.set_submenu(submenu) phrase_for_url = urllib.quote(self.selected_phrase.encode('utf-8')) @@ -758,12 +763,12 @@ class ConversationTextview(gobject.GObject): else: link = 'http://%s.wikipedia.org/wiki/Special:Search?search=%s'\ % (gajim.LANG, phrase_for_url) - item = gtk.MenuItem(_('Read _Wikipedia Article')) + item = Gtk.MenuItem(_('Read _Wikipedia Article')) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) - item = gtk.MenuItem(_('Look it up in _Dictionary')) + item = Gtk.MenuItem(_('Look it up in _Dictionary')) dict_link = gajim.config.get('dictionary_url') if dict_link == 'WIKTIONARY': # special link (yeah undocumented but default) @@ -779,7 +784,7 @@ class ConversationTextview(gobject.GObject): else: if dict_link.find('%s') == -1: # we must have %s in the url if not WIKTIONARY - item = gtk.MenuItem(_( + item = Gtk.MenuItem(_( 'Dictionary URL is missing an "%s" and it is not WIKTIONARY')) item.set_property('sensitive', False) else: @@ -793,16 +798,16 @@ class ConversationTextview(gobject.GObject): search_link = gajim.config.get('search_engine') if search_link.find('%s') == -1: # we must have %s in the url - item = gtk.MenuItem(_('Web Search URL is missing an "%s"')) + item = Gtk.MenuItem(_('Web Search URL is missing an "%s"')) item.set_property('sensitive', False) else: - item = gtk.MenuItem(_('Web _Search for it')) + item = Gtk.MenuItem(_('Web _Search for it')) link = search_link % phrase_for_url id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) - item = gtk.MenuItem(_('Open as _Link')) + item = Gtk.MenuItem(_('Open as _Link')) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) @@ -820,7 +825,7 @@ class ConversationTextview(gobject.GObject): if event.button != 3: # if not right click return False - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, + x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, int(event.x), int(event.y)) iter_ = self.tv.get_iter_at_location(x, y) tags = iter_.get_tags() @@ -840,7 +845,7 @@ class ConversationTextview(gobject.GObject): if return_val: # if sth was selected when we right-clicked # get the selected text start_sel, finish_sel = return_val[0], return_val[1] - self.selected_phrase = buffer_.get_text(start_sel, finish_sel).decode( + self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True).decode( 'utf-8') elif ord(iter_.get_char()) > 31: # we clicked on a word, do as if it's selected for context menu @@ -850,14 +855,14 @@ class ConversationTextview(gobject.GObject): finish_sel = iter_.copy() if not finish_sel.ends_word(): finish_sel.forward_word_end() - self.selected_phrase = buffer_.get_text(start_sel, finish_sel).decode( + self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True).decode( 'utf-8') def on_open_link_activate(self, widget, kind, text): helpers.launch_browser_mailer(kind, text) def on_copy_link_activate(self, widget, text): - clip = gtk.clipboard_get() + clip = Gtk.clipboard_get() clip.set_text(text) def on_start_chat_activate(self, widget, jid): @@ -943,7 +948,7 @@ class ConversationTextview(gobject.GObject): menu.popup(None, None, None, event.button, event.time) def hyperlink_handler(self, texttag, widget, event, iter_, kind): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: begin_iter = iter_.copy() # we get the begining of the tag while not begin_iter.begins_tag(texttag): @@ -964,7 +969,7 @@ class ConversationTextview(gobject.GObject): # it's a JID or mail kind = 'sth_at_sth' else: - word = self.tv.get_buffer().get_text(begin_iter, end_iter).decode( + word = self.tv.get_buffer().get_text(begin_iter, end_iter, True).decode( 'utf-8') if event.button == 3: # right click @@ -997,9 +1002,9 @@ class ConversationTextview(gobject.GObject): insert_tags_func = buffer_.insert_with_tags_by_name # detect_and_print_special_text() is also used by - # HtmlHandler.handle_specials() and there tags is gtk.TextTag objects, + # HtmlHandler.handle_specials() and there tags is Gtk.TextTag objects, # not strings - if other_tags and isinstance(other_tags[0], gtk.TextTag): + if other_tags and isinstance(other_tags[0], Gtk.TextTag): insert_tags_func = buffer_.insert_with_tags index = 0 @@ -1083,7 +1088,7 @@ class ConversationTextview(gobject.GObject): img = TextViewImage(anchor, special_text) animations = gajim.interface.emoticons_animations if not emot_ascii in animations: - animations[emot_ascii] = gtk.gdk.PixbufAnimation( + animations[emot_ascii] = GdkPixbuf.PixbufAnimation( gajim.interface.emoticons[emot_ascii]) img.set_from_animation(animations[emot_ascii]) img.show() @@ -1152,7 +1157,7 @@ class ConversationTextview(gobject.GObject): if use_other_tags: end_iter = buffer_.get_end_iter() insert_tags_func = buffer_.insert_with_tags_by_name - if other_tags and isinstance(other_tags[0], gtk.TextTag): + if other_tags and isinstance(other_tags[0], Gtk.TextTag): insert_tags_func = buffer_.insert_with_tags insert_tags_func(end_iter, special_text, *other_tags) @@ -1277,9 +1282,9 @@ class ConversationTextview(gobject.GObject): # we are at the end or we are sending something # scroll to the end (via idle in case the scrollbar has appeared) if gajim.config.get('use_smooth_scrolling'): - gobject.idle_add(self.smooth_scroll_to_end) + GObject.idle_add(self.smooth_scroll_to_end) else: - gobject.idle_add(self.scroll_to_end) + GObject.idle_add(self.scroll_to_end) self.just_cleared = False buffer_.end_user_action() diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 3702cbdcc..cf35d0ebb 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -25,8 +25,9 @@ Words single and multiple refers here to types of data forms: single means these with one record of data (without element), multiple - these which may contain more data (with element).''' -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GObject import base64 import gtkgui_helpers @@ -37,19 +38,19 @@ from common import helpers import itertools -class DataFormWidget(gtk.Alignment, object): +class DataFormWidget(Gtk.Alignment, object): # "public" interface """ Data Form widget. Use like any other widget """ __gsignals__ = dict( - validated = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, ()) + validated = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) ) def __init__(self, dataformnode=None): ''' Create a widget. ''' - gtk.Alignment.__init__(self, xscale=1.0, yscale=1.0) + GObject.GObject.__init__(self, xscale=1.0, yscale=1.0) self._data_form = None self.selectable = False @@ -71,7 +72,7 @@ class DataFormWidget(gtk.Alignment, object): selection = self.records_treeview.get_selection() selection.connect('changed', self.on_records_selection_changed) - selection.set_mode(gtk.SELECTION_MULTIPLE) + selection.set_mode(Gtk.SelectionMode.MULTIPLE) def on_data_form_vbox_key_press_event(self, widget, event): print 'key pressed' @@ -189,7 +190,7 @@ class DataFormWidget(gtk.Alignment, object): fieldtypes.append(str) fieldvars.append(field.var) - self.multiplemodel = gtk.ListStore(*fieldtypes) + self.multiplemodel = Gtk.ListStore(*fieldtypes) # moving all data to model for item in self._data_form.iter_records(): @@ -203,7 +204,7 @@ class DataFormWidget(gtk.Alignment, object): for field, counter in zip(self._data_form.reported.iter_fields(), itertools.count()): self.records_treeview.append_column( - gtk.TreeViewColumn(field.label, gtk.CellRendererText(), + Gtk.TreeViewColumn(field.label, Gtk.CellRendererText(), text=counter)) self.records_treeview.set_model(self.multiplemodel) @@ -277,7 +278,7 @@ class DataFormWidget(gtk.Alignment, object): model, rowrefs = selection.get_selected_rows() # rowref is a list of paths for i in xrange(len(rowrefs)): - rowrefs[i] = gtk.TreeRowReference(model, rowrefs[i]) + rowrefs[i] = Gtk.TreeRowReference(model, rowrefs[i]) # rowref is a list of row references; need to convert because we will # modify the model, paths would change for rowref in rowrefs: @@ -305,7 +306,7 @@ class DataFormWidget(gtk.Alignment, object): def on_records_selection_changed(self, widget): self.refresh_multiple_buttons() -class SingleForm(gtk.Table, object): +class SingleForm(Gtk.Table, object): """ Widget that represent DATAFORM_SINGLE mode form. Because this is used not only to display single forms, but to form input windows of multiple-type @@ -313,13 +314,13 @@ class SingleForm(gtk.Table, object): """ __gsignals__ = dict( - validated = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, ()) + validated = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) ) def __init__(self, dataform, selectable=False): assert isinstance(dataform, dataforms.SimpleDataForm) - gtk.Table.__init__(self) + GObject.GObject.__init__(self) self.set_col_spacings(12) self.set_row_spacings(6) @@ -330,8 +331,8 @@ class SingleForm(gtk.Table, object): widget """ if field.description != '': - if widget.flags() & gtk.NO_WINDOW: - evbox = gtk.EventBox() + if widget.flags() & Gtk.NO_WINDOW: + evbox = Gtk.EventBox() evbox.add(widget) widget = evbox widget.set_tooltip_text(field.description) @@ -356,7 +357,7 @@ class SingleForm(gtk.Table, object): if field.type_ == 'boolean': commonlabelcenter = True - widget = gtk.CheckButton() + widget = Gtk.CheckButton() widget.connect('toggled', self.on_boolean_checkbutton_toggled, field) widget.set_active(field.value) @@ -369,23 +370,23 @@ class SingleForm(gtk.Table, object): leftattach = 0 commonwidget = False - widget = gtk.Label(field.value) + widget = Gtk.Label(label=field.value) widget.set_property('selectable', selectable) widget.set_line_wrap(True) self.attach(widget, leftattach, rightattach, linecounter, - linecounter+1, xoptions=gtk.FILL, yoptions=gtk.FILL) + linecounter+1, xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) elif field.type_ == 'list-single': # TODO: What if we have radio buttons and non-required field? # TODO: We cannot deactivate them all... if len(field.options) < 6: # 5 option max: show radiobutton - widget = gtk.VBox() + widget = Gtk.VBox() first_radio = None for value, label in field.iter_options(): if not label: label = value - radio = gtk.RadioButton(first_radio, label=label) + radio = Gtk.RadioButton(first_radio, label=label) radio.connect('toggled', self.on_list_single_radiobutton_toggled, field, value) if first_radio is None: @@ -394,7 +395,7 @@ class SingleForm(gtk.Table, object): field.value = value if value == field.value: radio.set_active(True) - widget.pack_start(radio, expand=False) + widget.pack_start(radio, False, True, 0) else: # more than 5 options: show combobox def on_list_single_combobox_changed(combobox, f): @@ -413,13 +414,13 @@ class SingleForm(gtk.Table, object): # TODO: When more than few choices, make a list if len(field.options) < 6: # 5 option max: show checkbutton - widget = gtk.VBox() + widget = Gtk.VBox() for value, label in field.iter_options(): - check = gtk.CheckButton(label, use_underline=False) + check = Gtk.CheckButton(label, use_underline=False) check.set_active(value in field.values) check.connect('toggled', self.on_list_multi_checkbutton_toggled, field, value) - widget.pack_start(check, expand=False) + widget.pack_start(check, False, True, 0) widget.set_sensitive(readwrite) else: # more than 5 options: show combobox @@ -429,8 +430,8 @@ class SingleForm(gtk.Table, object): vals = [] selection.selected_foreach(for_selected) field.values = vals[:] - widget = gtk.ScrolledWindow() - widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + widget = Gtk.ScrolledWindow() + widget.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) tv = gtkgui_helpers.create_list_multi(field.options, field.values) widget.add(tv) @@ -440,7 +441,7 @@ class SingleForm(gtk.Table, object): tv.set_sensitive(readwrite) elif field.type_ == 'jid-single': - widget = gtk.Entry() + widget = Gtk.Entry() widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_text(field.value) @@ -452,20 +453,20 @@ class SingleForm(gtk.Table, object): widget = xml.get_object('multiple_form_hbox') treeview = xml.get_object('records_treeview') - listmodel = gtk.ListStore(str) + listmodel = Gtk.ListStore(str) for value in field.iter_values(): # nobody will create several megabytes long stanza listmodel.insert(999999, (value,)) treeview.set_model(listmodel) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', self.on_jid_multi_cellrenderertext_edited, treeview, listmodel, field) - treeview.append_column(gtk.TreeViewColumn(None, renderer, + treeview.append_column(Gtk.TreeViewColumn(None, renderer, text=0)) decorate_with_tooltip(treeview, field) @@ -495,7 +496,7 @@ class SingleForm(gtk.Table, object): elif field.type_ == 'text-private': commonlabelcenter = True - widget = gtk.Entry() + widget = Gtk.Entry() widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_visibility(False) widget.set_text(field.value) @@ -504,8 +505,8 @@ class SingleForm(gtk.Table, object): # TODO: bigger text view commonwidget = False - textwidget = gtk.TextView() - textwidget.set_wrap_mode(gtk.WRAP_WORD) + textwidget = Gtk.TextView() + textwidget.set_wrap_mode(Gtk.WrapMode.WORD) textwidget.get_buffer().connect('changed', self.on_text_multi_textbuffer_changed, field) textwidget.get_buffer().set_text(field.value) @@ -517,7 +518,7 @@ class SingleForm(gtk.Table, object): else: textwidget.set_sensitive(False) - widget = gtk.ScrolledWindow() + widget = Gtk.ScrolledWindow() widget.add(textwidget) widget=decorate_with_tooltip(widget, field) @@ -529,10 +530,10 @@ class SingleForm(gtk.Table, object): # should handle it as text-single commonlabelcenter = True if readwrite: - widget = gtk.Entry() + widget = Gtk.Entry() def kpe(widget, event): - if event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: + if event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: self.emit('validated') widget.connect('key-press-event', kpe) widget.connect('changed', self.on_text_single_entry_changed, @@ -543,52 +544,52 @@ class SingleForm(gtk.Table, object): widget.set_text(field.value) else: commonwidget=False - widget = gtk.Label(field.value) + widget = Gtk.Label(label=field.value) widget.set_property('selectable', selectable) widget.set_sensitive(True) widget.set_alignment(0.0, 0.5) widget=decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1, - yoptions=gtk.FILL) + yoptions=Gtk.AttachOptions.FILL) if commonlabel and field.label is not None: - label = gtk.Label(field.label) + label = Gtk.Label(label=field.label) if commonlabelcenter: label.set_alignment(0.0, 0.5) else: label.set_alignment(0.0, 0.0) label = decorate_with_tooltip(label, field) self.attach(label, 0, 1, linecounter, linecounter+1, - xoptions=gtk.FILL, yoptions=gtk.FILL) + xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) if field.media is not None: for uri in field.media.uris: if uri.type_.startswith('image/'): try: img_data = base64.decodestring(uri.uri_data) - pixbuf_l = gtk.gdk.PixbufLoader() + pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() - media = gtk.image_new_from_pixbuf(pixbuf_l.\ + media = Gtk.image_new_from_pixbuf(pixbuf_l.\ get_pixbuf()) except Exception: - media = gtk.Label(_('Unable to load image')) + media = Gtk.Label(label=_('Unable to load image')) else: - media = gtk.Label(_('Media type not supported: %s') % \ + media = Gtk.Label(label=_('Media type not supported: %s') % \ uri.type_) linecounter += 1 self.attach(media, 0, 1, linecounter, linecounter+1, - xoptions=gtk.FILL, yoptions=gtk.FILL) + xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) if commonwidget: assert widget is not None widget.set_sensitive(readwrite) widget = decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1, - yoptions=gtk.FILL) + yoptions=Gtk.AttachOptions.FILL) if field.required: - label = gtk.Label('*') + label = Gtk.Label(label='*') label.set_tooltip_text(_('This field is required')) self.attach(label, 2, 3, linecounter, linecounter+1, xoptions=0, yoptions=0) @@ -618,9 +619,8 @@ class SingleForm(gtk.Table, object): field.value = widget.get_text() def on_text_multi_textbuffer_changed(self, widget, field): - field.value = widget.get_text( - widget.get_start_iter(), - widget.get_end_iter()) + field.value = widget.get_text(widget.get_start_iter(), + widget.get_end_iter(), True) def on_jid_multi_cellrenderertext_edited(self, cell, path, newtext, treeview, model, field): @@ -636,7 +636,7 @@ class SingleForm(gtk.Table, object): dialogs.ErrorDialog( _('Jabber ID already in list'), _('The Jabber ID you entered is already in the list. Choose another one.')) - gobject.idle_add(treeview.set_cursor, path) + GObject.idle_add(treeview.set_cursor, path) return model[path][0]=newtext diff --git a/src/dialogs.py b/src/dialogs.py index 2cf0e66f0..d1213df14 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -29,8 +29,9 @@ ## along with Gajim. If not, see . ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GObject import os import gtkgui_helpers @@ -98,7 +99,7 @@ class EditGroupsDialog: contact.name, contact.groups) def on_edit_groups_dialog_response(self, widget, response_id): - if response_id == gtk.RESPONSE_CLOSE: + if response_id == Gtk.ResponseType.CLOSE: self.dialog.destroy() def remove_group(self, group): @@ -133,7 +134,7 @@ class EditGroupsDialog: return # check if it already exists model = self.treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: if model.get_value(iter_, 0).decode('utf-8') == group: return @@ -158,7 +159,7 @@ class EditGroupsDialog: self.remove_group(group) def init_list(self): - store = gtk.ListStore(str, bool, bool) + store = Gtk.ListStore(str, bool, bool) self.treeview.set_model(store) for column in self.treeview.get_columns(): # Clear treeview when re-drawing @@ -195,18 +196,18 @@ class EditGroupsDialog: store.set(iter_, 2, False) else: store.set(iter_, 2, True) - column = gtk.TreeViewColumn(_('Group')) + column = Gtk.TreeViewColumn(_('Group')) column.set_expand(True) self.treeview.append_column(column) - renderer = gtk.CellRendererText() - column.pack_start(renderer) + renderer = Gtk.CellRendererText() + column.pack_start(renderer, True, True, 0) column.set_attributes(renderer, text=0) - column = gtk.TreeViewColumn(_('In the group')) + column = Gtk.TreeViewColumn(_('In the group')) column.set_expand(False) self.treeview.append_column(column) - renderer = gtk.CellRendererToggle() - column.pack_start(renderer) + renderer = Gtk.CellRendererToggle() + column.pack_start(renderer, True, True, 0) renderer.set_property('activatable', True) renderer.connect('toggled', self.group_toggled_cb) column.set_attributes(renderer, active=1, inconsistent=2) @@ -234,7 +235,7 @@ class PassphraseDialog: cancelbutton.connect('clicked', self.on_cancelbutton_clicked) self.xml.connect_signals(self) - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.window.show_all() self.check = bool(checkbuttontext) @@ -284,27 +285,27 @@ class ChooseGPGKeyDialog: xml = gtkgui_helpers.get_gtk_builder('choose_gpg_key_dialog.ui') self.window = xml.get_object('choose_gpg_key_dialog') self.window.set_title(title_text) - self.window.set_transient_for(transient_for) + self.set_transient_for(transient_for) self.keys_treeview = xml.get_object('keys_treeview') prompt_label = xml.get_object('prompt_label') prompt_label.set_text(prompt_text) - model = gtk.ListStore(str, str) + model = Gtk.ListStore(str, str) model.set_sort_func(1, self.sort_keys) - model.set_sort_column_id(1, gtk.SORT_ASCENDING) + model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.keys_treeview.set_model(model) #columns - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col = self.keys_treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, text=0) col.set_sort_column_id(0) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col = self.keys_treeview.insert_column_with_attributes(-1, _('Contact name'), renderer, text=1) col.set_sort_column_id(1) self.keys_treeview.set_search_column(1) self.fill_tree(secret_keys, selected) self.window.connect('response', self.on_dialog_response) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def sort_keys(self, model, iter1, iter2): @@ -321,7 +322,7 @@ class ChooseGPGKeyDialog: def on_dialog_response(self, dialog, response): selection = self.keys_treeview.get_selection() (model, iter_) = selection.get_selected() - if iter_ and response == gtk.RESPONSE_OK: + if iter_ and response == Gtk.ResponseType.OK: keyID = [ model[iter_][0].decode('utf-8'), model[iter_][1].decode('utf-8') ] else: @@ -350,7 +351,7 @@ class ChangeActivityDialog: self.text = text self.xml = gtkgui_helpers.get_gtk_builder('change_activity_dialog.ui') self.window = self.xml.get_object('change_activity_dialog') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.checkbutton = self.xml.get_object('enable_checkbutton') self.notebook = self.xml.get_object('notebook') @@ -372,14 +373,14 @@ class ChangeActivityDialog: act = category + '_other' if group: - rbtns[act] = gtk.RadioButton(group) + rbtns[act] = Gtk.RadioButton(group) else: - rbtns[act] = group = gtk.RadioButton() + rbtns[act] = group = Gtk.RadioButton() - hbox = gtk.HBox(False, 5) - hbox.pack_start(gtkgui_helpers.load_activity_icon(category), False, + hbox = Gtk.HBox(False, 5) + hbox.pack_start(gtkgui_helpers.load_activity_icon(category, True, True, 0), False, False, 0) - lbl = gtk.Label('' + pep.ACTIVITIES[category]['category'] + '') + lbl = Gtk.Label(label='' + pep.ACTIVITIES[category]['category'] + '') lbl.set_use_markup(True) hbox.pack_start(lbl, False, False, 0) rbtns[act].add(hbox) @@ -399,14 +400,14 @@ class ChangeActivityDialog: act = category + '_' + activity if group: - rbtns[act] = gtk.RadioButton(group) + rbtns[act] = Gtk.RadioButton(group) else: - rbtns[act] = group = gtk.RadioButton() + rbtns[act] = group = Gtk.RadioButton() - hbox = gtk.HBox(False, 5) + hbox = Gtk.HBox(False, 5) hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, False, 0) - hbox.pack_start(gtk.Label(pep.ACTIVITIES[category][activity]), + hbox.pack_start(Gtk.Label(pep.ACTIVITIES[category][activity], True, True, 0), False, False, 0) rbtns[act].connect('toggled', self.on_rbtn_toggled, [category, activity]) @@ -435,7 +436,7 @@ class ChangeActivityDialog: self.checkbutton.set_active(False) self.xml.connect_signals(self) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def on_enable_checkbutton_toggled(self, widget): @@ -473,7 +474,7 @@ class ChangeMoodDialog: self.xml = gtkgui_helpers.get_gtk_builder('change_mood_dialog.ui') self.window = self.xml.get_object('change_mood_dialog') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.window.set_title(_('Set Mood')) table = self.xml.get_object('mood_icons_table') @@ -496,10 +497,10 @@ class ChangeMoodDialog: self.MOODS.sort() for mood in self.MOODS: - self.mood_buttons[mood] = gtk.RadioButton(no_mood_button) + self.mood_buttons[mood] = Gtk.RadioButton(no_mood_button) self.mood_buttons[mood].set_mode(False) self.mood_buttons[mood].add(gtkgui_helpers.load_mood_icon(mood)) - self.mood_buttons[mood].set_relief(gtk.RELIEF_NONE) + self.mood_buttons[mood].set_relief(Gtk.ReliefStyle.NONE) self.mood_buttons[mood].set_tooltip_text(pep.MOODS[mood]) self.mood_buttons[mood].connect('clicked', self.on_mood_button_clicked, mood) @@ -523,7 +524,7 @@ class ChangeMoodDialog: self.entry.set_sensitive(False) self.xml.connect_signals(self) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def on_mood_button_clicked(self, widget, data): @@ -559,7 +560,7 @@ class TimeoutDialog: def run_timeout(self): if self.countdown_left > 0: self.countdown() - gobject.timeout_add_seconds(1, self.countdown) + GObject.timeout_add_seconds(1, self.countdown) def on_timeout(): """ @@ -632,11 +633,11 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.preset_messages_dict[msg_name] = opts sorted_keys_list = helpers.get_sorted_keys(self.preset_messages_dict) - self.message_liststore = gtk.ListStore(str) # msg_name + self.message_liststore = Gtk.ListStore(str) # msg_name self.message_combobox = self.xml.get_object('message_combobox') self.message_combobox.set_model(self.message_liststore) - cellrenderertext = gtk.CellRendererText() - self.message_combobox.pack_start(cellrenderertext, True) + cellrenderertext = Gtk.CellRendererText() + self.message_combobox.pack_start(cellrenderertext, True, True, 0) self.message_combobox.add_attribute(cellrenderertext, 'text', 0) for msg_name in sorted_keys_list: self.message_liststore.append((msg_name,)) @@ -658,7 +659,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.xml.connect_signals(self) self.run_timeout() self.dialog.connect('response', self.on_dialog_response) - self.dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.dialog.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.dialog.show_all() def draw_activity(self): @@ -705,12 +706,12 @@ class ChangeStatusMessageDialog(TimeoutDialog): def on_timeout(self): # Prevent GUI freeze when the combobox menu is opened on close self.message_combobox.popdown() - self.dialog.response(gtk.RESPONSE_OK) + self.dialog.response(Gtk.ResponseType.OK) def on_dialog_response(self, dialog, response): - if response == gtk.RESPONSE_OK: + if response == Gtk.ResponseType.OK: beg, end = self.message_buffer.get_bounds() - message = self.message_buffer.get_text(beg, end).decode('utf-8')\ + message = self.message_buffer.get_text(beg, end, True).decode('utf-8')\ .strip() message = helpers.remove_invalid_xml_chars(message) msg = helpers.to_one_line(message) @@ -751,10 +752,10 @@ class ChangeStatusMessageDialog(TimeoutDialog): def on_change_status_message_dialog_key_press_event(self, widget, event): self.countdown_enabled = False - if event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER - if (event.state & gtk.gdk.CONTROL_MASK): - self.dialog.response(gtk.RESPONSE_OK) + if event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: # catch CTRL+ENTER + if (event.get_state() & Gdk.ModifierType.CONTROL_MASK): + self.dialog.response(Gtk.ResponseType.OK) # Stop the event return True @@ -773,7 +774,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.countdown_enabled = False start_iter, finish_iter = self.message_buffer.get_bounds() status_message_to_save_as_preset = self.message_buffer.get_text( - start_iter, finish_iter) + start_iter, finish_iter, True) def on_ok(msg_name): msg_text = status_message_to_save_as_preset.decode('utf-8') msg_text_1l = helpers.to_one_line(msg_text) @@ -912,13 +913,13 @@ class AddNewContactWindow: 'prompt': None} self.available_types.append(type_) # Combobox with transport/jabber icons - liststore = gtk.ListStore(str, gtk.gdk.Pixbuf, str) - cell = gtk.CellRendererPixbuf() - self.protocol_combobox.pack_start(cell, False) + liststore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, str) + cell = Gtk.CellRendererPixbuf() + self.protocol_combobox.pack_start(cell, False, True, 0) self.protocol_combobox.add_attribute(cell, 'pixbuf', 1) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() cell.set_property('xpad', 5) - self.protocol_combobox.pack_start(cell, True) + self.protocol_combobox.pack_start(cell, True, True, 0) self.protocol_combobox.add_attribute(cell, 'text', 0) self.protocol_combobox.set_model(liststore) uf_type = {'jabber': 'Jabber', 'aim': 'AIM', 'gadu-gadu': 'Gadu Gadu', @@ -944,7 +945,7 @@ class AddNewContactWindow: gajim.connections[account].request_gateway_prompt(service) self.protocol_combobox.set_active(0) self.auto_authorize_checkbutton.show() - liststore = gtk.ListStore(str) + liststore = Gtk.ListStore(str) self.protocol_jid_combobox.set_model(liststore) if jid: type_ = gajim.get_transport_name_from_jid(jid) @@ -995,14 +996,14 @@ class AddNewContactWindow: self.group_comboboxentry.set_active(i) i += 1 - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.window.show_all() if self.account: self.account_label.hide() self.account_hbox.hide() else: - liststore = gtk.ListStore(str, str) + liststore = Gtk.ListStore(str, str) for acct in accounts: liststore.append([acct, acct]) self.account_combobox.set_model(liststore) @@ -1035,7 +1036,7 @@ class AddNewContactWindow: gajim.connections[self.account].request_register_agent_info(jid) def on_add_new_contact_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.destroy() def on_cancel_button_clicked(self, widget): @@ -1107,14 +1108,14 @@ class AddNewContactWindow: message_buffer = self.message_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, True).decode('utf-8') if self.save_message_checkbutton.get_active(): msg = helpers.to_one_line(message) gajim.config.set_per('accounts', self.account, 'subscription_request_msg', msg) else: message= '' - group = self.group_comboboxentry.child.get_text().decode('utf-8') + group = self.group_comboboxentry.get_child().get_text().decode('utf-8') groups = [] if group: groups = [group] @@ -1261,7 +1262,7 @@ class AboutDialog: """ def __init__(self): - dlg = gtk.AboutDialog() + dlg = Gtk.AboutDialog() dlg.set_transient_for(gajim.interface.roster.window) dlg.set_name('Gajim') dlg.set_version(gajim.version) @@ -1273,8 +1274,8 @@ class AboutDialog: dlg.set_license(text) dlg.set_comments('%s\n%s %s\n%s %s' % (_('A GTK+ Jabber/XMPP client'), - _('GTK+ Version:'), self.tuple2str(gtk.gtk_version), \ - _('PyGTK Version:'), self.tuple2str(gtk.pygtk_version))) + _('GTK+ Version:'), self.tuple2str(Gtk.gtk_version), \ + _('PyGTK Version:'), self.tuple2str(Gtk.pygtk_version))) dlg.set_website('http://gajim.org/') authors_file_path = self.get_path('AUTHORS') @@ -1319,7 +1320,7 @@ class AboutDialog: dlg.set_artists(artists) # connect close button to destroy() function for button in dlg.action_area.get_children(): - if button.get_property('label') == gtk.STOCK_CLOSE: + if button.get_property('label') == Gtk.STOCK_CLOSE: button.connect('clicked', lambda x:dlg.destroy()) dlg.show_all() @@ -1340,11 +1341,11 @@ class AboutDialog: else: return None -class Dialog(gtk.Dialog): +class Dialog(Gtk.Dialog): def __init__(self, parent, title, buttons, default=None, on_response_ok=None, on_response_cancel=None): - gtk.Dialog.__init__(self, title, parent, - gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR) + GObject.GObject.__init__(self, title, parent, + Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.NO_SEPARATOR) self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel @@ -1352,8 +1353,8 @@ class Dialog(gtk.Dialog): self.vbox.set_spacing(12) self.set_resizable(False) - possible_responses = {gtk.STOCK_OK: self.on_response_ok, - gtk.STOCK_CANCEL: self.on_response_cancel} + possible_responses = {Gtk.STOCK_OK: self.on_response_ok, + Gtk.STOCK_CANCEL: self.on_response_cancel} for stock, response in buttons: b = self.add_button(stock, response) for response in possible_responses: @@ -1390,21 +1391,21 @@ class Dialog(gtk.Dialog): return index < len(buttons) and buttons[index] or None -class HigDialog(gtk.MessageDialog): +class HigDialog(Gtk.MessageDialog): def __init__(self, parent, type_, buttons, pritext, sectext, on_response_ok=None, on_response_cancel=None, on_response_yes=None, on_response_no=None): self.call_cancel_on_destroy = True - gtk.MessageDialog.__init__(self, parent, - gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, + Gtk.MessageDialog.__init__(self, parent, + Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, type_, buttons, message_format = pritext) self.format_secondary_markup(sectext) buttons = self.action_area.get_children() - self.possible_responses = {gtk.STOCK_OK: on_response_ok, - gtk.STOCK_CANCEL: on_response_cancel, gtk.STOCK_YES: on_response_yes, - gtk.STOCK_NO: on_response_no} + self.possible_responses = {Gtk.STOCK_OK: on_response_ok, + Gtk.STOCK_CANCEL: on_response_cancel, Gtk.STOCK_YES: on_response_yes, + Gtk.STOCK_NO: on_response_no} for b in buttons: for response in self.possible_responses: if b.get_label() == response: @@ -1424,7 +1425,7 @@ class HigDialog(gtk.MessageDialog): def on_dialog_destroy(self, widget): if not self.call_cancel_on_destroy: return - cancel_handler = self.possible_responses[gtk.STOCK_CANCEL] + cancel_handler = self.possible_responses[Gtk.STOCK_CANCEL] if not cancel_handler: return False if isinstance(cancel_handler, tuple): @@ -1440,19 +1441,19 @@ class HigDialog(gtk.MessageDialog): Show dialog """ vb = self.get_children()[0].get_children()[0] # Give focus to top vbox - vb.set_flags(gtk.CAN_FOCUS) +# vb.set_flags(Gtk.CAN_FOCUS) vb.grab_focus() self.show_all() -class FileChooserDialog(gtk.FileChooserDialog): +class FileChooserDialog(Gtk.FileChooserDialog): """ - Non-blocking FileChooser Dialog around gtk.FileChooserDialog + Non-blocking FileChooser Dialog around Gtk.FileChooserDialog """ def __init__(self, title_text, action, buttons, default_response, select_multiple=False, current_folder=None, on_response_ok=None, on_response_cancel=None): - gtk.FileChooserDialog.__init__(self, title=title_text, action=action, + GObject.GObject.__init__(self, title=title_text, action=action, buttons=buttons) self.set_default_response(default_response) @@ -1469,7 +1470,7 @@ class FileChooserDialog(gtk.FileChooserDialog): self.show_all() def on_dialog_response(self, dialog, response): - if response in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_CLOSE): + if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.CLOSE): if self.response_cancel: if isinstance(self.response_cancel, tuple): self.response_cancel[0](dialog, *self.response_cancel[1:]) @@ -1477,7 +1478,7 @@ class FileChooserDialog(gtk.FileChooserDialog): self.response_cancel(dialog) else: self.just_destroy(dialog) - elif response == gtk.RESPONSE_OK: + elif response == Gtk.ResponseType.OK: if self.response_ok: if isinstance(self.response_ok, tuple): self.response_ok[0](dialog, *self.response_ok[1:]) @@ -1508,7 +1509,7 @@ class ConfirmationDialog(HigDialog): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel HigDialog.__init__(self, None, - gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, pritext, sectext, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.popup() @@ -1543,8 +1544,8 @@ class NonModalConfirmationDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_modal(False) @@ -1575,8 +1576,8 @@ class WarningDialog(HigDialog): if not transient_for and hasattr(gajim.interface, 'roster') and \ gajim.interface.roster: transient_for = gajim.interface.roster.window - HigDialog.__init__(self, transient_for, gtk.MESSAGE_WARNING, - gtk.BUTTONS_OK, pritext, sectext) + HigDialog.__init__(self, transient_for, Gtk.MessageType.WARNING, + Gtk.ButtonsType.OK, pritext, sectext) self.set_modal(False) self.popup() @@ -1590,7 +1591,7 @@ class InformationDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, + HigDialog.__init__(self, parent, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, pritext, sectext) self.set_modal(False) self.popup() @@ -1606,7 +1607,7 @@ class ErrorDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, + HigDialog.__init__(self, parent, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, pritext, sectext, on_response_ok=on_response_ok, on_response_cancel=on_response_cancel) self.popup() @@ -1617,31 +1618,31 @@ class YesNoDialog(HigDialog): """ def __init__(self, pritext, sectext='', checktext='', text_label=None, - on_response_yes=None, on_response_no=None, type_=gtk.MESSAGE_QUESTION): + on_response_yes=None, on_response_no=None, type_=Gtk.MessageType.QUESTION): self.user_response_yes = on_response_yes self.user_response_no = on_response_no if hasattr(gajim.interface, 'roster') and gajim.interface.roster: parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, type_, gtk.BUTTONS_YES_NO, pritext, + HigDialog.__init__(self, parent, type_, Gtk.ButtonsType.YES_NO, pritext, sectext, on_response_yes=self.on_response_yes, on_response_no=self.on_response_no) if checktext: - self.checkbutton = gtk.CheckButton(checktext) - self.vbox.pack_start(self.checkbutton, expand=False, fill=True) + self.checkbutton = Gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, False, True, 0) else: self.checkbutton = None if text_label: - label = gtk.Label(text_label) - self.vbox.pack_start(label, expand=False, fill=True) - buff = gtk.TextBuffer() - self.textview = gtk.TextView(buff) - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_IN) + label = Gtk.Label(label=text_label) + self.vbox.pack_start(label, False, True, 0) + buff = Gtk.TextBuffer() + self.textview = Gtk.TextView(buff) + frame = Gtk.Frame() + frame.set_shadow_type(Gtk.ShadowType.IN) frame.add(self.textview) - self.vbox.pack_start(frame, expand=False, fill=True) + self.vbox.pack_start(frame, False, True, 0) else: self.textview = None self.set_modal(False) @@ -1652,7 +1653,7 @@ class YesNoDialog(HigDialog): if self.textview: buff = self.textview.get_buffer() start, end = buff.get_bounds() - txt = self.textview.get_buffer().get_text(start, end) + txt = self.textview.get_buffer().get_text(start, end, True) if isinstance(self.user_response_yes, tuple): if self.textview: @@ -1674,7 +1675,7 @@ class YesNoDialog(HigDialog): if self.textview: buff = self.textview.get_buffer() start, end = buff.get_bounds() - txt = self.textview.get_buffer().get_text(start, end) + txt = self.textview.get_buffer().get_text(start, end, True) if isinstance(self.user_response_no, tuple): if self.textview: @@ -1711,17 +1712,17 @@ class ConfirmationDialogCheck(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) - self.set_default_response(gtk.RESPONSE_OK) + self.set_default_response(Gtk.ResponseType.OK) ok_button = self.action_area.get_children()[0] # right to left ok_button.grab_focus() - self.checkbutton = gtk.CheckButton(checktext) - self.vbox.pack_start(self.checkbutton, expand=False, fill=True) + self.checkbutton = Gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, False, True, 0) self.set_modal(is_modal) self.popup() @@ -1766,27 +1767,27 @@ class ConfirmationDialogDoubleCheck(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) - self.set_default_response(gtk.RESPONSE_OK) + self.set_default_response(Gtk.ResponseType.OK) ok_button = self.action_area.get_children()[0] # right to left ok_button.grab_focus() if checktext1: - self.checkbutton1 = gtk.CheckButton(checktext1) + self.checkbutton1 = Gtk.CheckButton(checktext1) if tooltip1: self.checkbutton1.set_tooltip_text(tooltip1) - self.vbox.pack_start(self.checkbutton1, expand=False, fill=True) + self.vbox.pack_start(self.checkbutton1, False, True, 0) else: self.checkbutton1 = None if checktext2: - self.checkbutton2 = gtk.CheckButton(checktext2) + self.checkbutton2 = Gtk.CheckButton(checktext2) if tooltip2: self.checkbutton2.set_tooltip_text(tooltip2) - self.vbox.pack_start(self.checkbutton2, expand=False, fill=True) + self.vbox.pack_start(self.checkbutton2, False, True, 0) else: self.checkbutton2 = None @@ -1838,21 +1839,21 @@ class ConfirmationDialogDoubleRadio(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) - self.set_default_response(gtk.RESPONSE_OK) + self.set_default_response(Gtk.ResponseType.OK) ok_button = self.action_area.get_children()[0] # right to left ok_button.grab_focus() - self.radiobutton1 = gtk.RadioButton(label=radiotext1) - self.vbox.pack_start(self.radiobutton1, expand=False, fill=True) + self.radiobutton1 = Gtk.RadioButton(label=radiotext1) + self.vbox.pack_start(self.radiobutton1, False, True, 0) - self.radiobutton2 = gtk.RadioButton(group=self.radiobutton1, + self.radiobutton2 = Gtk.RadioButton(group=self.radiobutton1, label=radiotext2) - self.vbox.pack_start(self.radiobutton2, expand=False, fill=True) + self.vbox.pack_start(self.radiobutton2, False, True, 0) self.set_modal(is_modal) self.popup() @@ -1899,13 +1900,13 @@ class FTOverwriteConfirmationDialog(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_CANCEL, pritext, sectext) + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.CANCEL, pritext, sectext) self.on_response = on_response if propose_resume: - b = gtk.Button('', gtk.STOCK_REFRESH) + b = Gtk.Button('', Gtk.STOCK_REFRESH) align = b.get_children()[0] hbox = align.get_children()[0] label = hbox.get_children()[1] @@ -1913,7 +1914,7 @@ class FTOverwriteConfirmationDialog(ConfirmationDialog): label.set_use_underline(True) self.add_action_widget(b, 100) - b = gtk.Button('', gtk.STOCK_SAVE_AS) + b = Gtk.Button('', Gtk.STOCK_SAVE_AS) align = b.get_children()[0] hbox = align.get_children()[0] label = hbox.get_children()[1] @@ -2019,8 +2020,8 @@ class InputDialogCheck(InputDialog): self.input_entry.select_region(0, -1) # select all if checktext: - self.checkbutton = gtk.CheckButton(checktext) - self.vbox.pack_start(self.checkbutton, expand=False, fill=True) + self.checkbutton = Gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, False, True, 0) self.checkbutton.show() def on_okbutton_clicked(self, widget): @@ -2156,7 +2157,7 @@ class InputTextDialog(CommonInputDialog): def get_text(self): start_iter, end_iter = self.input_buffer.get_bounds() - return self.input_buffer.get_text(start_iter, end_iter).decode('utf-8') + return self.input_buffer.get_text(start_iter, end_iter, True).decode('utf-8') class DoubleInputDialog: """ @@ -2332,10 +2333,10 @@ class JoinGroupchatWindow: account_combobox = self.xml.get_object('account_combobox') account_label.set_no_show_all(False) account_combobox.set_no_show_all(False) - liststore = gtk.ListStore(str) + liststore = Gtk.ListStore(str) account_combobox.set_model(liststore) - cell = gtk.CellRendererText() - account_combobox.pack_start(cell, True) + cell = Gtk.CellRendererText() + account_combobox.pack_start(cell, True, True, 0) account_combobox.add_attribute(cell, 'text', 0) account_combobox.set_active(-1) @@ -2353,7 +2354,7 @@ class JoinGroupchatWindow: self._empty_required_widgets = [] self.window = self.xml.get_object('join_groupchat_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self._room_jid_entry = self.xml.get_object('room_jid_entry') self._nickname_entry = self.xml.get_object('nickname_entry') self._password_entry = self.xml.get_object('password_entry') @@ -2380,10 +2381,10 @@ class JoinGroupchatWindow: server_list.append(gajim.connections[account].muc_jid['jabber']) self.recently_combobox = self.xml.get_object('recently_combobox') - liststore = gtk.ListStore(str) + liststore = Gtk.ListStore(str) self.recently_combobox.set_model(liststore) - cell = gtk.CellRendererText() - self.recently_combobox.pack_start(cell, True) + cell = Gtk.CellRendererText() + self.recently_combobox.pack_start(cell, True, True, 0) self.recently_combobox.add_attribute(cell, 'text', 0) self.recently_groupchat = gajim.config.get('recently_groupchat').split() for g in self.recently_groupchat: @@ -2427,7 +2428,7 @@ class JoinGroupchatWindow: del gajim.interface.instances[self.account]['join_gc'] def on_join_groupchat_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE widget.destroy() def on_required_entry_changed(self, widget): @@ -2445,7 +2446,7 @@ class JoinGroupchatWindow: room_jid, server = text.split('@', 1) self._room_jid_entry.set_text(room_jid) if server: - self.server_comboboxentry.child.set_text(server) + self.server_comboboxentry.get_child().set_text(server) self.server_comboboxentry.grab_focus() def on_account_combobox_changed(self, widget): @@ -2457,7 +2458,7 @@ class JoinGroupchatWindow: def _set_room_jid(self, room_jid): room, server = gajim.get_name_and_server_from_jid(room_jid) self._room_jid_entry.set_text(room) - self.server_comboboxentry.child.set_text(server) + self.server_comboboxentry.get_child().set_text(server) def on_recently_combobox_changed(self, widget): model = widget.get_model() @@ -2466,7 +2467,7 @@ class JoinGroupchatWindow: self._set_room_jid(room_jid) def on_browse_rooms_button_clicked(self, widget): - server = self.server_comboboxentry.child.get_text().decode('utf-8') + server = self.server_comboboxentry.get_child().get_text().decode('utf-8') if server in gajim.interface.instances[self.account]['disco']: gajim.interface.instances[self.account]['disco'][server].window.\ present() @@ -2503,7 +2504,7 @@ class JoinGroupchatWindow: 'groupchat.')) return nickname = self._nickname_entry.get_text().decode('utf-8') - server = self.server_comboboxentry.child.get_text().decode('utf-8').\ + server = self.server_comboboxentry.get_child().get_text().decode('utf-8').\ strip() room = self._room_jid_entry.get_text().decode('utf-8').strip() room_jid = room + '@' + server @@ -2567,13 +2568,13 @@ class SynchroniseSelectAccountDialog: self.xml = gtkgui_helpers.get_gtk_builder('synchronise_select_account_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_account_dialog') self.accounts_treeview = self.xml.get_object('accounts_treeview') - model = gtk.ListStore(str, str, bool) + model = Gtk.ListStore(str, str, bool) self.accounts_treeview.set_model(model) # columns - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Name'), renderer, text=0) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Server'), renderer, text=1) @@ -2582,7 +2583,7 @@ class SynchroniseSelectAccountDialog: self.dialog.show_all() def on_accounts_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def init_accounts(self): @@ -2629,15 +2630,15 @@ class SynchroniseSelectContactsDialog: 'synchronise_select_contacts_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_contacts_dialog') self.contacts_treeview = self.xml.get_object('contacts_treeview') - model = gtk.ListStore(bool, str) + model = Gtk.ListStore(bool, str) self.contacts_treeview.set_model(model) # columns - renderer1 = gtk.CellRendererToggle() + renderer1 = Gtk.CellRendererToggle() renderer1.set_property('activatable', True) renderer1.connect('toggled', self.toggled_callback) self.contacts_treeview.insert_column_with_attributes(-1, _('Synchronise'), renderer1, active=0) - renderer2 = gtk.CellRendererText() + renderer2 = Gtk.CellRendererText() self.contacts_treeview.insert_column_with_attributes(-1, _('Name'), renderer2, text=1) @@ -2651,7 +2652,7 @@ class SynchroniseSelectContactsDialog: model[iter_][0] = not cell.get_active() def on_contacts_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def init_contacts(self): @@ -2676,7 +2677,7 @@ class SynchroniseSelectContactsDialog: def on_ok_button_clicked(self, widget): model = self.contacts_treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: if model[iter_][0]: # it is selected @@ -2762,7 +2763,7 @@ class ChangePasswordDialog: self.dialog.show_all() def on_dialog_response(self, dialog, response): - if response != gtk.RESPONSE_OK: + if response != Gtk.ResponseType.OK: dialog.destroy() self.on_response(None) return @@ -2788,7 +2789,7 @@ class PopupNotificationWindow: xml = gtkgui_helpers.get_gtk_builder('popup_notification_window.ui') self.window = xml.get_object('popup_notification_window') - self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) + self.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) close_button = xml.get_object('close_button') event_type_label = xml.get_object('event_type_label') event_description_label = xml.get_object('event_description_label') @@ -2802,10 +2803,10 @@ class PopupNotificationWindow: event_type_label.set_markup( '%s' % - gobject.markup_escape_text(title)) + GObject.markup_escape_text(title)) # set colors [ http://www.pitt.edu/~nisg/cis/web/cgi/rgb.html ] - self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('black')) + self.window.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('black')) # default image if not path_to_image: @@ -2831,11 +2832,11 @@ class PopupNotificationWindow: bg_color = gajim.config.get('notif_status_color') else: # Unknown event! Shouldn't happen but deal with it bg_color = gajim.config.get('notif_other_color') - popup_bg_color = gtk.gdk.color_parse(bg_color) - close_button.modify_bg(gtk.STATE_NORMAL, popup_bg_color) - eventbox.modify_bg(gtk.STATE_NORMAL, popup_bg_color) + popup_bg_color = Gdk.color_parse(bg_color) + close_button.modify_bg(Gtk.StateType.NORMAL, popup_bg_color) + eventbox.modify_bg(Gtk.StateType.NORMAL, popup_bg_color) event_description_label.set_markup('%s' % - gobject.markup_escape_text(text)) + GObject.markup_escape_text(text)) # set the image image.set_from_file(path_to_image) @@ -2845,17 +2846,17 @@ class PopupNotificationWindow: gajim.interface.roster.popups_notification_height += self.window_height pos_x = gajim.config.get('notification_position_x') if pos_x < 0: - pos_x = gtk.gdk.screen_width() - window_width + pos_x + 1 + pos_x = Gdk.Screen.width() - window_width + pos_x + 1 pos_y = gajim.config.get('notification_position_y') if pos_y < 0: - pos_y = gtk.gdk.screen_height() - \ + pos_y = Gdk.Screen.height() - \ gajim.interface.roster.popups_notification_height + pos_y + 1 self.window.move(pos_x, pos_y) xml.connect_signals(self) self.window.show_all() if timeout > 0: - gobject.timeout_add_seconds(timeout, self.on_timeout) + GObject.timeout_add_seconds(timeout, self.on_timeout) def on_close_button_clicked(self, widget): self.adjust_height_and_move_popup_notification_windows() @@ -2880,8 +2881,8 @@ class PopupNotificationWindow: current_index += 1 window_width, window_height = window_instance.window.get_size() gajim.interface.roster.popups_notification_height += window_height - window_instance.window.move(gtk.gdk.screen_width() - window_width, - gtk.gdk.screen_height() - \ + window_instance.window.move(Gdk.Screen.width() - window_width, + Gdk.Screen.height() - \ gajim.interface.roster.popups_notification_height) def on_popup_notification_window_button_press_event(self, widget, event): @@ -2965,7 +2966,7 @@ class SingleMessageWindow: lang = gajim.LANG gtkspell.Spell(self.conversation_textview.tv, lang) gtkspell.Spell(self.message_textview, lang) - except (gobject.GError, TypeError, RuntimeError, OSError): + except (GObject.GError, TypeError, RuntimeError, OSError): AspellDictError(lang) self.prepare_widgets_for(self.action) @@ -3053,7 +3054,7 @@ class SingleMessageWindow: self.cancel_button.hide() self.close_button.show() self.message_tv_buffer.set_text(self.message) - gobject.idle_add(self.set_cursor_to_end) + GObject.idle_add(self.set_cursor_to_end) else: # we write a new message (not from reply) self.close_button.hide() if self.to: # do we already have jid? @@ -3137,7 +3138,7 @@ class SingleMessageWindow: subject = self.subject_entry.get_text().decode('utf-8') begin, end = self.message_tv_buffer.get_bounds() - message = self.message_tv_buffer.get_text(begin, end).decode('utf-8') + message = self.message_tv_buffer.get_text(begin, end, True).decode('utf-8') if '/announce/' in to_whom_jid: gajim.connections[self.account].send_motd(to_whom_jid, subject, @@ -3183,7 +3184,7 @@ class SingleMessageWindow: self.window.destroy() def on_single_message_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.save_pos() self.window.destroy() @@ -3225,7 +3226,7 @@ class XMLConsoleWindow: self.xml.get_object('enable_checkbutton').set_active(True) self.input_textview.modify_text( - gtk.STATE_NORMAL, gtk.gdk.color_parse(color)) + Gtk.StateType.NORMAL, Gdk.color_parse(color)) if len(gajim.connections) > 1: title = _('XML Console for %s') % self.account @@ -3332,7 +3333,7 @@ class XMLConsoleWindow: buffer.insert_with_tags_by_name(end_iter, stanza.replace('><', '>\n<') \ + '\n\n', type_) if at_the_end: - gobject.idle_add(self.scroll_to_end) + GObject.idle_add(self.scroll_to_end) def _nec_stanza_received(self, obj): if obj.conn.name != self.account: @@ -3352,7 +3353,7 @@ class XMLConsoleWindow: self.account) return begin_iter, end_iter = self.input_tv_buffer.get_bounds() - stanza = self.input_tv_buffer.get_text(begin_iter, end_iter).decode( + stanza = self.input_tv_buffer.get_text(begin_iter, end_iter, True).decode( 'utf-8') if stanza: gajim.connections[self.account].send_stanza(stanza) @@ -3416,10 +3417,10 @@ class RosterItemExchangeWindow: else: self.body_scrolledwindow.hide() # Treeview - model = gtk.ListStore(bool, str, str, str, str) + model = Gtk.ListStore(bool, str, str, str, str) self.items_list_treeview.set_model(model) # columns - renderer1 = gtk.CellRendererToggle() + renderer1 = Gtk.CellRendererToggle() renderer1.set_property('activatable', True) renderer1.connect('toggled', self.toggled_callback) if self.action == 'add': @@ -3430,13 +3431,13 @@ class RosterItemExchangeWindow: title = _('Delete') self.items_list_treeview.insert_column_with_attributes(-1, title, renderer1, active=0) - renderer2 = gtk.CellRendererText() + renderer2 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Jabber ID'), renderer2, text=1) - renderer3 = gtk.CellRendererText() + renderer3 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Name'), renderer3, text=2) - renderer4 = gtk.CellRendererText() + renderer4 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Groups'), renderer4, text=3) @@ -3537,7 +3538,7 @@ class RosterItemExchangeWindow: def on_accept_button_clicked(self, widget): model = self.items_list_treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() if self.action == 'add': a = 0 while iter_: @@ -3715,7 +3716,7 @@ class ItemArchivingPreferencesWindow: def launch_progressbar(self): self.progressbar.show() - self.update_progressbar_timeout_id = gobject.timeout_add( + self.update_progressbar_timeout_id = GObject.timeout_add( 100, self.update_progressbar) def response_arrived(self, data): @@ -3763,26 +3764,26 @@ class ArchivingPreferencesWindow: self.method_foo_index[gajim.connections[self.account].\ method_manual]) - model = gtk.ListStore(str, str, str, str) + model = Gtk.ListStore(str, str, str, str) self.item_treeview.set_model(model) - col = gtk.TreeViewColumn('jid') + col = Gtk.TreeViewColumn('jid') self.item_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer, True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=0) - col = gtk.TreeViewColumn('expire') - col.pack_start(renderer, True) + col = Gtk.TreeViewColumn('expire') + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=1) self.item_treeview.append_column(col) - col = gtk.TreeViewColumn('otr') - col.pack_start(renderer, True) + col = Gtk.TreeViewColumn('otr') + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=2) self.item_treeview.append_column(col) - col = gtk.TreeViewColumn('save') - col.pack_start(renderer, True) + col = Gtk.TreeViewColumn('save') + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=3) self.item_treeview.append_column(col) @@ -3809,7 +3810,7 @@ class ArchivingPreferencesWindow: # item1 == item2 ? WTF? return 0 - model.set_sort_column_id(0, gtk.SORT_ASCENDING) + model.set_sort_column_id(0, Gtk.SortType.ASCENDING) model.set_sort_func(0, sort_items) self.remove_button.set_sensitive(False) @@ -4015,7 +4016,7 @@ class PrivacyListWindow: self.privacy_lists_title_label.set_label( _('Privacy List %s') % \ - gobject.markup_escape_text(self.privacy_list_name)) + GObject.markup_escape_text(self.privacy_list_name)) if len(gajim.connections) > 1: title = _('Privacy List for %s') % self.account @@ -4029,10 +4030,10 @@ class PrivacyListWindow: self.list_of_rules_combobox.set_sensitive(False) # set jabber id completion - jids_list_store = gtk.ListStore(gobject.TYPE_STRING) + jids_list_store = Gtk.ListStore(GObject.TYPE_STRING) for jid in gajim.contacts.get_jid_list(self.account): jids_list_store.append([jid]) - jid_entry_completion = gtk.EntryCompletion() + jid_entry_completion = Gtk.EntryCompletion() jid_entry_completion.set_text_column(0) jid_entry_completion.set_model(jids_list_store) jid_entry_completion.set_popup_completion(True) @@ -4490,7 +4491,7 @@ class InvitationReceivedDialog: sectext = sectext.replace('$Contact', contact_text) if comment: # only if not None and not '' - comment = gobject.markup_escape_text(comment) + comment = GObject.markup_escape_text(comment) comment = _('Comment: %s') % comment sectext += '\n\n%s' % comment sectext += '\n\n' + _('Do you want to accept the invitation?') @@ -4525,11 +4526,11 @@ class ProgressDialog: self.progressbar = self.xml.get_object('progressbar') self.dialog.set_title(title_text) self.dialog.set_default_size(450, 250) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.dialog.show_all() self.xml.connect_signals(self) - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GObject.timeout_add(100, self.update_progressbar) def update_progressbar(self): @@ -4561,20 +4562,20 @@ class ClientCertChooserDialog(FileChooserDialog): FileChooserDialog.__init__(self, title_text=_('Choose Client Cert #PCKS12'), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), + action=Gtk.FileChooserAction.OPEN, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), current_folder='', - default_response=gtk.RESPONSE_OK, + default_response=Gtk.ResponseType.OK, on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('PKCS12 Files')) filter_.add_pattern('*.p12') self.add_filter(filter_) @@ -4603,20 +4604,20 @@ class SoundChooserDialog(FileChooserDialog): callback(widget, path_to_snd_file) FileChooserDialog.__init__(self, title_text = _('Choose Sound'), - action = gtk.FILE_CHOOSER_ACTION_OPEN, - buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), - default_response = gtk.RESPONSE_OK, + action = Gtk.FileChooserAction.OPEN, + buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + default_response = Gtk.ResponseType.OK, current_folder = gajim.config.get('last_sounds_dir'), on_response_ok = (on_ok, on_response_ok), on_response_cancel = on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('Wav Sounds')) filter_.add_pattern('*.wav') self.add_filter(filter_) @@ -4656,10 +4657,10 @@ class ImageChooserDialog(FileChooserDialog): path = '' FileChooserDialog.__init__(self, title_text = _('Choose Image'), - action = gtk.FILE_CHOOSER_ACTION_OPEN, - buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), - default_response = gtk.RESPONSE_OK, + action = Gtk.FileChooserAction.OPEN, + buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + default_response = Gtk.ResponseType.OK, current_folder = path, on_response_ok = (on_ok, on_response_ok), on_response_cancel = on_response_cancel) @@ -4667,12 +4668,12 @@ class ImageChooserDialog(FileChooserDialog): if on_response_cancel: self.connect('destroy', on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('Images')) filter_.add_mime_type('image/png') filter_.add_mime_type('image/jpeg') @@ -4687,7 +4688,7 @@ class ImageChooserDialog(FileChooserDialog): self.set_filename(path_to_file) self.set_use_preview_label(False) - self.set_preview_widget(gtk.Image()) + self.set_preview_widget(Gtk.Image()) self.connect('selection-changed', self.update_preview) def update_preview(self, widget): @@ -4698,8 +4699,8 @@ class ImageChooserDialog(FileChooserDialog): widget.get_preview_widget().set_from_file(None) return try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(path_to_file, 100, 100) - except gobject.GError: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(path_to_file, 100, 100) + except GObject.GError: return widget.get_preview_widget().set_from_pixbuf(pixbuf) @@ -4708,12 +4709,12 @@ class AvatarChooserDialog(ImageChooserDialog): on_response_cancel=None, on_response_clear=None): ImageChooserDialog.__init__(self, path_to_file, on_response_ok, on_response_cancel) - button = gtk.Button(None, gtk.STOCK_CLEAR) + button = Gtk.Button(None, Gtk.STOCK_CLEAR) self.response_clear = on_response_clear if on_response_clear: button.connect('clicked', self.on_clear) button.show_all() - self.action_area.pack_start(button) + self.action_area.pack_start(button, True, True, 0) self.action_area.reorder_child(button, 0) def on_clear(self, widget): @@ -4744,10 +4745,10 @@ class ArchiveChooserDialog(FileChooserDialog): FileChooserDialog.__init__(self, title_text=_('Choose Archive'), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), - default_response=gtk.RESPONSE_OK, + action=Gtk.FileChooserAction.OPEN, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + default_response=Gtk.ResponseType.OK, current_folder=path, on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel) @@ -4755,12 +4756,12 @@ class ArchiveChooserDialog(FileChooserDialog): if on_response_cancel: self.connect('destroy', on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('Zip files')) filter_.add_pattern('*.zip') @@ -4843,7 +4844,7 @@ class TransformChatToMUC: self.__dict__[widget_to_add] = self.xml.get_object(widget_to_add) server_list = [] - self.servers = gtk.ListStore(str) + self.servers = Gtk.ListStore(str) self.server_list_comboboxentry.set_model(self.servers) self.server_list_comboboxentry.set_text_column(0) @@ -4868,18 +4869,18 @@ class TransformChatToMUC: # set treeview # name, jid - self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, str) - self.store.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) + self.store.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.guests_treeview.set_model(self.store) - renderer1 = gtk.CellRendererText() - renderer2 = gtk.CellRendererPixbuf() - column = gtk.TreeViewColumn('Status', renderer2, pixbuf=0) + renderer1 = Gtk.CellRendererText() + renderer2 = Gtk.CellRendererPixbuf() + column = Gtk.TreeViewColumn('Status', renderer2, pixbuf=0) self.guests_treeview.append_column(column) - column = gtk.TreeViewColumn('Name', renderer1, text=1) + column = Gtk.TreeViewColumn('Name', renderer1, text=1) self.guests_treeview.append_column(column) - self.guests_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.guests_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) # All contacts beside the following can be invited: # transports, zeroconf contacts, minimized groupchats @@ -4929,7 +4930,7 @@ class TransformChatToMUC: self.instances.remove(self) def on_chat_to_muc_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.destroy() def on_invite_button_clicked(self, widget): @@ -4969,8 +4970,8 @@ class TransformChatToMUC: class DataFormWindow(Dialog): def __init__(self, form, on_response_ok): self.df_response_ok = on_response_ok - Dialog.__init__(self, None, 'test', [(gtk.STOCK_CANCEL, - gtk.RESPONSE_REJECT), (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)], + Dialog.__init__(self, None, 'test', [(Gtk.STOCK_CANCEL, + Gtk.ResponseType.REJECT), (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)], on_response_ok=self.on_ok) self.set_resizable(True) gtkgui_helpers.resize_window(self, 600, 400) @@ -4979,7 +4980,7 @@ class DataFormWindow(Dialog): self.dataform_widget.set_sensitive(True) self.dataform_widget.data_form = self.dataform self.dataform_widget.show_all() - self.vbox.pack_start(self.dataform_widget) + self.vbox.pack_start(self.dataform_widget, True, True, 0) def on_ok(self): form = self.dataform_widget.data_form @@ -5201,7 +5202,7 @@ class VoIPCallReceivedDialog(object): def on_voip_call_received_messagedialog_close(self, dialog): return self.on_voip_call_received_messagedialog_response(dialog, - gtk.RESPONSE_NO) + Gtk.ResponseType.NO) def on_voip_call_received_messagedialog_response(self, dialog, response): # we've got response from user, either stop connecting or accept the call @@ -5210,7 +5211,7 @@ class VoIPCallReceivedDialog(object): if not session: dialog.destroy() return - if response == gtk.RESPONSE_YES: + if response == Gtk.ResponseType.YES: #TODO: Ensure that ctrl.contact.resource == resource jid = gajim.get_jid_without_resource(self.fjid) resource = gajim.get_resource_from_jid(self.fjid) @@ -5231,7 +5232,7 @@ class VoIPCallReceivedDialog(object): session.approve_session() for content in self.content_types: session.approve_content(content) - else: # response==gtk.RESPONSE_NO + else: # response==Gtk.ResponseType.NO if not session.accepted: session.decline_session() else: @@ -5280,11 +5281,11 @@ class CheckFingerprintDialog(YesNoDialog): YesNoDialog.__init__(self, pritext, sectext=sectext, checktext=checktext, on_response_yes=on_response_yes, on_response_no=on_response_no) - b = gtk.Button(_('View cert...')) + b = Gtk.Button(_('View cert...')) b.connect('clicked', self.on_cert_clicked) b.show_all() area = self.get_action_area() - area.pack_start(b) + area.pack_start(b, True, True, 0) def on_cert_clicked(self, button): d = CertificatDialog(self, self.account, self.cert) @@ -5297,11 +5298,11 @@ class SSLErrorDialog(ConfirmationDialogDoubleCheck): ConfirmationDialogDoubleCheck.__init__(self, pritext, sectext, checktext1, checktext2, on_response_ok=on_response_ok, on_response_cancel=on_response_cancel, is_modal=False) - b = gtk.Button(_('View cert...')) + b = Gtk.Button(_('View cert...')) b.connect('clicked', self.on_cert_clicked) b.show_all() area = self.get_action_area() - area.pack_start(b) + area.pack_start(b, True, True, 0) def on_cert_clicked(self, button): d = CertificatDialog(self, self.account, self.cert) diff --git a/src/disco.py b/src/disco.py index a18a7d9ac..2f954707a 100644 --- a/src/disco.py +++ b/src/disco.py @@ -47,9 +47,10 @@ import os import types import weakref -import gobject -import gtk -import pango +from gi.repository import GObject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import Pango import dialogs import tooltips @@ -151,7 +152,7 @@ class CacheDictionary: for key in self.cache.keys(): item = self.cache[key] if item.source: - gobject.source_remove(item.source) + GObject.source_remove(item.source) del self.cache[key] def _expire_timeout(self, key): @@ -168,9 +169,9 @@ class CacheDictionary: """ item = self.cache[key] if item.source: - gobject.source_remove(item.source) + GObject.source_remove(item.source) if self.lifetime: - source = gobject.timeout_add_seconds(self.lifetime/1000, self._expire_timeout, key) + source = GObject.timeout_add_seconds(self.lifetime/1000, self._expire_timeout, key) item.source = source def __getitem__(self, key): @@ -187,7 +188,7 @@ class CacheDictionary: def __delitem__(self, key): item = self.cache[key] if item.source: - gobject.source_remove(item.source) + GObject.source_remove(item.source) del self.cache[key] def __contains__(self, key): @@ -549,7 +550,7 @@ _('Without a connection, you can not browse available services')) if address_entry: self.address_comboboxentry = self.xml.get_object( 'address_comboboxentry') - self.address_comboboxentry_entry = self.address_comboboxentry.child + self.address_comboboxentry_entry = self.address_comboboxentry.get_child() self.address_comboboxentry_entry.set_activates_default(True) self.latest_addresses = gajim.config.get( @@ -561,15 +562,15 @@ _('Without a connection, you can not browse available services')) self.latest_addresses = self.latest_addresses[0:10] for j in self.latest_addresses: self.address_comboboxentry.append_text(j) - self.address_comboboxentry.child.set_text(jid) + self.address_comboboxentry.get_child().set_text(jid) else: # Don't show it at all if we didn't ask for it address_table.set_no_show_all(True) address_table.hide() - accel_group = gtk.AccelGroup() - keyval, mod = gtk.accelerator_parse('r') - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + accel_group = Gtk.AccelGroup() + keyval, mod = Gtk.accelerator_parse('r') + accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) @@ -590,7 +591,7 @@ _('Without a connection, you can not browse available services')) self.browser.account = value def accel_group_func(self, accel_group, acceleratable, keyval, modifier): - if (modifier & gtk.gdk.CONTROL_MASK) and (keyval == gtk.keysyms.r): + if (modifier & Gdk.ModifierType.CONTROL_MASK) and (keyval == Gdk.KEY_r): self.reload() def _initial_state(self): @@ -612,15 +613,15 @@ _('Without a connection, you can not browse available services')) 'bannerfontattrs') if bannerfont: - font = pango.FontDescription(bannerfont) + font = Pango.FontDescription(bannerfont) else: - font = pango.FontDescription('Normal') + font = Pango.FontDescription('Normal') if bannerfontattrs: # B is attribute set by default if 'B' in bannerfontattrs: - font.set_weight(pango.WEIGHT_HEAVY) + font.set_weight(Pango.Weight.HEAVY) if 'I' in bannerfontattrs: - font.set_style(pango.STYLE_ITALIC) + font.set_style(Pango.Style.ITALIC) font_attrs = 'font_desc="%s"' % font.to_string() font_size = font.get_size() @@ -630,7 +631,7 @@ _('Without a connection, you can not browse available services')) font_attrs = '%s size="large"' % font_attrs markup = '%s' % (font_attrs, text) if text_after: - font.set_weight(pango.WEIGHT_NORMAL) + font.set_weight(Pango.Weight.NORMAL) markup = '%s\n%s' % \ (markup, font.to_string(), text_after) self.banner.set_markup(markup) @@ -644,15 +645,15 @@ _('Without a connection, you can not browse available services')) textcolor = gajim.config.get_per('themes', theme, 'bannertextcolor') self.disconnect_style_event() if bgcolor: - color = gtk.gdk.color_parse(bgcolor) - self.banner_eventbox.modify_bg(gtk.STATE_NORMAL, color) + color = Gdk.color_parse(bgcolor) + self.banner_eventbox.modify_bg(Gtk.StateType.NORMAL, color) default_bg = False else: default_bg = True if textcolor: - color = gtk.gdk.color_parse(textcolor) - self.banner.modify_fg(gtk.STATE_NORMAL, color) + color = Gdk.color_parse(textcolor) + self.banner.modify_fg(Gtk.StateType.NORMAL, color) default_fg = False else: default_fg = True @@ -679,11 +680,11 @@ _('Without a connection, you can not browse available services')) """ self.disconnect_style_event() if opts[1]: - bg_color = widget.style.bg[gtk.STATE_SELECTED] - self.banner_eventbox.modify_bg(gtk.STATE_NORMAL, bg_color) + bg_color = widget.get_style().bg[Gtk.StateType.SELECTED] + self.banner_eventbox.modify_bg(Gtk.StateType.NORMAL, bg_color) if opts[0]: - fg_color = widget.style.fg[gtk.STATE_SELECTED] - self.banner.modify_fg(gtk.STATE_NORMAL, fg_color) + fg_color = widget.get_style().fg[Gtk.StateType.SELECTED] + self.banner.modify_fg(Gtk.StateType.NORMAL, fg_color) self.banner.ensure_style() self.connect_style_event(opts[0], opts[1]) @@ -799,7 +800,7 @@ _('This type of service does not contain any items to browse.')) def on_address_comboboxentry_changed(self, widget): if self.address_comboboxentry.get_active() != -1: # user selected one of the entries so do auto-visit - jid = self.address_comboboxentry.child.get_text().decode('utf-8') + jid = self.address_comboboxentry.get_child().get_text().decode('utf-8') try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat, s: @@ -809,7 +810,7 @@ _('This type of service does not contain any items to browse.')) self.travel(jid, '') def on_go_button_clicked(self, widget): - jid = self.address_comboboxentry.child.get_text().decode('utf-8') + jid = self.address_comboboxentry.get_child().get_text().decode('utf-8') try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat, s: @@ -878,20 +879,20 @@ class AgentBrowser: the JID and node of the item respectively """ # JID, node, name, address - self.model = gtk.ListStore(str, str, str, str) - self.model.set_sort_column_id(3, gtk.SORT_ASCENDING) + self.model = Gtk.ListStore(str, str, str, str) + self.model.set_sort_column_id(3, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column - col = gtk.TreeViewColumn(_('Name')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + col = Gtk.TreeViewColumn(_('Name')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Address column - col = gtk.TreeViewColumn(_('JID')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + col = Gtk.TreeViewColumn(_('JID')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) @@ -908,11 +909,11 @@ class AgentBrowser: Add the action buttons to the buttonbox for actions the browser can perform """ - self.browse_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Browse')) + self.browse_button = Gtk.Button() + image = Gtk.Image.new_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.BUTTON) + label = Gtk.Label(label=_('_Browse')) label.set_use_underline(True) - hbox = gtk.HBox() + hbox = Gtk.HBox() hbox.pack_start(image, False, True, 6) hbox.pack_end(label, True, True) self.browse_button.add(hbox) @@ -963,7 +964,7 @@ class AgentBrowser: # or pack_end, so we repack the close button here to make sure it's last close_button = self.window.xml.get_object('close_button') self.window.action_buttonbox.remove(close_button) - self.window.action_buttonbox.pack_end(close_button) + self.window.action_buttonbox.pack_end(close_button, True, True, 0) close_button.show_all() self.update_actions() @@ -1056,7 +1057,7 @@ class AgentBrowser: self.model.clear() self._total_items = self._progress = 0 self.window.progressbar.show() - self._pulse_timeout = gobject.timeout_add(250, self._pulse_timeout_cb) + self._pulse_timeout = GObject.timeout_add(250, self._pulse_timeout_cb) self.cache.get_items(self.jid, self.node, self._agent_items, force=force, args=(force,)) @@ -1074,7 +1075,7 @@ class AgentBrowser: Check if an item is already in the treeview. Return an iter to it if so, None otherwise """ - iter_ = self.model.get_iter_root() + iter_ = self.model.get_iter_first() while iter_: cjid = self.model.get_value(iter_, 0).decode('utf-8') cnode = self.model.get_value(iter_, 1).decode('utf-8') @@ -1091,7 +1092,7 @@ class AgentBrowser: """ self.model.clear() self._total_items = 0 - gobject.source_remove(self._pulse_timeout) + GObject.source_remove(self._pulse_timeout) self.window.progressbar.hide() # The server returned an error if items == 0: @@ -1236,7 +1237,7 @@ class ToplevelAgentBrowser(AgentBrowser): def _show_tooltip(self, state): view = self.window.services_treeview pointer = view.get_pointer() - props = view.get_path_at_pos(pointer[0], pointer[1]) + props = view.get_path_at_pos(pointer[1], pointer[2]) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: @@ -1274,7 +1275,7 @@ class ToplevelAgentBrowser(AgentBrowser): if jid and state > 0 and \ (self.tooltip.timeout == 0 or self.tooltip.id != props[0]): self.tooltip.id = row - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self._show_tooltip, state) def on_treeview_event_hide_tooltip(self, widget, event): @@ -1287,20 +1288,20 @@ class ToplevelAgentBrowser(AgentBrowser): # JID, node, icon, description, state # State means 2 when error, 1 when fetching, 0 when succes. view = self.window.services_treeview - self.model = gtk.TreeStore(str, str, gtk.gdk.Pixbuf, str, int) + self.model = Gtk.TreeStore(str, str, GdkPixbuf.Pixbuf, str, int) self.model.set_sort_func(4, self._treemodel_sort_func) - self.model.set_sort_column_id(4, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(4, Gtk.SortType.ASCENDING) view.set_model(self.model) - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() # Icon Renderer - renderer = gtk.CellRendererPixbuf() + renderer = Gtk.CellRendererPixbuf() renderer.set_property('xpad', 6) - col.pack_start(renderer, expand=False) + col.pack_start(renderer, False, True, 0) col.set_cell_data_func(renderer, self._pixbuf_renderer_data_func) # Text Renderer - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_cell_data_func(renderer, self._text_renderer_data_func) renderer.set_property('foreground', 'dark gray') # Save this so we can go along with theme changes @@ -1337,11 +1338,11 @@ class ToplevelAgentBrowser(AgentBrowser): def _add_actions(self): AgentBrowser._add_actions(self) - self.execute_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Execute Command')) + self.execute_button = Gtk.Button() + image = Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.BUTTON) + label = Gtk.Label(label=_('_Execute Command')) label.set_use_underline(True) - hbox = gtk.HBox() + hbox = Gtk.HBox() hbox.pack_start(image, False, True, 6) hbox.pack_end(label, True, True) self.execute_button.add(hbox) @@ -1349,17 +1350,17 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.action_buttonbox.add(self.execute_button) self.execute_button.show_all() - self.register_button = gtk.Button(label=_("Re_gister"), + self.register_button = Gtk.Button(label=_("Re_gister"), use_underline=True) self.register_button.connect('clicked', self.on_register_button_clicked) self.window.action_buttonbox.add(self.register_button) self.register_button.show_all() - self.join_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_CONNECT, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Join')) + self.join_button = Gtk.Button() + image = Gtk.Image.new_from_stock(Gtk.STOCK_CONNECT, Gtk.IconSize.BUTTON) + label = Gtk.Label(label=_('_Join')) label.set_use_underline(True) - hbox = gtk.HBox() + hbox = Gtk.HBox() hbox.pack_start(image, False, True, 6) hbox.pack_end(label, True, True) self.join_button.add(hbox) @@ -1367,11 +1368,11 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.action_buttonbox.add(self.join_button) self.join_button.show_all() - self.search_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Search')) + self.search_button = Gtk.Button() + image = Gtk.Image.new_from_stock(Gtk.STOCK_FIND, Gtk.IconSize.BUTTON) + label = Gtk.Label(label=_('_Search')) label.set_use_underline(True) - hbox = gtk.HBox() + hbox = Gtk.HBox() hbox.pack_start(image, False, True, 6) hbox.pack_end(label, True, True) self.search_button.add(hbox) @@ -1546,7 +1547,7 @@ class ToplevelAgentBrowser(AgentBrowser): # self.expanding = False # return False #self.expanding = True - #gobject.idle_add(expand_all) + #GObject.idle_add(expand_all) self.window.services_treeview.expand_all() def _update_progressbar(self): @@ -1555,7 +1556,7 @@ class ToplevelAgentBrowser(AgentBrowser): """ # Refresh this every update if self._progressbar_sourceid: - gobject.source_remove(self._progressbar_sourceid) + GObject.source_remove(self._progressbar_sourceid) fraction = 0 if self._total_items: @@ -1564,12 +1565,12 @@ class ToplevelAgentBrowser(AgentBrowser): fraction = float(self._progress) / float(self._total_items) if self._progress >= self._total_items: # We show the progressbar for just a bit before hiding it. - id_ = gobject.timeout_add_seconds(2, self._hide_progressbar_cb) + id_ = GObject.timeout_add_seconds(2, self._hide_progressbar_cb) self._progressbar_sourceid = id_ else: self.window.progressbar.show() # Hide the progressbar if we're timing out anyways. (20 secs) - id_ = gobject.timeout_add_seconds(20, self._hide_progressbar_cb) + id_ = GObject.timeout_add_seconds(20, self._hide_progressbar_cb) self._progressbar_sourceid = id_ self.window.progressbar.set_fraction(fraction) @@ -1611,7 +1612,7 @@ class ToplevelAgentBrowser(AgentBrowser): Looks up a category row and returns the iterator to it, or None """ cat = self._friendly_category(cat, type_)[0] - iter_ = self.model.get_iter_root() + iter_ = self.model.get_iter_first() while iter_: if self.model.get_value(iter_, 3).decode('utf-8') == cat: break @@ -1622,7 +1623,7 @@ class ToplevelAgentBrowser(AgentBrowser): def _find_item(self, jid, node): iter_ = None - cat_iter = self.model.get_iter_root() + cat_iter = self.model.get_iter_first() while cat_iter and not iter_: iter_ = self.model.iter_children(cat_iter) while iter_: @@ -1661,7 +1662,7 @@ class ToplevelAgentBrowser(AgentBrowser): if not cat: cat = self._create_category(*cat_args) self.model.append(cat, (jid, node, pix, descr, 1)) - gobject.idle_add(self._expand_all) + GObject.idle_add(self._expand_all) # Grab info on the service self.cache.get_info(jid, node, self._agent_info, force=force) self._update_progressbar() @@ -1736,39 +1737,39 @@ class MucBrowser(AgentBrowser): # JID, node, name, users_int, users_str, description, fetched # This is rather long, I'd rather not use a data_func here though. # Users is a string, because want to be able to leave it empty. - self.model = gtk.ListStore(str, str, str, int, str, str, bool) - self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) + self.model = Gtk.ListStore(str, str, str, int, str, str, bool) + self.model.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column - col = gtk.TreeViewColumn(_('Name')) - col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + col = Gtk.TreeViewColumn(_('Name')) + col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) col.set_fixed_width(100) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 2) col.set_sort_column_id(2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Users column - col = gtk.TreeViewColumn(_('Users')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + col = Gtk.TreeViewColumn(_('Users')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 4) col.set_sort_column_id(3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Description column - col = gtk.TreeViewColumn(_('Description')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + col = Gtk.TreeViewColumn(_('Description')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 5) col.set_sort_column_id(4) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Id column - col = gtk.TreeViewColumn(_('Id')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + col = Gtk.TreeViewColumn(_('Id')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 0) col.set_sort_column_id(0) self.window.services_treeview.insert_column(col, -1) @@ -1796,11 +1797,11 @@ class MucBrowser(AgentBrowser): AgentBrowser._clean_treemodel(self) def _add_actions(self): - self.bookmark_button = gtk.Button(label=_('_Bookmark'), use_underline=True) + self.bookmark_button = Gtk.Button(label=_('_Bookmark'), use_underline=True) self.bookmark_button.connect('clicked', self.on_bookmark_button_clicked) self.window.action_buttonbox.add(self.bookmark_button) self.bookmark_button.show_all() - self.join_button = gtk.Button(label=_('_Join'), use_underline=True) + self.join_button = Gtk.Button(label=_('_Join'), use_underline=True) self.join_button.connect('clicked', self.on_join_button_clicked) self.window.action_buttonbox.add(self.join_button) self.join_button.show_all() @@ -1896,9 +1897,9 @@ class MucBrowser(AgentBrowser): # We're already fetching return view = self.window.services_treeview - if not view.flags() & gtk.REALIZED: + if not view.get_realized(): # Prevent a silly warning, try again in a bit. - self._fetch_source = gobject.timeout_add(100, self._start_info_query) + self._fetch_source = GObject.timeout_add(100, self._start_info_query) return # We have to do this in a pygtk <2.8 compatible way :/ #start, end = self.window.services_treeview.get_visible_range() @@ -1965,7 +1966,7 @@ class MucBrowser(AgentBrowser): def _add_item(self, jid, node, parent_node, item, force): self.model.append((jid, node, item.get('name', ''), -1, '', '', False)) if not self._fetch_source: - self._fetch_source = gobject.idle_add(self._start_info_query) + self._fetch_source = GObject.idle_add(self._start_info_query) def _update_info(self, iter_, jid, node, identities, features, data): name = identities[0].get('name', '') @@ -2033,34 +2034,34 @@ class DiscussionGroupsBrowser(AgentBrowser): Create treemodel for the window """ # JID, node, name (with description) - pango markup, dont have info?, subscribed? - self.model = gtk.TreeStore(str, str, str, bool, bool) + self.model = Gtk.TreeStore(str, str, str, bool, bool) # sort by name - self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column # Pango markup for name and description, description printed with # font - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Name')) - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Name')) + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, markup=2) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) self.window.services_treeview.set_headers_visible(True) # Subscription state - renderer = gtk.CellRendererToggle() - col = gtk.TreeViewColumn(_('Subscribed')) - col.pack_start(renderer) + renderer = Gtk.CellRendererToggle() + col = Gtk.TreeViewColumn(_('Subscribed')) + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, inconsistent=3, active=4) col.set_resizable(False) self.window.services_treeview.insert_column(col, -1) # Node Column - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Node')) - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Node')) + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, markup=1) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) @@ -2095,7 +2096,7 @@ class DiscussionGroupsBrowser(AgentBrowser): dunno = True subscribed = False - name = gobject.markup_escape_text(name) + name = GObject.markup_escape_text(name) name = '%s' % name if parent_node: @@ -2126,19 +2127,19 @@ class DiscussionGroupsBrowser(AgentBrowser): return self.found_iter def _add_actions(self): - self.post_button = gtk.Button(label=_('New post'), use_underline=True) + self.post_button = Gtk.Button(label=_('New post'), use_underline=True) self.post_button.set_sensitive(False) self.post_button.connect('clicked', self.on_post_button_clicked) self.window.action_buttonbox.add(self.post_button) self.post_button.show_all() - self.subscribe_button = gtk.Button(label=_('_Subscribe'), use_underline=True) + self.subscribe_button = Gtk.Button(label=_('_Subscribe'), use_underline=True) self.subscribe_button.set_sensitive(False) self.subscribe_button.connect('clicked', self.on_subscribe_button_clicked) self.window.action_buttonbox.add(self.subscribe_button) self.subscribe_button.show_all() - self.unsubscribe_button = gtk.Button(label=_('_Unsubscribe'), use_underline=True) + self.unsubscribe_button = Gtk.Button(label=_('_Unsubscribe'), use_underline=True) self.unsubscribe_button.set_sensitive(False) self.unsubscribe_button.connect('clicked', self.on_unsubscribe_button_clicked) self.window.action_buttonbox.add(self.unsubscribe_button) diff --git a/src/features_window.py b/src/features_window.py index 0894cca61..b222d4ab6 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -25,7 +25,7 @@ import os import sys -import gtk +from gi.repository import Gtk import gtkgui_helpers from common import gajim @@ -41,7 +41,7 @@ class FeaturesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('features_window.ui') self.window = self.xml.get_object('features_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) treeview = self.xml.get_object('features_treeview') self.desc_label = self.xml.get_object('feature_desc_label') @@ -114,20 +114,20 @@ class FeaturesWindow: } # name, supported - self.model = gtk.ListStore(str, bool) + self.model = Gtk.ListStore(str, bool) treeview.set_model(self.model) - col = gtk.TreeViewColumn(Q_('?features:Available')) + col = Gtk.TreeViewColumn(Q_('?features:Available')) treeview.append_column(col) - cell = gtk.CellRendererToggle() + cell = Gtk.CellRendererToggle() cell.set_property('radio', True) - col.pack_start(cell) + col.pack_start(cell, True, True, 0) col.set_attributes(cell, active = 1) - col = gtk.TreeViewColumn(_('Feature')) + col = Gtk.TreeViewColumn(_('Feature')) treeview.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, expand = True) + cell = Gtk.CellRendererText() + col.pack_start(cell, True, True, 0) col.add_attribute(cell, 'text', 0) # Fill model @@ -136,7 +136,7 @@ class FeaturesWindow: rep = func() self.model.append([feature, rep]) - self.model.set_sort_column_id(0, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.xml.connect_signals(self) self.window.show_all() diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 40edc2d26..a92a01ad8 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -21,9 +21,10 @@ ## along with Gajim. If not, see . ## -import gtk -import gobject -import pango +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GObject +from gi.repository import Pango import os import time @@ -66,52 +67,52 @@ class FileTransfersWindow: shall_notify = gajim.config.get('notify_on_file_complete') self.notify_ft_checkbox.set_active(shall_notify ) - self.model = gtk.ListStore(gtk.gdk.Pixbuf, str, str, str, str, int, + self.model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str, str, int, int, str) self.tree.set_model(self.model) - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() - render_pixbuf = gtk.CellRendererPixbuf() + render_pixbuf = Gtk.CellRendererPixbuf() - col.pack_start(render_pixbuf, expand=True) + col.pack_start(render_pixbuf, True) render_pixbuf.set_property('xpad', 3) render_pixbuf.set_property('ypad', 3) render_pixbuf.set_property('yalign', .0) col.add_attribute(render_pixbuf, 'pixbuf', 0) self.tree.append_column(col) - col = gtk.TreeViewColumn(_('File')) - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=False) + col = Gtk.TreeViewColumn(_('File')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', C_LABELS) renderer.set_property('yalign', 0.) - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) col.add_attribute(renderer, 'markup', C_FILE) renderer.set_property('xalign', 0.) renderer.set_property('yalign', 0.) - renderer.set_property('ellipsize', pango.ELLIPSIZE_END) + renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) col.set_expand(True) self.tree.append_column(col) - col = gtk.TreeViewColumn(_('Time')) - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=False) + col = Gtk.TreeViewColumn(_('Time')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', C_TIME) renderer.set_property('yalign', 0.5) renderer.set_property('xalign', 0.5) - renderer = gtk.CellRendererText() - renderer.set_property('ellipsize', pango.ELLIPSIZE_END) + renderer = Gtk.CellRendererText() + renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) col.set_expand(False) self.tree.append_column(col) - col = gtk.TreeViewColumn(_('Progress')) - renderer = gtk.CellRendererProgress() + col = Gtk.TreeViewColumn(_('Progress')) + renderer = Gtk.CellRendererProgress() renderer.set_property('yalign', 0.5) renderer.set_property('xalign', 0.5) - col.pack_start(renderer, expand=False) + col.pack_start(renderer, False) col.add_attribute(renderer, 'text', C_PROGRESS) col.add_attribute(renderer, 'value', C_PERCENT) col.add_attribute(renderer, 'pulse', C_PULSE) @@ -121,18 +122,18 @@ class FileTransfersWindow: self.images = {} self.icons = { - 'upload': gtk.STOCK_GO_UP, - 'download': gtk.STOCK_GO_DOWN, - 'stop': gtk.STOCK_STOP, - 'waiting': gtk.STOCK_REFRESH, - 'pause': gtk.STOCK_MEDIA_PAUSE, - 'continue': gtk.STOCK_MEDIA_PLAY, - 'ok': gtk.STOCK_APPLY, - 'computing': gtk.STOCK_EXECUTE, - 'hash_error': gtk.STOCK_STOP, + 'upload': Gtk.STOCK_GO_UP, + 'download': Gtk.STOCK_GO_DOWN, + 'stop': Gtk.STOCK_STOP, + 'waiting': Gtk.STOCK_REFRESH, + 'pause': Gtk.STOCK_MEDIA_PAUSE, + 'continue': Gtk.STOCK_MEDIA_PLAY, + 'ok': Gtk.STOCK_APPLY, + 'computing': Gtk.STOCK_EXECUTE, + 'hash_error': Gtk.STOCK_STOP, } - self.tree.get_selection().set_mode(gtk.SELECTION_SINGLE) + self.tree.get_selection().set_mode(Gtk.SelectionMode.SINGLE) self.tree.get_selection().connect('changed', self.selection_changed) self.tooltip = tooltips.FileTransfersTooltip() self.file_transfers_menu = self.xml.get_object('file_transfers_menu') @@ -182,7 +183,7 @@ class FileTransfersWindow: (file_path, file_name) = os.path.split(file_props.file_name) else: file_name = file_props.name - sectext = '\t' + _('Filename: %s') % gobject.markup_escape_text( + sectext = '\t' + _('Filename: %s') % GObject.markup_escape_text( file_name) sectext += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) @@ -207,13 +208,13 @@ class FileTransfersWindow: sectext += recipient if file_props.type_ == 'r': sectext += '\n\t' + _('Saved in: %s') % file_path - dialog = dialogs.HigDialog(None, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, + dialog = dialogs.HigDialog(None, Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, _('File transfer completed'), sectext) if file_props.type_ == 'r': - button = gtk.Button(_('_Open Containing Folder')) + button = Gtk.Button(_('_Open Containing Folder')) button.connect('clicked', on_open, file_props) - dialog.action_area.pack_start(button) - ok_button = dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + dialog.action_area.pack_start(button, True, True, 0) + ok_button = dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) def on_ok(widget): dialog.destroy() ok_button.connect('clicked', on_ok) @@ -239,7 +240,7 @@ class FileTransfersWindow: file_name = os.path.basename(file_props.file_name) else: file_name = file_props.name - sectext = '\t' + _('Filename: %s') % gobject.markup_escape_text( + sectext = '\t' + _('Filename: %s') % GObject.markup_escape_text( file_name) sectext += '\n\t' + _('Recipient: %s') % jid if error_msg: @@ -283,12 +284,12 @@ class FileTransfersWindow: _('The file %(file)s has been fully received, but it seems to be ' 'wrongly received.\nDo you want to reload it?') % \ {'file': file_name}, on_response_yes=(on_yes, jid, file_props, - account), type_=gtk.MESSAGE_ERROR) + account), type_=Gtk.MessageType.ERROR) def show_file_send_request(self, account, contact): - win = gtk.ScrolledWindow() - win.set_shadow_type(gtk.SHADOW_IN) - win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) + win = Gtk.ScrolledWindow() + win.set_shadow_type(Gtk.ShadowType.IN) + win.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) from message_textview import MessageTextView desc_entry = MessageTextView() @@ -301,7 +302,7 @@ class FileTransfersWindow: files_path_list) text_buffer = desc_entry.get_buffer() desc = text_buffer.get_text(text_buffer.get_start_iter(), - text_buffer.get_end_iter()) + text_buffer.get_end_iter(), True) for file_path in files_path_list: if self.send_file(account, contact, file_path, desc) \ and file_dir is None: @@ -311,22 +312,22 @@ class FileTransfersWindow: dialog.destroy() dialog = dialogs.FileChooserDialog(_('Choose File to Send...'), - gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), - gtk.RESPONSE_OK, + Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL), + Gtk.ResponseType.OK, True, # select multiple true as we can select many files to send gajim.config.get('last_send_dir'), on_response_ok=on_ok, on_response_cancel=lambda e:dialog.destroy() ) - btn = gtk.Button(_('_Send')) + btn = Gtk.Button(_('_Send')) btn.set_property('can-default', True) # FIXME: add send icon to this button (JUMP_TO) - dialog.add_action_widget(btn, gtk.RESPONSE_OK) - dialog.set_default_response(gtk.RESPONSE_OK) + dialog.add_action_widget(btn, Gtk.ResponseType.OK) + dialog.set_default_response(Gtk.ResponseType.OK) - desc_hbox = gtk.HBox(False, 5) - desc_hbox.pack_start(gtk.Label(_('Description: ')), False, False, 0) + desc_hbox = Gtk.HBox(False, 5) + desc_hbox.pack_start(Gtk.Label(_('Description: ', True, True, 0)), False, False, 0) desc_hbox.pack_start(win, True, True, 0) dialog.vbox.pack_start(desc_hbox, False, False, 0) @@ -383,7 +384,7 @@ class FileTransfersWindow: if os.path.exists(file_path): # check if we have write permissions if not os.access(file_path, os.W_OK): - file_name = gobject.markup_escape_text(os.path.basename( + file_name = GObject.markup_escape_text(os.path.basename( file_path)) dialogs.ErrorDialog( _('Cannot overwrite existing file "%s"' % file_name), @@ -428,10 +429,10 @@ class FileTransfersWindow: dialog2 = dialogs.FileChooserDialog( title_text=_('Save File as...'), - action=gtk.FILE_CHOOSER_ACTION_SAVE, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK), - default_response=gtk.RESPONSE_OK, + action=Gtk.FileChooserAction.SAVE, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, Gtk.ResponseType.OK), + default_response=Gtk.ResponseType.OK, current_folder=gajim.config.get('last_save_dir'), on_response_ok=(on_ok, account, contact, file_props), on_response_cancel=(on_cancel, account, contact, file_props)) @@ -447,7 +448,7 @@ class FileTransfersWindow: """ if not file_props or not file_props.name: return - sec_text = '\t' + _('File: %s') % gobject.markup_escape_text( + sec_text = '\t' + _('File: %s') % GObject.markup_escape_text( file_props.name) if file_props.size: sec_text += '\n\t' + _('Size: %s') % \ @@ -474,7 +475,7 @@ class FileTransfersWindow: def get_icon(self, ident): return self.images.setdefault(ident, - self.window.render_icon(self.icons[ident], gtk.ICON_SIZE_MENU)) + self.window.render_icon(self.icons[ident], Gtk.IconSize.MENU)) def set_status(self,file_props, status): """ @@ -494,7 +495,7 @@ class FileTransfersWindow: text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, C_PROGRESS, text) - self.model.set(iter_, C_PULSE, gobject.constants.G_MAXINT) + self.model.set(iter_, C_PULSE, GObject.constants.G_MAXINT) elif status == 'computing': self.model.set(iter_, C_PULSE, 1) text = _('Checking file...') + '\n' @@ -505,11 +506,11 @@ class FileTransfersWindow: self.model.set(iter_, C_PROGRESS, text) def pulse(): p = self.model.get(iter_, C_PULSE)[0] - if p == gobject.constants.G_MAXINT: + if p == GObject.constants.G_MAXINT: return False self.model.set(iter_, C_PULSE, p + 1) return True - gobject.timeout_add(100, pulse) + GObject.timeout_add(100, pulse) elif status == 'hash_error': text = _('File error') + '\n' received_size = int(file_props.received_len) @@ -517,7 +518,7 @@ class FileTransfersWindow: text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, C_PROGRESS, text) - self.model.set(iter_, C_PULSE, gobject.constants.G_MAXINT) + self.model.set(iter_, C_PULSE, GObject.constants.G_MAXINT) self.model.set(iter_, C_IMAGE, self.get_icon(status)) path = self.model.get_path(iter_) self.select_func(path) @@ -674,7 +675,7 @@ class FileTransfersWindow: Return iter to the row, which holds file transfer, identified by the session id """ - iter_ = self.model.get_iter_root() + iter_ = self.model.get_iter_first() while iter_: if typ + sid == self.model[iter_][C_SID].decode('utf-8'): return iter_ @@ -737,7 +738,7 @@ class FileTransfersWindow: file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name - text_props = gobject.markup_escape_text(file_name) + '\n' + text_props = GObject.markup_escape_text(file_name) + '\n' text_props += contact.get_shown_name() self.model.set(iter_, 1, text_labels, 2, text_props, C_PULSE, -1, C_SID, file_props.type_ + file_props.sid) @@ -756,7 +757,7 @@ class FileTransfersWindow: def on_transfers_list_motion_notify_event(self, widget, event): pointer = self.tree.get_pointer() props = widget.get_path_at_pos(int(event.x), int(event.y)) - self.height_diff = pointer[1] - int(event.y) + self.height_diff = pointer[2] - int(event.y) if self.tooltip.timeout > 0: if not props or self.tooltip.id != props[0]: self.tooltip.hide_tooltip() @@ -773,7 +774,7 @@ class FileTransfersWindow: if file_props is not None: if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, widget) def on_transfers_list_leave_notify_event(self, widget=None, event=None): @@ -782,7 +783,7 @@ class FileTransfersWindow: elif self.height_diff is 0: return pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[0], pointer[1] - self.height_diff) + props = self.tree.get_path_at_pos(pointer[1], pointer[2] - self.height_diff) if self.tooltip.timeout > 0: if not props or self.tooltip.id == props[0]: self.tooltip.hide_tooltip() @@ -893,8 +894,8 @@ class FileTransfersWindow: if status: label = _('Pause') self.pause_button.set_label(label) - self.pause_button.set_image(gtk.image_new_from_stock( - gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_MENU)) + self.pause_button.set_image(Gtk.Image.new_from_stock( + Gtk.STOCK_MEDIA_PAUSE, Gtk.IconSize.MENU)) self.pause_menuitem.set_sensitive(True) self.pause_menuitem.set_no_show_all(False) @@ -904,8 +905,8 @@ class FileTransfersWindow: else: label = _('_Continue') self.pause_button.set_label(label) - self.pause_button.set_image(gtk.image_new_from_stock( - gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_MENU)) + self.pause_button.set_image(Gtk.Image.new_from_stock( + Gtk.STOCK_MEDIA_PLAY, Gtk.IconSize.MENU)) self.pause_menuitem.hide() self.pause_menuitem.set_no_show_all(True) self.continue_menuitem.set_sensitive(True) @@ -951,8 +952,8 @@ class FileTransfersWindow: self.tooltip.hide_tooltip() return pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[0], - pointer[1] - self.height_diff) + props = self.tree.get_path_at_pos(pointer[1], + pointer[2] - self.height_diff) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: @@ -1006,7 +1007,7 @@ class FileTransfersWindow: path = self.model.get_path(iter_) self.tree.get_selection().select_path(path) - if event.keyval == gtk.keysyms.Menu: + if event.keyval == Gdk.KEY_Menu: self.show_context_menu(event, iter_) return True @@ -1073,5 +1074,5 @@ class FileTransfersWindow: self.set_all_insensitive() def on_file_transfers_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.hide() diff --git a/src/gajim.py b/src/gajim.py index 894d7186e..43b5e6539 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -68,12 +68,12 @@ except ImportError: print 'Gajim needs python-nbxmpp to run. Quiting...' sys.exit() -from common import demandimport -demandimport.enable() -demandimport.ignore += ['gobject._gobject', 'libasyncns', 'i18n', - 'logging.NullHandler', 'dbus.service', 'OpenSSL.SSL', 'OpenSSL.crypto', - 'common.sleepy', 'DLFCN', 'dl', 'xml.sax', 'xml.sax.handler', 'ic', - 'Crypto.PublicKey', 'IPython'] +#from common import demandimport +#demandimport.enable() +#demandimport.ignore += ['GObject._gobject', 'libasyncns', 'i18n', +# 'logging.NullHandler', 'dbus.service', 'OpenSSL.SSL', 'OpenSSL.crypto', +# 'common.sleepy', 'DLFCN', 'dl', 'xml.sax', 'xml.sax.handler', 'ic', +# 'Crypto.PublicKey', 'IPython'] if os.name == 'nt': import locale @@ -111,6 +111,12 @@ import logging # gajim.gui or gajim.gtk more appropriate ? log = logging.getLogger('gajim.gajim') +#import gi +#gi.require_version('Gtk', '3.0') +#gi.require_version('Gdk', '2.0') +#gi.require_version('GObject', '2.0') +#gi.require_version('Pango', '1.0') + import getopt from common import i18n @@ -190,9 +196,10 @@ if os.name == 'nt': # PyGTK2.10+ only throws a warning warnings.filterwarnings('error', module='gtk') try: - import gobject - gobject.set_prgname('gajim') - import gtk + from gi.repository import GObject + GObject.set_prgname('gajim') + from gi.repository import Gtk + from gi.repository import Gdk except Warning, msg2: if str(msg2) == 'could not open display': print >> sys.stderr, _('Gajim needs X server to run. Quiting...') @@ -237,12 +244,14 @@ else: elif sysname in ('FreeBSD', 'OpenBSD', 'NetBSD'): libc.setproctitle('gajim') - if gtk.pygtk_version < (2, 22, 0): - pritext = _('Gajim needs PyGTK 2.22 or above') - sectext = _('Gajim needs PyGTK 2.22 or above to run. Quiting...') - elif gtk.gtk_version < (2, 22, 0): - pritext = _('Gajim needs GTK 2.22 or above') - sectext = _('Gajim needs GTK 2.22 or above to run. Quiting...') +# if Gtk.pygtk_version < (2, 22, 0): +# pritext = _('Gajim needs PyGTK 2.22 or above') +# sectext = _('Gajim needs PyGTK 2.22 or above to run. Quiting...') +# elif Gtk.gtk_version < (2, 22, 0): +# if (Gtk.get_major_version(), Gtk.get_minor_version(), +# Gtk.get_micro_version()) < (2, 22, 0): +# pritext = _('Gajim needs GTK 2.22 or above') +# sectext = _('Gajim needs GTK 2.22 or above to run. Quiting...') from common import check_paths @@ -257,9 +266,9 @@ else: 'http://sourceforge.net/project/showfiles.php?group_id=78018' if pritext: - dlg = gtk.MessageDialog(None, - gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, - gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, message_format = pritext) + dlg = Gtk.MessageDialog(None, + Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, message_format = pritext) dlg.format_secondary_text(sectext) dlg.run() @@ -385,12 +394,12 @@ if pid_alive(): print("Gajim is already running, bringing the roster to front...") sys.exit(0) pix = gtkgui_helpers.get_icon_pixmap('gajim', 48) - gtk.window_set_default_icon(pix) # set the icon to all newly opened wind + Gtk.window_set_default_icon(pix) # set the icon to all newly opened wind pritext = _('Gajim is already running') sectext = _('Another instance of Gajim seems to be running\nRun anyway?') dialog = dialogs.YesNoDialog(pritext, sectext) dialog.popup() - if dialog.run() != gtk.RESPONSE_YES: + if dialog.run() != Gtk.ResponseType.YES: sys.exit(3) dialog.destroy() # run anyway, delete pid and useless global vars @@ -440,31 +449,31 @@ if __name__ == '__main__': log.info("Encodings: d:%s, fs:%s, p:%s", sys.getdefaultencoding(), \ sys.getfilesystemencoding(), locale.getpreferredencoding()) - if os.name != 'nt': - # Session Management support - try: - import gnome.ui - raise ImportError - except ImportError: - pass - else: - def die_cb(dummy): - gajim.interface.roster.quit_gtkgui_interface() - gnome.program_init('gajim', gajim.version) - cli = gnome.ui.master_client() - cli.connect('die', die_cb) + #if os.name != 'nt': + ## Session Management support + #try: + #import gnome.ui + #raise ImportError + #except ImportError: + #pass + #else: + #def die_cb(dummy): + #gajim.interface.roster.quit_gtkgui_interface() + #gnome.program_init('gajim', gajim.version) + #cli = gnome.ui.master_client() + #cli.connect('die', die_cb) - path_to_gajim_script = gtkgui_helpers.get_abspath_for_script( - 'gajim') + #path_to_gajim_script = gtkgui_helpers.get_abspath_for_script( + #'gajim') - if path_to_gajim_script: - argv = [path_to_gajim_script] - try: - cli.set_restart_command(argv) - except TypeError: - # Fedora systems have a broken gnome-python wrapper for this - # function. - cli.set_restart_command(len(argv), argv) + #if path_to_gajim_script: + #argv = [path_to_gajim_script] + #try: + #cli.set_restart_command(argv) + #except TypeError: + ## Fedora systems have a broken gnome-python wrapper for this + ## function. + #cli.set_restart_command(len(argv), argv) check_paths.check_and_possibly_create_paths() @@ -475,10 +484,10 @@ if __name__ == '__main__': if os.name != 'nt': # This makes Gajim unusable under windows, and threads are used only # for GPG, so not under windows - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() + Gdk.threads_init() + Gdk.threads_enter() + Gtk.main() if os.name != 'nt': - gtk.gdk.threads_leave() + Gdk.threads_leave() except KeyboardInterrupt: print >> sys.stderr, 'KeyboardInterrupt' diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 0a8c64213..29023acfa 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -22,8 +22,8 @@ ## along with Gajim. If not, see . ## -import gtk -import pango +from gi.repository import Gtk +from gi.repository import Pango import dialogs import gtkgui_helpers @@ -34,7 +34,7 @@ class GajimThemesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('gajim_themes_window.ui') self.window = self.xml.get_object('gajim_themes_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) self.options = ['account', 'group', 'contact', 'banner'] self.options_combobox = self.xml.get_object('options_combobox') @@ -54,12 +54,12 @@ class GajimThemesWindow: 'muc_msg', 'muc_directed_msg'): self.colorbuttons[chatstate] = self.xml.get_object(chatstate + \ '_colorbutton') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) self.themes_tree.set_model(model) - col = gtk.TreeViewColumn(_('Theme')) + col = Gtk.TreeViewColumn(_('Theme')) self.themes_tree.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer, True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = 0) renderer.connect('edited', self.on_theme_cell_edited) renderer.set_property('editable', True) @@ -125,7 +125,7 @@ class GajimThemesWindow: def select_active_theme(self): model = self.themes_tree.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() active_theme = gajim.config.get('roster_theme').replace('_', ' ') while iter_: theme = model[iter_][0] @@ -198,7 +198,7 @@ class GajimThemesWindow: textcolor = gajim.config.get_per('themes', theme, option + 'textcolor') if textcolor: state = True - self.text_colorbutton.set_color(gtk.gdk.color_parse(textcolor)) + self.text_colorbutton.set_color(Gdk.color_parse(textcolor)) else: state = False self.textcolor_checkbutton.set_active(state) @@ -206,7 +206,7 @@ class GajimThemesWindow: bgcolor = gajim.config.get_per('themes', theme, option + 'bgcolor') if bgcolor: state = True - self.background_colorbutton.set_color(gtk.gdk.color_parse( + self.background_colorbutton.set_color(Gdk.color_parse( bgcolor)) else: state = False @@ -231,7 +231,7 @@ class GajimThemesWindow: 'muc_msg', 'muc_directed_msg'): color = gajim.config.get_per('themes', theme, 'state_' + chatstate + \ '_color') - self.colorbuttons[chatstate].set_color(gtk.gdk.color_parse(color)) + self.colorbuttons[chatstate].set_color(Gdk.color_parse(color)) def on_textcolor_checkbutton_toggled(self, widget): state = widget.get_active() @@ -328,11 +328,11 @@ class GajimThemesWindow: """ Return a FontDescription from togglebuttons states """ - fd = pango.FontDescription() + fd = Pango.FontDescription() if self.bold_togglebutton.get_active(): - fd.set_weight(pango.WEIGHT_BOLD) + fd.set_weight(Pango.Weight.BOLD) if self.italic_togglebutton.get_active(): - fd.set_style(pango.STYLE_ITALIC) + fd.set_style(Pango.Style.ITALIC) return fd def _set_font_widgets(self, font_attrs): @@ -365,10 +365,10 @@ class GajimThemesWindow: Get tuple of font properties: weight, style """ font_props = [False, False, False] - font_description = pango.FontDescription(font_name) - if font_description.get_weight() != pango.WEIGHT_NORMAL: + font_description = Pango.FontDescription(font_name) + if font_description.get_weight() != Pango.Weight.NORMAL: font_props[0] = True - if font_description.get_style() != pango.STYLE_ITALIC: + if font_description.get_style() != Pango.Style.ITALIC: font_props[1] = True return font_props diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 9e431f8d3..fd705214b 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -30,9 +30,10 @@ import os import time import locale -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject import gtkgui_helpers import gui_menu_builder import message_control @@ -72,10 +73,10 @@ def set_renderer_color(treeview, renderer, set_background=True): Set style for group row, using PRELIGHT system color """ if set_background: - bgcolor = treeview.style.bg[gtk.STATE_PRELIGHT] + bgcolor = treeview.get_style().bg[Gtk.StateType.PRELIGHT] renderer.set_property('cell-background-gdk', bgcolor) else: - fgcolor = treeview.style.fg[gtk.STATE_PRELIGHT] + fgcolor = treeview.get_style().fg[Gtk.StateType.PRELIGHT] renderer.set_property('foreground-gdk', fgcolor) def tree_cell_data_func(column, renderer, model, iter_, tv=None): @@ -84,7 +85,7 @@ def tree_cell_data_func(column, renderer, model, iter_, tv=None): theme = gajim.config.get('roster_theme') # allocate space for avatar only if needed parent_iter = model.iter_parent(iter_) - if isinstance(renderer, gtk.CellRendererPixbuf): + if isinstance(renderer, Gtk.CellRendererPixbuf): avatar_position = gajim.config.get('avatar_position_in_roster') if avatar_position == 'right': renderer.set_property('xalign', 1) # align pixbuf to the right @@ -103,7 +104,7 @@ def tree_cell_data_func(column, renderer, model, iter_, tv=None): renderer.set_property('cell-background', bgcolor) else: renderer.set_property('cell-background', None) - if isinstance(renderer, gtk.CellRendererText): + if isinstance(renderer, Gtk.CellRendererText): # foreground property is only with CellRendererText color = gajim.config.get_per('themes', theme, 'contacttextcolor') if color: @@ -118,7 +119,7 @@ def tree_cell_data_func(column, renderer, model, iter_, tv=None): renderer.set_property('cell-background', bgcolor) else: set_renderer_color(tv, renderer) - if isinstance(renderer, gtk.CellRendererText): + if isinstance(renderer, Gtk.CellRendererText): # foreground property is only with CellRendererText color = gajim.config.get_per('themes', theme, 'grouptextcolor') if color: @@ -327,7 +328,7 @@ class GroupchatControl(ChatControlBase): if gtkgui_helpers.gtk_icon_theme.has_icon('bookmark-new'): img = self.xml.get_object('image7') - img.set_from_icon_name('bookmark-new', gtk.ICON_SIZE_MENU) + img.set_from_icon_name('bookmark-new', Gtk.IconSize.MENU) widget.set_sensitive( gajim.connections[self.account].private_storage_supported or \ (gajim.connections[self.account].pubsub_supported and \ @@ -425,13 +426,13 @@ class GroupchatControl(ChatControlBase): self.hpaned.set_position(hpaned_position) #status_image, shown_nick, type, nickname, avatar - self.columns = [gtk.Image, str, str, str, gtk.gdk.Pixbuf] - self.model = gtk.TreeStore(*self.columns) + self.columns = [Gtk.Image, str, str, str, GdkPixbuf.Pixbuf] + self.model = Gtk.TreeStore(*self.columns) self.model.set_sort_func(C_NICK, self.tree_compare_iters) - self.model.set_sort_column_id(C_NICK, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(C_NICK, Gtk.SortType.ASCENDING) # columns - column = gtk.TreeViewColumn() + column = Gtk.TreeViewColumn() # list of renderers with attributes / properties in the form: # (name, renderer_object, expand?, attribute_name, attribute_value, # cell_data_func, func_arg) @@ -441,9 +442,9 @@ class GroupchatControl(ChatControlBase): self.renderers_propertys = {} renderer_image = cell_renderer_image.CellRendererImage(0, 0) self.renderers_propertys[renderer_image] = ('width', 26) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() self.renderers_propertys[renderer_text] = ('ellipsize', - pango.ELLIPSIZE_END) + Pango.EllipsizeMode.END) self.renderers_list += ( # status img @@ -454,7 +455,7 @@ class GroupchatControl(ChatControlBase): 'markup', C_TEXT, tree_cell_data_func, self.list_treeview)) # avatar img - avater_renderer = ('avatar', gtk.CellRendererPixbuf(), + avater_renderer = ('avatar', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_AVATAR, tree_cell_data_func, self.list_treeview) @@ -467,9 +468,9 @@ class GroupchatControl(ChatControlBase): self.list_treeview.append_column(column) # workaround to avoid gtk arrows to be shown - column = gtk.TreeViewColumn() # 2nd COLUMN - renderer = gtk.CellRendererPixbuf() - column.pack_start(renderer, expand=False) + column = Gtk.TreeViewColumn() # 2nd COLUMN + renderer = Gtk.CellRendererPixbuf() + column.pack_start(renderer, False, True, 0) self.list_treeview.append_column(column) column.set_visible(False) self.list_treeview.set_expander_column(column) @@ -507,7 +508,7 @@ class GroupchatControl(ChatControlBase): def fill_column(self, col): for rend in self.renderers_list: - col.pack_start(rend[1], expand=rend[2]) + col.pack_start(rend[1], rend[2], True, 0) col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys @@ -562,17 +563,17 @@ class GroupchatControl(ChatControlBase): and the ability to insert a nick """ ChatControlBase.on_msg_textview_populate_popup(self, textview, menu) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() menu.prepend(item) - item = gtk.MenuItem(_('Insert Nickname')) + item = Gtk.MenuItem(_('Insert Nickname')) menu.prepend(item) - submenu = gtk.Menu() + submenu = Gtk.Menu() item.set_submenu(submenu) for nick in sorted(gajim.contacts.get_nick_list(self.account, self.room_jid)): - item = gtk.MenuItem(nick, use_underline=False) + item = Gtk.MenuItem(nick, use_underline=False) submenu.append(item) id_ = item.connect('activate', self.append_nick_in_msg_textview, nick) @@ -587,7 +588,7 @@ class GroupchatControl(ChatControlBase): self.resize_from_another_muc = False # Reset the flag when everything will be redrawn, and in particular when # on_treeview_size_allocate will have been called. - gobject.idle_add(reset_flag) + GObject.idle_add(reset_flag) def on_hpaned_notify(self, pane, gparamspec): """ @@ -616,7 +617,7 @@ class GroupchatControl(ChatControlBase): """ Iterate over all contact rows in the tree model """ - role_iter = self.model.get_iter_root() + role_iter = self.model.get_iter_first() while role_iter: contact_iter = self.model.iter_children(role_iter) while contact_iter: @@ -668,13 +669,13 @@ class GroupchatControl(ChatControlBase): if chatstate == 'active' or (current_tab and has_focus): self.attention_flag = False # get active color from gtk - color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] + color = self.parent_win.notebook.get_style().fg[Gtk.StateType.ACTIVE] elif chatstate == 'newmsg' and (not has_focus or not current_tab) \ and not self.attention_flag: color_name = gajim.config.get_per('themes', theme, 'state_muc_msg_color') if color_name: - color = gtk.gdk.colormap_get_system().alloc_color(color_name) + color = Gdk.colormap_get_system().alloc_color(color_name) if self.is_continued: # if this is a continued conversation @@ -726,14 +727,14 @@ class GroupchatControl(ChatControlBase): image = 'muc_inactive' if '32' in images and image in images['32']: muc_icon = images['32'][image] - if muc_icon.get_storage_type() != gtk.IMAGE_EMPTY: + if muc_icon.get_storage_type() != Gtk.ImageType.EMPTY: pix = muc_icon.get_pixbuf() banner_status_img.set_from_pixbuf(pix) return # we need to scale 16x16 to 32x32 muc_icon = images['16'][image] pix = muc_icon.get_pixbuf() - scaled_pix = pix.scale_simple(32, 32, gtk.gdk.INTERP_BILINEAR) + scaled_pix = pix.scale_simple(32, 32, GdkPixbuf.InterpType.BILINEAR) banner_status_img.set_from_pixbuf(scaled_pix) def get_continued_conversation_name(self): @@ -758,8 +759,8 @@ class GroupchatControl(ChatControlBase): Draw the text in the fat line at the top of the window that houses the room jid, subject """ - self.name_label.set_ellipsize(pango.ELLIPSIZE_END) - self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) + self.name_label.set_ellipsize(Pango.EllipsizeMode.END) + self.banner_status_label.set_ellipsize(Pango.EllipsizeMode.END) font_attrs, font_attrs_small = self.get_font_attrs() if self.is_continued: name = self.get_continued_conversation_name() @@ -770,7 +771,7 @@ class GroupchatControl(ChatControlBase): if self.subject: subject = helpers.reduce_chars_newlines(self.subject, max_lines=2) - subject = gobject.markup_escape_text(subject) + subject = GObject.markup_escape_text(subject) subject_text = self.urlfinder.sub(self.make_href, subject) subject_text = '%s' % (font_attrs_small, subject_text) @@ -807,8 +808,8 @@ class GroupchatControl(ChatControlBase): request_voice_separator = xml.get_object('request_voice_separator') if gtkgui_helpers.gtk_icon_theme.has_icon('bookmark-new'): - img = gtk.Image() - img.set_from_icon_name('bookmark-new', gtk.ICON_SIZE_MENU) + img = Gtk.Image() + img.set_from_icon_name('bookmark-new', Gtk.IconSize.MENU) bookmark_room_menuitem.set_image(img) if hide_buttonbar_items: @@ -831,15 +832,15 @@ class GroupchatControl(ChatControlBase): bookmark_separator.hide() break - ag = gtk.accel_groups_from_object(self.parent_win.window)[0] - change_nick_menuitem.add_accelerator('activate', ag, gtk.keysyms.n, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK, gtk.ACCEL_VISIBLE) + ag = Gtk.accel_groups_from_object(self.parent_win.window)[0] + change_nick_menuitem.add_accelerator('activate', ag, Gdk.KEY_n, + Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE) change_subject_menuitem.add_accelerator('activate', ag, - gtk.keysyms.t, gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) - bookmark_room_menuitem.add_accelerator('activate', ag, gtk.keysyms.b, - gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) - history_menuitem.add_accelerator('activate', ag, gtk.keysyms.h, - gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + Gdk.KEY_t, Gdk.ModifierType.MOD1_MASK, Gtk.AccelFlags.VISIBLE) + bookmark_room_menuitem.add_accelerator('activate', ag, Gdk.KEY_b, + Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE) + history_menuitem.add_accelerator('activate', ag, Gdk.KEY_h, + Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE) if self.contact.jid in gajim.config.get_per('accounts', self.account, 'minimized_gc').split(' '): @@ -914,15 +915,15 @@ class GroupchatControl(ChatControlBase): def destroy_menu(self, menu, change_nick_menuitem, change_subject_menuitem, bookmark_room_menuitem, history_menuitem): # destroy accelerators - ag = gtk.accel_groups_from_object(self.parent_win.window)[0] - change_nick_menuitem.remove_accelerator(ag, gtk.keysyms.n, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK) - change_subject_menuitem.remove_accelerator(ag, gtk.keysyms.t, - gtk.gdk.MOD1_MASK) - bookmark_room_menuitem.remove_accelerator(ag, gtk.keysyms.b, - gtk.gdk.CONTROL_MASK) - history_menuitem.remove_accelerator(ag, gtk.keysyms.h, - gtk.gdk.CONTROL_MASK) + ag = Gtk.accel_groups_from_object(self.parent_win.window)[0] + change_nick_menuitem.remove_accelerator(ag, Gdk.KEY_n, + Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK) + change_subject_menuitem.remove_accelerator(ag, Gdk.KEY_t, + Gdk.ModifierType.MOD1_MASK) + bookmark_room_menuitem.remove_accelerator(ag, Gdk.KEY_b, + Gdk.ModifierType.CONTROL_MASK) + history_menuitem.remove_accelerator(ag, Gdk.KEY_h, + Gdk.ModifierType.CONTROL_MASK) # destroy menu menu.destroy() @@ -966,15 +967,15 @@ class GroupchatControl(ChatControlBase): self.form_widget.connect('validated', on_send_dataform_clicked) self.form_widget.show_all() vbox = self.xml.get_object('gc_textviews_vbox') - vbox.pack_start(self.form_widget, expand=False, fill=False) + vbox.pack_start(self.form_widget, False, True, 0) - valid_button = gtk.Button(stock=gtk.STOCK_OK) + valid_button = Gtk.Button(stock=Gtk.STOCK_OK) valid_button.connect('clicked', on_send_dataform_clicked) - self.btn_box = gtk.HButtonBox() - self.btn_box.set_layout(gtk.BUTTONBOX_END) - self.btn_box.pack_start(valid_button) + self.btn_box = Gtk.HButtonBox() + self.btn_box.set_layout(Gtk.ButtonBoxStyle.END) + self.btn_box.pack_start(valid_button, True, True, 0) self.btn_box.show_all() - vbox.pack_start(self.btn_box, expand=False, fill=False) + vbox.pack_start(self.btn_box, False, False, 0) if self.parent_win: self.parent_win.redraw_tab(self, 'attention') else: @@ -1037,7 +1038,7 @@ class GroupchatControl(ChatControlBase): gajim.interface.roster.draw_contact(self.room_jid, self.account) def get_contact_iter(self, nick): - role_iter = self.model.get_iter_root() + role_iter = self.model.get_iter_first() while role_iter: user_iter = self.model.iter_children(role_iter) while user_iter: @@ -1303,7 +1304,7 @@ class GroupchatControl(ChatControlBase): def got_connected(self): # Make autorejoin stop. if self.autorejoin: - gobject.source_remove(self.autorejoin) + GObject.source_remove(self.autorejoin) self.autorejoin = None gajim.gc_connected[self.account][self.room_jid] = True @@ -1349,7 +1350,7 @@ class GroupchatControl(ChatControlBase): if self.autorejoin is None and gajim.account_is_connected(self.account): ar_to = gajim.config.get('muc_autorejoin_timeout') if ar_to: - self.autorejoin = gobject.timeout_add_seconds(ar_to, + self.autorejoin = GObject.timeout_add_seconds(ar_to, self.rejoin) def rejoin(self): @@ -1403,7 +1404,7 @@ class GroupchatControl(ChatControlBase): else: image = state_images[gc_contact.show] - name = gobject.markup_escape_text(gc_contact.name) + name = GObject.markup_escape_text(gc_contact.name) # Strike name if blocked fjid = self.room_jid + '/' + nick @@ -1422,14 +1423,14 @@ class GroupchatControl(ChatControlBase): colorstring = "#%04x%04x%04x" % (color.red, color.green, color.blue) name += ('\n' - '%s') % (colorstring, gobject.markup_escape_text( + '%s') % (colorstring, GObject.markup_escape_text( status)) - if image.get_storage_type() == gtk.IMAGE_PIXBUF and \ + if image.get_storage_type() == Gtk.ImageType.PIXBUF and \ gc_contact.affiliation != 'none' and gajim.config.get( 'show_affiliation_in_groupchat'): pixbuf1 = image.get_pixbuf().copy() - pixbuf2 = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, 4, 4) + pixbuf2 = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, True, 8, 4, 4) if gc_contact.affiliation == 'owner': pixbuf2.fill(0xff0000ff) # Red elif gc_contact.affiliation == 'admin': @@ -1438,8 +1439,8 @@ class GroupchatControl(ChatControlBase): pixbuf2.fill(0x00ff00ff) # Green pixbuf2.composite(pixbuf1, 12, 12, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, - gtk.gdk.INTERP_HYPER, 127) - image = gtk.image_new_from_pixbuf(pixbuf1) + GdkPixbuf.InterpType.HYPER, 127) + image = Gtk.image_new_from_pixbuf(pixbuf1) self.model[iter_][C_IMG] = image self.model[iter_][C_TEXT] = name @@ -1829,7 +1830,7 @@ class GroupchatControl(ChatControlBase): return iter_ def get_role_iter(self, role): - role_iter = self.model.get_iter_root() + role_iter = self.model.get_iter_first() while role_iter: role_name = self.model[role_iter][C_NICK].decode('utf-8') if role == role_name: @@ -2150,7 +2151,7 @@ class GroupchatControl(ChatControlBase): # Textview is not sensitive, don't handle keypress return # construct event instance from binding - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time @@ -2158,7 +2159,7 @@ class GroupchatControl(ChatControlBase): message_buffer = widget.get_buffer() start_iter, end_iter = message_buffer.get_bounds() - if event.keyval == gtk.keysyms.Tab: # TAB + if event.keyval == Gdk.KEY_Tab: # TAB cursor_position = message_buffer.get_insert() end_iter = message_buffer.get_iter_at_mark(cursor_position) text = message_buffer.get_text(start_iter, end_iter, False).decode( @@ -2271,7 +2272,7 @@ class GroupchatControl(ChatControlBase): self.last_key_tabs = False def on_list_treeview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: selection = widget.get_selection() iter_ = selection.get_selected()[1] if iter_: @@ -2438,7 +2439,7 @@ class GroupchatControl(ChatControlBase): item = xml.get_object('send_file_menuitem') # add a special img for send file menuitem path_to_upload_img = gtkgui_helpers.get_icon_path('gajim-upload') - img = gtk.Image() + img = Gtk.Image() img.set_from_file(path_to_upload_img) item.set_image(img) @@ -2515,7 +2516,7 @@ class GroupchatControl(ChatControlBase): return True elif event.button == 1: # left click - if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK: + if gajim.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK: self.on_row_activated(widget, path) return True else: @@ -2529,7 +2530,7 @@ class GroupchatControl(ChatControlBase): widget.collapse_row(path) else: widget.expand_row(path, False) - elif event.state & gtk.gdk.SHIFT_MASK: + elif event.get_state() & Gdk.ModifierType.SHIFT_MASK: self.append_nick_in_msg_textview(self.msg_textview, nick) self.msg_textview.grab_focus() return True @@ -2570,7 +2571,7 @@ class GroupchatControl(ChatControlBase): if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row nick = self.model[iter_][C_NICK].decode('utf-8') - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, gajim.contacts.get_gc_contact( account, self.room_jid, nick)) @@ -2585,7 +2586,7 @@ class GroupchatControl(ChatControlBase): # control has been destroyed since tooltip was requested return pointer = self.list_treeview.get_pointer() - props = self.list_treeview.get_path_at_pos(pointer[0], pointer[1]) + props = self.list_treeview.get_path_at_pos(pointer[1], pointer[2]) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: diff --git a/src/groups.py b/src/groups.py index 0b44088f2..1b3809966 100644 --- a/src/groups.py +++ b/src/groups.py @@ -64,7 +64,7 @@ class GroupsPostWindow: item.addChild('title', {}, [self.subject_entry.get_text()]) buf = self.contents_textview.get_buffer() - item.addChild('content', {}, [buf.get_text(buf.get_start_iter(), buf.get_end_iter())]) + item.addChild('content', {}, [buf.get_text(buf.get_start_iter(), buf.get_end_iter(), True)]) # publish it to node gajim.connections[self.account].send_pb_publish(self.servicejid, self.groupid, item, '0') diff --git a/src/gtkexcepthook.py b/src/gtkexcepthook.py index 5a9bb3476..eb334270b 100644 --- a/src/gtkexcepthook.py +++ b/src/gtkexcepthook.py @@ -25,8 +25,8 @@ import os import traceback import threading -import gtk -import pango +from gi.repository import Gtk +from gi.repository import Pango from common import i18n # installs _() function import dialogs @@ -42,7 +42,7 @@ def _info(type_, value, tb): _excepthook_save(type_, value, tb) return - dialog = dialogs.HigDialog(None, gtk.MESSAGE_WARNING, gtk.BUTTONS_NONE, + dialog = dialogs.HigDialog(None, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, _('A programming error has been detected'), _('It probably is not fatal, but should be reported ' 'to the developers nonetheless.')) @@ -50,20 +50,20 @@ def _info(type_, value, tb): dialog.set_modal(False) #FIXME: add icon to this button RESPONSE_REPORT_BUG = 42 - dialog.add_buttons(gtk.STOCK_CLOSE, gtk.BUTTONS_CLOSE, + dialog.add_buttons(Gtk.STOCK_CLOSE, Gtk.ButtonsType.CLOSE, _('_Report Bug'), RESPONSE_REPORT_BUG) report_button = dialog.action_area.get_children()[0] # right to left report_button.grab_focus() # Details - textview = gtk.TextView() + textview = Gtk.TextView() textview.set_editable(False) - textview.modify_font(pango.FontDescription('Monospace')) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + textview.modify_font(Pango.FontDescription('Monospace')) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(textview) - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_IN) + frame = Gtk.Frame() + frame.set_shadow_type(Gtk.ShadowType.IN) frame.add(sw) frame.set_border_width(6) textbuffer = textview.get_buffer() @@ -71,15 +71,15 @@ def _info(type_, value, tb): traceback.print_exception(type_, value, tb, None, trace) textbuffer.set_text(trace.getvalue()) textview.set_size_request( - gtk.gdk.screen_width() / 3, - gtk.gdk.screen_height() / 4) - expander = gtk.Expander(_('Details')) + Gdk.Screen.width() / 3, + Gdk.Screen.height() / 4) + expander = Gtk.Expander(_('Details')) expander.add(frame) dialog.vbox.add(expander) dialog.set_resizable(True) # on expand the details the dialog remains centered on screen - dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS) + dialog.set_position(Gtk.WindowPosition.CENTER_ALWAYS) def on_dialog_response(dialog, response): if response == RESPONSE_REPORT_BUG: diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 7583e6daf..7e4c96e26 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -28,10 +28,12 @@ ## import xml.sax.saxutils -import gtk +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf import glib -import gobject -import pango +from gi.repository import GObject +from gi.repository import Pango import os import sys @@ -41,13 +43,13 @@ log = logging.getLogger('gajim.gtkgui_helpers') from common import i18n from common import gajim -gtk_icon_theme = gtk.icon_theme_get_default() +gtk_icon_theme = Gtk.IconTheme.get_default() gtk_icon_theme.append_search_path(gajim.ICONS_DIR) def get_icon_pixmap(icon_name, size=16): try: return gtk_icon_theme.load_icon(icon_name, size, 0) - except gobject.GError, e: + except GObject.GError, e: log.error('Unable to load icon %s: %s' % (icon_name, str(e))) def get_icon_path(icon_name, size=16): @@ -58,7 +60,7 @@ def get_icon_path(icon_name, size=16): return "" else: return icon_info.get_filename() - except gobject.GError, e: + except GObject.GError, e: log.error("Unable to find icon %s: %s" % (icon_name, str(e))) import vcard @@ -76,11 +78,11 @@ if os.name == 'nt': from common import helpers -screen_w = gtk.gdk.screen_width() -screen_h = gtk.gdk.screen_height() +screen_w = Gdk.Screen.width() +screen_h = Gdk.Screen.height() def add_image_to_menuitem(menuitem, icon_name): - img = gtk.Image() + img = Gtk.Image() path_img = get_icon_path(icon_name) img.set_from_file(path_img) menuitem.set_image(img) @@ -91,7 +93,7 @@ def add_image_to_button(button, icon_name): GUI_DIR = os.path.join(gajim.DATA_DIR, 'gui') def get_gtk_builder(file_name, widget=None): file_path = os.path.join(GUI_DIR, file_name) - builder = gtk.Builder() + builder = Gtk.Builder() builder.set_translation_domain(i18n.APP) if widget: builder.add_objects_from_file(file_path, [widget]) @@ -104,15 +106,15 @@ def get_completion_liststore(entry): Create a completion model for entry widget completion list consists of (Pixbuf, Text) rows """ - completion = gtk.EntryCompletion() - liststore = gtk.ListStore(gtk.gdk.Pixbuf, str) + completion = Gtk.EntryCompletion() + liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str) - render_pixbuf = gtk.CellRendererPixbuf() - completion.pack_start(render_pixbuf, expand = False) + render_pixbuf = Gtk.CellRendererPixbuf() + completion.pack_start(render_pixbuf, False, True, 0) completion.add_attribute(render_pixbuf, 'pixbuf', 0) - render_text = gtk.CellRendererText() - completion.pack_start(render_text, expand = True) + render_text = Gtk.CellRendererText() + completion.pack_start(render_text, True, True, 0) completion.add_attribute(render_text, 'text', 1) completion.set_property('text_column', 1) completion.set_model(liststore) @@ -138,7 +140,7 @@ def popup_emoticons_under_button(menu, button, parent_win): ## should we pop down or up? if (y + button.allocation.height + menu_height - < gtk.gdk.screen_height()): + < Gdk.Screen.height()): # now move the menu below the button y += button.allocation.height else: @@ -156,14 +158,14 @@ def get_theme_font_for_option(theme, option): Return string description of the font, stored in theme preferences """ font_name = gajim.config.get_per('themes', theme, option) - font_desc = pango.FontDescription() + font_desc = Pango.FontDescription() font_prop_str = gajim.config.get_per('themes', theme, option + 'attrs') if font_prop_str: if font_prop_str.find('B') != -1: - font_desc.set_weight(pango.WEIGHT_BOLD) + font_desc.set_weight(Pango.Weight.BOLD) if font_prop_str.find('I') != -1: - font_desc.set_style(pango.STYLE_ITALIC) - fd = pango.FontDescription(font_name) + font_desc.set_style(Pango.Style.ITALIC) + fd = Pango.FontDescription(font_name) fd.merge(font_desc, True) return fd.to_string() @@ -188,7 +190,7 @@ def get_default_font(): if xdg_config_home == '': xdg_config_home = os.path.expanduser('~/.config') # default xfce_config_file = os.path.join(xdg_config_home, - 'xfce4/mcs_settings/gtk.xml') + 'xfce4/mcs_settings/Gtk.xml') kde_config_file = os.path.expanduser('~/.kde/share/config/kdeglobals') @@ -406,15 +408,15 @@ def get_abspath_for_script(scriptname, want_type = False): def get_pixbuf_from_data(file_data, want_type = False): """ - Get image data and returns gtk.gdk.Pixbuf if want_type is True it also + Get image data and returns GdkPixbuf.Pixbuf if want_type is True it also returns 'jpeg', 'png' etc """ - pixbufloader = gtk.gdk.PixbufLoader() + pixbufloader = GdkPixbuf.PixbufLoader() try: pixbufloader.write(file_data) pixbufloader.close() pixbuf = pixbufloader.get_pixbuf() - except gobject.GError: # 'unknown image format' + except GObject.GError: # 'unknown image format' pixbufloader.close() pixbuf = None if want_type: @@ -429,9 +431,9 @@ def get_pixbuf_from_data(file_data, want_type = False): return pixbuf def get_invisible_cursor(): - pixmap = gtk.gdk.Pixmap(None, 1, 1, 1) - color = gtk.gdk.Color() - cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0) + pixmap = Gdk.Pixmap(None, 1, 1, 1) + color = Gdk.Color() + cursor = Gdk.Cursor.new(pixmap, pixmap, color, color, 0, 0) return cursor def get_current_desktop(window): @@ -457,10 +459,16 @@ def possibly_move_window_in_current_desktop(window): NOTE: Window is a GDK window. """ + #TODO: property_get doesn't work: + #prop_atom = Gdk.Atom.intern('_NET_CURRENT_DESKTOP', False) + #type_atom = Gdk.Atom.intern("CARDINAL", False) + #w = Gdk.Screen.get_default().get_root_window() + #Gdk.property_get(w, prop_atom, type_atom, 0, 9999, False) + return False if os.name == 'nt': return False - root_window = gtk.gdk.screen_get_default().get_root_window() + root_window = Gdk.Screen.get_default().get_root_window() # current user's vd current_virtual_desktop_no = get_current_desktop(root_window) @@ -514,20 +522,20 @@ def get_fade_color(treeview, selected, focused): Get a gdk color that is between foreground and background in 0.3 0.7 respectively colors of the cell for the given treeview """ - style = treeview.style + style = treeview.get_style() if selected: if focused: # is the window focused? - state = gtk.STATE_SELECTED + state = Gtk.StateType.SELECTED else: # is it not? NOTE: many gtk themes change bg on this - state = gtk.STATE_ACTIVE + state = Gtk.StateType.ACTIVE else: - state = gtk.STATE_NORMAL + state = Gtk.StateType.NORMAL bg = style.base[state] fg = style.text[state] p = 0.3 # background q = 0.7 # foreground # p + q should do 1.0 - return gtk.gdk.Color(int(bg.red*p + fg.red*q), + return Gdk.Color(int(bg.red*p + fg.red*q), int(bg.green*p + fg.green*q), int(bg.blue*p + fg.blue*q)) @@ -557,7 +565,7 @@ def get_scaled_pixbuf(pixbuf, kind): else: h = height w = int(h * ratio) - scaled_buf = pixbuf.scale_simple(w, h, gtk.gdk.INTERP_HYPER) + scaled_buf = pixbuf.scale_simple(w, h, GdkPixbuf.InterpType.HYPER) return scaled_buf def get_avatar_pixbuf_from_cache(fjid, use_local=True): @@ -743,9 +751,9 @@ Description=xmpp gajim.config.set('check_if_gajim_is_default', False) try: - import gconf + from gi.repository import GConf # in try because daemon may not be there - client = gconf.client_get_default() + client = GConf.Client.get_default() except Exception: return @@ -786,7 +794,7 @@ def get_state_image_from_file_path_show(file_path, show): files = [] files.append(os.path.join(file_path, state_file + '.png')) files.append(os.path.join(file_path, state_file + '.gif')) - image = gtk.Image() + image = Gtk.Image() image.set_from_pixbuf(None) for file_ in files: if os.path.exists(file_): @@ -799,7 +807,7 @@ def get_possible_button_event(event): """ Mouse or keyboard caused the event? """ - if event.type == gtk.gdk.KEY_PRESS: + if event.type == Gdk.KEY_PRESS: return 0 # no event.button so pass 0 # BUTTON_PRESS event, so pass event.button return event.button @@ -870,9 +878,9 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): dialog.destroy() dialog = dialogs.FileChooserDialog(title_text=_('Save Image as...'), - action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, - gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK), - default_response=gtk.RESPONSE_OK, + action=Gtk.FileChooserAction.SAVE, buttons=(Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK), + default_response=Gtk.ResponseType.OK, current_folder=gajim.config.get('last_save_dir'), on_response_ok=on_ok, on_response_cancel=on_cancel) @@ -881,16 +889,16 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): on_cancel(widget)) def on_bm_header_changed_state(widget, event): - widget.set_state(gtk.STATE_NORMAL) #do not allow selected_state + widget.set_state(Gtk.StateType.NORMAL) #do not allow selected_state def create_combobox(value_list, selected_value = None): """ Value_list is [(label1, value1)] """ - liststore = gtk.ListStore(str, str) - combobox = gtk.ComboBox(liststore) - cell = gtk.CellRendererText() - combobox.pack_start(cell, True) + liststore = Gtk.ListStore(str, str) + combobox = Gtk.ComboBox(liststore) + cell = Gtk.CellRendererText() + combobox.pack_start(cell, True, True, 0) combobox.add_attribute(cell, 'text', 0) i = -1 for value in value_list: @@ -906,14 +914,14 @@ def create_list_multi(value_list, selected_values=None): """ Value_list is [(label1, value1)] """ - liststore = gtk.ListStore(str, str) - treeview = gtk.TreeView(liststore) - treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + liststore = Gtk.ListStore(str, str) + treeview = Gtk.TreeView(liststore) + treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) treeview.set_headers_visible(False) - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() treeview.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) + cell = Gtk.CellRendererText() + col.pack_start(cell, True, True, 0) col.set_attributes(cell, text=0) for value in value_list: iter = liststore.append(value) @@ -982,7 +990,7 @@ def load_icons_meta(): if not os.path.isfile(path_opened): path_opened = os.path.join(path, 'opened.png') if os.path.isfile(path_opened): - pixo = gtk.gdk.pixbuf_new_from_file(path_opened) + pixo = GdkPixbuf.Pixbuf.new_from_file(path_opened) else: pixo = None # Same thing for closed @@ -990,7 +998,7 @@ def load_icons_meta(): if not os.path.isfile(path_closed): path_closed = os.path.join(path, 'closed.png') if os.path.isfile(path_closed): - pixc = gtk.gdk.pixbuf_new_from_file(path_closed) + pixc = GdkPixbuf.Pixbuf.new_from_file(path_closed) else: pixc = None return pixo, pixc @@ -1007,19 +1015,19 @@ def _load_icon_list(icons_list, path, pixbuf2 = None): files = [] files.append(path + icon_file + '.gif') files.append(path + icon_file + '.png') - image = gtk.Image() + image = Gtk.Image() image.show() imgs[icon] = image for file_ in files: # loop seeking for either gif or png if os.path.exists(file_): image.set_from_file(file_) - if pixbuf2 and image.get_storage_type() == gtk.IMAGE_PIXBUF: + if pixbuf2 and image.get_storage_type() == Gtk.ImageType.PIXBUF: # add pixbuf2 on top-left corner of image pixbuf1 = image.get_pixbuf() pixbuf2.composite(pixbuf1, 0, 0, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, - gtk.gdk.INTERP_NEAREST, 255) + GdkPixbuf.InterpType.NEAREST, 255) image.set_from_pixbuf(pixbuf1) break return imgs @@ -1058,21 +1066,21 @@ def make_jabber_state_images(): else: # Resize 32x32 icons to 24x24 for each in gajim.interface.jabber_state_images['32']: - img = gtk.Image() + img = Gtk.Image() pix = gajim.interface.jabber_state_images['32'][each] pix_type = pix.get_storage_type() - if pix_type == gtk.IMAGE_ANIMATION: + if pix_type == Gtk.ImageType.ANIMATION: animation = pix.get_animation() pixbuf = animation.get_static_image() - elif pix_type == gtk.IMAGE_EMPTY: + elif pix_type == Gtk.ImageType.EMPTY: pix = gajim.interface.jabber_state_images['16'][each] pix_16_type = pix.get_storage_type() - if pix_16_type == gtk.IMAGE_ANIMATION: + if pix_16_type == Gtk.ImageType.ANIMATION: animation = pix.get_animation() pixbuf = animation.get_static_image() else: pixbuf = pix.get_pixbuf() - scaled_pix = pixbuf.scale_simple(24, 24, gtk.gdk.INTERP_BILINEAR) + scaled_pix = pixbuf.scale_simple(24, 24, GdkPixbuf.InterpType.BILINEAR) img.set_from_pixbuf(scaled_pix) gajim.interface.jabber_state_images['24'][each] = img @@ -1085,11 +1093,11 @@ def label_set_autowrap(widget): Make labels automatically re-wrap if their containers are resized. Accepts label or container widgets """ - if isinstance (widget, gtk.Container): + if isinstance (widget, Gtk.Container): children = widget.get_children() for i in xrange (len (children)): label_set_autowrap(children[i]) - elif isinstance(widget, gtk.Label): + elif isinstance(widget, Gtk.Label): widget.set_line_wrap(True) widget.connect_after('size-allocate', __label_size_allocate) @@ -1101,13 +1109,13 @@ def __label_size_allocate(widget, allocation): lw_old, lh_old = layout.get_size() # fixed width labels - if lw_old/pango.SCALE == allocation.width: + if lw_old/Pango.SCALE == allocation.width: return - # set wrap width to the pango.Layout of the labels ### + # set wrap width to the Pango.Layout of the labels ### widget.set_alignment(0.0, 0.0) - layout.set_width (allocation.width * pango.SCALE) + layout.set_width (allocation.width * Pango.SCALE) lh = layout.get_size()[1] if lh_old != lh: - widget.set_size_request (-1, lh / pango.SCALE) + widget.set_size_request (-1, lh / Pango.SCALE) diff --git a/src/gui_interface.py b/src/gui_interface.py index b16c178e8..403c95693 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -41,8 +41,9 @@ import time import math from subprocess import Popen -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GObject from common import i18n from common import gajim @@ -228,7 +229,7 @@ class Interface: # we stop blocking notifications of any kind # this prevents from getting the roster items as 'just signed in' # contacts. 30 seconds should be enough time - gobject.timeout_add_seconds(30, + GObject.timeout_add_seconds(30, self.unblock_signed_in_notifications, account) if account in self.show_vcard_when_connect and obj.show not in ( @@ -369,7 +370,7 @@ class Interface: # popup notifications for 30s account_jid = account + '/' + jid gajim.block_signed_in_notifications[account_jid] = True - gobject.timeout_add_seconds(30, + GObject.timeout_add_seconds(30, self.unblock_signed_in_notifications, account_jid) highest = gajim.contacts.get_contact_with_highest_priority(account, jid) @@ -964,13 +965,13 @@ class Interface: # then the file is not corrupt jid = unicode(file_props.sender) if file_props.hash_ == hash_: - gobject.idle_add(self.popup_ft_result, account, jid, file_props) - gobject.idle_add(ft_win.set_status, file_props, 'ok') + GObject.idle_add(self.popup_ft_result, account, jid, file_props) + GObject.idle_add(ft_win.set_status, file_props, 'ok') else: # wrong hash, we need to get the file again! file_props.error = -10 - gobject.idle_add(self.popup_ft_result, account, jid, file_props) - gobject.idle_add(ft_win.set_status, file_props, 'hash_error') + GObject.idle_add(self.popup_ft_result, account, jid, file_props) + GObject.idle_add(ft_win.set_status, file_props, 'hash_error') # End jingle session if session: session.end_session() @@ -1109,7 +1110,7 @@ class Interface: if gajim.config.get('ask_offline_status_on_connection'): # Ask offline status in 1 minute so w'are sure we got all online # presences - gobject.timeout_add_seconds(60, self.ask_offline_status, account) + GObject.timeout_add_seconds(60, self.ask_offline_status, account) if state != common.sleepy.STATE_UNKNOWN and connected in (2, 3): # we go online or free for chat, so we activate auto status gajim.sleeper_state[account] = 'online' @@ -1757,7 +1758,7 @@ class Interface: self.roster.draw_contact(jid, account) if w: w.set_active_tab(ctrl) - w.window.window.focus(gtk.get_current_event_time()) + w.window.window.focus(Gtk.get_current_event_time()) # Using isinstance here because we want to catch all derived types if isinstance(ctrl, ChatControlBase): tv = ctrl.conv_textview @@ -1770,13 +1771,13 @@ class Interface: def image_is_ok(self, image): if not os.path.exists(image): return False - img = gtk.Image() + img = Gtk.Image() try: img.set_from_file(image) except Exception: return False t = img.get_storage_type() - if t != gtk.IMAGE_PIXBUF and t != gtk.IMAGE_ANIMATION: + if t != Gtk.ImageType.PIXBUF and t != Gtk.ImageType.ANIMATION: return False return True @@ -1874,7 +1875,6 @@ class Interface: emoticons_pattern_postmatch = '' emoticon_length = 0 for emoticon in keys: # travel thru emoticons list - emoticon = emoticon.decode('utf-8') emoticon_escaped = re.escape(emoticon) # espace regexp metachars # | means or in regexp emoticons_pattern += emoticon_escaped + '|' @@ -1917,7 +1917,7 @@ class Interface: button, parent_win) def prepare_emoticons_menu(self): - menu = gtk.Menu() + menu = Gtk.Menu() def emoticon_clicked(w, str_): if self.emoticon_menuitem_clicked: self.emoticon_menuitem_clicked(str_) @@ -1932,12 +1932,14 @@ class Interface: # Calculate the side lenght of the popup to make it a square size = int(round(math.sqrt(len(self.emoticons_images)))) for image in self.emoticons_images: - item = gtk.MenuItem() - img = gtk.Image() - if isinstance(image[1], gtk.gdk.PixbufAnimation): + item = Gtk.MenuItem() + img = Gtk.Image() + if isinstance(image[1], GdkPixbuf.PixbufAnimation): img.set_from_animation(image[1]) else: img.set_from_pixbuf(image[1]) + c = item.get_child() + item.remove(c) item.add(img) item.connect('activate', emoticon_clicked, image[0]) # add tooltip with ascii @@ -1972,9 +1974,9 @@ class Interface: # and :-) if not emot_file in self.emoticons.values(): if emot_file.endswith('.gif'): - pix = gtk.gdk.PixbufAnimation(emot_file) + pix = GdkPixbuf.PixbufAnimation.new_from_file(emot_file) else: - pix = gtk.gdk.pixbuf_new_from_file_at_size(emot_file, + pix = GdkPixbuf.Pixbuf.new_from_file_at_size(emot_file, 16, 16) self.emoticons_images.append((emot, pix)) self.emoticons[emot.upper()] = emot_file @@ -2187,7 +2189,7 @@ class Interface: # For JEP-0172 if added_to_roster: ctrl.user_nick = gajim.nicks[account] - gobject.idle_add(mw.window.grab_focus) + GObject.idle_add(mw.window.grab_focus) return ctrl @@ -2307,11 +2309,11 @@ class Interface: return format_rgb (*gdkcolor_to_rgb (gdkcolor)) # get style colors and create string for dvipng - dummy = gtk.Invisible() + dummy = Gtk.Invisible() dummy.ensure_style() style = dummy.get_style() - bg_str = format_gdkcolor(style.base[gtk.STATE_NORMAL]) - fg_str = format_gdkcolor(style.text[gtk.STATE_NORMAL]) + bg_str = format_gdkcolor(style.base[Gtk.StateType.NORMAL]) + fg_str = format_gdkcolor(style.text[Gtk.StateType.NORMAL]) return (bg_str, fg_str) def get_fg_color(self, fmt='hex'): @@ -2323,9 +2325,9 @@ class Interface: return str(c) # get foreground style color and create string - dummy = gtk.Invisible() + dummy = Gtk.Invisible() dummy.ensure_style() - return format_gdkcolor(dummy.get_style().text[gtk.STATE_NORMAL]) + return format_gdkcolor(dummy.get_style().text[Gtk.StateType.NORMAL]) def read_sleepy(self): """ @@ -2435,9 +2437,9 @@ class Interface: # Otherwise, an exception will stop our loop timeout, in_seconds = gajim.idlequeue.PROCESS_TIMEOUT if in_seconds: - gobject.timeout_add_seconds(timeout, self.process_connections) + GObject.timeout_add_seconds(timeout, self.process_connections) else: - gobject.timeout_add(timeout, self.process_connections) + GObject.timeout_add(timeout, self.process_connections) raise return True # renew timeout (loop for ever) @@ -2608,21 +2610,21 @@ class Interface: except ImportError: print 'ipython_view not found' return - import pango + from gi.repository import Pango if os.name == 'nt': font = 'Lucida Console 9' else: font = 'Luxi Mono 10' - window = gtk.Window() + window = Gtk.Window() window.set_size_request(750, 550) window.set_resizable(True) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) view = IPythonView() - view.modify_font(pango.FontDescription(font)) - view.set_wrap_mode(gtk.WRAP_CHAR) + view.modify_font(Pango.FontDescription(font)) + view.set_wrap_mode(Gtk.WrapMode.CHAR) sw.add(view) window.add(sw) window.show_all() @@ -2650,18 +2652,18 @@ class Interface: # get instances for windows/dialogs that will show_all()/hide() self.instances['file_transfers'] = dialogs.FileTransfersWindow() - gobject.timeout_add(100, self.autoconnect) + GObject.timeout_add(100, self.autoconnect) timeout, in_seconds = gajim.idlequeue.PROCESS_TIMEOUT if in_seconds: - gobject.timeout_add_seconds(timeout, self.process_connections) + GObject.timeout_add_seconds(timeout, self.process_connections) else: - gobject.timeout_add(timeout, self.process_connections) - gobject.timeout_add_seconds(gajim.config.get( + GObject.timeout_add(timeout, self.process_connections) + GObject.timeout_add_seconds(gajim.config.get( 'check_idle_every_foo_seconds'), self.read_sleepy) # when using libasyncns we need to process resolver in regular intervals if resolver.USE_LIBASYNCNS: - gobject.timeout_add(200, gajim.resolver.process) + GObject.timeout_add(200, gajim.resolver.process) def remote_init(): if gajim.config.get('remote_control'): @@ -2670,7 +2672,7 @@ class Interface: self.remote_ctrl = remote_control.Remote() except Exception: pass - gobject.timeout_add_seconds(5, remote_init) + GObject.timeout_add_seconds(5, remote_init) def __init__(self): gajim.interface = self @@ -2730,8 +2732,8 @@ class Interface: break # Is gnome configured to activate row on single click ? try: - import gconf - client = gconf.client_get_default() + from gi.repository import GConf + client = GConf.Client.get_default() click_policy = client.get_string( '/apps/nautilus/preferences/click_policy') if click_policy == 'single': @@ -2814,9 +2816,9 @@ class Interface: gajim.connections[account] = Connection(account) # gtk hooks - gtk.about_dialog_set_email_hook(self.on_launch_browser_mailer, 'mail') - gtk.about_dialog_set_url_hook(self.on_launch_browser_mailer, 'url') - gtk.link_button_set_uri_hook(self.on_launch_browser_mailer, 'url') +# Gtk.about_dialog_set_email_hook(self.on_launch_browser_mailer, 'mail') +# Gtk.about_dialog_set_url_hook(self.on_launch_browser_mailer, 'url') +# Gtk.link_button_set_uri_hook(self.on_launch_browser_mailer, 'url') self.instances = {} @@ -2928,7 +2930,7 @@ class Interface: pixs.append(pix) if pixs: # set the icon to all windows - gtk.window_set_default_icon_list(*pixs) + Gtk.Window.set_default_icon_list(pixs) self.init_emoticons() self.make_regexps() @@ -2941,7 +2943,7 @@ class Interface: lang = gajim.config.get('speller_language') if not lang: lang = gajim.LANG - tv = gtk.TextView() + tv = Gtk.TextView() try: import gtkspell spell = gtkspell.Spell(tv, lang) @@ -2998,7 +3000,7 @@ class PassphraseRequest: self.passphrase = passphrase self.completed = True if passphrase is not None: - gobject.timeout_add_seconds(30, + GObject.timeout_add_seconds(30, gajim.interface.forget_gpg_passphrase, self.keyid) for (account, cb) in self.callbacks: self.run_callback(account, cb) @@ -3050,7 +3052,7 @@ class ThreadInterface: def thread_function(func, func_args, callback, callback_args): output = func(*func_args) if callback: - gobject.idle_add(callback, output, *callback_args) + GObject.idle_add(callback, output, *callback_args) Thread(target=thread_function, args=(func, func_args, callback, callback_args)).start() diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 7d9d3a8e9..e968c513c 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -18,7 +18,7 @@ ## along with Gajim. If not, see . ## -import gtk +from gi.repository import Gtk import os import gtkgui_helpers import message_control @@ -35,7 +35,7 @@ def build_resources_submenu(contacts, account, action, room_jid=None, action self.on_invite_to_room """ roster = gajim.interface.roster - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() iconset = gajim.config.get('iconset') if not iconset: @@ -44,7 +44,7 @@ def build_resources_submenu(contacts, account, action, room_jid=None, for c in contacts: # icon MUST be different instance for every item state_images = gtkgui_helpers.load_iconset(path) - item = gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority))) + item = Gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority))) icon_name = helpers.get_icon_name_to_show(c, account) icon = state_images[icon_name] item.set_image(icon) @@ -89,10 +89,10 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): # they are not all from the same transport invite_menuitem.set_sensitive(False) return - invite_to_submenu = gtk.Menu() + invite_to_submenu = Gtk.Menu() invite_menuitem.set_submenu(invite_to_submenu) - invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New Group Chat')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + invite_to_new_room_menuitem = Gtk.ImageMenuItem(_('_New Group Chat')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) invite_to_new_room_menuitem.set_image(icon) if len(contact_list) > 1: # several resources invite_to_new_room_menuitem.set_submenu(build_resources_submenu( @@ -136,10 +136,10 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): contacts_transport == gajim.get_transport_name_from_jid(room_jid): rooms.append((room_jid, acct)) if len(rooms): - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator invite_to_submenu.append(item) for (room_jid, account) in rooms: - menuitem = gtk.MenuItem(room_jid.split('@')[0]) + menuitem = Gtk.MenuItem(room_jid.split('@')[0]) if len(contact_list) > 1: # several resources menuitem.set_submenu(build_resources_submenu( contact_list, account, roster.on_invite_to_room, room_jid, @@ -207,7 +207,7 @@ control=None, gc_contact=None, is_anonymous=True): # add a special img for send file menuitem path_to_upload_img = gtkgui_helpers.get_icon_path('gajim-upload') - img = gtk.Image() + img = Gtk.Image() img.set_from_file(path_to_upload_img) send_file_menuitem.set_image(img) @@ -373,7 +373,7 @@ control=None, gc_contact=None, is_anonymous=True): send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( gajim.interface.status_sent_to_users[account][jid])) else: - icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NETWORK, Gtk.IconSize.MENU) send_custom_status_menuitem.set_image(icon) muc_icon = gtkgui_helpers.load_icon('muc_active') @@ -393,14 +393,14 @@ control=None, gc_contact=None, is_anonymous=True): invite_menuitem.set_sensitive(False) # One or several resource, we do the same for send_custom_status - status_menuitems = gtk.Menu() + status_menuitems = Gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): # icon MUST be different instance for every item state_images = gtkgui_helpers.load_iconset(path) - status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) status_menuitem.connect('activate', roster.on_send_custom_status, [(contact, account)], s) icon = state_images[s] diff --git a/src/history_manager.py b/src/history_manager.py index b1d007826..4b9292590 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -49,8 +49,8 @@ if os.name == 'nt': import sys import signal -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject import time import locale @@ -110,7 +110,7 @@ class HistoryManager: def __init__(self): pix = gtkgui_helpers.get_icon_pixmap('gajim') # set the icon to all newly opened windows - gtk.window_set_default_icon(pix) + Gtk.window_set_default_icon(pix) if not os.path.exists(LOG_DB_PATH): dialogs.ErrorDialog(_('Cannot find history logs database'), @@ -148,12 +148,12 @@ class HistoryManager: xml.connect_signals(self) def _init_jids_listview(self): - self.jids_liststore = gtk.ListStore(str, str) # jid, jid_id + self.jids_liststore = Gtk.ListStore(str, str) # jid, jid_id self.jids_listview.set_model(self.jids_liststore) - self.jids_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.jids_listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) - renderer_text = gtk.CellRendererText() # holds jid - col = gtk.TreeViewColumn(_('Jabber ID'), renderer_text, text=0) + renderer_text = Gtk.CellRendererText() # holds jid + col = Gtk.TreeViewColumn(_('Jabber ID'), renderer_text, text=0) self.jids_listview.append_column(col) self.jids_listview.get_selection().connect('changed', @@ -161,19 +161,19 @@ class HistoryManager: def _init_logs_listview(self): # log_line_id(HIDDEN), jid_id(HIDDEN), time, message, subject, nickname - self.logs_liststore = gtk.ListStore(str, str, str, str, str, str) + self.logs_liststore = Gtk.ListStore(str, str, str, str, str, str) self.logs_listview.set_model(self.logs_liststore) - self.logs_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.logs_listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) - renderer_text = gtk.CellRendererText() # holds time - col = gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) + renderer_text = Gtk.CellRendererText() # holds time + col = Gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) # user can click this header and sort col.set_sort_column_id(C_UNIXTIME) col.set_resizable(True) self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds nickname - col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) + renderer_text = Gtk.CellRendererText() # holds nickname + col = Gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) # user can click this header and sort col.set_sort_column_id(C_NICKNAME) col.set_resizable(True) @@ -181,16 +181,16 @@ class HistoryManager: self.nickname_col_for_logs = col self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds message - col = gtk.TreeViewColumn(_('Message'), renderer_text, markup=C_MESSAGE) + renderer_text = Gtk.CellRendererText() # holds message + col = Gtk.TreeViewColumn(_('Message'), renderer_text, markup=C_MESSAGE) # user can click this header and sort col.set_sort_column_id(C_MESSAGE) col.set_resizable(True) self.message_col_for_logs = col self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds subject - col = gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) + renderer_text = Gtk.CellRendererText() # holds subject + col = Gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) col.set_sort_column_id(C_SUBJECT) # user can click this header and sort col.set_resizable(True) col.set_visible(False) @@ -199,37 +199,37 @@ class HistoryManager: def _init_search_results_listview(self): # log_line_id (HIDDEN), jid, time, message, subject, nickname - self.search_results_liststore = gtk.ListStore(str, str, str, str, str, + self.search_results_liststore = Gtk.ListStore(str, str, str, str, str, str) self.search_results_listview.set_model(self.search_results_liststore) - renderer_text = gtk.CellRendererText() # holds JID (who said this) - col = gtk.TreeViewColumn(_('JID'), renderer_text, text=1) + renderer_text = Gtk.CellRendererText() # holds JID (who said this) + col = Gtk.TreeViewColumn(_('JID'), renderer_text, text=1) col.set_sort_column_id(1) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds time - col = gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) + renderer_text = Gtk.CellRendererText() # holds time + col = Gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) # user can click this header and sort col.set_sort_column_id(C_UNIXTIME) col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds message - col = gtk.TreeViewColumn(_('Message'), renderer_text, text=C_MESSAGE) + renderer_text = Gtk.CellRendererText() # holds message + col = Gtk.TreeViewColumn(_('Message'), renderer_text, text=C_MESSAGE) col.set_sort_column_id(C_MESSAGE) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds subject - col = gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) + renderer_text = Gtk.CellRendererText() # holds subject + col = Gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) col.set_sort_column_id(C_SUBJECT) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds nickname - col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) + renderer_text = Gtk.CellRendererText() # holds nickname + col = Gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) # user can click this header and sort col.set_sort_column_id(C_NICKNAME) col.set_resizable(True) @@ -237,16 +237,16 @@ class HistoryManager: def on_history_manager_window_delete_event(self, widget, event): if not self.AT_LEAST_ONE_DELETION_DONE: - gtk.main_quit() + Gtk.main_quit() return def on_yes(clicked): self.cur.execute('VACUUM') self.con.commit() - gtk.main_quit() + Gtk.main_quit() def on_no(): - gtk.main_quit() + Gtk.main_quit() dialog = dialogs.YesNoDialog( _('Do you want to clean up the database? ' @@ -285,7 +285,7 @@ class HistoryManager: list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference(liststore, path)) for rowref in list_of_rowrefs: # FILL THE STORE, for all rows selected path = rowref.get_path() @@ -413,7 +413,7 @@ class HistoryManager: if color: message_ += ' foreground="%s"' % color message_ += '>%s' % \ - gobject.markup_escape_text(message) + GObject.markup_escape_text(message) self.logs_liststore.append((log_line_id, jid_id, time_, message_, subject, nickname)) @@ -451,7 +451,7 @@ class HistoryManager: def on_logs_listview_key_press_event(self, widget, event): liststore, list_of_paths = self.logs_listview.get_selection()\ .get_selected_rows() - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self._delete_logs(liststore, list_of_paths) def on_listview_button_press_event(self, widget, event): @@ -479,7 +479,7 @@ class HistoryManager: dlg.props.do_overwrite_confirmation = True response = dlg.run() - if response == gtk.RESPONSE_OK: # user want us to export ;) + if response == Gtk.ResponseType.OK: # user want us to export ;) liststore, list_of_paths = self.jids_listview.get_selection()\ .get_selected_rows() path_to_file = dlg.get_filename() @@ -489,7 +489,7 @@ class HistoryManager: dlg.destroy() def on_delete_menuitem_activate(self, widget, listview): - widget_name = gtk.Buildable.get_name(listview) + widget_name = Gtk.Buildable.get_name(listview) liststore, list_of_paths = listview.get_selection().get_selected_rows() if widget_name == 'jids_listview': self._delete_jid_logs(liststore, list_of_paths) @@ -501,7 +501,7 @@ class HistoryManager: def on_jids_listview_key_press_event(self, widget, event): liststore, list_of_paths = self.jids_listview.get_selection()\ .get_selected_rows() - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self._delete_jid_logs(liststore, list_of_paths) def _export_jids_logs_to_file(self, liststore, list_of_paths, path_to_file): @@ -511,7 +511,7 @@ class HistoryManager: list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference(liststore, path)) for rowref in list_of_rowrefs: path = rowref.get_path() @@ -563,7 +563,7 @@ class HistoryManager: # delete all rows from db that match jid_id list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference(liststore, path)) for rowref in list_of_rowrefs: path = rowref.get_path() @@ -612,7 +612,7 @@ class HistoryManager: # delete rows from db that match log_line_id list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference(liststore, path)) for rowref in list_of_rowrefs: path = rowref.get_path() @@ -660,7 +660,7 @@ class HistoryManager: # as this is what db returns so I don't have to fight with types jid_id = self._get_jid_id(jid) - iter_ = self.jids_liststore.get_iter_root() + iter_ = self.jids_liststore.get_iter_first() while iter_: # self.jids_liststore[iter_][1] holds jid_ids if self.jids_liststore[iter_][1] == jid_id: @@ -673,7 +673,7 @@ class HistoryManager: path = self.jids_liststore.get_path(iter_) self.jids_listview.set_cursor(path) - iter_ = self.logs_liststore.get_iter_root() + iter_ = self.logs_liststore.get_iter_first() while iter_: # self.logs_liststore[iter_][0] holds lon_line_ids if self.logs_liststore[iter_][0] == log_line_id: @@ -686,4 +686,4 @@ class HistoryManager: if __name__ == '__main__': signal.signal(signal.SIGINT, signal.SIG_DFL) # ^C exits the application HistoryManager() - gtk.main() + Gtk.main() diff --git a/src/history_window.py b/src/history_window.py index c458c65af..a774b83b0 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -25,8 +25,8 @@ ## along with Gajim. If not, see . ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject import time import calendar @@ -78,7 +78,7 @@ class HistoryWindow: self.on_log_history_checkbutton_toggled) self.query_entry = xml.get_object('query_entry') self.query_combobox = xml.get_object('query_combobox') - self.jid_entry = self.query_combobox.child + self.jid_entry = self.query_combobox.get_child() self.jid_entry.connect('activate', self.on_jid_entry_activate) self.query_combobox.set_active(0) self.results_treeview = xml.get_object('results_treeview') @@ -86,28 +86,28 @@ class HistoryWindow: self.search_in_date = xml.get_object('search_in_date') # contact_name, date, message, time - model = gtk.ListStore(str, str, str, str, str) + model = Gtk.ListStore(str, str, str, str, str) self.results_treeview.set_model(model) - col = gtk.TreeViewColumn(_('Name')) + col = Gtk.TreeViewColumn(_('Name')) self.results_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = C_CONTACT_NAME) col.set_sort_column_id(C_CONTACT_NAME) # user can click this header and sort col.set_resizable(True) - col = gtk.TreeViewColumn(_('Date')) + col = Gtk.TreeViewColumn(_('Date')) self.results_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = C_UNIXTIME) col.set_sort_column_id(C_UNIXTIME) # user can click this header and sort col.set_resizable(True) - col = gtk.TreeViewColumn(_('Message')) + col = Gtk.TreeViewColumn(_('Message')) self.results_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text = C_MESSAGE) col.set_resizable(True) @@ -118,7 +118,7 @@ class HistoryWindow: self.jids_to_search = [] # This will load history too - gobject.idle_add(self._fill_completion_dict().next) + GObject.idle_add(self._fill_completion_dict().next) if jid: self.jid_entry.set_text(jid) @@ -231,7 +231,7 @@ class HistoryWindow: del gajim.interface.instances['logs'] def on_history_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.save_state() self.window.destroy() @@ -605,7 +605,7 @@ class HistoryWindow: timestamp_str = gajim.config.get('time_stamp') timestamp_str = helpers.from_one_line(timestamp_str) tim = time.strftime(timestamp_str, local_time) - result = start_iter.forward_search(tim, gtk.TEXT_SEARCH_VISIBLE_ONLY, + result = start_iter.forward_search(tim, Gtk.TextSearchFlags.VISIBLE_ONLY, None) if result is not None: match_start_iter, match_end_iter = result @@ -641,7 +641,7 @@ class HistoryWindow: self.jid_entry.set_text(jid) if account and account not in self.accounts_seen_online: # Update dict to not only show bare jid - gobject.idle_add(self._fill_completion_dict().next) + GObject.idle_add(self._fill_completion_dict().next) else: # Only in that case because it's called by self._fill_completion_dict() # otherwise diff --git a/src/htmltextview.py b/src/htmltextview.py index 981dc5531..3b31e6da9 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -26,7 +26,7 @@ ## """ -A gtk.TextView-based renderer for XHTML-IM, as described in: +A Gtk.TextView-based renderer for XHTML-IM, as described in: http://xmpp.org/extensions/xep-0071.html Starting with the version posted by Gustavo Carneiro, @@ -35,9 +35,11 @@ with the markup that docutils generate, and also more modular. """ -import gobject -import pango -import gtk +from gi.repository import GObject +from gi.repository import Pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf import xml.sax, xml.sax.handler import re from cStringIO import StringIO @@ -64,8 +66,8 @@ whitespace_rx = re.compile('\\s+') allwhitespace_rx = re.compile('^\\s*$') # pixels = points * display_resolution -display_resolution = 0.3514598*(gtk.gdk.screen_height() / - float(gtk.gdk.screen_height_mm())) +display_resolution = 0.3514598*(Gdk.Screen.height() / + float(Gdk.Screen.height_mm())) # embryo of CSS classes classes = { @@ -194,9 +196,9 @@ for name in BLOCK_HEAD: def _parse_css_color(color): if color.startswith('rgb(') and color.endswith(')'): r, g, b = [int(c)*257 for c in color[4:-1].split(',')] - return gtk.gdk.Color(r, g, b) + return Gdk.Color(r, g, b) else: - return gtk.gdk.color_parse(color) + return Gdk.color_parse(color) def style_iter(style): return ([x.strip() for x in item.split(':', 1)] for item in style.split(';')\ @@ -219,7 +221,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.text = '' self.starting=True self.preserve = False - self.styles = [] # a gtk.TextTag or None, for each span level + self.styles = [] # a Gtk.TextTag or None, for each span level self.list_counters = [] # stack (top at head) of list # counters, or None for unordered list @@ -258,7 +260,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): frac = val/100 if font_relative: attrs = self._get_current_attributes() - font_size = attrs.font.get_size() / pango.SCALE + font_size = attrs.font.get_size() / Pango.SCALE callback(frac*display_resolution*font_size, *args) elif block_relative: # CSS says 'Percentage values: refer to width of the closest @@ -285,14 +287,14 @@ class HtmlHandler(xml.sax.handler.ContentHandler): elif value.endswith('em'): # ems, the width of the element's font attrs = self._get_current_attributes() - font_size = attrs.font.get_size() / pango.SCALE + font_size = attrs.font.get_size() / Pango.SCALE callback(get_val()*display_resolution*font_size, *args) elif value.endswith('ex'): # x-height, ~ the height of the letter 'x' # FIXME: figure out how to calculate this correctly # for now 'em' size is used as approximation attrs = self._get_current_attributes() - font_size = attrs.font.get_size() / pango.SCALE + font_size = attrs.font.get_size() / Pango.SCALE callback(get_val()*display_resolution*font_size, *args) elif value.endswith('px'): # pixels @@ -321,13 +323,13 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_font_size(self, tag, value): try: scale = { - 'xx-small': pango.SCALE_XX_SMALL, - 'x-small': pango.SCALE_X_SMALL, - 'small': pango.SCALE_SMALL, - 'medium': pango.SCALE_MEDIUM, - 'large': pango.SCALE_LARGE, - 'x-large': pango.SCALE_X_LARGE, - 'xx-large': pango.SCALE_XX_LARGE, + 'xx-small': Pango.SCALE_XX_SMALL, + 'x-small': Pango.SCALE_X_SMALL, + 'small': Pango.SCALE_SMALL, + 'medium': Pango.SCALE_MEDIUM, + 'large': Pango.SCALE_LARGE, + 'x-large': Pango.SCALE_X_LARGE, + 'xx-large': Pango.SCALE_XX_LARGE, } [value] except KeyError: pass @@ -336,10 +338,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.set_property('scale', scale / attrs.font_scale) return if value == 'smaller': - tag.set_property('scale', pango.SCALE_SMALL) + tag.set_property('scale', Pango.SCALE_SMALL) return if value == 'larger': - tag.set_property('scale', pango.SCALE_LARGE) + tag.set_property('scale', Pango.SCALE_LARGE) return # font relative (5 ~ 4pt, 110 ~ 72pt) self._parse_length(value, True, False, 5, 110,self.__parse_font_size_cb, @@ -348,9 +350,9 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_font_style(self, tag, value): try: style = { - 'normal': pango.STYLE_NORMAL, - 'italic': pango.STYLE_ITALIC, - 'oblique': pango.STYLE_OBLIQUE, + 'normal': Pango.Style.NORMAL, + 'italic': Pango.Style.ITALIC, + 'oblique': Pango.Style.OBLIQUE, } [value] except KeyError: log.warning('unknown font-style %s' % value) @@ -378,17 +380,17 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # TODO: missing 'bolder' and 'lighter' try: weight = { - '100': pango.WEIGHT_ULTRALIGHT, - '200': pango.WEIGHT_ULTRALIGHT, - '300': pango.WEIGHT_LIGHT, - '400': pango.WEIGHT_NORMAL, - '500': pango.WEIGHT_NORMAL, - '600': pango.WEIGHT_BOLD, - '700': pango.WEIGHT_BOLD, - '800': pango.WEIGHT_ULTRABOLD, - '900': pango.WEIGHT_HEAVY, - 'normal': pango.WEIGHT_NORMAL, - 'bold': pango.WEIGHT_BOLD, + '100': Pango.Weight.ULTRALIGHT, + '200': Pango.Weight.ULTRALIGHT, + '300': Pango.Weight.LIGHT, + '400': Pango.Weight.NORMAL, + '500': Pango.Weight.NORMAL, + '600': Pango.Weight.BOLD, + '700': Pango.Weight.BOLD, + '800': Pango.Weight.ULTRABOLD, + '900': Pango.Weight.HEAVY, + 'normal': Pango.Weight.NORMAL, + 'bold': Pango.Weight.BOLD, } [value] except KeyError: log.warning('unknown font-style %s' % value) @@ -401,10 +403,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_text_align(self, tag, value): try: align = { - 'left': gtk.JUSTIFY_LEFT, - 'right': gtk.JUSTIFY_RIGHT, - 'center': gtk.JUSTIFY_CENTER, - 'justify': gtk.JUSTIFY_FILL, + 'left': Gtk.Justification.LEFT, + 'right': Gtk.Justification.RIGHT, + 'center': Gtk.Justification.CENTER, + 'justify': Gtk.Justification.FILL, } [value] except KeyError: log.warning('Invalid text-align:%s requested' % value) @@ -414,12 +416,12 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_text_decoration(self, tag, value): values = value.split(' ') if 'none' in values: - tag.set_property('underline', pango.UNDERLINE_NONE) + tag.set_property('underline', Pango.Underline.NONE) tag.set_property('strikethrough', False) if 'underline' in values: - tag.set_property('underline', pango.UNDERLINE_SINGLE) + tag.set_property('underline', Pango.Underline.SINGLE) else: - tag.set_property('underline', pango.UNDERLINE_NONE) + tag.set_property('underline', Pango.Underline.NONE) if 'line-through' in values: tag.set_property('strikethrough', True) else: @@ -431,11 +433,11 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_white_space(self, tag, value): if value == 'pre': - tag.set_property('wrap_mode', gtk.WRAP_NONE) + tag.set_property('wrap_mode', Gtk.WrapMode.NONE) elif value == 'normal': - tag.set_property('wrap_mode', gtk.WRAP_WORD) + tag.set_property('wrap_mode', Gtk.WrapMode.WORD) elif value == 'nowrap': - tag.set_property('wrap_mode', gtk.WRAP_NONE) + tag.set_property('wrap_mode', Gtk.WrapMode.NONE) def __length_tag_cb(self, value, tag, propname): try: @@ -483,7 +485,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.type_ = type_ # to be used by the URL handler tag.connect('event', self.textview.hyperlink_handler, 'url') tag.set_property('foreground', gajim.config.get('urlmsgcolor')) - tag.set_property('underline', pango.UNDERLINE_SINGLE) + tag.set_property('underline', Pango.Underline.SINGLE) tag.is_anchor = True if title: tag.title = title @@ -525,7 +527,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # Caveat: GdkPixbuf is known not to be safe to load # images from network... this program is now potentially # hackable ;) - loader = gtk.gdk.PixbufLoader() + loader = GdkPixbuf.PixbufLoader() dims = [0, 0] def height_cb(length): dims[1] = length @@ -548,7 +550,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): """ FIXME: Floats should be relative to the whole textview, and resize with it. This needs new pifbufs for every resize, - gtk.gdk.Pixbuf.scale_simple or similar. + GdkPixbuf.Pixbuf.scale_simple or similar. """ if isinstance(dims[0], float): dims[0] = int(dims[0]*w) @@ -647,7 +649,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self._insert_text(text.strip('\n')) def _anchor_event(self, tag, textview, event, iter_, href, type_): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: self.textview.emit('url-clicked', href, type_) return True return False @@ -792,11 +794,11 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self._jump_line() self._end_span() -class HtmlTextView(gtk.TextView): +class HtmlTextView(Gtk.TextView): def __init__(self): - gobject.GObject.__init__(self) - self.set_wrap_mode(gtk.WRAP_CHAR) + GObject.GObject.__init__(self) + self.set_wrap_mode(Gtk.WrapMode.CHAR) self.set_editable(False) self._changed_cursor = False self.connect('destroy', self.__destroy_event) @@ -808,7 +810,8 @@ class HtmlTextView(gtk.TextView): self.connect('copy-clipboard', self.on_html_text_view_copy_clipboard) self.id_ = self.connect('button-release-event', self.on_left_mouse_button_release) - self.get_buffer().create_tag('eol', scale = pango.SCALE_XX_SMALL) + #Pango.SCALE_XX_SMALL) + self.get_buffer().create_tag('eol', scale=0.5787037037037) self.tooltip = tooltips.BaseTooltip() self.config = gajim.config self.interface = gajim.interface @@ -820,15 +823,15 @@ class HtmlTextView(gtk.TextView): def __leave_event(self, widget, event): if self._changed_cursor: - window = widget.get_window(gtk.TEXT_WINDOW_TEXT) - window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) + window = widget.get_window(Gtk.TextWindowType.TEXT) + window.set_cursor(Gdk.Cursor.new(Gdk.XTERM)) self._changed_cursor = False def show_tooltip(self, tag): if not self.tooltip.win: # check if the current pointer is still over the line - x, y, _ = self.window.get_pointer() - x, y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) + x, y = self.get_window(Gtk.TextWindowType.TEXT).get_pointer()[1:3] + x, y = self.window_to_buffer_coords(Gtk.TextWindowType.TEXT, x, y) tags = self.get_iter_at_location(x, y).get_tags() is_over_anchor = False for tag_ in tags: @@ -840,12 +843,12 @@ class HtmlTextView(gtk.TextView): text = getattr(tag, 'title', False) if text: pointer = self.get_pointer() - position = self.window.get_origin() - self.tooltip.show_tooltip(text, 8, position[1] + pointer[1]) + position = self.get_window(Gtk.TextWindowType.TEXT).get_origin() + self.tooltip.show_tooltip(text, 8, position[1] + pointer[2]) def __motion_notify_event(self, widget, event): - x, y, _ = widget.window.get_pointer() - x, y = widget.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) + x, y = widget.get_window(Gtk.TextWindowType.TEXT).get_pointer()[1:3] + x, y = widget.window_to_buffer_coords(Gtk.TextWindowType.TEXT, x, y) tags = widget.get_iter_at_location(x, y).get_tags() anchor_tags = [tag for tag in tags if getattr(tag, 'is_anchor', False)] if self.tooltip.timeout != 0: @@ -853,14 +856,14 @@ class HtmlTextView(gtk.TextView): if not anchor_tags: self.tooltip.hide_tooltip() if not self._changed_cursor and anchor_tags: - window = widget.get_window(gtk.TEXT_WINDOW_TEXT) - window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + window = widget.get_window(Gtk.TextWindowType.TEXT) + window.set_cursor(Gdk.Cursor.new(Gdk.HAND2)) self._changed_cursor = True - self.tooltip.timeout = gobject.timeout_add(500, self.show_tooltip, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, anchor_tags[0]) elif self._changed_cursor and not anchor_tags: - window = widget.get_window(gtk.TEXT_WINDOW_TEXT) - window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) + window = widget.get_window(Gtk.TextWindowType.TEXT) + window.set_cursor(Gdk.Cursor.new(Gdk.XTERM)) self._changed_cursor = False return False @@ -879,17 +882,17 @@ class HtmlTextView(gtk.TextView): # buffer_.insert(eob, '\n') def on_html_text_view_copy_clipboard(self, unused_data): - clipboard = self.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD) + clipboard = self.get_clipboard(Gdk.SELECTION_CLIPBOARD) clipboard.set_text(self.get_selected_text()) self.emit_stop_by_name('copy-clipboard') def on_html_text_view_realized(self, unused_data): self.get_buffer().remove_selection_clipboard(self.get_clipboard( - gtk.gdk.SELECTION_PRIMARY)) + Gdk.SELECTION_PRIMARY)) def on_html_text_view_unrealized(self, unused_data): self.get_buffer().add_selection_clipboard(self.get_clipboard( - gtk.gdk.SELECTION_PRIMARY)) + Gdk.SELECTION_PRIMARY)) def on_left_mouse_button_release(self, widget, event): if event.button != 1: @@ -899,7 +902,7 @@ class HtmlTextView(gtk.TextView): if bounds: # textview can be hidden while we add a new line in it. if self.has_screen(): - clipboard = self.get_clipboard(gtk.gdk.SELECTION_PRIMARY) + clipboard = self.get_clipboard(Gdk.SELECTION_PRIMARY) clipboard.set_text(self.get_selected_text()) def get_selected_text(self): @@ -944,7 +947,7 @@ if __name__ == '__main__': path = gtkgui_helpers.get_icon_path('gajim-muc_separator') # use this for hr - htmlview.tv.focus_out_line_pixbuf = gtk.gdk.pixbuf_new_from_file(path) + htmlview.tv.focus_out_line_pixbuf = GdkPixbuf.Pixbuf.new_from_file(path) tooltip = tooltips.BaseTooltip() @@ -953,20 +956,21 @@ if __name__ == '__main__': Change the cursor to a hand when we are over a mail or an url """ global change_cursor - pointer_x, pointer_y = htmlview.tv.window.get_pointer()[0:2] - x, y = htmlview.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, + pointer_x, pointer_y = htmlview.tv.get_window(Gtk.TextWindowType.TEXT).\ + get_pointer()[1:3] + x, y = htmlview.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, pointer_x, pointer_y) tags = htmlview.tv.get_iter_at_location(x, y).get_tags() if change_cursor: - htmlview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.XTERM)) + htmlview.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor.new(Gdk.XTERM)) change_cursor = None tag_table = htmlview.tv.get_buffer().get_tag_table() for tag in tags: try: if tag.is_anchor: - htmlview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.HAND2)) + htmlview.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor.new(Gdk.HAND2)) change_cursor = tag elif tag == tag_table.lookup('focus-out-line'): over_line = True @@ -978,16 +982,16 @@ if __name__ == '__main__': # if not over_line: # line_tooltip.hide_tooltip() #if over_line and not line_tooltip.win: - # line_tooltip.timeout = gobject.timeout_add(500, + # line_tooltip.timeout = GObject.timeout_add(500, # show_line_tooltip) - # htmlview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - # gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + # htmlview.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + # Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) # change_cursor = tag htmlview.tv.connect('motion_notify_event', on_textview_motion_notify_event) def handler(texttag, widget, event, iter_, kind): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: pass htmlview.tv.hyperlink_handler = htmlview.hyperlink_handler @@ -1108,19 +1112,19 @@ hhx4dbgYKAAA7' alt='Larry'/> ''') htmlview.tv.show() - sw = gtk.ScrolledWindow() - sw.set_property('hscrollbar-policy', gtk.POLICY_AUTOMATIC) - sw.set_property('vscrollbar-policy', gtk.POLICY_AUTOMATIC) + sw = Gtk.ScrolledWindow() + sw.set_property('hscrollbar-policy', Gtk.PolicyType.AUTOMATIC) + sw.set_property('vscrollbar-policy', Gtk.PolicyType.AUTOMATIC) sw.set_property('border-width', 0) sw.add(htmlview.tv) sw.show() - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_IN) + frame = Gtk.Frame() + frame.set_shadow_type(Gtk.ShadowType.IN) frame.show() frame.add(sw) - w = gtk.Window() + w = Gtk.Window() w.add(frame) w.set_default_size(400, 300) w.show_all() - w.connect('destroy', lambda w: gtk.main_quit()) - gtk.main() + w.connect('destroy', lambda w: Gtk.main_quit()) + Gtk.main() diff --git a/src/ipython_view.py b/src/ipython_view.py index c26a0bbf9..e816c7805 100644 --- a/src/ipython_view.py +++ b/src/ipython_view.py @@ -42,11 +42,12 @@ available under the terms of the BSD which accompanies this distribution, and is available at U{http://www.opensource.org/licenses/bsd-license.php} """ -import gtk, gobject +from gi.repository import Gtk +from gi.repository import GObject import re import sys import os -import pango +from gi.repository import Pango from StringIO import StringIO try: @@ -128,7 +129,7 @@ class IterableIPShell: # Workaround for updating namespace with sys.modules # self.__update_namespace() - + def __update_namespace(self): ''' Update self.IP namespace for autocompletion with sys.modules @@ -187,7 +188,7 @@ class IterableIPShell: Generate prompt depending on is_continuation value @param is_continuation - @type is_continuation: boolean + @type is_continuation: boolean @return: The prompt string representation @rtype: string @@ -316,7 +317,7 @@ class IterableIPShell: output.close() input_.close() -class ConsoleView(gtk.TextView): +class ConsoleView(Gtk.TextView): """ Specialized text view for console-like workflow @@ -324,13 +325,13 @@ class ConsoleView(gtk.TextView): @type ANSI_COLORS: dictionary @ivar text_buffer: Widget's text buffer. - @type text_buffer: gtk.TextBuffer + @type text_buffer: Gtk.TextBuffer @ivar color_pat: Regex of terminal color pattern @type color_pat: _sre.SRE_Pattern @ivar mark: Scroll mark for automatic scrolling on input. - @type mark: gtk.TextMark + @type mark: Gtk.TextMark @ivar line_start: Start of command line mark. - @type line_start: gtk.TextMark + @type line_start: Gtk.TextMark """ ANSI_COLORS = {'0;30': 'Black', '0;31': 'Red', @@ -346,8 +347,8 @@ class ConsoleView(gtk.TextView): """ Initialize console view """ - gtk.TextView.__init__(self) - self.modify_font(pango.FontDescription('Mono')) + GObject.GObject.__init__(self) + self.modify_font(Pango.FontDescription('Mono')) self.set_cursor_visible(True) self.text_buffer = self.get_buffer() self.mark = self.text_buffer.create_mark('scroll_mark', @@ -366,7 +367,7 @@ class ConsoleView(gtk.TextView): self.connect('key-press-event', self.onKeyPress) def write(self, text, editable=False): - gobject.idle_add(self._write, text, editable) + GObject.idle_add(self._write, text, editable) def _write(self, text, editable=False): """ @@ -400,7 +401,7 @@ class ConsoleView(gtk.TextView): def showPrompt(self, prompt): - gobject.idle_add(self._showPrompt, prompt) + GObject.idle_add(self._showPrompt, prompt) def _showPrompt(self, prompt): """ @@ -414,7 +415,7 @@ class ConsoleView(gtk.TextView): self.text_buffer.get_end_iter()) def changeLine(self, text): - gobject.idle_add(self._changeLine, text) + GObject.idle_add(self._changeLine, text) def _changeLine(self, text): """ @@ -441,7 +442,7 @@ class ConsoleView(gtk.TextView): return rv def showReturned(self, text): - gobject.idle_add(self._showReturned, text) + GObject.idle_add(self._showReturned, text) def _showReturned(self, text): """ @@ -470,9 +471,9 @@ class ConsoleView(gtk.TextView): line @param widget: Widget that key press accored in. - @type widget: gtk.Widget + @type widget: Gtk.Widget @param event: Event object - @type event: gtk.gdk.Event + @type event: Gdk.Event @return: Return True if event should not trickle. @rtype: boolean @@ -482,14 +483,14 @@ class ConsoleView(gtk.TextView): selection_mark = self.text_buffer.get_selection_bound() selection_iter = self.text_buffer.get_iter_at_mark(selection_mark) start_iter = self.text_buffer.get_iter_at_mark(self.line_start) - if event.keyval == gtk.keysyms.Home: - if event.state == 0: + if event.keyval == Gdk.KEY_Home: + if event.get_state() == 0: self.text_buffer.place_cursor(start_iter) return True - elif event.state == gtk.gdk.SHIFT_MASK: + elif event.get_state() == Gdk.ModifierType.SHIFT_MASK: self.text_buffer.move_mark(insert_mark, start_iter) return True - elif event.keyval == gtk.keysyms.Left: + elif event.keyval == Gdk.KEY_Left: insert_iter.backward_cursor_position() if not insert_iter.editable(True): return True @@ -555,27 +556,27 @@ class IPythonView(ConsoleView, IterableIPShell): autocompletions, etc @param widget: Widget that key press occured in. - @type widget: gtk.Widget + @type widget: Gtk.Widget @param event: Event object. - @type event: gtk.gdk.Event + @type event: Gdk.Event @return: True if event should not trickle. @rtype: boolean """ - if event.state & gtk.gdk.CONTROL_MASK and event.keyval == 99: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == 99: self.interrupt = True self._processLine() return True - elif event.keyval == gtk.keysyms.Return: + elif event.keyval == Gdk.KEY_Return: self._processLine() return True - elif event.keyval == gtk.keysyms.Up: + elif event.keyval == Gdk.KEY_Up: self.changeLine(self.historyBack()) return True - elif event.keyval == gtk.keysyms.Down: + elif event.keyval == Gdk.KEY_Down: self.changeLine(self.historyForward()) return True - elif event.keyval == gtk.keysyms.Tab: + elif event.keyval == Gdk.KEY_Tab: if not self.getCurrentLine().strip(): return False completed, possibilities = self.complete(self.getCurrentLine()) diff --git a/src/message_control.py b/src/message_control.py index 4c58c5a92..f063fb333 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -42,7 +42,7 @@ TYPE_PM = 'pm' class MessageControl(object): """ - An abstract base widget that can embed in the gtk.Notebook of a + An abstract base widget that can embed in the Gtk.Notebook of a MessageWindow """ @@ -156,7 +156,7 @@ class MessageControl(object): Derivded classes MUST implement this. """ - # Return a markup'd label and optional gtk.Color in a tupple like: + # Return a markup'd label and optional Gtk.Color in a tupple like: # return (label_str, None) pass diff --git a/src/message_textview.py b/src/message_textview.py index 6bc4a4c7d..9700032bd 100644 --- a/src/message_textview.py +++ b/src/message_textview.py @@ -23,35 +23,36 @@ import gc -import gtk -import gobject -import pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject +from gi.repository import Pango import gtkgui_helpers from common import gajim -class MessageTextView(gtk.TextView): +class MessageTextView(Gtk.TextView): """ Class for the message textview (where user writes new messages) for chat/groupchat windows """ UNDO_LIMIT = 20 __gsignals__ = dict( - mykeypress = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, + mykeypress = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, # return value - (int, gtk.gdk.ModifierType ) # arguments + (int, Gdk.ModifierType ) # arguments ) ) def __init__(self): - gtk.TextView.__init__(self) + GObject.GObject.__init__(self) # set properties self.set_border_width(1) self.set_accepts_tab(True) self.set_editable(True) self.set_cursor_visible(True) - self.set_wrap_mode(gtk.WRAP_WORD_CHAR) + self.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.set_left_margin(2) self.set_right_margin(2) self.set_pixels_above_lines(2) @@ -69,15 +70,15 @@ class MessageTextView(gtk.TextView): self.fonts_tags = [] self.other_tags = {} self.other_tags['bold'] = _buffer.create_tag('bold') - self.other_tags['bold'].set_property('weight', pango.WEIGHT_BOLD) + self.other_tags['bold'].set_property('weight', Pango.Weight.BOLD) self.begin_tags['bold'] = '' self.end_tags['bold'] = '' self.other_tags['italic'] = _buffer.create_tag('italic') - self.other_tags['italic'].set_property('style', pango.STYLE_ITALIC) + self.other_tags['italic'].set_property('style', Pango.Style.ITALIC) self.begin_tags['italic'] = '' self.end_tags['italic'] = '' self.other_tags['underline'] = _buffer.create_tag('underline') - self.other_tags['underline'].set_property('underline', pango.UNDERLINE_SINGLE) + self.other_tags['underline'].set_property('underline', Pango.Underline.SINGLE) self.begin_tags['underline'] = '' self.end_tags['underline'] = '' self.other_tags['strike'] = _buffer.create_tag('strike') @@ -176,10 +177,10 @@ class MessageTextView(gtk.TextView): _buffer = self.get_buffer() font = font.get_font_name() - font_desc = pango.FontDescription(font) + font_desc = Pango.FontDescription(font) family = font_desc.get_family() size = font_desc.get_size() - size = size / pango.SCALE + size = size / Pango.SCALE weight = font_desc.get_weight() style = font_desc.get_style() @@ -202,12 +203,12 @@ class MessageTextView(gtk.TextView): _buffer.apply_tag_by_name(tag_name, start, finish) - if weight == pango.WEIGHT_BOLD: + if weight == Pango.Weight.BOLD: _buffer.apply_tag_by_name('bold', start, finish) else: _buffer.remove_tag_by_name('bold', start, finish) - if style == pango.STYLE_ITALIC: + if style == Pango.Style.ITALIC: _buffer.apply_tag_by_name('italic', start, finish) else: _buffer.remove_tag_by_name('italic', start, finish) @@ -217,7 +218,7 @@ class MessageTextView(gtk.TextView): old = _buffer.get_start_iter() tags = {} tags['bold'] = False - iter = _buffer.get_start_iter() + iter_ = _buffer.get_start_iter() old = _buffer.get_start_iter() text = '' modified = False @@ -229,31 +230,31 @@ class MessageTextView(gtk.TextView): text = text.replace('\n', '
') return text - for tag in iter.get_toggled_tags(True): + for tag in iter_.get_toggled_tags(True): tag_name = tag.get_property('name') if tag_name not in self.begin_tags: continue text += self.begin_tags[tag_name] modified = True - while (iter.forward_to_tag_toggle(None) and not iter.is_end()): - text += xhtml_special(_buffer.get_text(old, iter)) + while (iter_.forward_to_tag_toggle(None) and not iter_.is_end()): + text += xhtml_special(_buffer.get_text(old, iter_, True)) old.forward_to_tag_toggle(None) new_tags, old_tags, end_tags = [], [], [] - for tag in iter.get_toggled_tags(True): + for tag in iter_.get_toggled_tags(True): tag_name = tag.get_property('name') if tag_name not in self.begin_tags: continue new_tags.append(tag_name) modified = True - for tag in iter.get_tags(): + for tag in iter_.get_tags(): tag_name = tag.get_property('name') if tag_name not in self.begin_tags or tag_name not in self.end_tags: continue if tag_name not in new_tags: old_tags.append(tag_name) - for tag in iter.get_toggled_tags(False): + for tag in iter_.get_toggled_tags(False): tag_name = tag.get_property('name') if tag_name not in self.end_tags: continue @@ -268,8 +269,8 @@ class MessageTextView(gtk.TextView): for tag in old_tags: text += self.begin_tags[tag] - text += xhtml_special(_buffer.get_text(old, _buffer.get_end_iter())) - for tag in iter.get_toggled_tags(False): + text += xhtml_special(_buffer.get_text(old, _buffer.get_end_iter(), True)) + for tag in iter_.get_toggled_tags(False): tag_name = tag.get_property('name') if tag_name not in self.end_tags: continue @@ -281,7 +282,7 @@ class MessageTextView(gtk.TextView): return None def destroy(self): - gobject.idle_add(gc.collect) + GObject.idle_add(gc.collect) def clear(self, widget = None): """ @@ -322,62 +323,62 @@ class MessageTextView(gtk.TextView): # and we also return True there to stop the default action from running # CTRL + SHIFT + TAB -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.ISO_Left_Tab, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.ISO_Left_Tab, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_ISO_Left_Tab, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_ISO_Left_Tab, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) -# CTRL + TAB -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Tab, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +## CTRL + TAB +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Tab, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Tab, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) -# TAB -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab, - 0, 'mykeypress', int, gtk.keysyms.Tab, gtk.gdk.ModifierType, 0) +## TAB +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Tab, + #0, 'mykeypress', int, Gdk.KEY_Tab, Gdk.ModifierType, 0) -# CTRL + UP -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Up, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Up, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +## CTRL + UP +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Up, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Up, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) -# CTRL + DOWN -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Down, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Down, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +## CTRL + DOWN +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Down, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Down, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) -# CTRL + SHIFT + UP -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Up, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK, 'mykeypress', int, - gtk.keysyms.Up, gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK | - gtk.gdk.SHIFT_MASK) +## CTRL + SHIFT + UP +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Up, + #Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 'mykeypress', int, + #Gdk.KEY_Up, Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK | + #Gdk.ModifierType.SHIFT_MASK) -# CTRL + SHIFT + DOWN -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Down, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK, 'mykeypress', int, - gtk.keysyms.Down, gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK | - gtk.gdk.SHIFT_MASK) +## CTRL + SHIFT + DOWN +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Down, + #Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 'mykeypress', int, + #Gdk.KEY_Down, Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK | + #Gdk.ModifierType.SHIFT_MASK) -# ENTER -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Return, - 0, 'mykeypress', int, gtk.keysyms.Return, - gtk.gdk.ModifierType, 0) +## ENTER +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Return, + #0, 'mykeypress', int, Gdk.KEY_Return, + #Gdk.ModifierType, 0) -# Ctrl + Enter -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Return, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Return, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +## Ctrl + Enter +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Return, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Return, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) -# Keypad Enter -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.KP_Enter, - 0, 'mykeypress', int, gtk.keysyms.KP_Enter, - gtk.gdk.ModifierType, 0) +## Keypad Enter +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_KP_Enter, + #0, 'mykeypress', int, Gdk.KEY_KP_Enter, + #Gdk.ModifierType, 0) -# Ctrl + Keypad Enter -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.KP_Enter, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.KP_Enter, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +## Ctrl + Keypad Enter +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_KP_Enter, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_KP_Enter, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) -# Ctrl + z -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.z, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.z, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +## Ctrl + z +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_z, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_z, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) diff --git a/src/message_window.py b/src/message_window.py index 2167ae456..f47b09db4 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -27,8 +27,9 @@ ## along with Gajim. If not, see . ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject import time import common @@ -106,16 +107,16 @@ class MessageWindow(object): 'w', 'Page_Up', 'Page_Down', 'Right', 'Left', 'd', 'c', 'm', 't', 'Escape'] + \ [''+str(i) for i in xrange(10)] - accel_group = gtk.AccelGroup() + accel_group = Gtk.AccelGroup() for key in keys: - keyval, mod = gtk.accelerator_parse(key) - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + keyval, mod = Gtk.accelerator_parse(key) + accel_group.connect(keyval, mod, Gtk.AccelFlags.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 # so this line adds that - self.window.add_events(gtk.gdk.POINTER_MOTION_MASK) + self.window.add_events(Gdk.EventMask.POINTER_MOTION_MASK) id_ = self.notebook.connect('switch-page', self._on_notebook_switch_page) @@ -127,13 +128,13 @@ class MessageWindow(object): # Tab customizations pref_pos = gajim.config.get('tabs_position') if pref_pos == 'bottom': - nb_pos = gtk.POS_BOTTOM + nb_pos = Gtk.PositionType.BOTTOM elif pref_pos == 'left': - nb_pos = gtk.POS_LEFT + nb_pos = Gtk.PositionType.LEFT elif pref_pos == 'right': - nb_pos = gtk.POS_RIGHT + nb_pos = Gtk.PositionType.RIGHT else: - nb_pos = gtk.POS_TOP + nb_pos = Gtk.PositionType.TOP self.notebook.set_tab_pos(nb_pos) window_mode = gajim.interface.msg_win_mgr.mode if gajim.config.get('tabs_always_visible') or \ @@ -275,17 +276,17 @@ class MessageWindow(object): scrolled = True self.notebook.set_show_tabs(True) if scrolled: - gobject.idle_add(conv_textview.scroll_to_end_iter) + GObject.idle_add(conv_textview.scroll_to_end_iter) # Add notebook page and connect up to the tab's close button xml = gtkgui_helpers.get_gtk_builder('message_window.ui', 'chat_tab_ebox') tab_label_box = xml.get_object('chat_tab_ebox') widget = xml.get_object('tab_close_button') - #this reduces the size of the button - style = gtk.RcStyle() - style.xthickness = 0 - style.ythickness = 0 - widget.modify_style(style) + # this reduces the size of the button +# style = Gtk.RcStyle() +# style.xthickness = 0 +# style.ythickness = 0 +# widget.modify_style(style) id_ = widget.connect('clicked', self._on_close_button_clicked, control) control.handlers[id_] = widget @@ -305,7 +306,7 @@ class MessageWindow(object): # NOTE: we do not call set_control_active(True) since we don't know # whether the tab is the active one. self.show_title() - gobject.timeout_add(500, control.msg_textview.grab_focus) + GObject.timeout_add(500, control.msg_textview.grab_focus) def on_tab_eventbox_button_press_event(self, widget, event, child): if event.button == 3: # right click @@ -317,27 +318,27 @@ class MessageWindow(object): self.remove_tab(ctrl, self.CLOSE_TAB_MIDDLE_CLICK) else: ctrl = self._widget_to_control(child) - gobject.idle_add(ctrl.msg_textview.grab_focus) + GObject.idle_add(ctrl.msg_textview.grab_focus) def _on_message_textview_mykeypress_event(self, widget, event_keyval, event_keymod): # NOTE: handles mykeypress which is custom signal; see message_textview.py # construct event instance from binding - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time - if event.state & gtk.gdk.CONTROL_MASK: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Tab switch bindings - if event.keyval == gtk.keysyms.Tab: # CTRL + TAB + if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.move_to_next_unread_tab(True) - elif event.keyval == gtk.keysyms.ISO_Left_Tab: # CTRL + SHIFT + TAB + elif event.keyval == Gdk.KEY_ISO_Left_Tab: # CTRL + SHIFT + TAB self.move_to_next_unread_tab(False) - elif event.keyval == gtk.keysyms.Page_Down: # CTRL + PAGE DOWN + elif event.keyval == Gdk.KEY_Page_Down: # CTRL + PAGE DOWN self.notebook.emit('key_press_event', event) - elif event.keyval == gtk.keysyms.Page_Up: # CTRL + PAGE UP + elif event.keyval == Gdk.KEY_Page_Up: # CTRL + PAGE UP self.notebook.emit('key_press_event', event) def accel_group_func(self, accel_group, acceleratable, keyval, modifier): @@ -348,76 +349,76 @@ class MessageWindow(object): return # CTRL mask - if modifier & gtk.gdk.CONTROL_MASK: - if keyval == gtk.keysyms.h: # CTRL + h - if gtk.settings_get_default().get_property( + if modifier & Gdk.ModifierType.CONTROL_MASK: + if keyval == Gdk.KEY_h: # CTRL + h + if Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') != 'Emacs': control._on_history_menuitem_activate() return True elif control.type_id == message_control.TYPE_CHAT and \ - keyval == gtk.keysyms.f: # CTRL + f + keyval == Gdk.KEY_f: # CTRL + f # CTRL + f moves cursor one char forward when user uses Emacs # theme - if not gtk.settings_get_default().get_property( + if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': control._on_send_file_menuitem_activate(None) return True elif control.type_id == message_control.TYPE_CHAT and \ - keyval == gtk.keysyms.g: # CTRL + g + keyval == Gdk.KEY_g: # CTRL + g control._on_convert_to_gc_menuitem_activate(None) return True elif control.type_id in (message_control.TYPE_CHAT, - message_control.TYPE_PM) and keyval == gtk.keysyms.i: # CTRL + i + message_control.TYPE_PM) and keyval == Gdk.KEY_i: # CTRL + i control._on_contact_information_menuitem_activate(None) return True - elif keyval == gtk.keysyms.l or keyval == gtk.keysyms.L: # CTRL + l|L + elif keyval == Gdk.KEY_l or keyval == Gdk.KEY_L: # CTRL + l|L control.conv_textview.clear() return True - elif keyval == gtk.keysyms.u: # CTRL + u: emacs style clear line + elif keyval == Gdk.KEY_u: # CTRL + u: emacs style clear line control.clear(control.msg_textview) return True elif control.type_id == message_control.TYPE_GC and \ - keyval == gtk.keysyms.b: # CTRL + b + keyval == Gdk.KEY_b: # CTRL + b control._on_bookmark_room_menuitem_activate(None) return True # Tab switch bindings - elif keyval == gtk.keysyms.F4: # CTRL + F4 + elif keyval == Gdk.KEY_F4: # CTRL + F4 self.remove_tab(control, self.CLOSE_CTRL_KEY) return True - elif keyval == gtk.keysyms.w: # CTRL + w + elif keyval == Gdk.KEY_w: # CTRL + w # CTRL + w removes latest word before sursor when User uses emacs # theme - if not gtk.settings_get_default().get_property( + if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': self.remove_tab(control, self.CLOSE_CTRL_KEY) return True - elif keyval in (gtk.keysyms.Page_Up, gtk.keysyms.Page_Down): + elif keyval in (Gdk.KEY_Page_Up, Gdk.KEY_Page_Down): # CTRL + PageUp | PageDown # Create event and send it to notebook - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event = Gdk.Event(Gdk.KEY_PRESS) event.window = self.window.window event.time = int(time.time()) - event.state = gtk.gdk.CONTROL_MASK + event.state = Gdk.ModifierType.CONTROL_MASK event.keyval = int(keyval) self.notebook.emit('key_press_event', event) return True - if modifier & gtk.gdk.SHIFT_MASK: + if modifier & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT if control.type_id == message_control.TYPE_GC and \ - keyval == gtk.keysyms.n: # CTRL + SHIFT + n + keyval == Gdk.KEY_n: # CTRL + SHIFT + n control._on_change_nick_menuitem_activate(None) return True # MOD1 (ALT) mask - elif modifier & gtk.gdk.MOD1_MASK: + elif modifier & Gdk.ModifierType.MOD1_MASK: # Tab switch bindings - if keyval == gtk.keysyms.Right: # ALT + RIGHT + if keyval == Gdk.KEY_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) return True - elif keyval == gtk.keysyms.Left: # ALT + LEFT + elif keyval == Gdk.KEY_Left: # ALT + LEFT new = self.notebook.get_current_page() - 1 if new < 0: new = self.notebook.get_n_pages() - 1 @@ -426,23 +427,23 @@ class MessageWindow(object): elif chr(keyval) in st: # ALT + 1,2,3.. self.notebook.set_current_page(st.index(chr(keyval))) return True - elif keyval == gtk.keysyms.c: # ALT + C toggles chat buttons + elif keyval == Gdk.KEY_c: # ALT + C toggles chat buttons control.chat_buttons_set_visible(not control.hide_chat_buttons) return True - elif keyval == gtk.keysyms.m: # ALT + M show emoticons menu + elif keyval == Gdk.KEY_m: # ALT + M show emoticons menu control.show_emoticons_menu() return True - elif keyval == gtk.keysyms.d: # ALT + D show actions menu - if gtk.settings_get_default().get_property( + elif keyval == Gdk.KEY_d: # ALT + D show actions menu + if Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') != 'Emacs': control.on_actions_button_clicked(control.actions_button) return True elif control.type_id == message_control.TYPE_GC and \ - keyval == gtk.keysyms.t: # ALT + t + keyval == Gdk.KEY_t: # ALT + t control._on_change_subject_menuitem_activate(None) return True # Close tab bindings - elif keyval == gtk.keysyms.Escape and \ + elif keyval == Gdk.KEY_Escape and \ gajim.config.get('escape_key_closes'): # Escape self.remove_tab(control, self.CLOSE_ESC) return True @@ -545,7 +546,7 @@ class MessageWindow(object): ctrl_page = self.notebook.page_num(ctrl.widget) self.notebook.set_current_page(ctrl_page) self.window.present() - gobject.idle_add(ctrl.msg_textview.grab_focus) + GObject.idle_add(ctrl.msg_textview.grab_focus) def remove_tab(self, ctrl, method, reason = None, force = False): """ @@ -638,12 +639,12 @@ class MessageWindow(object): (tab_label_str, tab_label_color) = ctrl.get_tab_label(chatstate) nick_label.set_markup(tab_label_str) if tab_label_color: - nick_label.modify_fg(gtk.STATE_NORMAL, tab_label_color) - nick_label.modify_fg(gtk.STATE_ACTIVE, tab_label_color) + nick_label.modify_fg(Gtk.StateType.NORMAL, tab_label_color) + nick_label.modify_fg(Gtk.StateType.ACTIVE, tab_label_color) tab_img = ctrl.get_tab_image() if tab_img: - if tab_img.get_storage_type() == gtk.IMAGE_ANIMATION: + if tab_img.get_storage_type() == Gtk.ImageType.ANIMATION: status_img.set_from_animation(tab_img.get_animation()) else: status_img.set_from_pixbuf(tab_img.get_pixbuf()) @@ -810,37 +811,37 @@ class MessageWindow(object): def _on_notebook_key_press(self, widget, event): # when tab itself is selected, # make sure <- and -> are allowed for navigating between tabs - if event.keyval in (gtk.keysyms.Left, gtk.keysyms.Right): + if event.keyval in (Gdk.KEY_Left, Gdk.KEY_Right): return False control = self.get_active_control() - if event.state & gtk.gdk.SHIFT_MASK: + if event.get_state() & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT + TAB - if event.state & gtk.gdk.CONTROL_MASK and \ - event.keyval == gtk.keysyms.ISO_Left_Tab: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ + event.keyval == Gdk.KEY_ISO_Left_Tab: self.move_to_next_unread_tab(False) return True # SHIFT + PAGE_[UP|DOWN]: send to conv_textview - elif event.keyval in (gtk.keysyms.Page_Down, gtk.keysyms.Page_Up): + elif event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up): control.conv_textview.tv.emit('key_press_event', event) return True - elif event.state & gtk.gdk.CONTROL_MASK: - if event.keyval == gtk.keysyms.Tab: # CTRL + TAB + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: + if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.move_to_next_unread_tab(True) return True # Ctrl+PageUP / DOWN has to be handled by notebook - elif event.keyval == gtk.keysyms.Page_Down: + elif event.keyval == Gdk.KEY_Page_Down: self.move_to_next_unread_tab(True) return True - elif event.keyval == gtk.keysyms.Page_Up: + elif event.keyval == Gdk.KEY_Page_Up: self.move_to_next_unread_tab(False) return True - if event.keyval in (gtk.keysyms.Shift_L, gtk.keysyms.Shift_R, - gtk.keysyms.Control_L, gtk.keysyms.Control_R, gtk.keysyms.Caps_Lock, - gtk.keysyms.Shift_Lock, gtk.keysyms.Meta_L, gtk.keysyms.Meta_R, - gtk.keysyms.Alt_L, gtk.keysyms.Alt_R, gtk.keysyms.Super_L, - gtk.keysyms.Super_R, gtk.keysyms.Hyper_L, gtk.keysyms.Hyper_R): + if event.keyval in (Gdk.KEY_Shift_L, Gdk.KEY_Shift_R, + Gdk.KEY_Control_L, Gdk.KEY_Control_R, Gdk.KEY_Caps_Lock, + Gdk.KEY_Shift_Lock, Gdk.KEY_Meta_L, Gdk.KEY_Meta_R, + Gdk.KEY_Alt_L, Gdk.KEY_Alt_R, Gdk.KEY_Super_L, + Gdk.KEY_Super_R, Gdk.KEY_Hyper_L, Gdk.KEY_Hyper_R): return True if isinstance(control, ChatControlBase): @@ -855,8 +856,8 @@ class MessageWindow(object): """ page_num = -1 to_right = False - horiz = self.notebook.get_tab_pos() == gtk.POS_TOP or \ - self.notebook.get_tab_pos() == gtk.POS_BOTTOM + horiz = self.notebook.get_tab_pos() == Gtk.PositionType.TOP or \ + self.notebook.get_tab_pos() == Gtk.PositionType.BOTTOM for i in xrange(self.notebook.get_n_pages()): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) @@ -892,13 +893,13 @@ class MessageWindow(object): return page_num ################################################################################ -class MessageWindowMgr(gobject.GObject): +class MessageWindowMgr(GObject.GObject): """ A manager and factory for MessageWindow objects """ __gsignals__ = { - 'window-delete': (gobject.SIGNAL_RUN_LAST, None, (object,)), + 'window-delete': (GObject.SignalFlags.RUN_LAST, None, (object,)), } # These constants map to common.config.opt_one_window_types indices @@ -923,7 +924,7 @@ class MessageWindowMgr(gobject.GObject): ONE_MSG_WINDOW_PERACCT: The key is the account name ONE_MSG_WINDOW_PERTYPE: The key is a message type constant """ - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self._windows = {} # Map the mode to a int constant for frequent compares @@ -984,7 +985,10 @@ class MessageWindowMgr(gobject.GObject): parent_size = win.window.get_size() # Need to add the size of the now visible paned handle, otherwise # the saved width of the message window decreases by this amount - handle_size = win.parent_paned.style_get_property('handle-size') + s = GObject.Value() + s.init(GObject.TYPE_INT) + win.parent_paned.style_get_property('handle-size', s) + handle_size = s.get_int() size = (parent_size[0] + size[0] + handle_size, size[1]) elif self.mode == self.ONE_MSG_WINDOW_PERACCT: size = (gajim.config.get_per('accounts', acct, 'msgwin-width'), @@ -1195,7 +1199,7 @@ class MessageWindowMgr(gobject.GObject): size_height_key = type_ + '-msgwin-height' elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: # Ignore any hpaned width - width = msg_win.notebook.allocation.width + width = msg_win.notebook.get_allocation().width if acct: gajim.config.set_per('accounts', acct, size_width_key, width) @@ -1206,8 +1210,8 @@ class MessageWindowMgr(gobject.GObject): gajim.config.set_per('accounts', acct, pos_y_key, y) else: - win_maximized = msg_win.window.window.get_state() == \ - gtk.gdk.WINDOW_STATE_MAXIMIZED + win_maximized = msg_win.window.get_window().get_state() == \ + Gdk.WindowState.MAXIMIZED gajim.config.set(max_win_key, win_maximized) width += width_adjust gajim.config.set(size_width_key, width) diff --git a/src/music_track_listener.py b/src/music_track_listener.py index c0910d7e3..30ee57ce3 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -23,7 +23,7 @@ ## along with Gajim. If not, see . ## -import gobject +from gi.repository import GObject if __name__ == '__main__': # install _() func before importing dbus_support from common import i18n @@ -36,9 +36,9 @@ class MusicTrackInfo(object): __slots__ = ['title', 'album', 'artist', 'duration', 'track_number', 'paused'] -class MusicTrackListener(gobject.GObject): +class MusicTrackListener(GObject.GObject): __gsignals__ = { - 'music-track-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), + 'music-track-changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), } _instance = None @@ -300,4 +300,4 @@ if __name__ == '__main__': print 'Now not playing anything' else: print 'Now playing: "%s" by %s' % (track.title, track.artist) - gobject.MainLoop().run() + GObject.MainLoop().run() diff --git a/src/negotiation.py b/src/negotiation.py index a8287a3a0..e002cf74f 100644 --- a/src/negotiation.py +++ b/src/negotiation.py @@ -49,7 +49,7 @@ class FeatureNegotiationWindow: dataform = dataforms.ExtendForm(node = self.form) self.data_form_widget = dataforms_widget.DataFormWidget(dataform) self.data_form_widget.show() - config_vbox.pack_start(self.data_form_widget) + config_vbox.pack_start(self.data_form_widget, True, True, 0) self.xml.connect_signals(self) self.window.show_all() diff --git a/src/notify.py b/src/notify.py index 78b31f6a7..f2b8d5b11 100644 --- a/src/notify.py +++ b/src/notify.py @@ -30,9 +30,9 @@ import os import time from dialogs import PopupNotificationWindow -import gobject +from gi.repository import GObject import gtkgui_helpers -import gtk +from gi.repository import Gtk from common import gajim from common import helpers @@ -45,8 +45,8 @@ if dbus_support.supported: USER_HAS_PYNOTIFY = True # user has pynotify module try: - import pynotify - pynotify.init('Gajim Notification') + from gi.repository import Notify + Notify.init('Gajim Notification') except ImportError: USER_HAS_PYNOTIFY = False @@ -89,7 +89,7 @@ text=None, timeout=-1): if gajim.config.get('use_notif_daemon') and dbus_support.supported: try: DesktopNotification(event_type, jid, account, msg_type, - path_to_image, title, gobject.markup_escape_text(text), timeout) + path_to_image, title, GObject.markup_escape_text(text), timeout) return # sucessfully did D-Bus Notification procedure! except dbus.DBusException, e: # Connection to D-Bus failed @@ -103,17 +103,17 @@ text=None, timeout=-1): if not text and event_type == 'new_message': # empty text for new_message means do_preview = False # -> default value for text - _text = gobject.markup_escape_text( + _text = GObject.markup_escape_text( gajim.get_name_from_jid(account, jid)) else: - _text = gobject.markup_escape_text(text) + _text = GObject.markup_escape_text(text) if not title: _title = '' else: _title = title - notification = pynotify.Notification(_title, _text) + notification = Notify.Notification(_title, _text) notification.set_timeout(timeout*1000) notification.set_category(event_type) @@ -122,14 +122,14 @@ text=None, timeout=-1): notification.set_data('account', account) notification.set_data('msg_type', msg_type) notification.set_property('icon-name', path_to_image) - if 'actions' in pynotify.get_server_caps(): + if 'actions' in Notify.get_server_caps(): notification.add_action('default', 'Default Action', on_pynotify_notification_clicked) try: notification.show() return - except gobject.GError, e: + except GObject.GError, e: # Connection to notification-daemon failed, see #2893 gajim.log.debug(str(e)) diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 1029662ce..96a5baa04 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -26,8 +26,11 @@ GUI classes related to plug-in management. __all__ = ['PluginsWindow'] -import pango -import gtk, gobject, os +from gi.repository import Pango +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GObject +import os import gtkgui_helpers from dialogs import WarningDialog, YesNoDialog, ArchiveChooserDialog @@ -53,7 +56,7 @@ class PluginsWindow(object): '''Initialize Plugins window''' self.xml = gtkgui_helpers.get_gtk_builder('plugins_window.ui') self.window = self.xml.get_object('plugins_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.set_transient_for(gajim.interface.roster.window) widgets_to_extract = ('plugins_notebook', 'plugin_name_label', 'plugin_version_label', 'plugin_authors_label', @@ -64,45 +67,45 @@ class PluginsWindow(object): for widget_name in widgets_to_extract: setattr(self, widget_name, self.xml.get_object(widget_name)) - attr_list = pango.AttrList() - attr_list.insert(pango.AttrWeight(pango.WEIGHT_BOLD, 0, -1)) + attr_list = Pango.AttrList() + attr_list.insert(Pango.AttrWeight(Pango.Weight.BOLD, 0, -1)) self.plugin_name_label.set_attributes(attr_list) - self.installed_plugins_model = gtk.ListStore(gobject.TYPE_PYOBJECT, - gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN, - gtk.gdk.Pixbuf) + self.installed_plugins_model = Gtk.ListStore(GObject.TYPE_PYOBJECT, + GObject.TYPE_STRING, GObject.TYPE_BOOLEAN, GObject.TYPE_BOOLEAN, + GdkPixbuf.Pixbuf) self.installed_plugins_treeview.set_model(self.installed_plugins_model) self.installed_plugins_treeview.set_rules_hint(True) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Plugin'))#, renderer, text=NAME) - cell = gtk.CellRendererPixbuf() - col.pack_start(cell, False) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Plugin'))#, renderer, text=NAME) + cell = Gtk.CellRendererPixbuf() + col.pack_start(cell, False, True, 0) col.add_attribute(cell, 'pixbuf', ICON) - col.pack_start(renderer, True) + col.pack_start(renderer, True, True, 0) col.add_attribute(renderer, 'text', NAME) self.installed_plugins_treeview.append_column(col) - renderer = gtk.CellRendererToggle() + renderer = Gtk.CellRendererToggle() renderer.connect('toggled', self.installed_plugins_toggled_cb) - col = gtk.TreeViewColumn(_('Active'), renderer, active=ACTIVE, + col = Gtk.TreeViewColumn(_('Active'), renderer, active=ACTIVE, activatable=ACTIVATABLE) self.installed_plugins_treeview.append_column(col) - icon = gtk.Image() - self.def_icon = icon.render_icon(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + icon = Gtk.Image() + self.def_icon = icon.render_icon(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) # connect signal for selection change selection = self.installed_plugins_treeview.get_selection() selection.connect('changed', self.installed_plugins_treeview_selection_changed) - selection.set_mode(gtk.SELECTION_SINGLE) + selection.set_mode(Gtk.SelectionMode.SINGLE) self._clear_installed_plugin_info() self.fill_installed_plugins_model() - selection.select_iter(self.installed_plugins_model.get_iter_root()) + selection.select_iter(self.installed_plugins_model.get_iter_first()) self.xml.connect_signals(self) @@ -114,7 +117,7 @@ class PluginsWindow(object): def on_plugins_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('close_button').grab_focus) + GObject.idle_add(self.xml.get_object('close_button').grab_focus) @log_calls('PluginsWindow') def installed_plugins_treeview_selection_changed(self, treeview_selection): @@ -133,7 +136,7 @@ class PluginsWindow(object): self.plugin_version_label.set_text(plugin.version) self.plugin_authors_label.set_text(plugin.authors) label = self.plugin_homepage_linkbutton.get_children()[0] - label.set_ellipsize(pango.ELLIPSIZE_END) + label.set_ellipsize(Pango.EllipsizeMode.END) self.plugin_homepage_linkbutton.set_uri(plugin.homepage) self.plugin_homepage_linkbutton.set_label(plugin.homepage) self.plugin_homepage_linkbutton.set_property('sensitive', True) @@ -170,7 +173,7 @@ class PluginsWindow(object): def fill_installed_plugins_model(self): pm = gajim.plugin_manager self.installed_plugins_model.clear() - self.installed_plugins_model.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.installed_plugins_model.set_sort_column_id(1, Gtk.SortType.ASCENDING) for plugin in pm.plugins: icon = self.get_plugin_icon(plugin) @@ -182,7 +185,7 @@ class PluginsWindow(object): plugin.__path__)[1]) + '.png' icon = self.def_icon if os.path.isfile(icon_file): - icon = gtk.gdk.pixbuf_new_from_file_at_size(icon_file, 16, 16) + icon = GdkPixbuf.Pixbuf.new_from_file_at_size(icon_file, 16, 16) return icon @log_calls('PluginsWindow') @@ -299,16 +302,16 @@ class PluginsWindow(object): self.dialog = ArchiveChooserDialog(on_response_ok=_try_install) -class GajimPluginConfigDialog(gtk.Dialog): +class GajimPluginConfigDialog(Gtk.Dialog): @log_calls('GajimPluginConfigDialog') def __init__(self, plugin, **kwargs): - gtk.Dialog.__init__(self, '%s %s'%(plugin.name, _('Configuration')), + Gtk.Dialog.__init__(self, '%s %s'%(plugin.name, _('Configuration')), **kwargs) self.plugin = plugin - self.add_button('gtk-close', gtk.RESPONSE_CLOSE) + self.add_button('gtk-close', Gtk.ResponseType.CLOSE) - self.child.set_spacing(3) + self.get_child().set_spacing(3) self.init() diff --git a/src/profile_window.py b/src/profile_window.py index 5c506e941..8b13d4198 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -22,8 +22,9 @@ # THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO) -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GObject import base64 import mimetypes import os @@ -45,7 +46,7 @@ class ProfileWindow: def __init__(self, account, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui') self.window = self.xml.get_object('profile_window') - self.window.set_transient_for(transient_for) + self.set_transient_for(transient_for) self.progressbar = self.xml.get_object('progressbar') self.statusbar = self.xml.get_object('statusbar') self.context_id = self.statusbar.get_context_id('profile') @@ -58,12 +59,12 @@ class ProfileWindow: self.avatar_encoded = None self.message_id = self.statusbar.push(self.context_id, _('Retrieving profile...')) - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GObject.timeout_add(100, self.update_progressbar) self.remove_statusbar_timeout_id = None # Create Image for avatar button - image = gtk.Image() + image = Gtk.Image() self.xml.get_object('PHOTO_button').set_image(image) self.xml.connect_signals(self) gajim.ged.register_event_handler('vcard-published', ged.GUI1, @@ -76,7 +77,7 @@ class ProfileWindow: self.xml.get_object('ok_button').grab_focus() def on_information_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('ok_button').grab_focus) + GObject.idle_add(self.xml.get_object('ok_button').grab_focus) def update_progressbar(self): self.progressbar.pulse() @@ -88,9 +89,9 @@ class ProfileWindow: def on_profile_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) if self.remove_statusbar_timeout_id is not None: - gobject.source_remove(self.remove_statusbar_timeout_id) + GObject.source_remove(self.remove_statusbar_timeout_id) gajim.ged.remove_event_handler('vcard-published', ged.GUI1, self._nec_vcard_published) gajim.ged.remove_event_handler('vcard-not-published', ged.GUI1, @@ -102,7 +103,7 @@ class ProfileWindow: self.dialog.destroy() def on_profile_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_clear_button_clicked(self, widget): @@ -132,12 +133,12 @@ class ProfileWindow: msg = _('File does not exist') if not invalid_file and filesize > 16384: # 16 kb try: - pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path_to_file) # get the image at 'notification size' # and hope that user did not specify in ACE crazy size scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except gobject.GError, msg: # unknown format + except GObject.GError, msg: # unknown format # msg should be string, not object instance msg = str(msg) invalid_file = True @@ -198,7 +199,7 @@ class ProfileWindow: If right-clicked, show popup """ if event.button == 3 and self.avatar_encoded: # right click - menu = gtk.Menu() + menu = Gtk.Menu() # Try to get pixbuf pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid, @@ -206,13 +207,13 @@ class ProfileWindow: if pixbuf not in (None, 'ask'): nick = gajim.config.get_per('accounts', self.account, 'name') - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menuitem = Gtk.ImageMenuItem(Gtk.STOCK_SAVE_AS) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, nick) menu.append(menuitem) # show clear - menuitem = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + menuitem = Gtk.ImageMenuItem(Gtk.STOCK_CLEAR) menuitem.connect('activate', self.on_clear_button_clicked) menu.append(menuitem) menu.connect('selection-done', lambda w:w.destroy()) @@ -233,7 +234,7 @@ class ProfileWindow: pritext = _('Wrong date format') dialogs.ErrorDialog(pritext, _('Format of the date must be ' 'YYYY-MM-DD')) - gobject.idle_add(lambda: widget.grab_focus()) + GObject.idle_add(lambda: widget.grab_focus()) return True def set_value(self, entry_name, value): @@ -290,9 +291,9 @@ class ProfileWindow: self.statusbar.remove_message(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information received')) - self.remove_statusbar_timeout_id = gobject.timeout_add_seconds(3, + self.remove_statusbar_timeout_id = GObject.timeout_add_seconds(3, self.remove_statusbar, self.message_id) - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) self.progressbar.hide() self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None @@ -350,7 +351,7 @@ class ProfileWindow: buff = self.xml.get_object('DESC_textview').get_buffer() start_iter = buff.get_start_iter() end_iter = buff.get_end_iter() - txt = buff.get_text(start_iter, end_iter, 0) + txt = buff.get_text(start_iter, end_iter, False) if txt != '': vcard_['DESC'] = txt.decode('utf-8') @@ -382,14 +383,14 @@ class ProfileWindow: self.message_id = self.statusbar.push(self.context_id, _('Sending profile...')) self.progressbar.show() - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GObject.timeout_add(100, self.update_progressbar) def _nec_vcard_published(self, obj): if obj.conn.name != self.account: return if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) self.update_progressbar_timeout_id = None self.window.destroy() @@ -400,10 +401,10 @@ class ProfileWindow: self.statusbar.remove_message(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information NOT published')) - self.remove_statusbar_timeout_id = gobject.timeout_add_seconds(3, + self.remove_statusbar_timeout_id = GObject.timeout_add_seconds(3, self.remove_statusbar, self.message_id) if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None dialogs.InformationDialog(_('vCard publication failed'), diff --git a/src/remote_control.py b/src/remote_control.py index ac34db3e5..5216201bb 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -26,8 +26,8 @@ ## along with Gajim. If not, see . ## -import gobject -import gtk +from gi.repository import GObject +from gi.repository import Gtk import os import base64 import mimetypes @@ -535,7 +535,7 @@ class SignalObject(dbus.service.Object): win = gajim.interface.msg_win_mgr.get_window(jid, connected_account).window if win.get_property('visible'): - win.window.focus(gtk.get_current_event_time()) + win.window.focus(Gtk.get_current_event_time()) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @@ -553,7 +553,7 @@ class SignalObject(dbus.service.Object): if account not in gajim.connections: return DBUS_BOOLEAN(False) status = gajim.SHOW_LIST[gajim.connections[account].connected] - gobject.idle_add(gajim.interface.roster.send_status, account, + GObject.idle_add(gajim.interface.roster.send_status, account, status, message) else: # account not specified, so change the status of all accounts @@ -567,7 +567,7 @@ class SignalObject(dbus.service.Object): if acc not in gajim.connections: continue status_ = gajim.SHOW_LIST[gajim.connections[acc].connected] - gobject.idle_add(gajim.interface.roster.send_status, acc, + GObject.idle_add(gajim.interface.roster.send_status, acc, status_, message) return DBUS_BOOLEAN(False) @@ -581,7 +581,7 @@ class SignalObject(dbus.service.Object): gajim.config.set_per('accounts', account, 'priority', prio) show = gajim.SHOW_LIST[gajim.connections[account].connected] status = gajim.connections[account].status - gobject.idle_add(gajim.connections[account].change_status, show, + GObject.idle_add(gajim.connections[account].change_status, show, status) else: # account not specified, so change prio of all accounts @@ -594,7 +594,7 @@ class SignalObject(dbus.service.Object): gajim.config.set_per('accounts', acc, 'priority', prio) show = gajim.SHOW_LIST[gajim.connections[acc].connected] status = gajim.connections[acc].status - gobject.idle_add(gajim.connections[acc].change_status, show, + GObject.idle_add(gajim.connections[acc].change_status, show, status) @dbus.service.method(INTERFACE, in_signature='', out_signature='') @@ -687,12 +687,12 @@ class SignalObject(dbus.service.Object): """ win = gajim.interface.roster.window if win.get_property('visible'): - gobject.idle_add(win.hide) + GObject.idle_add(win.hide) else: win.present() # preserve the 'steal focus preservation' if self._is_first(): - win.window.focus(gtk.get_current_event_time()) + win.window.focus(Gtk.get_current_event_time()) else: win.window.focus(long(time())) @@ -705,7 +705,7 @@ class SignalObject(dbus.service.Object): win.present() # preserve the 'steal focus preservation' if self._is_first(): - win.window.focus(gtk.get_current_event_time()) + win.window.focus(Gtk.get_current_event_time()) else: win.window.focus(long(time())) @@ -717,7 +717,7 @@ class SignalObject(dbus.service.Object): win = gajim.ipython_window if win: if win.window.is_visible(): - gobject.idle_add(win.hide) + GObject.idle_add(win.hide) else: win.show_all() win.present() diff --git a/src/roster_window.py b/src/roster_window.py index d901ce0f8..8e6565472 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -32,9 +32,11 @@ ## along with Gajim. If not, see . ## -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject import os import sys import time @@ -95,7 +97,7 @@ class RosterWindow: def _get_account_iter(self, name, model=None): """ - Return the gtk.TreeIter of the given account or None if not found + Return the Gtk.TreeIter of the given account or None if not found Keyword arguments: name -- the account name @@ -113,14 +115,17 @@ class RosterWindow: if model == self.model or it is None: return it try: - return self.modelfilter.convert_child_iter_to_iter(it) + (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) + if ok: + return it + return None except RuntimeError: return None def _get_group_iter(self, name, account, model=None): """ - Return the gtk.TreeIter of the given group or None if not found + Return the Gtk.TreeIter of the given group or None if not found Keyword arguments: name -- the group name @@ -142,14 +147,17 @@ class RosterWindow: if model == self.model or it is None: return it try: - return self.modelfilter.convert_child_iter_to_iter(it) + (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) + if ok: + return it + return None except RuntimeError: return None def _get_self_contact_iter(self, account, model=None): """ - Return the gtk.TreeIter of SelfContact or None if not found + Return the Gtk.TreeIter of SelfContact or None if not found Keyword arguments: account -- the account of SelfContact @@ -164,7 +172,7 @@ class RosterWindow: def _get_contact_iter(self, jid, account, contact=None, model=None): """ - Return a list of gtk.TreeIter of the given contact + Return a list of Gtk.TreeIter of the given contact Keyword arguments: jid -- the jid without resource @@ -201,19 +209,21 @@ class RosterWindow: its2 = [] for it in its: try: - its2.append(self.modelfilter.convert_child_iter_to_iter(it)) + (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) + if ok: + its2.append(it) except RuntimeError: pass return its2 - def _iter_is_separator(self, model, titer): + def _iter_is_separator(self, model, titer, dummy): """ Return True if the given iter is a separator Keyword arguments: model -- the data model - iter -- the gtk.TreeIter to test + iter -- the Gtk.TreeIter to test """ if model[titer][0] == 'SEPARATOR': return True @@ -248,12 +258,12 @@ class RosterWindow: if gajim.account_is_securely_connected(account): # the only way to create a pixbuf from stock tls_pixbuf = self.window.render_icon( - gtk.STOCK_DIALOG_AUTHENTICATION, - gtk.ICON_SIZE_MENU) + Gtk.STOCK_DIALOG_AUTHENTICATION, + Gtk.IconSize.MENU) it = self.model.append(None, [ gajim.interface.jabber_state_images['16'][show], - gobject.markup_escape_text(account), 'account', our_jid, + GObject.markup_escape_text(account), 'account', our_jid, account, None, None, None, None, None, tls_pixbuf] + [None] * self.nb_ext_renderers) self._iters[account]['account'] = it @@ -309,7 +319,7 @@ class RosterWindow: iter_parent = self._get_account_iter(account, self.model) iter_group = self.model.append(iter_parent, [gajim.interface.jabber_state_images['16']['closed'], - gobject.markup_escape_text(group), 'group', group, account, None, + GObject.markup_escape_text(group), 'group', group, account, None, None, None, None, None, None] + [None] * self.nb_ext_renderers) self.draw_group(group, account) self._iters[account_group]['groups'][group] = iter_group @@ -1022,10 +1032,10 @@ class RosterWindow: self.regroup and num_of_secured and num_of_secured == num_of_accounts: # the only way to create a pixbuf from stock tls_pixbuf = self.window.render_icon( - gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_MENU) + Gtk.STOCK_DIALOG_AUTHENTICATION, Gtk.IconSize.MENU) self.model[child_iter][C_PADLOCK_PIXBUF] = tls_pixbuf else: - self.model[child_iter][C_PADLOCK_PIXBUF] = None + self.model[child_iter][C_PADLOCK_PIXBUF] = "" if self.regroup: account_name = _('Merged accounts') @@ -1052,27 +1062,27 @@ class RosterWindow: self.model[child_iter][C_MOOD_PIXBUF] = pep_dict['mood'].\ asPixbufIcon() else: - self.model[child_iter][C_MOOD_PIXBUF] = None + self.model[child_iter][C_MOOD_PIXBUF] = "" if gajim.config.get('show_activity_in_roster') and 'activity' in \ pep_dict: self.model[child_iter][C_ACTIVITY_PIXBUF] = pep_dict['activity'].\ asPixbufIcon() else: - self.model[child_iter][C_ACTIVITY_PIXBUF] = None + self.model[child_iter][C_ACTIVITY_PIXBUF] = "" if gajim.config.get('show_tunes_in_roster') and 'tune' in pep_dict: self.model[child_iter][C_TUNE_PIXBUF] = pep_dict['tune'].\ asPixbufIcon() else: - self.model[child_iter][C_TUNE_PIXBUF] = None + self.model[child_iter][C_TUNE_PIXBUF] = "" if gajim.config.get('show_location_in_roster') and 'location' in \ pep_dict: self.model[child_iter][C_LOCATION_PIXBUF] = pep_dict['location'].\ asPixbufIcon() else: - self.model[child_iter][C_LOCATION_PIXBUF] = None + self.model[child_iter][C_LOCATION_PIXBUF] = "" def _really_draw_accounts(self): for acct in self.accounts_to_draw: @@ -1085,7 +1095,7 @@ class RosterWindow: return self.accounts_to_draw.append(account) if len(self.accounts_to_draw) == 1: - gobject.timeout_add(200, self._really_draw_accounts) + GObject.timeout_add(200, self._really_draw_accounts) def _really_draw_group(self, group, account): child_iter = self._get_group_iter(group, account, model=self.model) @@ -1097,7 +1107,7 @@ class RosterWindow: accounts = [] else: accounts = [account] - text = gobject.markup_escape_text(group) + text = GObject.markup_escape_text(group) if helpers.group_is_blocked(account, group): text = '%s' % text if gajim.config.get('show_contacts_number'): @@ -1121,7 +1131,7 @@ class RosterWindow: return self.groups_to_draw[ag] = {'group': group, 'account': account} if len(self.groups_to_draw) == 1: - gobject.timeout_add(200, self._really_draw_groups) + GObject.timeout_add(200, self._really_draw_groups) def draw_parent_contact(self, jid, account): child_iters = self._get_contact_iter(jid, account, model=self.model) @@ -1155,7 +1165,7 @@ class RosterWindow: if not child_iters: return False - name = gobject.markup_escape_text(contact.get_shown_name()) + name = GObject.markup_escape_text(contact.get_shown_name()) # gets number of unread gc marked messages if jid in gajim.interface.minimized_controls[account] and \ @@ -1208,7 +1218,7 @@ class RosterWindow: color.blue) name += '\n%s' % (colorstring, - gobject.markup_escape_text(status)) + GObject.markup_escape_text(status)) icon_name = helpers.get_icon_name_to_show(contact, account) # look if another resource has awaiting events @@ -1329,7 +1339,7 @@ class RosterWindow: if pep_type in contact.pep: pixbuf = contact.pep[pep_type].asPixbufIcon() else: - pixbuf = None + pixbuf = "" for child_iter in iters: self.model[child_iter][model_column] = pixbuf @@ -1340,7 +1350,7 @@ class RosterWindow: jid = self.model[iters[0]][C_JID].decode('utf-8') pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf in (None, 'ask'): - scaled_pixbuf = None + scaled_pixbuf = "" else: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') for child_iter in iters: @@ -1401,13 +1411,13 @@ class RosterWindow: yield False task = _draw_all_contacts(jids, account) - gobject.idle_add(task.next) + GObject.idle_add(task.next) def _before_fill(self): self.tree.freeze_child_notify() self.tree.set_model(None) # disable sorting - self.model.set_sort_column_id(-2, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(-2, Gtk.SortType.ASCENDING) self.starting = True self.starting_filtering = True @@ -1424,7 +1434,7 @@ class RosterWindow: self.draw_group(group, account) self.draw_account(account) - self.model.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.tree.set_model(self.modelfilter) self.tree.thaw_child_notify() self.starting_filtering = False @@ -1435,10 +1445,10 @@ class RosterWindow: Create new empty model and draw roster """ self.modelfilter = None - self.model = gtk.TreeStore(*self.columns) + self.model = Gtk.TreeStore(*self.columns) self.model.set_sort_func(1, self._compareIters) - self.model.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.modelfilter = self.model.filter_new() self.modelfilter.set_visible_func(self._visible_func) self.modelfilter.connect('row-has-child-toggled', @@ -1581,7 +1591,7 @@ class RosterWindow: return False return True - def _visible_func(self, model, titer): + def _visible_func(self, model, titer, dummy): """ Determine whether iter should be visible in the treeview """ @@ -2034,7 +2044,7 @@ class RosterWindow: rect = self.tree.get_cell_area(props[0], props[1]) # position of the treeview on the screen - position = self.tree.window.get_origin() + position = self.tree.get_window().get_origin() self.tooltip.show_tooltip(contact, rect.height, position[1] + \ rect.y) else: @@ -2426,15 +2436,15 @@ class RosterWindow: # in case show_roster_on_start is False and roster is never shown # window.window is None - if self.window.window is not None: + if self.window.get_window() is not None: if gajim.config.get('save-roster-position'): - x, y = self.window.window.get_root_origin() + x, y = self.window.get_window().get_root_origin() gajim.config.set('roster_x-position', x) gajim.config.set('roster_y-position', y) width, height = self.window.get_size() # For the width use the size of the vbox containing the tree and # status combo, this will cancel out any hpaned width - width = self.xml.get_object('roster_vbox2').allocation.width + width = self.xml.get_object('roster_vbox2').get_allocation().width gajim.config.set('roster_width', width) gajim.config.set('roster_height', height) if not self.xml.get_object('roster_vbox2').get_property('visible'): @@ -2461,7 +2471,7 @@ class RosterWindow: When we quit the gtk interface - exit gtk """ self.prepare_quit() - gtk.main_quit() + Gtk.main_quit() def on_quit_request(self, widget=None): """ @@ -2562,11 +2572,11 @@ class RosterWindow: if jid in jid_list or jid == gajim.get_jid_from_account(account): if not gajim.jid_is_transport(jid) and len(obj.contact_list) == 1: if obj.old_show == 0 and obj.new_show > 1: - gobject.timeout_add_seconds(5, self.remove_newly_added, jid, + GObject.timeout_add_seconds(5, self.remove_newly_added, jid, account) elif obj.old_show > 1 and obj.new_show == 0 and \ obj.conn.connected > 1: - gobject.timeout_add_seconds(5, self.remove_to_be_removed, + GObject.timeout_add_seconds(5, self.remove_to_be_removed, jid, account) if obj.need_redraw: @@ -2589,7 +2599,7 @@ class RosterWindow: if obj.popup: ctrl = gajim.interface.msg_win_mgr.search_control(jid, account) if ctrl: - gobject.idle_add(ctrl.parent_win.set_active_tab, ctrl) + GObject.idle_add(ctrl.parent_win.set_active_tab, ctrl) else: ctrl = gajim.interface.new_chat(obj.contact, account) if len(gajim.events.get_events(account, obj.jid)): @@ -2629,7 +2639,7 @@ class RosterWindow: account) gajim.config.set_per('accounts', account, 'opened_chat_controls', '') - gobject.idle_add(self.refilter_shown_roster_items) + GObject.idle_add(self.refilter_shown_roster_items) def _nec_anonymous_auth(self, obj): """ @@ -2859,7 +2869,7 @@ class RosterWindow: # no connected contacts, show the ofline one connected_contacts = contacts self.tooltip.account = account - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, connected_contacts) elif model[titer][C_TYPE] == 'groupchat': if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: @@ -2868,7 +2878,7 @@ class RosterWindow: self.tooltip.id = row contact = gajim.contacts.get_contacts(account, jid) self.tooltip.account = account - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, contact) elif model[titer][C_TYPE] == 'account': # we're on an account entry in the roster @@ -2877,7 +2887,7 @@ class RosterWindow: if account == 'all': self.tooltip.id = row self.tooltip.account = None - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, []) return jid = gajim.get_jid_from_account(account) @@ -2931,7 +2941,7 @@ class RosterWindow: contacts.append(contact) self.tooltip.id = row self.tooltip.account = None - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, contacts) def on_agent_logging(self, widget, jid, state, account): @@ -3158,7 +3168,7 @@ class RosterWindow: old_text = jid title = _('Rename Group') message = _('Enter a new name for group %s') % \ - gobject.markup_escape_text(jid) + GObject.markup_escape_text(jid) def on_renamed(new_text, account, row_type, jid, old_text): if 'rename' in gajim.interface.instances: @@ -3264,12 +3274,12 @@ class RosterWindow: dialogs.ErrorDialog(_('Could not load image'), msg) return try: - pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path_to_file) if filesize > 16384: # 16 kb # get the image at 'tooltip size' # and hope that user did not specify in ACE crazy size pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except gobject.GError, msg: # unknown format + except GObject.GError, msg: # unknown format # msg should be string, not object instance msg = str(msg) dialogs.ErrorDialog(_('Could not load image'), msg) @@ -3405,7 +3415,7 @@ class RosterWindow: if gc_control: mw = gajim.interface.msg_win_mgr.get_window(jid, account) mw.set_active_tab(gc_control) - mw.window.window.focus(gtk.get_current_event_time()) + mw.window.window.focus(Gtk.get_current_event_time()) return ctrl = gajim.interface.minimized_controls[account][jid] mw = gajim.interface.msg_win_mgr.get_window(jid, account) @@ -3415,7 +3425,7 @@ class RosterWindow: ctrl.parent_win = mw mw.new_tab(ctrl) mw.set_active_tab(ctrl) - mw.window.window.focus(gtk.get_current_event_time()) + mw.window.window.focus(Gtk.get_current_event_time()) self.remove_groupchat(jid, account) def on_edit_account(self, widget, account): @@ -3458,12 +3468,12 @@ class RosterWindow: When a key is pressed in the treeviews """ self.tooltip.hide_tooltip() - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: if self.rfilter_enabled: self.disable_rfilter() else: self.tree.get_selection().unselect_all() - elif event.keyval == gtk.keysyms.F2: + elif event.keyval == Gdk.KEY_F2: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -3475,7 +3485,7 @@ class RosterWindow: account = model[path][C_ACCOUNT].decode('utf-8') self.on_rename(widget, type_, jid, account) - elif event.keyval == gtk.keysyms.Delete: + elif event.keyval == Gdk.KEY_Delete: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if not len(list_of_paths): @@ -3499,17 +3509,17 @@ class RosterWindow: elif type_ == 'agent': self.on_remove_agent(widget, list_) - elif not (event.state & (gtk.gdk.CONTROL_MASK | gtk.gdk.MOD1_MASK)) and\ - gtk.gdk.keyval_to_unicode(event.keyval): + elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.MOD1_MASK)) and\ + Gdk.keyval_to_unicode(event.keyval): # if we got unicode symbol without ctrl / alt - num = gtk.gdk.keyval_to_unicode(event.keyval) + num = Gdk.keyval_to_unicode(event.keyval) self.enable_rfilter(unichr(num)) - elif event.state & gtk.gdk.CONTROL_MASK and event.state & gtk.gdk.SHIFT_MASK and event.keyval == gtk.keysyms.U: + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.get_state() & Gdk.ModifierType.SHIFT_MASK and event.keyval == Gdk.KEY_U: self.enable_rfilter('') self.rfilter_entry.emit('key_press_event', event) - elif event.keyval == gtk.keysyms.Left: + elif event.keyval == Gdk.KEY_Left: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -3522,7 +3532,7 @@ class RosterWindow: elif len(path) > 1: self.tree.set_cursor(path[:-1]) return True - elif event.keyval == gtk.keysyms.Right: + elif event.keyval == Gdk.KEY_Right: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -3540,8 +3550,8 @@ class RosterWindow: return False if event.button == 1: # Left click - if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK and \ - not event.state & gtk.gdk.CONTROL_MASK: + if gajim.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + not event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Check if button has been pressed on the same row if self.clicked_path == path: self.on_row_activated(widget, path) @@ -3549,8 +3559,8 @@ class RosterWindow: def accel_group_func(self, accel_group, acceleratable, keyval, modifier): # CTRL mask - if modifier & gtk.gdk.CONTROL_MASK: - if keyval == gtk.keysyms.s: # CTRL + s + if modifier & Gdk.ModifierType.CONTROL_MASK: + if keyval == Gdk.KEY_s: # CTRL + s model = self.status_combobox.get_model() accounts = gajim.connections.keys() status = model[self.previous_status_combobox_active][2].decode( @@ -3633,8 +3643,8 @@ class RosterWindow: x_min = gajim.config.get('roster_avatar_width') else: x_min = 0 - if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK and \ - not event.state & gtk.gdk.CONTROL_MASK: + if gajim.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + not event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Don't handle double click if we press icon of a metacontact titer = model.get_iter(path) if x > x_min and x < x_min + 27 and type_ == 'contact' and \ @@ -4058,7 +4068,7 @@ class RosterWindow: self.draw_contact(jid, account, selected=True, focus=False) def on_roster_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: if self.rfilter_enabled: self.disable_rfilter() return @@ -4074,8 +4084,8 @@ class RosterWindow: 'allow_hide_roster')): self.tooltip.hide_tooltip() self.window.hide() - elif event.state & gtk.gdk.CONTROL_MASK and event.keyval == \ - gtk.keysyms.i: + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == \ + Gdk.KEY_i: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() for path in list_of_paths: @@ -4086,8 +4096,8 @@ class RosterWindow: contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_info(widget, contact, account) - elif event.state & gtk.gdk.CONTROL_MASK and event.keyval == \ - gtk.keysyms.h: + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == \ + Gdk.KEY_h: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -4102,7 +4112,7 @@ class RosterWindow: self.on_history(widget, contact, account) def on_roster_window_popup_menu(self, widget): - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event = Gdk.Event(Gdk.KEY_PRESS) self.show_treeview_menu(event) def on_row_activated(self, widget, path): @@ -4319,7 +4329,7 @@ class RosterWindow: if self.filtering: # Prevent endless loops jid = model[titer][C_JID].decode('utf-8') - gobject.idle_add(self.draw_contact, jid, account) + GObject.idle_add(self.draw_contact, jid, account) elif type_ == 'group': group = model[titer][C_JID].decode('utf-8') self._adjust_group_expand_collapse_state(group, account) @@ -4341,7 +4351,7 @@ class RosterWindow: # if len(self._last_selected_contact): # # update unselected rows # for (jid, account) in self._last_selected_contact: -# gobject.idle_add(self.draw_contact, jid, +# GObject.idle_add(self.draw_contact, jid, # account) # self._last_selected_contact = [] # if len(list_of_paths) == 0: @@ -4354,7 +4364,7 @@ class RosterWindow: # jid = row[C_JID].decode('utf-8') # account = row[C_ACCOUNT].decode('utf-8') # self._last_selected_contact.append((jid, account)) -# gobject.idle_add(self.draw_contact, jid, account, True) +# GObject.idle_add(self.draw_contact, jid, account, True) def on_service_disco_menuitem_activate(self, widget, account): server_jid = gajim.config.get_per('accounts', account, 'hostname') @@ -4435,16 +4445,16 @@ class RosterWindow: self.disable_rfilter() def on_rfilter_entry_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.disable_rfilter() - elif event.keyval == gtk.keysyms.Return: + elif event.keyval == Gdk.KEY_Return: self.tree.grab_focus() self.tree.emit('key_press_event', event) self.disable_rfilter() - elif event.keyval in (gtk.keysyms.Up, gtk.keysyms.Down): + elif event.keyval in (Gdk.KEY_Up, Gdk.KEY_Down): self.tree.grab_focus() self.tree.emit('key_press_event', event) - elif event.keyval == gtk.keysyms.BackSpace: + elif event.keyval == Gdk.KEY_BackSpace: if widget.get_text() == '': self.disable_rfilter() @@ -4473,9 +4483,9 @@ class RosterWindow: def on_roster_hpaned_notify(self, pane, gparamspec): """ Keep changing the width of the roster - (when a gtk.Paned widget handle is dragged) + (when a Gtk.Paned widget handle is dragged) """ - if gparamspec.name == 'position': + if gparamspec and gparamspec.name == 'position': roster_width = pane.get_child1().allocation.width gajim.config.set('roster_width', roster_width) @@ -4653,7 +4663,7 @@ class RosterWindow: self.remove_contact_from_groups(c_source.jid, account, [grp_source]) - if context.action in (gtk.gdk.ACTION_MOVE, gtk.gdk.ACTION_COPY): + if context.action in (Gdk.DragAction.MOVE, Gdk.DragAction.COPY): context.finish(True, True, etime) def drag_drop(self, treeview, context, x, y, timestamp): @@ -4681,10 +4691,10 @@ class RosterWindow: data = selection.data path_dest, position = drop_info - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 \ + if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 2 \ and path_dest[1] == 0: # dropped before the first group return - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2: + if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 2: # dropped before a group: we drop it in the previous group every # time path_dest = (path_dest[0], path_dest[1]-1) @@ -4851,29 +4861,29 @@ class RosterWindow: drop_in_middle_of_meta = False if type_dest == 'contact': - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 4: + if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 4: drop_in_middle_of_meta = True - if position == gtk.TREE_VIEW_DROP_AFTER and (len(path_dest) == 4 or\ + if position == Gtk.TreeViewDropPosition.AFTER and (len(path_dest) == 4 or\ self.modelfilter.iter_has_child(iter_dest)): drop_in_middle_of_meta = True # Contact drop on group row or between two contacts that are # not metacontacts - if (type_dest == 'group' or position in (gtk.TREE_VIEW_DROP_BEFORE, - gtk.TREE_VIEW_DROP_AFTER)) and not drop_in_middle_of_meta: + if (type_dest == 'group' or position in (Gtk.TreeViewDropPosition.BEFORE, + Gtk.TreeViewDropPosition.AFTER)) and not drop_in_middle_of_meta: self.on_drop_in_group(None, account_source, c_source, grp_dest, is_big_brother, context, etime, grp_source) return # Contact drop on another contact, make meta contacts - if position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER or \ - position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE or drop_in_middle_of_meta: + if position == Gtk.TreeViewDropPosition.INTO_OR_AFTER or \ + position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE or drop_in_middle_of_meta: c_dest = gajim.contacts.get_contact_with_highest_priority( account_dest, jid_dest) if not c_dest: # c_dest is None if jid_dest doesn't belong to account return - menu = gtk.Menu() - item = gtk.MenuItem(_('Send %s to %s') % (c_source.get_shown_name(), + menu = Gtk.Menu() + item = Gtk.MenuItem(_('Send %s to %s') % (c_source.get_shown_name(), c_dest.get_shown_name())) item.connect('activate', self.on_drop_rosterx, account_source, c_source, account_dest, c_dest, is_big_brother, context, etime) @@ -4884,10 +4894,10 @@ class RosterWindow: source_family = gajim.contacts.get_metacontacts_family( account_source, c_source.jid) if dest_family == source_family: - item = gtk.MenuItem(_('Make %s first contact') % ( + item = Gtk.MenuItem(_('Make %s first contact') % ( c_source.get_shown_name())) else: - item = gtk.MenuItem(_('Make %s and %s metacontacts') % ( + item = Gtk.MenuItem(_('Make %s and %s metacontacts') % ( c_source.get_shown_name(), c_dest.get_shown_name())) item.connect('activate', self.on_drop_in_contact, account_source, @@ -4948,7 +4958,7 @@ class RosterWindow: self.setup_and_draw_roster() # Update the status combobox model = self.status_combobox.get_model() - titer = model.get_iter_root() + titer = model.get_iter_first() while titer: if model[titer][2] != '': # If it's not change status message iter @@ -5049,10 +5059,10 @@ class RosterWindow: Set style for treeview cell, using PRELIGHT system color """ if set_background: - bgcolor = self.tree.style.bg[style] + bgcolor = self.tree.get_style().bg[style] renderer.set_property('cell-background-gdk', bgcolor) else: - fgcolor = self.tree.style.fg[style] + fgcolor = self.tree.get_style().fg[style] renderer.set_property('foreground-gdk', fgcolor) def _iconCellDataFunc(self, column, renderer, model, titer, data=None): @@ -5102,7 +5112,7 @@ class RosterWindow: if color: renderer.set_property('foreground', color) else: - self.set_renderer_color(renderer, gtk.STATE_ACTIVE, False) + self.set_renderer_color(renderer, Gtk.StateType.ACTIVE, False) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'accountfont')) renderer.set_property('xpad', 0) @@ -5113,7 +5123,7 @@ class RosterWindow: if color: renderer.set_property('foreground', color) else: - self.set_renderer_color(renderer, gtk.STATE_PRELIGHT, False) + self.set_renderer_color(renderer, Gtk.StateType.PRELIGHT, False) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'groupfont')) parent_iter = model.iter_parent(titer) @@ -5240,7 +5250,7 @@ class RosterWindow: if color: renderer.set_property('cell-background', color) else: - self.set_renderer_color(renderer, gtk.STATE_ACTIVE) + self.set_renderer_color(renderer, Gtk.StateType.ACTIVE) def _set_contact_row_background_color(self, renderer, jid, account): theme = gajim.config.get('roster_theme') @@ -5260,7 +5270,7 @@ class RosterWindow: if color: renderer.set_property('cell-background', color) else: - self.set_renderer_color(renderer, gtk.STATE_PRELIGHT) + self.set_renderer_color(renderer, Gtk.StateType.PRELIGHT) ################################################################################ ### Everything about building menus @@ -5315,14 +5325,14 @@ class RosterWindow: self.profile_avatar_menuitem_handler_id = None # remove the existing submenus - add_new_contact_menuitem.remove_submenu() - service_disco_menuitem.remove_submenu() - join_gc_menuitem.remove_submenu() - single_message_menuitem.remove_submenu() - advanced_menuitem.remove_submenu() - profile_avatar_menuitem.remove_submenu() + add_new_contact_menuitem.set_submenu(None) + service_disco_menuitem.set_submenu(None) + join_gc_menuitem.set_submenu(None) + single_message_menuitem.set_submenu(None) + advanced_menuitem.set_submenu(None) + profile_avatar_menuitem.set_submenu(None) - gc_sub_menu = gtk.Menu() # gc is always a submenu + gc_sub_menu = Gtk.Menu() # gc is always a submenu join_gc_menuitem.set_submenu(gc_sub_menu) connected_accounts = gajim.get_number_of_connected_accounts() @@ -5334,7 +5344,7 @@ class RosterWindow: if connected_accounts > 2 or \ (connected_accounts > 1 and not gajim.zeroconf_is_connected()): # 2 or more "real" (no zeroconf) accounts? make submenus - new_chat_sub_menu = gtk.Menu() + new_chat_sub_menu = Gtk.Menu() for account in accounts_list: if gajim.connections[account].connected <= 1 or \ @@ -5343,8 +5353,8 @@ class RosterWindow: continue # new chat - new_chat_item = gtk.MenuItem(_('using account %s') % account, - False) + new_chat_item = Gtk.MenuItem(_('using account %s') % account, + use_underline=False) new_chat_sub_menu.append(new_chat_item) new_chat_item.connect('activate', self.on_new_chat_menuitem_activate, account) @@ -5386,9 +5396,9 @@ class RosterWindow: break # No other account connected else: # 2 or more 'real' accounts are connected, make submenus - single_message_sub_menu = gtk.Menu() - add_sub_menu = gtk.Menu() - disco_sub_menu = gtk.Menu() + single_message_sub_menu = Gtk.Menu() + add_sub_menu = Gtk.Menu() + disco_sub_menu = Gtk.Menu() for account in accounts_list: if gajim.connections[account].connected <= 1 or \ @@ -5397,8 +5407,8 @@ class RosterWindow: continue # single message - single_message_item = gtk.MenuItem(_('using account %s') % \ - account, False) + single_message_item = Gtk.MenuItem(_('using account %s') % \ + account, use_underline=False) single_message_sub_menu.append(single_message_item) single_message_item.connect('activate', self.on_send_single_message_menuitem_activate, account) @@ -5406,20 +5416,22 @@ class RosterWindow: # join gc if gajim.connections[account].private_storage_supported: connected_accounts_with_private_storage += 1 - gc_item = gtk.MenuItem(_('using account %s') % account, False) + gc_item = Gtk.MenuItem(_('using account %s') % account, + use_underline=False) gc_sub_menu.append(gc_item) - gc_menuitem_menu = gtk.Menu() + gc_menuitem_menu = Gtk.Menu() self.add_bookmarks_list(gc_menuitem_menu, account) gc_item.set_submenu(gc_menuitem_menu) # add - add_item = gtk.MenuItem(_('to %s account') % account, False) + add_item = Gtk.MenuItem(_('to %s account') % account, + use_underline=False) add_sub_menu.append(add_item) add_item.connect('activate', self.on_add_new_contact, account) # disco - disco_item = gtk.MenuItem(_('using %s account') % account, - False) + disco_item = Gtk.MenuItem(_('using %s account') % account, + use_underline=False) disco_sub_menu.append(disco_item) disco_item.connect('activate', self.on_service_disco_menuitem_activate, account) @@ -5454,12 +5466,12 @@ class RosterWindow: item.set_sensitive(False) # Manage GC bookmarks - newitem = gtk.SeparatorMenuItem() # separator + newitem = Gtk.SeparatorMenuItem() # separator gc_sub_menu.append(newitem) - newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + newitem = Gtk.ImageMenuItem(_('_Manage Bookmarks...')) + img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) newitem.set_image(img) newitem.connect('activate', self.on_manage_bookmarks_menuitem_activate) gc_sub_menu.append(newitem) @@ -5474,11 +5486,11 @@ class RosterWindow: connected_accounts_with_vcard.append(account) if len(connected_accounts_with_vcard) > 1: # 2 or more accounts? make submenus - profile_avatar_sub_menu = gtk.Menu() + profile_avatar_sub_menu = Gtk.Menu() for account in connected_accounts_with_vcard: # profile, avatar - profile_avatar_item = gtk.MenuItem(_('of account %s') % account, - False) + profile_avatar_item = Gtk.MenuItem(_('of account %s') % account, + use_underline=False) profile_avatar_sub_menu.append(profile_avatar_item) profile_avatar_item.connect('activate', self.on_profile_avatar_menuitem_activate, account) @@ -5512,14 +5524,14 @@ class RosterWindow: advanced_menuitem.set_submenu(advanced_menuitem_menu) advanced_menuitem_menu.show_all() else: # user has *more* than one account : build advanced submenus - advanced_sub_menu = gtk.Menu() + advanced_sub_menu = Gtk.Menu() accounts = [] # Put accounts in a list to sort them for account in gajim.connections: accounts.append(account) accounts.sort() for account in accounts: - advanced_item = gtk.MenuItem(_('for account %s') % account, - False) + advanced_item = Gtk.MenuItem(_('for account %s') % account, + use_underline=False) advanced_sub_menu.append(advanced_item) advanced_menuitem_menu = \ self.get_and_connect_advanced_menuitem_menu(account) @@ -5559,12 +5571,12 @@ class RosterWindow: execute_command_menuitem = xml.get_object( 'execute_command_menuitem') edit_account_menuitem = xml.get_object('edit_account_menuitem') - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() status_menuitem.set_submenu(sub_menu) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem(uf_show) icon = state_images[show] item.set_image(icon) sub_menu.append(item) @@ -5575,10 +5587,10 @@ class RosterWindow: else: item.connect('activate', self.change_status, account, show) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() sub_menu.append(item) - item = gtk.ImageMenuItem(_('_Change Status Message')) + item = Gtk.ImageMenuItem(_('_Change Status Message')) gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate, @@ -5586,11 +5598,11 @@ class RosterWindow: if gajim.connections[account].connected < 2: item.set_sensitive(False) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem(uf_show) icon = state_images['offline'] item.set_image(icon) sub_menu.append(item) @@ -5598,10 +5610,10 @@ class RosterWindow: pep_menuitem = xml.get_object('pep_menuitem') if gajim.connections[account].pep_supported: - pep_submenu = gtk.Menu() + pep_submenu = Gtk.Menu() pep_menuitem.set_submenu(pep_submenu) def add_item(label, opt_name, func): - item = gtk.CheckMenuItem(label) + item = Gtk.CheckMenuItem(label) pep_submenu.append(item) if not dbus_support.supported: item.set_sensitive(False) @@ -5616,15 +5628,15 @@ class RosterWindow: add_item(_('Publish Location'), 'publish_location', self.on_publish_location_toggled) - pep_config = gtk.ImageMenuItem(_('Configure Services...')) - item = gtk.SeparatorMenuItem() + pep_config = Gtk.ImageMenuItem(_('Configure Services...')) + item = Gtk.SeparatorMenuItem() pep_submenu.append(item) pep_config.set_sensitive(True) pep_submenu.append(pep_config) pep_config.connect('activate', self.on_pep_services_menuitem_activate, account) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) pep_config.set_image(img) else: @@ -5655,7 +5667,7 @@ class RosterWindow: start_chat_menuitem.connect('activate', self.on_new_chat_menuitem_activate, account) - gc_sub_menu = gtk.Menu() # gc is always a submenu + gc_sub_menu = Gtk.Menu() # gc is always a submenu join_group_chat_menuitem.set_submenu(gc_sub_menu) self.add_bookmarks_list(gc_sub_menu, account) @@ -5672,21 +5684,21 @@ class RosterWindow: status_menuitem = xml.get_object('status_menuitem') zeroconf_properties_menuitem = xml.get_object( 'zeroconf_properties_menuitem') - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() status_menuitem.set_submenu(sub_menu) for show in ('online', 'away', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem(uf_show) icon = state_images[show] item.set_image(icon) sub_menu.append(item) item.connect('activate', self.change_status, account, show) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() sub_menu.append(item) - item = gtk.ImageMenuItem(_('_Change Status Message')) + item = Gtk.ImageMenuItem(_('_Change Status Message')) gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate, @@ -5695,7 +5707,7 @@ class RosterWindow: item.set_sensitive(False) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem(uf_show) icon = state_images['offline'] item.set_image(icon) sub_menu.append(item) @@ -5716,7 +5728,7 @@ class RosterWindow: if account != 'all': # not in merged mode menu = self.build_account_menu(account) else: - menu = gtk.Menu() + menu = Gtk.Menu() iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') accounts = [] # Put accounts in a list to sort them @@ -5725,7 +5737,7 @@ class RosterWindow: accounts.sort() for account in accounts: state_images = gtkgui_helpers.load_iconset(path) - item = gtk.ImageMenuItem(account) + item = Gtk.ImageMenuItem(account) show = gajim.SHOW_LIST[gajim.connections[account].connected] icon = state_images[show] item.set_image(icon) @@ -5760,32 +5772,32 @@ class RosterWindow: if contact.show not in ('offline', 'error'): list_online.append((contact, account)) list_.append((contact, account)) - menu = gtk.Menu() + menu = Gtk.Menu() # Make special context menu if group is Groupchats if group == _('Groupchats'): - maximize_menuitem = gtk.ImageMenuItem(_('_Maximize All')) - icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, - gtk.ICON_SIZE_MENU) + maximize_menuitem = Gtk.ImageMenuItem(_('_Maximize All')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_GOTO_TOP, + Gtk.IconSize.MENU) maximize_menuitem.set_image(icon) maximize_menuitem.connect('activate', self.on_all_groupchat_maximized, list_) menu.append(maximize_menuitem) else: # Send Group Message - send_group_message_item = gtk.ImageMenuItem( + send_group_message_item = Gtk.ImageMenuItem( _('Send Group M_essage')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) send_group_message_item.set_image(icon) - send_group_message_submenu = gtk.Menu() + send_group_message_submenu = Gtk.Menu() send_group_message_item.set_submenu(send_group_message_submenu) menu.append(send_group_message_item) - group_message_to_all_item = gtk.MenuItem(_('To all users')) + group_message_to_all_item = Gtk.MenuItem(_('To all users')) send_group_message_submenu.append(group_message_to_all_item) - group_message_to_all_online_item = gtk.MenuItem( + group_message_to_all_online_item = Gtk.MenuItem( _('To all online users')) send_group_message_submenu.append(group_message_to_all_online_item) @@ -5796,7 +5808,7 @@ class RosterWindow: self.on_send_single_message_menuitem_activate, account, list_) # Invite to - invite_menuitem = gtk.ImageMenuItem(_('In_vite to')) + invite_menuitem = Gtk.ImageMenuItem(_('In_vite to')) muc_icon = gtkgui_helpers.load_icon('muc_active') if muc_icon: invite_menuitem.set_image(muc_icon) @@ -5805,7 +5817,7 @@ class RosterWindow: menu.append(invite_menuitem) # Send Custom Status - send_custom_status_menuitem = gtk.ImageMenuItem( + send_custom_status_menuitem = Gtk.ImageMenuItem( _('Send Cus_tom Status')) # add a special img for this menuitem if helpers.group_is_blocked(account, group): @@ -5813,17 +5825,17 @@ class RosterWindow: 'offline')) send_custom_status_menuitem.set_sensitive(False) else: - icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, - gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NETWORK, + Gtk.IconSize.MENU) send_custom_status_menuitem.set_image(icon) - status_menuitems = gtk.Menu() + status_menuitems = Gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): # icon MUST be different instance for every item state_images = gtkgui_helpers.load_iconset(path) - status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) status_menuitem.connect('activate', self.on_send_custom_status, list_, s, group) icon = state_images[s] @@ -5837,11 +5849,11 @@ class RosterWindow: send_group_message_item.set_sensitive(False) if not group in helpers.special_groups: - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) # Rename - rename_item = gtk.ImageMenuItem(_('Re_name')) + rename_item = Gtk.ImageMenuItem(_('Re_name')) # add a special img for rename menuitem gtkgui_helpers.add_image_to_menuitem(rename_item, 'gajim-kbd_input') menu.append(rename_item) @@ -5860,17 +5872,17 @@ class RosterWindow: if is_blocked and gajim.connections[account].\ privacy_rules_supported: - unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, - gtk.ICON_SIZE_MENU) + unblock_menuitem = Gtk.ImageMenuItem(_('_Unblock')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, + Gtk.IconSize.MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, list_, group) menu.append(unblock_menuitem) else: - block_menuitem = gtk.ImageMenuItem(_('_Block')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, - gtk.ICON_SIZE_MENU) + block_menuitem = Gtk.ImageMenuItem(_('_Block')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, + Gtk.IconSize.MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, list_, group) menu.append(block_menuitem) @@ -5878,9 +5890,9 @@ class RosterWindow: block_menuitem.set_sensitive(False) # Remove group - remove_item = gtk.ImageMenuItem(_('_Remove')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, - gtk.ICON_SIZE_MENU) + remove_item = Gtk.ImageMenuItem(_('_Remove')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, + Gtk.IconSize.MENU) remove_item.set_image(icon) menu.append(remove_item) remove_item.connect('activate', self.on_remove_group_item_activated, @@ -5937,7 +5949,7 @@ class RosterWindow: is_blocked = False list_.append((contact, account)) - menu = gtk.Menu() + menu = Gtk.Menu() account = None for (contact, current_account) in list_: # check that we use the same account for every sender @@ -5946,16 +5958,16 @@ class RosterWindow: break account = current_account if account is not None: - send_group_message_item = gtk.ImageMenuItem( + send_group_message_item = Gtk.ImageMenuItem( _('Send Group M_essage')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) send_group_message_item.set_image(icon) menu.append(send_group_message_item) send_group_message_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) # Invite to Groupchat - invite_item = gtk.ImageMenuItem(_('In_vite to')) + invite_item = Gtk.ImageMenuItem(_('In_vite to')) muc_icon = gtkgui_helpers.load_icon('muc_active') if muc_icon: invite_item.set_image(muc_icon) @@ -5963,38 +5975,38 @@ class RosterWindow: gui_menu_builder.build_invite_submenu(invite_item, list_) menu.append(invite_item) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) # Manage Transport submenu - item = gtk.ImageMenuItem(_('_Manage Contacts')) - icon = gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, - gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('_Manage Contacts')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PROPERTIES, + Gtk.IconSize.MENU) item.set_image(icon) - manage_contacts_submenu = gtk.Menu() + manage_contacts_submenu = Gtk.Menu() item.set_submenu(manage_contacts_submenu) menu.append(item) # Edit Groups - edit_groups_item = gtk.ImageMenuItem(_('Edit _Groups')) - icon = gtk.image_new_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_MENU) + edit_groups_item = Gtk.ImageMenuItem(_('Edit _Groups')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_EDIT, Gtk.IconSize.MENU) edit_groups_item.set_image(icon) manage_contacts_submenu.append(edit_groups_item) edit_groups_item.connect('activate', self.on_edit_groups, list_) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator manage_contacts_submenu.append(item) # Block if is_blocked and privacy_rules_supported: - unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + unblock_menuitem = Gtk.ImageMenuItem(_('_Unblock')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, list_) manage_contacts_submenu.append(unblock_menuitem) else: - block_menuitem = gtk.ImageMenuItem(_('_Block')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + block_menuitem = Gtk.ImageMenuItem(_('_Block')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, list_) manage_contacts_submenu.append(block_menuitem) @@ -6003,8 +6015,8 @@ class RosterWindow: block_menuitem.set_sensitive(False) # Remove - remove_item = gtk.ImageMenuItem(_('_Remove')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) + remove_item = Gtk.ImageMenuItem(_('_Remove')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.MENU) remove_item.set_image(icon) manage_contacts_submenu.append(remove_item) remove_item.connect('activate', self.on_req_usub, list_) @@ -6028,11 +6040,11 @@ class RosterWindow: path = model.get_path(titer) account = model[titer][C_ACCOUNT].decode('utf-8') contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - menu = gtk.Menu() + menu = Gtk.Menu() # Send single message - item = gtk.ImageMenuItem(_('Send Single Message')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Send Single Message')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_send_single_message_menuitem_activate, account, contact) @@ -6043,7 +6055,7 @@ class RosterWindow: blocked = True # Send Custom Status - send_custom_status_menuitem = gtk.ImageMenuItem( + send_custom_status_menuitem = Gtk.ImageMenuItem( _('Send Cus_tom Status')) # add a special img for this menuitem if blocked: @@ -6056,17 +6068,17 @@ class RosterWindow: send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( gajim.interface.status_sent_to_users[account][jid])) else: - icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, - gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NETWORK, + Gtk.IconSize.MENU) send_custom_status_menuitem.set_image(icon) - status_menuitems = gtk.Menu() + status_menuitems = Gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): # icon MUST be different instance for every item state_images = gtkgui_helpers.load_iconset(path) - status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) status_menuitem.connect('activate', self.on_send_custom_status, [(contact, account)], s) icon = state_images[s] @@ -6074,12 +6086,12 @@ class RosterWindow: status_menuitems.append(status_menuitem) menu.append(send_custom_status_menuitem) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) # Execute Command - item = gtk.ImageMenuItem(_('Execute Command...')) - icon = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Execute Command...')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.MENU) item.set_image(icon) menu.append(item) item.connect('activate', self.on_execute_command, contact, account, @@ -6088,18 +6100,18 @@ class RosterWindow: item.set_sensitive(False) # Manage Transport submenu - item = gtk.ImageMenuItem(_('_Manage Transport')) - icon = gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, - gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('_Manage Transport')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PROPERTIES, + Gtk.IconSize.MENU) item.set_image(icon) - manage_transport_submenu = gtk.Menu() + manage_transport_submenu = Gtk.Menu() item.set_submenu(manage_transport_submenu) menu.append(item) # Modify Transport - item = gtk.ImageMenuItem(_('_Modify Transport')) - icon = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('_Modify Transport')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) item.set_image(icon) manage_transport_submenu.append(item) item.connect('activate', self.on_edit_agent, contact, account) @@ -6107,7 +6119,7 @@ class RosterWindow: item.set_sensitive(False) # Rename - item = gtk.ImageMenuItem(_('_Rename')) + item = Gtk.ImageMenuItem(_('_Rename')) # add a special img for rename menuitem gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') manage_transport_submenu.append(item) @@ -6115,38 +6127,38 @@ class RosterWindow: if gajim.account_is_disconnected(account): item.set_sensitive(False) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator manage_transport_submenu.append(item) # Block if blocked: - item = gtk.ImageMenuItem(_('_Unblock')) + item = Gtk.ImageMenuItem(_('_Unblock')) item.connect('activate', self.on_unblock, [(contact, account)]) else: - item = gtk.ImageMenuItem(_('_Block')) + item = Gtk.ImageMenuItem(_('_Block')) item.connect('activate', self.on_block, [(contact, account)]) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) item.set_image(icon) manage_transport_submenu.append(item) if gajim.account_is_disconnected(account): item.set_sensitive(False) # Remove - item = gtk.ImageMenuItem(_('_Remove')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('_Remove')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.MENU) item.set_image(icon) manage_transport_submenu.append(item) item.connect('activate', self.on_remove_agent, [(contact, account)]) if gajim.account_is_disconnected(account): item.set_sensitive(False) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) # Information - information_menuitem = gtk.ImageMenuItem(_('_Information')) - icon = gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_MENU) + information_menuitem = Gtk.ImageMenuItem(_('_Information')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_INFO, Gtk.IconSize.MENU) information_menuitem.set_image(icon) menu.append(information_menuitem) information_menuitem.connect('activate', self.on_info, contact, account) @@ -6164,39 +6176,39 @@ class RosterWindow: jid = model[titer][C_JID].decode('utf-8') account = model[titer][C_ACCOUNT].decode('utf-8') contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - menu = gtk.Menu() + menu = Gtk.Menu() if jid in gajim.interface.minimized_controls[account]: - maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) - icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, - gtk.ICON_SIZE_MENU) + maximize_menuitem = Gtk.ImageMenuItem(_('_Maximize')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_GOTO_TOP, + Gtk.IconSize.MENU) maximize_menuitem.set_image(icon) maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ jid, account) menu.append(maximize_menuitem) if not gajim.gc_connected[account].get(jid, False): - connect_menuitem = gtk.ImageMenuItem(_('_Reconnect')) - connect_icon = gtk.image_new_from_stock(gtk.STOCK_CONNECT, \ - gtk.ICON_SIZE_MENU) + connect_menuitem = Gtk.ImageMenuItem(_('_Reconnect')) + connect_icon = Gtk.Image.new_from_stock(Gtk.STOCK_CONNECT, \ + Gtk.IconSize.MENU) connect_menuitem.set_image(connect_icon) connect_menuitem.connect('activate', self.on_reconnect, jid, account) menu.append(connect_menuitem) - disconnect_menuitem = gtk.ImageMenuItem(_('_Disconnect')) - disconnect_icon = gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, \ - gtk.ICON_SIZE_MENU) + disconnect_menuitem = Gtk.ImageMenuItem(_('_Disconnect')) + disconnect_icon = Gtk.Image.new_from_stock(Gtk.STOCK_DISCONNECT, \ + Gtk.IconSize.MENU) disconnect_menuitem.set_image(disconnect_icon) disconnect_menuitem.connect('activate', self.on_disconnect, jid, account) menu.append(disconnect_menuitem) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) - history_menuitem = gtk.ImageMenuItem(_('_History')) - history_icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, \ - gtk.ICON_SIZE_MENU) + history_menuitem = Gtk.ImageMenuItem(_('_History')) + history_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_FILL, \ + Gtk.IconSize.MENU) history_menuitem.set_image(history_icon) history_menuitem .connect('activate', self.on_history, contact, account) menu.append(history_menuitem) @@ -6268,13 +6280,13 @@ class RosterWindow: """ Add a seperator and History Manager menuitem BELOW for account menuitems """ - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem() # separator menu.append(item) # History manager - item = gtk.ImageMenuItem(_('History Manager')) - icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, - gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('History Manager')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_FILL, + Gtk.IconSize.MENU) item.set_image(icon) menu.append(item) item.connect('activate', self.on_history_manager_menuitem_activate) @@ -6283,8 +6295,8 @@ class RosterWindow: """ Show join new group chat item and bookmarks list for an account """ - item = gtk.ImageMenuItem(_('_Join New Group Chat')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('_Join New Group Chat')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_join_gc_activate, account) @@ -6292,12 +6304,12 @@ class RosterWindow: # User has at least one bookmark. if gajim.connections[account].bookmarks: - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() gc_sub_menu.append(item) for bookmark in gajim.connections[account].bookmarks: # Do not use underline. - item = gtk.MenuItem(bookmark['name'], False) + item = Gtk.MenuItem(bookmark['name'], use_underline=False) item.connect('activate', self.on_bookmark_menuitem_activate, account, bookmark) gc_sub_menu.append(item) @@ -6307,14 +6319,14 @@ class RosterWindow: # Just handle new_chat_menuitem to have ctrl+N working even if we don't # open the menu new_chat_menuitem = self.xml.get_object('new_chat_menuitem') - ag = gtk.accel_groups_from_object(self.window)[0] + ag = Gtk.accel_groups_from_object(self.window)#[0] if self.new_chat_menuitem_handler_id: new_chat_menuitem.handler_disconnect( self.new_chat_menuitem_handler_id) self.new_chat_menuitem_handler_id = None - new_chat_menuitem.remove_submenu() + new_chat_menuitem.set_submenu(None) connected_accounts = gajim.get_number_of_connected_accounts() if connected_accounts == 1 or (connected_accounts == 2 and \ @@ -6384,7 +6396,7 @@ class RosterWindow: def fill_column(self, col): for rend in self.renderers_list: - col.pack_start(rend[1], expand=rend[2]) + col.pack_start(rend[1], rend[2]) col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys @@ -6407,9 +6419,9 @@ class RosterWindow: # [icon, name, type, jid, account, editable, mood_pixbuf, # activity_pixbuf, tune_pixbuf, location_pixbuf, avatar_pixbuf, # padlock_pixbuf] - self.columns = [gtk.Image, str, str, str, str, - gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, - gtk.gdk.Pixbuf, gtk.gdk.Pixbuf] + self.columns = [Gtk.Image, str, str, str, str, + GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, + GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf] self.xml = gtkgui_helpers.get_gtk_builder('roster_window.ui') self.window = self.xml.get_object('roster_window') self.hpaned = self.xml.get_object('roster_hpaned') @@ -6421,7 +6433,7 @@ class RosterWindow: self.window.set_property('skip-taskbar-hint', True) self.tree = self.xml.get_object('roster_treeview') sel = self.tree.get_selection() - sel.set_mode(gtk.SELECTION_MULTIPLE) + sel.set_mode(Gtk.SelectionMode.MULTIPLE) # sel.connect('changed', # self.on_treeview_selection_changed) @@ -6476,7 +6488,7 @@ class RosterWindow: self.accounts_to_draw = [] # uf_show, img, show, sensitive - liststore = gtk.ListStore(str, gtk.Image, str, bool) + liststore = Gtk.ListStore(str, Gtk.Image, str, bool) self.status_combobox = self.xml.get_object('status_combobox') cell = cell_renderer_image.CellRendererImage(0, 1) @@ -6489,7 +6501,7 @@ class RosterWindow: # if we want False (so we add it for img_cell too) self.status_combobox.add_attribute(cell, 'sensitive', 3) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() cell.set_property('xpad', 5) # padding for status text self.status_combobox.pack_start(cell, True) # text to show is in in first column of liststore @@ -6497,7 +6509,7 @@ class RosterWindow: # if it will be sensitive or not it is in the fourth column self.status_combobox.add_attribute(cell, 'sensitive', 3) - self.status_combobox.set_row_separator_func(self._iter_is_separator) + self.status_combobox.set_row_separator_func(self._iter_is_separator, None) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show) @@ -6507,7 +6519,7 @@ class RosterWindow: liststore.append(['SEPARATOR', None, '', True]) path = gtkgui_helpers.get_icon_path('gajim-kbd_input') - img = gtk.Image() + img = Gtk.Image() img.set_from_file(path) # sensitivity to False because by default we're offline self.status_message_menuitem_iter = liststore.append( @@ -6553,7 +6565,7 @@ class RosterWindow: self.xml.get_object('show_roster_menuitem').set_active(True) # columns - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() # list of renderers with attributes / properties in the form: # (name, renderer_object, expand?, attribute_name, attribute_value, # cell_data_func, func_arg) @@ -6563,12 +6575,12 @@ class RosterWindow: 'activity': C_ACTIVITY_PIXBUF, 'tune': C_TUNE_PIXBUF, 'location': C_LOCATION_PIXBUF} - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() self.renderers_propertys[renderer_text] = ('ellipsize', - pango.ELLIPSIZE_END) + Pango.EllipsizeMode.END) def add_avatar_renderer(): - self.renderers_list.append(('avatar', gtk.CellRendererPixbuf(), + self.renderers_list.append(('avatar', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_AVATAR_PIXBUF, self._fill_avatar_pixbuf_renderer, None)) @@ -6582,26 +6594,26 @@ class RosterWindow: ('name', renderer_text, True, 'markup', C_NAME, self._nameCellDataFunc, None), - ('mood', gtk.CellRendererPixbuf(), False, + ('mood', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_MOOD_PIXBUF, self._fill_pep_pixbuf_renderer, C_MOOD_PIXBUF), - ('activity', gtk.CellRendererPixbuf(), False, + ('activity', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_ACTIVITY_PIXBUF, self._fill_pep_pixbuf_renderer, C_ACTIVITY_PIXBUF), - ('tune', gtk.CellRendererPixbuf(), False, + ('tune', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_TUNE_PIXBUF, self._fill_pep_pixbuf_renderer, C_TUNE_PIXBUF), - ('location', gtk.CellRendererPixbuf(), False, + ('location', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_LOCATION_PIXBUF, self._fill_pep_pixbuf_renderer, C_LOCATION_PIXBUF)) if gajim.config.get('avatar_position_in_roster') == 'right': add_avatar_renderer() - self.renderers_list.append(('padlock', gtk.CellRendererPixbuf(), False, + self.renderers_list.append(('padlock', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_PADLOCK_PIXBUF, self._fill_padlock_pixbuf_renderer, None)) @@ -6610,9 +6622,9 @@ class RosterWindow: self.tree.append_column(col) # do not show gtk arrows workaround - col = gtk.TreeViewColumn() - render_pixbuf = gtk.CellRendererPixbuf() - col.pack_start(render_pixbuf, expand=False) + col = Gtk.TreeViewColumn() + render_pixbuf = Gtk.CellRendererPixbuf() + col.pack_start(render_pixbuf, False) self.tree.append_column(col) col.set_visible(False) self.tree.set_expander_column(col) @@ -6620,12 +6632,12 @@ class RosterWindow: # signals self.TARGET_TYPE_URI_LIST = 80 TARGETS = [('MY_TREE_MODEL_ROW', - gtk.TARGET_SAME_APP | gtk.TARGET_SAME_WIDGET, 0)] - TARGETS2 = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0), + Gtk.TargetFlags.SAME_APP | Gtk.TargetFlags.SAME_WIDGET, 0)] + TARGETS2 = [('MY_TREE_MODEL_ROW', Gtk.TargetFlags.SAME_WIDGET, 0), ('text/uri-list', 0, self.TARGET_TYPE_URI_LIST)] - self.tree.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, TARGETS, - gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_COPY) - self.tree.enable_model_drag_dest(TARGETS2, gtk.gdk.ACTION_DEFAULT) + self.tree.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, TARGETS, + Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE | Gdk.DragAction.COPY) + self.tree.enable_model_drag_dest(TARGETS2, Gdk.DragAction.DEFAULT) self.tree.connect('drag_begin', self.drag_begin) self.tree.connect('drag_end', self.drag_end) self.tree.connect('drag_drop', self.drag_drop) @@ -6662,7 +6674,7 @@ class RosterWindow: config.AccountCreationWizardWindow() # Open wizard only after roster is created, so we can make it # transient for the roster window - gobject.idle_add(_open_wizard) + GObject.idle_add(_open_wizard) if not gajim.ZEROCONF_ACC_NAME in gajim.config.get_per('accounts'): # Create zeroconf in config file from common.zeroconf import connection_zeroconf @@ -6670,19 +6682,19 @@ class RosterWindow: # Setting CTRL+J to be the shortcut for bringing up the dialog to join a # conference. - accel_group = gtk.accel_groups_from_object(self.window)[0] - accel_group.connect_group(gtk.keysyms.j, gtk.gdk.CONTROL_MASK, - gtk.ACCEL_MASK, self.on_ctrl_j) + accel_group = Gtk.accel_groups_from_object(self.window)[0] + accel_group.connect(Gdk.KEY_j, Gdk.ModifierType.CONTROL_MASK, + Gtk.AccelFlags.MASK, self.on_ctrl_j) # Setting CTRL+N to be the shortcut for show Start chat dialog new_chat_menuitem = self.xml.get_object('new_chat_menuitem') new_chat_menuitem.add_accelerator('activate', accel_group, - gtk.keysyms.n, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + Gdk.KEY_n, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE) # Setting CTRL+S to be the shortcut to change status message - accel_group = gtk.AccelGroup() - keyval, mod = gtk.accelerator_parse('s') - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + accel_group = Gtk.AccelGroup() + keyval, mod = Gtk.accelerator_parse('s') + accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) diff --git a/src/search_window.py b/src/search_window.py index 1b2f3a02b..b40bcf852 100644 --- a/src/search_window.py +++ b/src/search_window.py @@ -19,8 +19,8 @@ ## along with Gajim. If not, see . ## -import gobject -import gtk +from gi.repository import GObject +from gi.repository import Gtk from common import gajim from common import dataforms @@ -52,7 +52,7 @@ class SearchWindow: self.xml.connect_signals(self) self.window.show_all() self.request_form() - self.pulse_id = gobject.timeout_add(80, self.pulse_callback) + self.pulse_id = GObject.timeout_add(80, self.pulse_callback) self.is_form = None @@ -72,12 +72,12 @@ class SearchWindow: return True def on_search_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_search_window_destroy(self, widget): if self.pulse_id: - gobject.source_remove(self.pulse_id) + GObject.source_remove(self.pulse_id) del gajim.interface.instances[self.account]['search'][self.jid] gajim.ged.remove_event_handler('search-form-received', ged.GUI1, self._nec_search_form_received) @@ -104,7 +104,7 @@ class SearchWindow: self.progressbar.show() self.label.set_text(_('Waiting for results')) self.label.show() - self.pulse_id = gobject.timeout_add(80, self.pulse_callback) + self.pulse_id = GObject.timeout_add(80, self.pulse_callback) self.search_button.hide() def on_add_contact_button_clicked(self, widget): @@ -128,7 +128,7 @@ class SearchWindow: def _nec_search_form_received(self, obj): if self.pulse_id: - gobject.source_remove(self.pulse_id) + GObject.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() @@ -151,7 +151,7 @@ class SearchWindow: self.data_form_widget = config.FakeDataForm(obj.data) self.data_form_widget.show_all() - self.search_vbox.pack_start(self.data_form_widget) + self.search_vbox.pack_start(self.data_form_widget, True, True, 0) def on_result_treeview_cursor_changed(self, treeview): if self.jid_column == -1: @@ -168,7 +168,7 @@ class SearchWindow: def _nec_search_result_received(self, obj): if self.pulse_id: - gobject.source_remove(self.pulse_id) + GObject.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() @@ -178,29 +178,29 @@ class SearchWindow: self.label.show() return # We suppose all items have the same fields - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - self.result_treeview = gtk.TreeView() + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + self.result_treeview = Gtk.TreeView() self.result_treeview.connect('cursor-changed', self.on_result_treeview_cursor_changed) sw.add(self.result_treeview) # Create model fieldtypes = [str]*len(obj.data[0]) - model = gtk.ListStore(*fieldtypes) + model = Gtk.ListStore(*fieldtypes) # Copy data to model for item in obj.data: model.append(item.values()) # Create columns counter = 0 for field in obj.data[0].keys(): - self.result_treeview.append_column(gtk.TreeViewColumn(field, - gtk.CellRendererText(), text=counter)) + self.result_treeview.append_column(Gtk.TreeViewColumn(field, + Gtk.CellRendererText(), text=counter)) if field == 'jid': self.jid_column = counter counter += 1 self.result_treeview.set_model(model) sw.show_all() - self.search_vbox.pack_start(sw) + self.search_vbox.pack_start(sw, True, True, 0) if self.jid_column > -1: self.add_contact_button.show() self.information_button.show() @@ -223,7 +223,7 @@ class SearchWindow: self.result_treeview = self.data_form_widget.records_treeview selection = self.result_treeview.get_selection() - selection.set_mode(gtk.SELECTION_SINGLE) + selection.set_mode(Gtk.SelectionMode.SINGLE) self.result_treeview.connect('cursor-changed', self.on_result_treeview_cursor_changed) @@ -233,7 +233,7 @@ class SearchWindow: self.jid_column = counter break counter += 1 - self.search_vbox.pack_start(self.data_form_widget) + self.search_vbox.pack_start(self.data_form_widget, True, True, 0) self.data_form_widget.show() if self.jid_column > -1: self.add_contact_button.show() diff --git a/src/statusicon.py b/src/statusicon.py index 6548843d7..6ce82586f 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -24,8 +24,8 @@ ## import sys -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject import os import dialogs @@ -86,7 +86,7 @@ class StatusIcon: def show_icon(self): if not self.status_icon: - self.status_icon = gtk.StatusIcon() + self.status_icon = Gtk.StatusIcon() self.statusicon_size = '16' self.status_icon.set_property('has-tooltip', True) self.status_icon.connect('activate', self.on_status_icon_left_clicked) @@ -135,11 +135,11 @@ class StatusIcon: Apart from image, we also update tooltip text here """ def really_set_img(): - if image.get_storage_type() == gtk.IMAGE_PIXBUF: + if image.get_storage_type() == Gtk.ImageType.PIXBUF: self.status_icon.set_from_pixbuf(image.get_pixbuf()) # FIXME: oops they forgot to support GIF animation? # or they were lazy to get it to work under Windows! WTF! - elif image.get_storage_type() == gtk.IMAGE_ANIMATION: + elif image.get_storage_type() == Gtk.ImageType.ANIMATION: self.status_icon.set_from_pixbuf( image.get_animation().get_static_image()) # self.status_icon.set_from_animation(image.get_animation()) @@ -150,16 +150,16 @@ class StatusIcon: self.status_icon.set_visible(True) if gajim.events.get_nb_systray_events(): self.status_icon.set_visible(True) - if gajim.config.get('trayicon_blink'): - self.status_icon.set_blinking(True) - else: - image = gtkgui_helpers.load_icon('event') - really_set_img() - return +# if gajim.config.get('trayicon_blink'): +# self.status_icon.set_blinking(True) +# else: + image = gtkgui_helpers.load_icon('event') + really_set_img() + return else: if gajim.config.get('trayicon') == 'on_event': self.status_icon.set_visible(False) - self.status_icon.set_blinking(False) +# self.status_icon.set_blinking(False) image = gajim.interface.jabber_state_images[self.statusicon_size][ self.status] @@ -213,11 +213,11 @@ class StatusIcon: chat_with_menuitem.disconnect(self.new_chat_handler_id) self.new_chat_handler_id = None - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() self.popup_menus.append(sub_menu) status_menuitem.set_submenu(sub_menu) - gc_sub_menu = gtk.Menu() # gc is always a submenu + gc_sub_menu = Gtk.Menu() # gc is always a submenu join_gc_menuitem.set_submenu(gc_sub_menu) # We need our own set of status icons, let's make 'em! @@ -230,15 +230,15 @@ class StatusIcon: for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic = True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem(uf_show) item.set_image(state_images[show]) sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, show) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() sub_menu.append(item) - item = gtk.ImageMenuItem(_('_Change Status Message...')) + item = Gtk.ImageMenuItem(_('_Change Status Message...')) gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate) @@ -249,11 +249,11 @@ class StatusIcon: connected_accounts_with_private_storage = 0 - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic = True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem(uf_show) item.set_image(state_images['offline']) sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, 'offline') @@ -267,14 +267,14 @@ class StatusIcon: accounts_list = sorted(gajim.contacts.get_accounts()) # items that get shown whether an account is zeroconf or not if connected_accounts > 1: # 2 or more connections? make submenus - account_menu_for_chat_with = gtk.Menu() + account_menu_for_chat_with = Gtk.Menu() chat_with_menuitem.set_submenu(account_menu_for_chat_with) self.popup_menus.append(account_menu_for_chat_with) for account in accounts_list: if gajim.account_is_connected(account): # for chat_with - item = gtk.MenuItem(_('using account %s') % account) + item = Gtk.MenuItem(_('using account %s') % account) account_menu_for_chat_with.append(item) item.connect('activate', self.on_new_chat, account) @@ -299,7 +299,7 @@ class StatusIcon: connected_accounts_with_private_storage += 1 # for single message - single_message_menuitem.remove_submenu() + single_message_menuitemset_submenu(None) self.single_message_handler_id = single_message_menuitem.\ connect('activate', self.on_single_message_menuitem_activate, account) @@ -309,7 +309,7 @@ class StatusIcon: break # No other account connected else: # 2 or more 'real' accounts are connected, make submenus - account_menu_for_single_message = gtk.Menu() + account_menu_for_single_message = Gtk.Menu() single_message_menuitem.set_submenu( account_menu_for_single_message) self.popup_menus.append(account_menu_for_single_message) @@ -321,24 +321,25 @@ class StatusIcon: if gajim.connections[account].private_storage_supported: connected_accounts_with_private_storage += 1 # for single message - item = gtk.MenuItem(_('using account %s') % account) + item = Gtk.MenuItem(_('using account %s') % account) item.connect('activate', self.on_single_message_menuitem_activate, account) account_menu_for_single_message.append(item) # join gc - gc_item = gtk.MenuItem(_('using account %s') % account, False) + gc_item = Gtk.MenuItem(_('using account %s') % account, + use_underline=False) gc_sub_menu.append(gc_item) - gc_menuitem_menu = gtk.Menu() + gc_menuitem_menu = Gtk.Menu() gajim.interface.roster.add_bookmarks_list(gc_menuitem_menu, account) gc_item.set_submenu(gc_menuitem_menu) gc_sub_menu.show_all() - newitem = gtk.SeparatorMenuItem() # separator + newitem = Gtk.SeparatorMenuItem() # separator gc_sub_menu.append(newitem) - newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) + newitem = Gtk.ImageMenuItem(_('_Manage Bookmarks...')) + img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, Gtk.IconSize.MENU) newitem.set_image(img) newitem.connect('activate', gajim.interface.roster.on_manage_bookmarks_menuitem_activate) @@ -362,8 +363,8 @@ class StatusIcon: if os.name == 'nt': if self.added_hide_menuitem is False: - self.systray_context_menu.prepend(gtk.SeparatorMenuItem()) - item = gtk.MenuItem(_('Hide this menu')) + self.systray_context_menu.prepend(Gtk.SeparatorMenuItem()) + item = Gtk.MenuItem(_('Hide this menu')) self.systray_context_menu.prepend(item) self.added_hide_menuitem = True @@ -423,7 +424,7 @@ class StatusIcon: gajim.config.get('roster_y-position')) if not gajim.config.get('roster_window_skip_taskbar'): win.set_property('skip-taskbar-hint', False) - win.present_with_time(gtk.get_current_event_time()) + win.present_with_time(Gtk.get_current_event_time()) else: self.handle_first_event() @@ -452,7 +453,7 @@ class StatusIcon: def on_clicked(self, widget, event): self.on_tray_leave_notify_event(widget, None) - if event.type_ != gtk.gdk.BUTTON_PRESS: + if event.type_ != Gdk.EventType.BUTTON_PRESS: return if event.button == 1: # Left click self.on_left_click() diff --git a/src/tooltips.py b/src/tooltips.py index 0acc2abd5..386a6d4bb 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -28,8 +28,9 @@ ## along with Gajim. If not, see . ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject import os import time import locale @@ -78,20 +79,20 @@ class BaseTooltip: implementation: show data as value of a label """ self.create_window() - self.win.add(gtk.Label(data)) + self.win.add(Gtk.Label(label=data)) def create_window(self): """ Create a popup window each time tooltip is requested """ - self.win = gtk.Window(gtk.WINDOW_POPUP) + self.win = Gtk.Window(Gtk.WindowType.POPUP) self.win.set_title('tooltip') self.win.set_border_width(3) self.win.set_resizable(False) self.win.set_name('gtk-tooltips') - self.win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) + self.win.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) - self.win.set_events(gtk.gdk.POINTER_MOTION_MASK) + self.win.set_events(Gdk.EventMask.POINTER_MOTION_MASK) self.win.connect_after('expose_event', self.expose) self.win.connect('size-request', self.on_size_request) self.win.connect('motion-notify-event', self.motion_notify_event) @@ -135,7 +136,7 @@ class BaseTooltip: def expose(self, widget, event): style = self.win.get_style() size = self.win.get_size() - style.paint_shadow(self.win.window, gtk.STATE_NORMAL, gtk.SHADOW_OUT, + style.paint_shadow(self.win.window, Gtk.StateType.NORMAL, Gtk.ShadowType.OUT, None, self.win, 'tooltip', 0, 0, size[0], size[1]) return True @@ -165,7 +166,7 @@ class BaseTooltip: def hide_tooltip(self): if self.timeout > 0: - gobject.source_remove(self.timeout) + GObject.source_remove(self.timeout) self.timeout = 0 if self.win: self.win.destroy() @@ -231,12 +232,12 @@ class StatusTable: self.spacer_label = ' ' def create_table(self): - self.table = gtk.Table(4, 1) + self.table = Gtk.Table(4, 1) self.table.set_property('column-spacing', 2) def add_text_row(self, text, col_inc = 0): self.current_row += 1 - self.text_label = gtk.Label() + self.text_label = Gtk.Label() self.text_label.set_line_wrap(True) self.text_label.set_alignment(0, 0) self.text_label.set_selectable(False) @@ -254,8 +255,8 @@ class StatusTable: status = unicode(status, encoding='utf-8') # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) - str_status = gobject.markup_escape_text(str_status) - status = gobject.markup_escape_text(status) + str_status = GObject.markup_escape_text(str_status) + status = GObject.markup_escape_text(status) str_status += ' - ' + status + '' return str_status @@ -269,29 +270,29 @@ class StatusTable: files = [] files.append(os.path.join(file_path, state_file + '.png')) files.append(os.path.join(file_path, state_file + '.gif')) - image = gtk.Image() + image = Gtk.Image() image.set_from_pixbuf(None) for f in files: if os.path.exists(f): image.set_from_file(f) break - spacer = gtk.Label(self.spacer_label) + spacer = Gtk.Label(label=self.spacer_label) image.set_alignment(1, 0.5) if indent: self.table.attach(spacer, 1, 2, self.current_row, self.current_row + 1, 0, 0, 0, 0) self.table.attach(image, 2, 3, self.current_row, - self.current_row + 1, gtk.FILL, gtk.FILL, 2, 0) - status_label = gtk.Label() + self.current_row + 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 2, 0) + status_label = Gtk.Label() status_label.set_markup(str_status) status_label.set_alignment(0, 0) status_label.set_line_wrap(True) self.table.attach(status_label, 3, 4, self.current_row, - self.current_row + 1, gtk.FILL | gtk.EXPAND, 0, 0, 0) + self.current_row + 1, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 0, 0, 0) if show_lock: - lock_image = gtk.Image() - lock_image.set_from_stock(gtk.STOCK_DIALOG_AUTHENTICATION, - gtk.ICON_SIZE_MENU) + lock_image = Gtk.Image() + lock_image.set_from_stock(Gtk.STOCK_DIALOG_AUTHENTICATION, + Gtk.IconSize.MENU) self.table.attach(lock_image, 4, 5, self.current_row, self.current_row + 1, 0, 0, 0, 0) @@ -316,7 +317,7 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): if isinstance(message, str): message = unicode(message, encoding = 'utf-8') message = helpers.reduce_chars_newlines(message, 100, 1) - message = gobject.markup_escape_text(message) + message = GObject.markup_escape_text(message) if acct['name'] in gajim.con_types and \ gajim.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True @@ -324,11 +325,11 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): show_lock = False if message: self.add_status_row(file_path, acct['show'], - gobject.markup_escape_text(acct['name']) + \ + GObject.markup_escape_text(acct['name']) + \ ' - ' + message, show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], - gobject.markup_escape_text(acct['name']) + GObject.markup_escape_text(acct['name']) , show_lock=show_lock, indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1) @@ -340,7 +341,7 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): accounts = helpers.get_notification_icon_tooltip_dict() self.table.resize(2, 1) self.fill_table_with_accounts(accounts) - self.hbox = gtk.HBox() + self.hbox = Gtk.HBox() self.table.set_property('column-spacing', 1) self.hbox.add(self.table) @@ -353,11 +354,11 @@ class GCTooltip(BaseTooltip): def __init__(self): self.account = None - self.text_label = gtk.Label() + self.text_label = Gtk.Label() self.text_label.set_line_wrap(True) self.text_label.set_alignment(0, 0) self.text_label.set_selectable(False) - self.avatar_image = gtk.Image() + self.avatar_image = Gtk.Image() BaseTooltip.__init__(self) @@ -365,14 +366,14 @@ class GCTooltip(BaseTooltip): if not contact: return self.create_window() - vcard_table = gtk.Table(3, 1) + vcard_table = Gtk.Table(3, 1) vcard_table.set_property('column-spacing', 2) vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] nick_markup = '' + \ - gobject.markup_escape_text(contact.get_shown_name()) \ + GObject.markup_escape_text(contact.get_shown_name()) \ + '' properties.append((nick_markup, None)) @@ -382,7 +383,7 @@ class GCTooltip(BaseTooltip): # escape markup entities status = helpers.reduce_chars_newlines(status, 300, 5) status = '' +\ - gobject.markup_escape_text(status) + '' + GObject.markup_escape_text(status) + '' properties.append((status, None)) show = helpers.get_uf_show(contact.show) @@ -394,7 +395,7 @@ class GCTooltip(BaseTooltip): if hasattr(contact, 'resource') and contact.resource.strip(): properties.append((_('Resource: '), - gobject.markup_escape_text(contact.resource))) + GObject.markup_escape_text(contact.resource))) if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) @@ -419,31 +420,31 @@ class GCTooltip(BaseTooltip): while properties: property_ = properties.pop(0) vcard_current_row += 1 - vertical_fill = gtk.FILL + vertical_fill = Gtk.AttachOptions.FILL if not properties: - vertical_fill |= gtk.EXPAND - label = gtk.Label() + vertical_fill |= Gtk.AttachOptions.EXPAND + label = Gtk.Label() label.set_alignment(0, 0) if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, 2, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) - label = gtk.Label() + vcard_current_row + 1, Gtk.AttachOptions.FILL, vertical_fill, 0, 0) + label = Gtk.Label() label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, - vcard_current_row + 1, gtk.EXPAND | gtk.FILL, + vcard_current_row + 1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, vertical_fill, 0, 0) else: label.set_markup(property_[0]) label.set_line_wrap(True) vcard_table.attach(label, 1, 3, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0) + vcard_current_row + 1, Gtk.AttachOptions.FILL, vertical_fill, 0) self.avatar_image.set_alignment(0, 0) vcard_table.attach(self.avatar_image, 3, 4, 2, vcard_current_row + 1, - gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) + Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 3, 3) gajim.plugin_manager.gui_extension_point('gc_tooltip_populate', self, contact, vcard_table) self.win.add(vcard_table) @@ -455,11 +456,11 @@ class RosterTooltip(NotificationAreaTooltip): def __init__(self): self.account = None - self.image = gtk.Image() + self.image = Gtk.Image() self.image.set_alignment(0, 0) # padding is independent of the total length and better than alignment self.image.set_padding(1, 2) - self.avatar_image = gtk.Image() + self.avatar_image = Gtk.Image() NotificationAreaTooltip.__init__(self) def populate(self, contacts): @@ -491,19 +492,19 @@ class RosterTooltip(NotificationAreaTooltip): table_size = 4 else: self.avatar_image.set_from_pixbuf(None) - vcard_table = gtk.Table(1,table_size) + vcard_table = Gtk.Table(1,table_size) vcard_table.set_property('column-spacing', 2) vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] name_markup = u'' + \ - gobject.markup_escape_text(prim_contact.get_shown_name())\ + GObject.markup_escape_text(prim_contact.get_shown_name())\ + '' if gajim.config.get('mergeaccounts'): name_markup += u" (%s)" % ( gajim.config.get('tooltip_account_name_color'), - gobject.markup_escape_text(prim_contact.account.name)) + GObject.markup_escape_text(prim_contact.account.name)) if self.account and helpers.jid_is_blocked(self.account, prim_contact.jid): @@ -604,7 +605,7 @@ class RosterTooltip(NotificationAreaTooltip): # status is wrapped status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. - status = gobject.markup_escape_text(status) + status = GObject.markup_escape_text(status) properties.append(('%s' % status, None)) properties.append((show, None)) @@ -615,14 +616,14 @@ class RosterTooltip(NotificationAreaTooltip): # contact has only one ressource if num_resources == 1 and contact.resource: properties.append((_('Resource: '), - gobject.markup_escape_text(contact.resource) +\ + GObject.markup_escape_text(contact.resource) +\ ' (' + unicode(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: # ('both' is the normal sub so we don't show it) properties.append(( _('Subscription: '), - gobject.markup_escape_text(helpers.get_uf_sub(prim_contact.sub)))) + GObject.markup_escape_text(helpers.get_uf_sub(prim_contact.sub)))) if prim_contact.keyID: keyID = None @@ -632,7 +633,7 @@ class RosterTooltip(NotificationAreaTooltip): keyID = prim_contact.keyID[8:] if keyID: properties.append((_('OpenPGP: '), - gobject.markup_escape_text(keyID))) + GObject.markup_escape_text(keyID))) if contact.last_activity_time: last_active = datetime(*contact.last_activity_time[:6]) @@ -660,21 +661,21 @@ class RosterTooltip(NotificationAreaTooltip): while properties: property_ = properties.pop(0) vcard_current_row += 1 - vertical_fill = gtk.FILL + vertical_fill = Gtk.AttachOptions.FILL if not properties and table_size == 4: - vertical_fill |= gtk.EXPAND - label = gtk.Label() + vertical_fill |= Gtk.AttachOptions.EXPAND + label = Gtk.Label() label.set_alignment(0, 0) if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, 2, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) - label = gtk.Label() + vcard_current_row + 1, Gtk.AttachOptions.FILL, vertical_fill, 0, 0) + label = Gtk.Label() label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, - vcard_current_row + 1, gtk.EXPAND | gtk.FILL, + vcard_current_row + 1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, vertical_fill, 0, 0) else: if isinstance(property_[0], (unicode, str)): # FIXME: rm unicode? @@ -683,11 +684,11 @@ class RosterTooltip(NotificationAreaTooltip): else: label = property_[0] vcard_table.attach(label, 1, 3, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0) + vcard_current_row + 1, Gtk.AttachOptions.FILL, vertical_fill, 0) self.avatar_image.set_alignment(0, 0) if table_size == 4: vcard_table.attach(self.avatar_image, 3, 4, 2, - vcard_current_row + 1, gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) + vcard_current_row + 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 3, 3) gajim.plugin_manager.gui_extension_point('roster_tooltip_populate', self, contacts, vcard_table) @@ -733,7 +734,7 @@ class FileTransfersTooltip(BaseTooltip): BaseTooltip.__init__(self) def populate(self, file_props): - ft_table = gtk.Table(2, 1) + ft_table = Gtk.Table(2, 1) ft_table.set_property('column-spacing', 2) current_row = 1 self.create_window() @@ -744,7 +745,7 @@ class FileTransfersTooltip(BaseTooltip): else: file_name = file_props.name properties.append((_('Name: '), - gobject.markup_escape_text(file_name))) + GObject.markup_escape_text(file_name))) if file_props.type_ == 'r': type_ = _('Download') actor = _('Sender: ') @@ -760,7 +761,7 @@ class FileTransfersTooltip(BaseTooltip): else: name = receiver.split('/')[0] properties.append((_('Type: '), type_)) - properties.append((actor, gobject.markup_escape_text(name))) + properties.append((actor, GObject.markup_escape_text(name))) transfered_len = file_props.received_len if not transfered_len: @@ -788,22 +789,22 @@ class FileTransfersTooltip(BaseTooltip): status = _('Not started') properties.append((_('Status: '), status)) file_desc = file_props.desc - properties.append((_('Description: '), gobject.markup_escape_text( + properties.append((_('Description: '), GObject.markup_escape_text( file_desc))) while properties: property_ = properties.pop(0) current_row += 1 - label = gtk.Label() + label = Gtk.Label() label.set_alignment(0, 0) label.set_markup(property_[0]) ft_table.attach(label, 1, 2, current_row, current_row + 1, - gtk.FILL, gtk.FILL, 0, 0) - label = gtk.Label() + Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) + label = Gtk.Label() label.set_alignment(0, 0) label.set_line_wrap(True) label.set_markup(property_[1]) ft_table.attach(label, 2, 3, current_row, current_row + 1, - gtk.EXPAND | gtk.FILL, gtk.FILL, 0, 0) + Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) self.win.add(ft_table) @@ -814,7 +815,7 @@ class ServiceDiscoveryTooltip(BaseTooltip): """ def populate(self, status): self.create_window() - label = gtk.Label() + label = Gtk.Label() label.set_line_wrap(True) label.set_alignment(0, 0) label.set_selectable(False) diff --git a/src/vcard.py b/src/vcard.py index f406e66dd..9d9dabe7b 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -31,8 +31,8 @@ # THIS FILE IS FOR **OTHERS'** PROFILE (when we VIEW their INFO) -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject import base64 import time import locale @@ -123,7 +123,7 @@ class VcardWindow: self.vcard_arrived = False self.os_info_arrived = False self.entity_time_arrived = False - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GObject.timeout_add(100, self.update_progressbar) gajim.ged.register_event_handler('version-result-received', ged.GUI1, @@ -151,11 +151,11 @@ class VcardWindow: def on_vcard_information_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) del gajim.interface.instances[self.account]['infos'][self.contact.jid] buffer_ = self.xml.get_object('textview_annotation').get_buffer() annotation = buffer_.get_text(buffer_.get_start_iter(), - buffer_.get_end_iter()) + buffer_.get_end_iter(), True) connection = gajim.connections[self.account] if annotation != connection.annotations.get(self.contact.jid, ''): connection.annotations[self.contact.jid] = annotation @@ -170,19 +170,19 @@ class VcardWindow: self._nec_vcard_received) def on_vcard_information_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_information_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('close_button').grab_focus) + GObject.idle_add(self.xml.get_object('close_button').grab_focus) def on_PHOTO_eventbox_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3: # right click - menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menu = Gtk.Menu() + menuitem = Gtk.ImageMenuItem(Gtk.STOCK_SAVE_AS) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.jid, self.contact.get_shown_name()) @@ -195,7 +195,7 @@ class VcardWindow: def set_value(self, entry_name, value): try: if value and entry_name == 'URL_label': - widget = gtk.LinkButton(value, value) + widget = Gtk.LinkButton(value, value) widget.set_alignment(0, 0) widget.show() table = self.xml.get_object('personal_info_table') @@ -220,7 +220,7 @@ class VcardWindow: self.xml.get_object('user_avatar_label').show() if not pixbuf: image.set_from_icon_name('stock_person', - gtk.ICON_SIZE_DIALOG) + Gtk.IconSize.DIALOG) continue pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') image.set_from_pixbuf(pixbuf) @@ -259,7 +259,7 @@ class VcardWindow: def test_remove_progressbar(self): if self.update_progressbar_timeout_id is not None and \ self.vcard_arrived and self.os_info_arrived and self.entity_time_arrived: - gobject.source_remove(self.update_progressbar_timeout_id) + GObject.source_remove(self.update_progressbar_timeout_id) self.progressbar.hide() self.update_progressbar_timeout_id = None @@ -432,10 +432,10 @@ class VcardWindow: else: # Request os info if contact is connected if self.gc_contact: j, r = gajim.get_room_and_nick_from_fjid(self.real_jid) - gobject.idle_add(gajim.connections[self.account].request_os_info, + GObject.idle_add(gajim.connections[self.account].request_os_info, j, r, self.contact.jid) else: - gobject.idle_add(gajim.connections[self.account].request_os_info, + GObject.idle_add(gajim.connections[self.account].request_os_info, self.contact.jid, self.contact.resource) # do not wait for entity_time if contact is not connected or has error @@ -446,10 +446,10 @@ class VcardWindow: else: # Request entity time if contact is connected if self.gc_contact: j, r = gajim.get_room_and_nick_from_fjid(self.real_jid) - gobject.idle_add(gajim.connections[self.account].\ + GObject.idle_add(gajim.connections[self.account].\ request_entity_time, j, r, self.contact.jid) else: - gobject.idle_add(gajim.connections[self.account].\ + GObject.idle_add(gajim.connections[self.account].\ request_entity_time, self.contact.jid, self.contact.resource) self.os_info = {0: {'resource': self.real_resource, 'client': '', @@ -465,10 +465,10 @@ class VcardWindow: uf_resources += '\n' + c.resource + \ _(' resource with priority ') + unicode(c.priority) if c.show not in ('offline', 'error'): - gobject.idle_add( + GObject.idle_add( gajim.connections[self.account].request_os_info, c.jid, c.resource) - gobject.idle_add(gajim.connections[self.account].\ + GObject.idle_add(gajim.connections[self.account].\ request_entity_time, c.jid, c.resource) self.os_info[i] = {'resource': c.resource, 'client': '', 'os': ''} @@ -516,7 +516,7 @@ class ZeroconfVcardWindow: del gajim.interface.instances[self.account]['infos'][self.contact.jid] def on_zeroconf_information_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_PHOTO_eventbox_button_press_event(self, widget, event): @@ -524,8 +524,8 @@ class ZeroconfVcardWindow: If right-clicked, show popup """ if event.button == 3: # right click - menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menu = Gtk.Menu() + menuitem = Gtk.ImageMenuItem(Gtk.STOCK_SAVE_AS) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.jid, self.contact.get_shown_name()) @@ -538,7 +538,7 @@ class ZeroconfVcardWindow: def set_value(self, entry_name, value): try: if value and entry_name == 'URL_label': - widget = gtk.LinkButton(value, value) + widget = Gtk.LinkButton(value, value) widget.set_alignment(0, 0) table = self.xml.get_object('personal_info_table') table.attach(widget, 1, 4, 3, 4, yoptions = 0) From da75bf846b6d3683fd4c6d9bf76952029c4bacd8 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 23 Dec 2012 17:48:11 +0100 Subject: [PATCH 002/592] correctly handle SSL errors. Fixes #7252 --- src/common/connection.py | 48 ++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index d3ec7d6c7..4557596a6 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -1308,34 +1308,40 @@ class Connection(CommonConnection, ConnectionHandlers): try: errnum = con.Connection.ssl_errnum except AttributeError: - errnum = -1 # we don't have an errnum - if errnum > 0 and str(errnum) not in gajim.config.get_per('accounts', - self.name, 'ignore_ssl_errors').split(): - text = _('The authenticity of the %s certificate could be invalid.' - ) % hostname - if errnum in ssl_error: - text += _('\nSSL Error: %s') % ssl_error[errnum] - else: - text += _('\nUnknown SSL error: %d') % errnum - gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, - error_text=text, error_num=errnum, - cert=con.Connection.ssl_cert_pem, - fingerprint=con.Connection.ssl_fingerprint_sha1, - certificate=con.Connection.ssl_certificate)) - return True + errnum = [] # we don't have an errnum + i = 0 + for er in errnum: + if er > 0 and str(er) not in gajim.config.get_per('accounts', + self.name, 'ignore_ssl_errors').split(): + text = _('The authenticity of the %s certificate could be ' + 'invalid.') % hostname + if er in ssl_error: + text += _('\nSSL Error: %s') % ssl_error[er] + else: + text += _('\nUnknown SSL error: %d') % er + gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, + error_text=text, error_num=er, + cert=con.Connection.ssl_cert_pem[i], + fingerprint=con.Connection.ssl_fingerprint_sha1[i], + certificate=con.Connection.ssl_certificate[i])) + return True + i += 1 if hasattr(con.Connection, 'ssl_fingerprint_sha1'): saved_fingerprint = gajim.config.get_per('accounts', self.name, 'ssl_fingerprint_sha1') if saved_fingerprint: # Check sha1 fingerprint - if con.Connection.ssl_fingerprint_sha1 != saved_fingerprint: + if con.Connection.ssl_fingerprint_sha1[-1] != saved_fingerprint: gajim.nec.push_incoming_event(FingerprintErrorEvent(None, - conn=self, certificate=con.Connection.ssl_certificate, - new_fingerprint=con.Connection.ssl_fingerprint_sha1)) + conn=self, + certificate=con.Connection.ssl_certificate, + new_fingerprint=con.Connection.ssl_fingerprint_sha1[ + -1])) return True else: gajim.config.set_per('accounts', self.name, - 'ssl_fingerprint_sha1', con.Connection.ssl_fingerprint_sha1) + 'ssl_fingerprint_sha1', + con.Connection.ssl_fingerprint_sha1[-1]) if not check_X509.check_certificate(con.Connection.ssl_certificate, hostname) and '100' not in gajim.config.get_per('accounts', self.name, 'ignore_ssl_errors').split(): @@ -1344,8 +1350,8 @@ class Connection(CommonConnection, ConnectionHandlers): hostname gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, error_text=txt, error_num=100, - cert=con.Connection.ssl_cert_pem, - fingerprint=con.Connection.ssl_fingerprint_sha1, + cert=con.Connection.ssl_cert_pem[-1], + fingerprint=con.Connection.ssl_fingerprint_sha1[-1], certificate=con.Connection.ssl_certificate)) return True From 71aa8d195009a9269fba2722e8c1b44e7e382649 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 25 Dec 2012 18:18:39 +0100 Subject: [PATCH 003/592] correctly get SSL certificate from nbxmpp. Fixes #7283 --- src/common/connection.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index 4557596a6..3636c55cc 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -1334,7 +1334,7 @@ class Connection(CommonConnection, ConnectionHandlers): if con.Connection.ssl_fingerprint_sha1[-1] != saved_fingerprint: gajim.nec.push_incoming_event(FingerprintErrorEvent(None, conn=self, - certificate=con.Connection.ssl_certificate, + certificate=con.Connection.ssl_certificate[-1], new_fingerprint=con.Connection.ssl_fingerprint_sha1[ -1])) return True @@ -1342,8 +1342,8 @@ class Connection(CommonConnection, ConnectionHandlers): gajim.config.set_per('accounts', self.name, 'ssl_fingerprint_sha1', con.Connection.ssl_fingerprint_sha1[-1]) - if not check_X509.check_certificate(con.Connection.ssl_certificate, - hostname) and '100' not in gajim.config.get_per('accounts', + if not check_X509.check_certificate(con.Connection.ssl_certificate[ + -1], hostname) and '100' not in gajim.config.get_per('accounts', self.name, 'ignore_ssl_errors').split(): txt = _('The authenticity of the %s certificate could be ' 'invalid.\nThe certificate does not cover this domain.') % \ @@ -1352,7 +1352,7 @@ class Connection(CommonConnection, ConnectionHandlers): error_text=txt, error_num=100, cert=con.Connection.ssl_cert_pem[-1], fingerprint=con.Connection.ssl_fingerprint_sha1[-1], - certificate=con.Connection.ssl_certificate)) + certificate=con.Connection.ssl_certificate[-1])) return True self._register_handlers(con, con_type) From 4554b85922f79caf848610617051e70e2e8dbecd Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 25 Dec 2012 18:56:05 +0100 Subject: [PATCH 004/592] fix config names. Fixes #7276 --- src/common/connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index 3636c55cc..6924f0eb2 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -2384,7 +2384,7 @@ class Connection(CommonConnection, ConnectionHandlers): if not change_nick: t = p.setTag(nbxmpp.NS_MUC + ' x') tags = {} - timeout = gajim.config.get_per('room', room_jid, + timeout = gajim.config.get_per('rooms', room_jid, 'muc_restore_timeout') if timeout is None or timeout == -2: timeout = gajim.config.get('muc_restore_timeout') @@ -2398,7 +2398,7 @@ class Connection(CommonConnection, ConnectionHandlers): last_date = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime( last_date)) tags['since'] = last_date - nb = gajim.config.get_per('room', room_jid, 'muc_restore_lines') + nb = gajim.config.get_per('rooms', room_jid, 'muc_restore_lines') if nb is None or nb == -2: nb = gajim.config.get('muc_restore_lines') if nb >= 0: From 11f661a3ed22708ae3845e23f6e69d9f90ce5da6 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 26 Dec 2012 11:19:36 +0100 Subject: [PATCH 005/592] fix some GTK calls --- src/dialogs.py | 2 +- src/roster_window.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index d1213df14..242f47363 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -235,7 +235,7 @@ class PassphraseDialog: cancelbutton.connect('clicked', self.on_cancelbutton_clicked) self.xml.connect_signals(self) - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.window.show_all() self.check = bool(checkbuttontext) diff --git a/src/roster_window.py b/src/roster_window.py index 8e6565472..865552ec3 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2279,7 +2279,7 @@ class RosterWindow: else: # No need to redraw contacts if we're quitting if child_iterA: - self.model[child_iterA][C_AVATAR_PIXBUF] = None + self.model[child_iterA][C_AVATAR_PIXBUF] = '' if account in gajim.con_types: gajim.con_types[account] = None for jid in gajim.contacts.get_jid_list(account): @@ -2343,10 +2343,12 @@ class RosterWindow: table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2, 'xa':3, 'dnd':4, 'invisible':5} + liststore = self.status_combobox.get_model() # we check if there are more options in the combobox that it should # if yes, we remove the first ones - while len(self.status_combobox.get_model()) > len(table)+2: - self.status_combobox.remove_text(0) + while len(liststore) > len(table)+2: + titer = liststore.get_iter_first() + liststore.remove(titer) show = helpers.get_global_show() # temporarily block signal in order not to send status that we show @@ -2356,7 +2358,6 @@ class RosterWindow: self.status_combobox.set_active(table[show]) else: uf_show = helpers.get_uf_show(show) - liststore = self.status_combobox.get_model() liststore.prepend(['SEPARATOR', None, '', True]) status_combobox_text = uf_show + ' (' + _("desync'ed") +')' liststore.prepend([status_combobox_text, From ad2f2eada65e941b27248936bbc8f33563a049e8 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 26 Dec 2012 11:19:59 +0100 Subject: [PATCH 006/592] une GnomeKeyring vi gobject introspections --- src/common/exceptions.py | 12 ++++ src/common/passwords.py | 125 ++++++++++++++++++++++----------------- 2 files changed, 83 insertions(+), 54 deletions(-) diff --git a/src/common/exceptions.py b/src/common/exceptions.py index 3bc6b3643..862d7bc24 100644 --- a/src/common/exceptions.py +++ b/src/common/exceptions.py @@ -143,3 +143,15 @@ class PluginsystemError(Exception): def __str__(self): return self.text + +class GnomeKeyringError(Exception): + """ + Error with Gnome Keyring + """ + + def __init__(self, error): + Exception.__init__(self) + self.error = error + + def __str__(self): + return str(self.error) diff --git a/src/common/passwords.py b/src/common/passwords.py index f65222c85..5a5cbd5f8 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -29,11 +29,12 @@ __all__ = ['get_password', 'save_password'] import warnings from common import gajim from common import kwalletbinding +from common.exceptions import GnomeKeyringError USER_HAS_GNOMEKEYRING = False USER_USES_GNOMEKEYRING = False USER_HAS_KWALLETCLI = False -gnomekeyring = None +GnomeKeyring = None class PasswordStorage(object): def get_password(self, account_name): @@ -61,13 +62,15 @@ class SimplePasswordStorage(PasswordStorage): class GnomePasswordStorage(PasswordStorage): def __init__(self): - self.keyring = gnomekeyring.get_default_keyring_sync() + (err, self.keyring) = GnomeKeyring.get_default_keyring_sync() + if err != GnomeKeyring.Result.OK: + raise GnomeKeyringError(err) if self.keyring is None: self.keyring = 'login' - try: - gnomekeyring.create_sync(self.keyring, None) - except gnomekeyring.AlreadyExistsError: - pass + err = GnomeKeyring.create_sync(self.keyring, None) + if err not in (GnomeKeyring.Result.OK, + GnomeKeyring.Result.KEYRING_ALREADY_EXISTS): + raise GnomeKeyringError(err) def get_password(self, account_name): conf = gajim.config.get_per('accounts', account_name, 'password') @@ -78,62 +81,75 @@ class GnomePasswordStorage(PasswordStorage): ## migrate the password over to keyring try: self.save_password(account_name, password, update=False) - except gnomekeyring.NoKeyringDaemonError: - ## no keyring daemon: in the future, stop using it - set_storage(SimplePasswordStorage()) + except GnomeKeyringError, e: + if e.error == GnomeKeyring.Result.NO_KEYRING_DAEMON: + ## no keyring daemon: in the future, stop using it + set_storage(SimplePasswordStorage()) return password - try: - server = gajim.config.get_per('accounts', account_name, 'hostname') - user = gajim.config.get_per('accounts', account_name, 'name') - attributes1 = dict(server=str(server), user=str(user), protocol='xmpp') - attributes2 = dict(account_name=str(account_name), gajim=1) - try: - items = gnomekeyring.find_items_sync( - gnomekeyring.ITEM_NETWORK_PASSWORD, attributes1) - except gnomekeyring.Error: - try: - items = gnomekeyring.find_items_sync( - gnomekeyring.ITEM_GENERIC_SECRET, attributes2) - if items: - # We found an old item, move it to new way of storing - password = items[0].secret - self.save_password(account_name, password) - gnomekeyring.item_delete_sync(items[0].keyring, - int(items[0].item_id)) - except gnomekeyring.Error: - items = [] - if len(items) > 1: - warnings.warn("multiple gnome keyring items found for account %s;" - " trying to use the first one..." - % account_name) - if items: - return items[0].secret + server = gajim.config.get_per('accounts', account_name, 'hostname') + user = gajim.config.get_per('accounts', account_name, 'name') + attributes1 = GnomeKeyring.attribute_list_new() + GnomeKeyring.attribute_list_append_string(attributes1, 'server', + str(server)) + GnomeKeyring.attribute_list_append_string(attributes1, 'user', + str(user)) + GnomeKeyring.attribute_list_append_string(attributes1, 'protocol', + 'xmpp') + attributes2 = GnomeKeyring.attribute_list_new() + GnomeKeyring.attribute_list_append_string(attributes2, 'account_name', + str(account_name)) + GnomeKeyring.attribute_list_append_string(attributes2, 'gajim', + '1') + (err, items) = GnomeKeyring.find_items_sync( + GnomeKeyring.ItemType.NETWORK_PASSWORD, attributes1) + if err != GnomeKeyring.Result.OK: + (err, items) = GnomeKeyring.find_items_sync( + GnomeKeyring.ItemType.GENERIC_SECRET, attributes2) + if err == GnomeKeyring.Result.OK and len(items) > 0: + password = items[0].secret + self.save_password(account_name, password) + for item in items: + GnomeKeyring.item_delete_sync(item.keyring, + int(item.item_id)) else: - return None - except gnomekeyring.DeniedError: + items = [] + if len(items) > 1: + warnings.warn("multiple gnome keyring items found for account %s;" + " trying to use the first one..." % account_name) + if items: + return items[0].secret + else: return None - except gnomekeyring.NoKeyringDaemonError: + if err == GnomeKeyring.Result.NO_KEYRING_DAEMON: ## no keyring daemon: in the future, stop using it set_storage(SimplePasswordStorage()) - return None + return None def save_password(self, account_name, password, update=True): server = gajim.config.get_per('accounts', account_name, 'hostname') user = gajim.config.get_per('accounts', account_name, 'name') display_name = _('XMPP account %s@%s') % (user, server) - attributes1 = dict(server=str(server), user=str(user), protocol='xmpp') + attributes1 = GnomeKeyring.attribute_list_new() + GnomeKeyring.attribute_list_append_string(attributes1, 'server', + str(server)) + GnomeKeyring.attribute_list_append_string(attributes1, 'user', + str(user)) + GnomeKeyring.attribute_list_append_string(attributes1, 'protocol', + 'xmpp') if password is None: password = str() - try: - auth_token = gnomekeyring.item_create_sync( - self.keyring, gnomekeyring.ITEM_NETWORK_PASSWORD, - display_name, attributes1, password, update) - except gnomekeyring.DeniedError: - set_storage(SimplePasswordStorage()) - storage.save_password(account_name, password) - return + (err, auth_token) = GnomeKeyring.item_create_sync(self.keyring, + GnomeKeyring.ItemType.NETWORK_PASSWORD, display_name, attributes1, + password, update) + if err != GnomeKeyring.Result.OK: + if err == GnomeKeyring.Result.DENIED: + set_storage(SimplePasswordStorage()) + storage.save_password(account_name, password) + return + else: + raise GnomeKeyringError(err) gajim.config.set_per('accounts', account_name, 'password', - 'gnomekeyring:') + 'gnomekeyring:') if account_name in gajim.connections: gajim.connections[account_name].password = password @@ -181,24 +197,25 @@ def get_storage(): global storage if storage is None: # None is only in first time get_storage is called if gajim.config.get('use_gnomekeyring'): - global gnomekeyring + global GnomeKeyring try: - gnomekeyring = __import__('gnomekeyring') + gir = __import__('gi.repository', globals(), locals(), + ['GnomeKeyring'], -1) + GnomeKeyring = gir.GnomeKeyring except ImportError: pass else: global USER_HAS_GNOMEKEYRING global USER_USES_GNOMEKEYRING USER_HAS_GNOMEKEYRING = True - if gnomekeyring.is_available(): + if GnomeKeyring.is_available(): USER_USES_GNOMEKEYRING = True else: USER_USES_GNOMEKEYRING = False if USER_USES_GNOMEKEYRING: try: storage = GnomePasswordStorage() - except (gnomekeyring.NoKeyringDaemonError, gnomekeyring.DeniedError, - gnomekeyring.CancelledError): + except GnomeKeyringError: storage = None if storage is None: if gajim.config.get('use_kwalletcli'): From b81863527f49d7fb9dab587325a6c090caf45a73 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 26 Dec 2012 23:08:26 +0100 Subject: [PATCH 007/592] use gobject introspection to access gconf --- src/command_system/tools.py | 13 ++++++------- src/gtkgui_helpers.py | 9 ++++----- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/command_system/tools.py b/src/command_system/tools.py index 775744073..901ff3e75 100644 --- a/src/command_system/tools.py +++ b/src/command_system/tools.py @@ -25,7 +25,6 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from types import * -#from glib import GError def remove(sequence, target): if isinstance(sequence, ListType): @@ -36,9 +35,9 @@ def remove(sequence, target): del sequence[target] def gconf(path): -# try: -# from gconf import client_get_default -# client = client_get_default() -# return client.get_string(path) -# except ImportError, GError: - pass \ No newline at end of file + try: + from gi.repository import GConf + client = GConf.Client.get_default() + return client.get_string(path) + except ImportError: + pass diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 7e4c96e26..28de9421b 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -31,7 +31,6 @@ import xml.sax.saxutils from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf -import glib from gi.repository import GObject from gi.repository import Pango import os @@ -175,11 +174,11 @@ def get_default_font(): Xfce and last KDE it returns None on failure or else a string 'Font Size' """ try: - from gconf import client_get_default - client = client_get_default() + from gi.repository import GConf + client = GConf.Client.get_default() value = client.get_string("/desktop/gnome/interface/font_name") return value.decode("utf8") - except ImportError, glib.GError: + except ImportError: pass # try to get Xfce default font @@ -833,7 +832,7 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): # Save image try: pixbuf.save(file_path, image_format) - except glib.GError, e: + except Exception, e: log.debug('Error saving avatar: %s' % str(e)) if os.path.exists(file_path): os.remove(file_path) From 7ebde173bc655cb6cffe8d72324404316b731c86 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 26 Dec 2012 23:39:22 +0100 Subject: [PATCH 008/592] use gobject introspection to access gupnp-igd --- src/common/gajim.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/common/gajim.py b/src/common/gajim.py index f6c129bc6..120e09018 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -191,9 +191,8 @@ except ImportError: HAVE_UPNP_IGD = True try: - raise ImportError - import gupnp.igd - gupnp_igd = gupnp.igd.Simple() + from gi.repository import GUPnPIgd + gupnp_igd = GUPnPIgd.SimpleIgd() except ImportError: HAVE_UPNP_IGD = False From caf56d7ad9f1912e006e21afdfaa418211bd3d90 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 26 Dec 2012 23:55:53 +0100 Subject: [PATCH 009/592] remove session mnagement broken support --- src/features_window.py | 15 +-------------- src/gajim.py | 26 -------------------------- 2 files changed, 1 insertion(+), 40 deletions(-) diff --git a/src/features_window.py b/src/features_window.py index b222d4ab6..80ccb774a 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -67,10 +67,6 @@ class FeaturesWindow: _('Autodetection of network status.'), _('Requires gnome-network-manager and python-dbus.'), _('Feature not available under Windows.')), - _('Session Management'): (self.session_management_available, - _('Gajim session is stored on logout and restored on login.'), - _('Requires python-gnome2.'), - _('Feature not available under Windows.')), _('Password encryption'): (self.some_keyring_available, _('Passwords can be stored securely and not just in plaintext.'), _('Requires gnome-keyring and python-gnome2-desktop, or kwalletcli.'), @@ -192,22 +188,13 @@ class FeaturesWindow: import network_manager_listener return network_manager_listener.supported - def session_management_available(self): - if os.name == 'nt': - return False - try: - __import__('gnome.ui') - except Exception: - return False - return True - def some_keyring_available(self): if os.name == 'nt': return False if kwalletbinding.kwallet_available(): return True try: - __import__('gnomekeyring') + from gi.repository import GnomeKeyring except Exception: return False return True diff --git a/src/gajim.py b/src/gajim.py index 43b5e6539..825a96e5f 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -449,32 +449,6 @@ if __name__ == '__main__': log.info("Encodings: d:%s, fs:%s, p:%s", sys.getdefaultencoding(), \ sys.getfilesystemencoding(), locale.getpreferredencoding()) - #if os.name != 'nt': - ## Session Management support - #try: - #import gnome.ui - #raise ImportError - #except ImportError: - #pass - #else: - #def die_cb(dummy): - #gajim.interface.roster.quit_gtkgui_interface() - #gnome.program_init('gajim', gajim.version) - #cli = gnome.ui.master_client() - #cli.connect('die', die_cb) - - #path_to_gajim_script = gtkgui_helpers.get_abspath_for_script( - #'gajim') - - #if path_to_gajim_script: - #argv = [path_to_gajim_script] - #try: - #cli.set_restart_command(argv) - #except TypeError: - ## Fedora systems have a broken gnome-python wrapper for this - ## function. - #cli.set_restart_command(len(argv), argv) - check_paths.check_and_possibly_create_paths() interface = Interface() From af4bf3210382cbf2263bdb31fbc0fe9d1c9fdbbf Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 27 Dec 2012 00:02:51 +0100 Subject: [PATCH 010/592] gtkspell is now ok --- src/gtkspell.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gtkspell.py b/src/gtkspell.py index aa1adaec7..ad578a94a 100644 --- a/src/gtkspell.py +++ b/src/gtkspell.py @@ -19,7 +19,7 @@ import ctypes import ctypes.util -import gtk +from gi.repository import Gtk gboolean = ctypes.c_int @@ -63,8 +63,8 @@ def ensure_attached(func): class Spell(object): def __init__(self, textview, language=None, create=True): - if not isinstance(textview, gtk.TextView): - raise TypeError("Textview must be derived from gtk.TextView") + if not isinstance(textview, Gtk.TextView): + raise TypeError("Textview must be derived from Gtk.TextView") tv = PyGObject.from_address(id(textview)).obj spell = libgtkspell.gtkspell_get_from_text_view(tv) if create: From d033e9f60038a18e29704ee1770fbab80b3692b9 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 27 Dec 2012 00:11:48 +0100 Subject: [PATCH 011/592] prevent traceback --- src/config.py | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/src/config.py b/src/config.py index 0a6178ccd..002221fe5 100644 --- a/src/config.py +++ b/src/config.py @@ -1215,7 +1215,10 @@ class PreferencesWindow: model.set_value(iter_, 0, new_text) def on_msg_treeview_cursor_changed(self, widget, data = None): - (model, iter_) = self.msg_tree.get_selection().get_selected() + sel = self.msg_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return self.xml.get_object('delete_msg_button').set_sensitive(True) @@ -1230,7 +1233,10 @@ class PreferencesWindow: self.msg_tree.set_cursor(model.get_path(iter_)) def on_delete_msg_button_clicked(self, widget, data = None): - (model, iter_) = self.msg_tree.get_selection().get_selected() + sel = self.msg_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return buf = self.xml.get_object('msg_textview').get_buffer() @@ -1239,7 +1245,10 @@ class PreferencesWindow: self.xml.get_object('delete_msg_button').set_sensitive(False) def on_msg_textview_changed(self, widget, data = None): - (model, iter_) = self.msg_tree.get_selection().get_selected() + sel = self.msg_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return buf = self.xml.get_object('msg_textview').get_buffer() @@ -1357,7 +1366,10 @@ class ManageProxiesWindow: self.proxies_treeview.set_cursor(model.get_path(iter_)) def on_remove_proxy_button_clicked(self, widget): - (model, iter_) = self.proxies_treeview.get_selection().get_selected() + sel = self.proxies_treeview.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return proxy = model[iter_][0].decode('utf-8') @@ -1412,7 +1424,11 @@ class ManageProxiesWindow: #useauth_checkbutton.set_active(False) #self.on_useauth_checkbutton_toggled(useauth_checkbutton) - (model, iter_) = widget.get_selection().get_selected() + sel = widget.get_selection() + if sel: + (model, iter_) = sel.get_selected() + else: + iter_ = None if not iter_: self.xml.get_object('proxyname_entry').set_text('') self.xml.get_object('proxytype_combobox').set_sensitive(False) @@ -1463,7 +1479,10 @@ class ManageProxiesWindow: def on_proxyname_entry_changed(self, widget): if self.block_signal: return - (model, iter_) = self.proxies_treeview.get_selection().get_selected() + sel = self.proxies_treeview.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return old_name = model.get_value(iter_, 0).decode('utf-8') @@ -4182,8 +4201,12 @@ class ManageSoundsWindow: model.append((enabled, sound_ui_name, path, sound_event_config_name)) def on_treeview_sounds_cursor_changed(self, widget, data = None): - (model, iter_) = self.sound_tree.get_selection().get_selected() sounds_entry = self.xml.get_object('sounds_entry') + sel = self.sound_tree.get_selection() + if not sel: + sounds_entry.set_text('') + return + (model, iter_) = sel.get_selected() if not iter_: sounds_entry.set_text('') return @@ -4191,7 +4214,10 @@ class ManageSoundsWindow: sounds_entry.set_text(path_to_snd_file) def on_browse_for_sounds_button_clicked(self, widget, data = None): - (model, iter_) = self.sound_tree.get_selection().get_selected() + sel = self.sound_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return def on_ok(widget, path_to_snd_file): @@ -4223,7 +4249,10 @@ class ManageSoundsWindow: model[iter_][2] = path_to_snd_file # set new path to sounds_model def on_play_button_clicked(self, widget): - model, iter_ = self.sound_tree.get_selection().get_selected() + sel = self.sound_tree.get_selection() + if not sel: + return + model, iter_ = sel.get_selected() if not iter_: return snd_event_config_name = model[iter_][3] From a8d946bc96e052f682dcddde6e6606bea9b96484 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 27 Dec 2012 21:58:52 +0100 Subject: [PATCH 012/592] more GTK3 fixes --- data/gui/add_new_contact_window.ui | 103 +++++++--- data/gui/dubbleinput_dialog.ui | 114 ++++++----- data/gui/esession_info_window.ui | 142 +++++++------ data/gui/input_dialog.ui | 115 ++++++----- data/gui/input_text_dialog.ui | 150 ++++++++------ data/gui/roster_window.ui | 313 ++++++++++++++++++----------- src/chat_control.py | 12 +- src/conversation_textview.py | 6 +- src/dialogs.py | 8 +- src/disco.py | 2 +- src/filetransfers_window.py | 4 +- src/groupchat_control.py | 6 +- src/gtkgui_helpers.py | 21 +- src/history_manager.py | 2 +- src/htmltextview.py | 2 +- src/message_window.py | 8 +- src/profile_window.py | 2 +- src/roster_window.py | 20 +- src/statusicon.py | 3 +- src/tooltips.py | 16 +- src/vcard.py | 4 +- 21 files changed, 627 insertions(+), 426 deletions(-) diff --git a/data/gui/add_new_contact_window.ui b/data/gui/add_new_contact_window.ui index e9f713f1e..cee67a0bb 100644 --- a/data/gui/add_new_contact_window.ui +++ b/data/gui/add_new_contact_window.ui @@ -1,22 +1,23 @@ - + - - + + False 6 Add New Contact False dialog - - + + True - vertical + False 6 True + False False @@ -27,10 +28,12 @@ True + False 6 True + False 0 A_ccount: True @@ -44,8 +47,9 @@ True + False liststore3 - + @@ -64,16 +68,20 @@ + True + True 1 True + False 6 True + False 0 _Protocol: True @@ -88,7 +96,8 @@ True - + False + False @@ -99,9 +108,10 @@ True + False True liststore2 - + @@ -110,17 +120,22 @@ + True + True 2 + True + True 2 True + False True 6 3 @@ -130,6 +145,7 @@ True + False 0 _User ID: True @@ -137,7 +153,7 @@ GTK_FILL - + @@ -145,16 +161,18 @@ True True True + Type User ID 1 2 - + True + False 0 _Nickname: True @@ -164,7 +182,7 @@ 1 2 GTK_FILL - + @@ -172,18 +190,20 @@ True True True + Type Nickname 1 2 1 2 - + True + False 0 _Group: True @@ -192,37 +212,48 @@ 2 3 GTK_FILL - + - + True - groups_liststore - 0 + False + True + 0 + 1 + + + True + Choose a group of type a new group + + 1 2 2 3 - GTK_FILL False + True 3 A_llow this contact to view my status + False True True False True + False True + 0 True True @@ -238,9 +269,8 @@ True True 6 - automatic - automatic etched-in + 5 True @@ -251,30 +281,39 @@ + True + True 5 _Save subscription message + False True True False + False True + 0 True + True + True 6 True + False True 6 True + False 0 You have to register with this transport to be able to add a contact from this @@ -283,18 +322,22 @@ proceed. True + True + True 0 _Register + False True True True False + False True - + False @@ -304,12 +347,15 @@ proceed. + True + True 7 True + False True You must be connected to the transport to be able to add a contact from this protocol. @@ -323,18 +369,21 @@ to add a contact from this protocol. True + False 5 12 end gtk-cancel + False True True True False + False True - + False @@ -345,13 +394,15 @@ to add a contact from this protocol. gtk-add + False True True True True False + False True - + False @@ -369,9 +420,6 @@ to add a contact from this protocol. - - I would like to add you to my contact list. - @@ -390,4 +438,7 @@ to add a contact from this protocol. + + I would like to add you to my contact list. + diff --git a/data/gui/dubbleinput_dialog.ui b/data/gui/dubbleinput_dialog.ui index 159939468..8770d27df 100644 --- a/data/gui/dubbleinput_dialog.ui +++ b/data/gui/dubbleinput_dialog.ui @@ -1,50 +1,105 @@ - + - - + + False 6 dialog - False - + - + True + False vertical 6 + + + True + False + end + + + gtk-cancel + False + True + True + True + False + False + True + + + False + False + 0 + + + + + gtk-ok + False + True + True + True + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + True + False 6 - vertical 6 True + False 12 True + False gtk-dialog-question 6 False + True 0 True + False True + True + True 1 False + True 0 @@ -63,6 +118,7 @@ True + False False @@ -82,50 +138,10 @@ - - 1 - - - - - True - end - - - gtk-cancel - True - True - True - False - True - - - False - False - 0 - - - - - gtk-ok - True - True - True - True - False - True - - - False - False - 1 - - - False - end - 0 + True + 1 diff --git a/data/gui/esession_info_window.ui b/data/gui/esession_info_window.ui index 9e6dee5b2..bd6489024 100644 --- a/data/gui/esession_info_window.ui +++ b/data/gui/esession_info_window.ui @@ -1,93 +1,46 @@ - + - - + + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 center-on-parent dialog - False - + True + False vertical 2 - - - True - - - 32 - 32 - True - - - False - 0 - - - - - True - 0 - - - 1 - - - - - 1 - - - - - True - 4 - - - True - (<b>ESession</b> info) - True - True - - - False - False - 10 - 0 - - - - - False - False - 2 - - - + True + False end + False True True False - + False + True + False 0 0 True + False 2 True + False gtk-apply @@ -99,6 +52,7 @@ True + False _Verify True @@ -122,11 +76,13 @@ gtk-close + False True True False + False True - + False @@ -137,10 +93,74 @@ False + True end 0 + + + True + False + + + 32 + 32 + True + False + + + False + True + 0 + + + + + True + False + 0 + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 4 + + + True + False + (<b>ESession</b> info) + True + True + + + False + False + 10 + 0 + + + + + False + False + 2 + + diff --git a/data/gui/input_dialog.ui b/data/gui/input_dialog.ui index 1e475eb2b..64c7269c1 100644 --- a/data/gui/input_dialog.ui +++ b/data/gui/input_dialog.ui @@ -1,51 +1,106 @@ - + - - + + False 6 dialog - False - - + + - + True + False vertical 6 + + + True + False + end + + + gtk-cancel + False + True + True + True + False + False + True + + + False + False + 0 + + + + + gtk-ok + False + True + True + True + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + True + False 6 - vertical 6 True + False 12 True + False gtk-dialog-question 6 False + True 0 True + False True + True + True 1 False + True 0 @@ -62,50 +117,10 @@ - - 1 - - - - - True - end - - - gtk-cancel - True - True - True - False - True - - - False - False - 0 - - - - - gtk-ok - True - True - True - True - False - True - - - False - False - 1 - - - False - end - 0 + True + 1 diff --git a/data/gui/input_text_dialog.ui b/data/gui/input_text_dialog.ui index 68fc57979..c8584f696 100644 --- a/data/gui/input_text_dialog.ui +++ b/data/gui/input_text_dialog.ui @@ -1,89 +1,32 @@ - + - - + + False 6 400 dialog - False - + - + True + False vertical 6 - - - True - 6 - vertical - 6 - - - True - 12 - - - True - gtk-dialog-question - 6 - - - False - 0 - - - - - True - True - - - 1 - - - - - False - 0 - - - - - True - True - automatic - never - in - - - True - True - word - - - - - 1 - - - - - 1 - - - + True + False end gtk-cancel + False True True True False + False True @@ -95,11 +38,13 @@ gtk-ok + False True True True True False + False True @@ -111,10 +56,81 @@ False + True end 0 + + + True + False + 6 + 6 + + + True + False + 12 + + + True + False + gtk-dialog-question + 6 + + + False + True + 0 + + + + + True + False + True + + + True + True + 1 + + + + + False + True + 0 + + + + + True + True + never + in + + + True + True + word + + + + + True + True + 1 + + + + + False + True + 1 + + diff --git a/data/gui/roster_window.ui b/data/gui/roster_window.ui index a0fd915e2..81259d8fc 100644 --- a/data/gui/roster_window.ui +++ b/data/gui/roster_window.ui @@ -1,10 +1,95 @@ - + - - + + + + True + False + gtk-jump-to + 1 + + + True + False + gtk-help + 1 + + + True + False + gtk-dialog-question + 1 + + + True + False + gtk-properties + 1 + + + True + False + gtk-disconnect + 1 + + + True + False + gtk-info + 1 + + + True + False + gtk-new + 1 + + + True + False + gtk-connect + 1 + + + True + False + gtk-add + 1 + + + True + False + gtk-find + 1 + + + True + False + gtk-network + 1 + + + True + False + gtk-properties + 1 + + + True + False + gtk-save + 1 + + + True + False + gtk-justify-fill + 1 + 85 200 + False Gajim roster 250 @@ -12,30 +97,36 @@ - - - - - + + + + + True - vertical + False True + False + False True + False _Actions True - + + False _Start Chat... + False True + False True image1 False @@ -45,6 +136,8 @@ Send Single _Message... + False + False True image2 False @@ -54,7 +147,9 @@ Join _Group Chat... + False True + False True image3 False @@ -64,12 +159,15 @@ True + False Add _Contact... + False True + False True image4 False @@ -79,7 +177,9 @@ _Discover Services + False True + False True image5 False @@ -88,7 +188,9 @@ + False True + False _Advanced True @@ -96,17 +198,20 @@ True + False gtk-quit + False True + False True True accelgroup1 - + @@ -115,28 +220,35 @@ + False True + False _Edit True - + + False _Accounts + False True + False True image6 False accelgroup1 - + Profile, A_vatar + False True + False True image7 False @@ -146,27 +258,32 @@ True + False gtk-preferences + False True + False True True accelgroup1 - + P_lugins + False True + False True image13 False - + @@ -175,76 +292,92 @@ + False True + False _View True - + + False + False True + False Show _Offline Contacts True - + + False True + False Show Only _Active Contacts True - + + False True + False Show T_ransports True - + + False True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Show _Roster True True - + True + False File _Transfers + False True + False True image8 False accelgroup1 - + _History + False True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True image9 False accelgroup1 - + @@ -253,70 +386,84 @@ + False True + False _Help True + False _Contents + False True + False Help online True image10 False accelgroup1 - + _FAQ + False True + False Frequently Asked Questions (online) True image11 False accelgroup1 - + Keyboard Shortcuts + False True + False True image14 False - + True + False Fea_tures + False True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True image12 False accelgroup1 - + gtk-about + False True + False True True accelgroup1 - + @@ -335,24 +482,24 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - vertical True True False gtk-clear - True - - + + False + True 0 @@ -361,36 +508,43 @@ True True never - automatic True True + True False True - - - - - - - - - + + + + + + + + + + + + + True + True 1 True - + False + False + True 2 @@ -405,81 +559,12 @@ + True + True 1 - - - True - gtk-jump-to - 1 - - - True - gtk-new - 1 - - - True - gtk-connect - 1 - - - True - gtk-add - 1 - - - True - gtk-find - 1 - - - True - gtk-network - 1 - - - True - gtk-properties - 1 - - - True - gtk-save - 1 - - - True - gtk-justify-fill - 1 - - - True - gtk-help - 1 - - - True - gtk-dialog-question - 1 - - - True - gtk-properties - 1 - - - True - gtk-disconnect - 1 - - - True - gtk-info - 1 - diff --git a/src/chat_control.py b/src/chat_control.py index 39335ea74..97e6eba90 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -255,7 +255,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): Derives types SHOULD implement this, rather than connection to the even itself """ - event = Gdk.Event(Gdk.KEY_PRESS) + event = Gdk.Event(Gdk.EventType.KEY_PRESS) event.keyval = event_keyval event.state = event_keymod event.time = 0 @@ -709,7 +709,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): def set_emoticons_menu_position(w, msg_tv=self.msg_textview): window = msg_tv.get_window(Gtk.TextWindowType.WIDGET) # get the window position - origin = window.get_origin() + origin = window.get_origin()[1:] size = window.get_size() buf = msg_tv.get_buffer() # get the cursor position @@ -734,7 +734,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return (x, y, True) # push_in True gajim.interface.emoticon_menuitem_clicked = self.append_emoticon gajim.interface.emoticons_menu.popup(None, None, - set_emoticons_menu_position, 1, 0) + set_emoticons_menu_position, None, 1, 0) def _on_message_textview_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_space: @@ -788,7 +788,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): xhtml = self.msg_textview.get_xhtml() # construct event instance from binding - event = Gdk.Event(Gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.EventType.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time @@ -1981,7 +1981,7 @@ class ChatControl(ChatControlBase): menu.connect('selection-done', lambda w: w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) return True def on_location_eventbox_button_release_event(self, widget, event): @@ -3049,7 +3049,7 @@ class ChatControl(ChatControlBase): window.window.shape_combine_mask(mask, 0, 0) # make the bigger avatar window show up centered - x0, y0 = small_avatar.window.get_origin() + x0, y0 = small_avatar.window.get_origin()[1:] x0 += small_avatar.allocation.x y0 += small_avatar.allocation.y center_x= x0 + (small_avatar.allocation.width / 2) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 778c4686e..6506a40b5 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -600,7 +600,7 @@ class ConversationTextview(GObject.GObject): break if xep0184_warning and not self.xep0184_warning_tooltip.win: # check if the current pointer is still over the line - position = self.tv.get_window(Gtk.TextWindowType.TEXT).get_origin() + position = self.tv.get_window(Gtk.TextWindowType.TEXT).get_origin()[1:] self.xep0184_warning_tooltip.show_tooltip(_('This icon indicates that ' 'this message has not yet\nbeen received by the remote end. ' "If this icon stays\nfor a long time, it's likely the message got " @@ -619,7 +619,7 @@ class ConversationTextview(GObject.GObject): break if over_line and not self.line_tooltip.win: # check if the current pointer is still over the line - position = self.tv.get_window(Gtk.TextWindowType.TEXT).get_origin() + position = self.tv.get_window(Gtk.TextWindowType.TEXT).get_origin()[1:] self.line_tooltip.show_tooltip(_('Text below this line is what has ' 'been said since the\nlast time you paid attention to this group ' 'chat'), 8, position[1] + pointer[2]) @@ -945,7 +945,7 @@ class ConversationTextview(GObject.GObject): childs[0].hide() # copy link location childs[1].hide() # open link in browser - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) def hyperlink_handler(self, texttag, widget, event, iter_, kind): if event.type == Gdk.EventType.BUTTON_PRESS: diff --git a/src/dialogs.py b/src/dialogs.py index 242f47363..d88f3428f 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -30,6 +30,7 @@ ## from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject import os @@ -915,11 +916,11 @@ class AddNewContactWindow: # Combobox with transport/jabber icons liststore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, str) cell = Gtk.CellRendererPixbuf() - self.protocol_combobox.pack_start(cell, False, True, 0) + self.protocol_combobox.pack_start(cell, False) self.protocol_combobox.add_attribute(cell, 'pixbuf', 1) cell = Gtk.CellRendererText() cell.set_property('xpad', 5) - self.protocol_combobox.pack_start(cell, True, True, 0) + self.protocol_combobox.pack_start(cell, True) self.protocol_combobox.add_attribute(cell, 'text', 0) self.protocol_combobox.set_model(liststore) uf_type = {'jabber': 'Jabber', 'aim': 'AIM', 'gadu-gadu': 'Gadu Gadu', @@ -996,7 +997,7 @@ class AddNewContactWindow: self.group_comboboxentry.set_active(i) i += 1 - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.window.show_all() if self.account: @@ -2703,6 +2704,7 @@ class NewChatDialog(InputDialog): title = _('Start Chat') prompt_text = _('Fill in the nickname or the Jabber ID of the contact you would like\nto send a chat message to:') InputDialog.__init__(self, title, prompt_text, is_modal=False) + self.input_entry.set_placeholder_text(_('Nickname / Jabber ID')) self.completion_dict = {} liststore = gtkgui_helpers.get_completion_liststore(self.input_entry) diff --git a/src/disco.py b/src/disco.py index 2f954707a..c3a51f7a9 100644 --- a/src/disco.py +++ b/src/disco.py @@ -1244,7 +1244,7 @@ class ToplevelAgentBrowser(AgentBrowser): # bounding rectangle of coordinates for the cell within the treeview rect = view.get_cell_area(props[0], props[1]) # position of the treeview on the screen - position = view.window.get_origin() + position = view.get_window().get_origin()[1:] self.tooltip.show_tooltip(state, rect.height, position[1] + rect.y) else: self.tooltip.hide_tooltip() diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index a92a01ad8..33ae185b8 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -963,7 +963,7 @@ class FileTransfersWindow: # bounding rectangle of coordinates for the cell within the treeview rect = self.tree.get_cell_area(props[0], props[1]) # position of the treeview on the screen - position = widget.window.get_origin() + position = widget.get_window().get_origin()[1:] self.tooltip.show_tooltip(file_props, rect.height, position[1] + rect.y + self.height_diff) else: @@ -989,7 +989,7 @@ class FileTransfersWindow: event_button = gtkgui_helpers.get_possible_button_event(event) self.file_transfers_menu.show_all() - self.file_transfers_menu.popup(None, self.tree, None, + self.file_transfers_menu.popup(None, self.tree, None, None, event_button, event.time) def on_transfers_list_key_press_event(self, widget, event): diff --git a/src/groupchat_control.py b/src/groupchat_control.py index fd705214b..2887f50a1 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -2151,7 +2151,7 @@ class GroupchatControl(ChatControlBase): # Textview is not sensitive, don't handle keypress return # construct event instance from binding - event = Gdk.Event(Gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.EventType.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time @@ -2452,7 +2452,7 @@ class GroupchatControl(ChatControlBase): # show the popup now! menu = xml.get_object('gc_occupants_menu') menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) def _start_private_message(self, nick): gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) @@ -2591,7 +2591,7 @@ class GroupchatControl(ChatControlBase): # as it was before setting the timeout if props and self.tooltip.id == props[0]: rect = self.list_treeview.get_cell_area(props[0], props[1]) - position = self.list_treeview.window.get_origin() + position = self.list_treeview.get_window().get_origin()[1:] self.tooltip.show_tooltip(contact, rect.height, position[1] + rect.y) else: diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 28de9421b..79f11591b 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -109,12 +109,9 @@ def get_completion_liststore(entry): liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str) render_pixbuf = Gtk.CellRendererPixbuf() - completion.pack_start(render_pixbuf, False, True, 0) + completion.pack_start(render_pixbuf, False) completion.add_attribute(render_pixbuf, 'pixbuf', 0) - render_text = Gtk.CellRendererText() - completion.pack_start(render_text, True, True, 0) - completion.add_attribute(render_text, 'text', 1) completion.set_property('text_column', 1) completion.set_model(liststore) entry.set_completion(completion) @@ -125,10 +122,11 @@ def popup_emoticons_under_button(menu, button, parent_win): """ Popup the emoticons menu under button, which is in parent_win """ - window_x1, window_y1 = parent_win.get_origin() - def position_menu_under_button(menu): + window_x1, window_y1 = parent_win.get_origin()[1:] + def position_menu_under_button(menu, data): # inline function, which will not keep refs, when used as CB - button_x, button_y = button.allocation.x, button.allocation.y + alloc = button.get_allocation() + button_x, button_y = alloc.x, alloc.y # now convert them to X11-relative window_x, window_y = window_x1, window_y1 @@ -138,10 +136,9 @@ def popup_emoticons_under_button(menu, button, parent_win): menu_height = menu.size_request()[1] ## should we pop down or up? - if (y + button.allocation.height + menu_height - < Gdk.Screen.height()): + if (y + alloc.height + menu_height < Gdk.Screen.height()): # now move the menu below the button - y += button.allocation.height + y += alloc.height else: # now move the menu above the button y -= menu_height @@ -150,7 +147,7 @@ def popup_emoticons_under_button(menu, button, parent_win): push_in = True return (x, y, push_in) - menu.popup(None, None, position_menu_under_button, 1, 0) + menu.popup(None, None, position_menu_under_button, None, 1, 0) def get_theme_font_for_option(theme, option): """ @@ -806,7 +803,7 @@ def get_possible_button_event(event): """ Mouse or keyboard caused the event? """ - if event.type == Gdk.KEY_PRESS: + if event.type == Gdk.EventType.KEY_PRESS: return 0 # no event.button so pass 0 # BUTTON_PRESS event, so pass event.button return event.button diff --git a/src/history_manager.py b/src/history_manager.py index 4b9292590..1d005cb2a 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -464,7 +464,7 @@ class HistoryManager: self.on_delete_menuitem_activate, widget) xml.connect_signals(self) - xml.get_object('context_menu').popup(None, None, None, + xml.get_object('context_menu').popup(None, None, None, None, event.button, event.time) return True diff --git a/src/htmltextview.py b/src/htmltextview.py index 3b31e6da9..b668466c2 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -843,7 +843,7 @@ class HtmlTextView(Gtk.TextView): text = getattr(tag, 'title', False) if text: pointer = self.get_pointer() - position = self.get_window(Gtk.TextWindowType.TEXT).get_origin() + position = self.get_window(Gtk.TextWindowType.TEXT).get_origin()[1:] self.tooltip.show_tooltip(text, 8, position[1] + pointer[2]) def __motion_notify_event(self, widget, event): diff --git a/src/message_window.py b/src/message_window.py index f47b09db4..2cf5cdaeb 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -325,7 +325,7 @@ class MessageWindow(object): # NOTE: handles mykeypress which is custom signal; see message_textview.py # construct event instance from binding - event = Gdk.Event(Gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.EventType.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time @@ -395,7 +395,7 @@ class MessageWindow(object): elif keyval in (Gdk.KEY_Page_Up, Gdk.KEY_Page_Down): # CTRL + PageUp | PageDown # Create event and send it to notebook - event = Gdk.Event(Gdk.KEY_PRESS) + event = Gdk.Event(Gdk.EventType.KEY_PRESS) event.window = self.window.window event.time = int(time.time()) event.state = Gdk.ModifierType.CONTROL_MASK @@ -686,7 +686,7 @@ class MessageWindow(object): return self.window.is_active() def get_origin(self): - return self.window.window.get_origin() + return self.window.get_window().get_origin() def get_control(self, key, acct): """ @@ -791,7 +791,7 @@ class MessageWindow(object): def popup_menu(self, event): menu = self.get_active_control().prepare_context_menu() # show the menu - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) menu.show_all() def _on_notebook_switch_page(self, notebook, page, page_num): diff --git a/src/profile_window.py b/src/profile_window.py index 8b13d4198..058b7295d 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -219,7 +219,7 @@ class ProfileWindow: menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget) diff --git a/src/roster_window.py b/src/roster_window.py index 865552ec3..3810c30a7 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2392,7 +2392,7 @@ class RosterWindow: if isinstance(w, dict): self.close_all_from_dict(w) else: - w.window.destroy() + w.window().destroy() def close_all(self, account, force=False): """ @@ -2403,7 +2403,7 @@ class RosterWindow: self.close_all_from_dict(gajim.interface.instances[account]) for ctrl in gajim.interface.msg_win_mgr.get_controls(acct=account): ctrl.parent_win.remove_tab(ctrl, ctrl.parent_win.CLOSE_CLOSE_BUTTON, - force = force) + force=force) def on_roster_window_delete_event(self, widget, event): """ @@ -4113,7 +4113,7 @@ class RosterWindow: self.on_history(widget, contact, account) def on_roster_window_popup_menu(self, widget): - event = Gdk.Event(Gdk.KEY_PRESS) + event = Gdk.Event(Gdk.EventType.KEY_PRESS) self.show_treeview_menu(event) def on_row_activated(self, widget, path): @@ -4909,7 +4909,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, 1, etime) + menu.popup(None, None, None, None, 1, etime) ################################################################################ ### Everything about images and icons.... @@ -5751,7 +5751,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_group_menu(self, event, titer): """ @@ -5913,7 +5913,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_contact_menu(self, event, titer): """ @@ -5926,7 +5926,7 @@ class RosterWindow: menu = gui_menu_builder.get_contact_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_multiple_contact_menu(self, event, iters): """ @@ -6030,7 +6030,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_transport_menu(self, event, titer): """ @@ -6169,7 +6169,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_groupchat_menu(self, event, titer): model = self.modelfilter @@ -6219,7 +6219,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def get_and_connect_advanced_menuitem_menu(self, account): """ diff --git a/src/statusicon.py b/src/statusicon.py index 6ce82586f..3fb273230 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -369,8 +369,7 @@ class StatusIcon: self.added_hide_menuitem = True self.systray_context_menu.show_all() - self.systray_context_menu.popup(None, None, None, 0, - event_time) + self.systray_context_menu.popup(None, None, None, None, 0, event_time) def on_show_all_events_menuitem_activate(self, widget): events = gajim.events.get_systray_events() diff --git a/src/tooltips.py b/src/tooltips.py index 386a6d4bb..f51429724 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -93,8 +93,8 @@ class BaseTooltip: self.win.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) self.win.set_events(Gdk.EventMask.POINTER_MOTION_MASK) - self.win.connect_after('expose_event', self.expose) - self.win.connect('size-request', self.on_size_request) +# self.win.connect_after('draw', self.on_draw) +# self.win.connect('size-request', self.on_size_request) self.win.connect('motion-notify-event', self.motion_notify_event) self.screen = self.win.get_screen() @@ -133,12 +133,12 @@ class BaseTooltip: self.preferred_position[1] = 0 self.win.move(self.preferred_position[0], self.preferred_position[1]) - def expose(self, widget, event): - style = self.win.get_style() - size = self.win.get_size() - style.paint_shadow(self.win.window, Gtk.StateType.NORMAL, Gtk.ShadowType.OUT, - None, self.win, 'tooltip', 0, 0, size[0], size[1]) - return True +# def expose(self, widget, event): +# style = self.win.get_style() +# size = self.win.get_size() +# style.paint_shadow(self.win.window, Gtk.StateType.NORMAL, Gtk.ShadowType.OUT, +# None, self.win, 'tooltip', 0, 0, size[0], size[1]) +# return True def show_tooltip(self, data, widget_height, widget_y_position): """ diff --git a/src/vcard.py b/src/vcard.py index 9d9dabe7b..242316e5f 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -190,7 +190,7 @@ class VcardWindow: menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) def set_value(self, entry_name, value): try: @@ -533,7 +533,7 @@ class ZeroconfVcardWindow: menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.popup(None, None, None, None, event.button, event.time) def set_value(self, entry_name, value): try: From 1a3a91e6c493de8ea201155daedcc7dc429d8e43 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 28 Dec 2012 21:58:49 +0100 Subject: [PATCH 013/592] update README --- README.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.html b/README.html index 38861e74b..5fa6156a9 100644 --- a/README.html +++ b/README.html @@ -14,8 +14,9 @@

Runtime Requirements

    -
  • python2.5 or higher
  • -
  • pygtk2.22 or higher
  • +
  • python2.7 or higher
  • +
  • python-gi
  • +
  • gir1.2-gtk-3.0
  • python-nbxmpp
@@ -28,7 +29,7 @@
  • For zeroconf (bonjour), the "enable link-local messaging" checkbox, you need dbus-glib, python-avahi
  • dnsutils (or whatever package provides the nslookup binary) for SRV support
  • gtkspell and aspell-LANG where lang is your locale eg. en, fr etc
  • -
  • gnome-python-desktop (for GnomeKeyring support as password storage)
  • +
  • gir1.2-gnomekeyring-1.0 for GnomeKeyring support as password storage
  • kwalletcli (for support of KDE Wallet as password storage)
  • notification-daemon or notify-python (and D-Bus) to get cooler popups
  • D-Bus running to have gajim-remote working. Some distributions split dbus-x11, which is needed for dbus to work with Gajim. Version >= 0.80 is required.
  • From cbd329c9cc98ae0b522b7ad64b69f6247a8f75d4 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 28 Dec 2012 21:59:20 +0100 Subject: [PATCH 014/592] correctly place tooltips --- src/roster_window.py | 2 +- src/tooltips.py | 27 ++++++++------------------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 3810c30a7..2f5dd2954 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2045,7 +2045,7 @@ class RosterWindow: # position of the treeview on the screen position = self.tree.get_window().get_origin() - self.tooltip.show_tooltip(contact, rect.height, position[1] + \ + self.tooltip.show_tooltip(contact, rect.height, position[2] + \ rect.y) else: self.tooltip.hide_tooltip() diff --git a/src/tooltips.py b/src/tooltips.py index f51429724..07191c506 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -93,8 +93,7 @@ class BaseTooltip: self.win.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) self.win.set_events(Gdk.EventMask.POINTER_MOTION_MASK) -# self.win.connect_after('draw', self.on_draw) -# self.win.connect('size-request', self.on_size_request) + self.win.connect('size-allocate', self.on_size_allocate) self.win.connect('motion-notify-event', self.motion_notify_event) self.screen = self.win.get_screen() @@ -114,32 +113,22 @@ class BaseTooltip: def motion_notify_event(self, widget, event): self.hide_tooltip() - def on_size_request(self, widget, requisition): - half_width = requisition.width / 2 + 1 + def on_size_allocate(self, widget, rect): + half_width = rect.width / 2 + 1 if self.preferred_position[0] < half_width: self.preferred_position[0] = 0 - elif self.preferred_position[0] + requisition.width > \ - self.screen.get_width() + half_width: - self.preferred_position[0] = self.screen.get_width() - \ - requisition.width + elif self.preferred_position[0] + rect.width > \ + self.screen.get_width() + half_width: + self.preferred_position[0] = self.screen.get_width() - rect.width elif not self.check_last_time: self.preferred_position[0] -= half_width - if self.preferred_position[1] + requisition.height > \ - self.screen.get_height(): + if self.preferred_position[1] + rect.height > self.screen.get_height(): # flip tooltip up - self.preferred_position[1] -= requisition.height + \ - self.widget_height + 8 + self.preferred_position[1] -= rect.height + self.widget_height + 8 if self.preferred_position[1] < 0: self.preferred_position[1] = 0 self.win.move(self.preferred_position[0], self.preferred_position[1]) -# def expose(self, widget, event): -# style = self.win.get_style() -# size = self.win.get_size() -# style.paint_shadow(self.win.window, Gtk.StateType.NORMAL, Gtk.ShadowType.OUT, -# None, self.win, 'tooltip', 0, 0, size[0], size[1]) -# return True - def show_tooltip(self, data, widget_height, widget_y_position): """ Show tooltip on widget From aaa217be40119ba49a8b3228d1423050ed9eec36 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 28 Dec 2012 21:59:53 +0100 Subject: [PATCH 015/592] fix features window --- src/features_window.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/features_window.py b/src/features_window.py index 80ccb774a..1bf2bbe1a 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -41,7 +41,7 @@ class FeaturesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('features_window.ui') self.window = self.xml.get_object('features_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) treeview = self.xml.get_object('features_treeview') self.desc_label = self.xml.get_object('feature_desc_label') @@ -117,13 +117,13 @@ class FeaturesWindow: treeview.append_column(col) cell = Gtk.CellRendererToggle() cell.set_property('radio', True) - col.pack_start(cell, True, True, 0) - col.set_attributes(cell, active = 1) + col.pack_start(cell, True) + col.add_attribute(cell, 'active', 1) col = Gtk.TreeViewColumn(_('Feature')) treeview.append_column(col) cell = Gtk.CellRendererText() - col.pack_start(cell, True, True, 0) + col.pack_start(cell, True) col.add_attribute(cell, 'text', 0) # Fill model From 43a3bac502a5d24f02648f51503c9853c17db77f Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 28 Dec 2012 22:00:24 +0100 Subject: [PATCH 016/592] missing import --- src/gtkexcepthook.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gtkexcepthook.py b/src/gtkexcepthook.py index eb334270b..9ba17ba29 100644 --- a/src/gtkexcepthook.py +++ b/src/gtkexcepthook.py @@ -26,6 +26,7 @@ import traceback import threading from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import Pango from common import i18n # installs _() function import dialogs From e71188a6fa664866d04c0b0af4426d106400c5b1 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 19:36:56 +0100 Subject: [PATCH 017/592] print -> print() --- src/adhoc_commands.py | 2 +- src/common/check_paths.py | 54 +++++++-------- src/common/configpaths.py | 4 +- src/common/connection_handlers.py | 4 +- src/common/connection_handlers_events.py | 8 +-- src/common/dbus_support.py | 16 ++--- src/common/idle.py | 4 +- src/common/jingle_transport.py | 2 +- src/common/logger.py | 4 +- src/common/logging_helpers.py | 4 +- src/common/multimedia_helpers.py | 2 +- src/common/optparser.py | 5 +- src/common/resolver.py | 2 +- src/common/rst_xhtml_generator.py | 12 ++-- src/common/zeroconf/roster_zeroconf.py | 12 ---- src/dataforms_widget.py | 2 +- src/dialogs.py | 1 - src/gajim-remote.py | 27 ++++---- src/gajim.py | 28 ++++---- src/gtkgui_helpers.py | 14 ++-- src/gui_interface.py | 4 +- src/ipython_view.py | 4 +- src/music_track_listener.py | 8 +-- test/integration/test_resolver.py | 2 +- test/integration/test_xmpp_client_nb.py | 2 +- test/runtests.py | 8 +-- test/unit/test_socks5.py | 84 ++++++++++++------------ 27 files changed, 154 insertions(+), 165 deletions(-) diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index 8fd2559aa..a22bea8e7 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -159,7 +159,7 @@ class CommandWindow: return self.stage_adhoc_commands_window_delete_event(self.window) def __del__(self): - print 'Object has been deleted.' + print('Object has been deleted.') # stage 1: waiting for command list def stage1(self): diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 3250f46a4..6dbab7945 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -36,7 +36,7 @@ from common import jingle_xtls import sqlite3 as sqlite def create_log_db(): - print _('creating logs database') + print(_('creating logs database')) con = sqlite.connect(logger.LOG_DB_PATH) os.chmod(logger.LOG_DB_PATH, 0600) # rw only for us cur = con.cursor() @@ -84,7 +84,7 @@ def create_log_db(): con.close() def create_cache_db(): - print _('creating cache database') + print(_('creating cache database')) con = sqlite.connect(logger.CACHE_DB_PATH) os.chmod(logger.CACHE_DB_PATH, 0600) # rw only for us cur = con.cursor() @@ -128,7 +128,7 @@ def create_cache_db(): con.close() def split_db(): - print 'spliting database' + print('spliting database') if os.name == 'nt': try: import configpaths @@ -162,8 +162,8 @@ def split_db(): cur.executescript('DROP TABLE %s;' % table) con.commit() except sqlite.OperationalError, e: - print >> sys.stderr, 'error moving table %s to cache.db: %s' % \ - (table, str(e)) + print('error moving table %s to cache.db: %s' % (table, str(e)), + file=sys.stderr) con.close() logger.CACHE_DB_PATH = tmp @@ -249,7 +249,7 @@ def check_and_possibly_move_config(): continue if not os.path.exists(src): continue - print 'moving %s to %s' % (src, dst) + print(_('moving %s to %s') % (src, dst)) shutil.move(src, dst) gajim.logger.init_vars() gajim.logger.attach_cache_database() @@ -275,57 +275,57 @@ def check_and_possibly_create_paths(): if not os.path.exists(MY_DATA): create_path(MY_DATA) elif os.path.isfile(MY_DATA): - print _('%s is a file but it should be a directory') % MY_DATA - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_DATA) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CONFIG): create_path(MY_CONFIG) elif os.path.isfile(MY_CONFIG): - print _('%s is a file but it should be a directory') % MY_CONFIG - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_CONFIG) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CACHE): create_path(MY_CACHE) elif os.path.isfile(MY_CACHE): - print _('%s is a file but it should be a directory') % MY_CACHE - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_CACHE) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(VCARD_PATH): create_path(VCARD_PATH) elif os.path.isfile(VCARD_PATH): - print _('%s is a file but it should be a directory') % VCARD_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % VCARD_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(AVATAR_PATH): create_path(AVATAR_PATH) elif os.path.isfile(AVATAR_PATH): - print _('%s is a file but it should be a directory') % AVATAR_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % AVATAR_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(LOG_DB_FOLDER): create_path(LOG_DB_FOLDER) elif os.path.isfile(LOG_DB_FOLDER): - print _('%s is a file but it should be a directory') % LOG_DB_FOLDER - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % LOG_DB_FOLDER) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(PLUGINS_CONFIG_PATH): create_path(PLUGINS_CONFIG_PATH) elif os.path.isfile(PLUGINS_CONFIG_PATH): - print _('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_FOLDER): create_path(CACHE_DB_FOLDER) elif os.path.isfile(CACHE_DB_FOLDER): - print _('%s is a file but it should be a directory') % CACHE_DB_FOLDER - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % CACHE_DB_FOLDER) + print(_('Gajim will now exit')) sys.exit() check_and_possibly_move_config() @@ -334,16 +334,16 @@ def check_and_possibly_create_paths(): create_log_db() gajim.logger.init_vars() elif os.path.isdir(LOG_DB_PATH): - print _('%s is a directory but should be a file') % LOG_DB_PATH - print _('Gajim will now exit') + print(_('%s is a directory but should be a file') % LOG_DB_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_PATH): create_cache_db() gajim.logger.attach_cache_database() elif os.path.isdir(CACHE_DB_PATH): - print _('%s is a directory but should be a file') % CACHE_DB_PATH - print _('Gajim will now exit') + print(_('%s is a directory but should be a file') % CACHE_DB_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(XTLS_CERTS): @@ -363,5 +363,5 @@ def create_path(directory): create_path(head) if os.path.exists(directory): return - print _('creating %s directory') % directory + print(('creating %s directory') % directory) os.mkdir(directory, 0700) diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 93c2b996b..214d7891e 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -162,8 +162,8 @@ class ConfigPaths: try: self.add('TMP', None, fse(tempfile.gettempdir())) except IOError, e: - print >> sys.stderr, 'Error opening tmp folder: %s\nUsing %s' % ( - str(e), os.path.expanduser('~')) + print('Error opening tmp folder: %s\nUsing %s' % (str(e), + os.path.expanduser('~')), file=sys.stderr) self.add('TMP', None, fse(os.path.expanduser('~'))) try: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index ffd112f40..bf23ecac7 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -593,7 +593,7 @@ class ConnectionVcard: elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTIONS_ARRIVED: # TODO - print 'ARCHIVING_COLLECTIONS_ARRIVED' + print('ARCHIVING_COLLECTIONS_ARRIVED') elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTION_ARRIVED: def save_if_not_exists(with_, nick, direction, tim, payload): @@ -603,7 +603,7 @@ class ConnectionVcard: gajim.logger.save_if_not_exists(with_, direction, tim, msg=payload[0].getData(), nick=nick) elif payload[0].getName() == 'message': - print 'Not implemented' + print('Not implemented') chat = iq_obj.getTag('chat') if chat: with_ = chat.getAttr('with') diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 9bb2e96a4..c07d2cf3d 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -366,10 +366,10 @@ class RosterReceivedEvent(nec.NetworkIncomingEvent): try: j = helpers.parse_jid(jid) except Exception: - print >> sys.stderr, _('JID %s is not RFC compliant. It ' - 'will not be added to your roster. Use roster ' - 'management tools such as ' - 'http://jru.jabberstudio.org/ to remove it') % jid + print(_('JID %s is not RFC compliant. It will not be added ' + 'to your roster. Use roster management tools such as ' + 'http://jru.jabberstudio.org/ to remove it') % jid, + file=sys.stderr) else: infos = raw_roster[jid] if jid != our_jid and (not infos['subscription'] or \ diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index 12a3ed163..5b1424a1c 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -38,8 +38,8 @@ try: except ImportError: supported = False if not os.name == 'nt': # only say that to non Windows users - print _('D-Bus python bindings are missing in this computer') - print _('D-Bus capabilities of Gajim cannot be used') + print(_('D-Bus python bindings are missing in this computer')) + print(_('D-Bus capabilities of Gajim cannot be used')) else: try: # test if dbus-x11 is installed @@ -49,14 +49,14 @@ else: except dbus.DBusException: supported = False if not os.name == 'nt': # only say that to non Windows users - print _('D-Bus does not run correctly on this machine') - print _('D-Bus capabilities of Gajim cannot be used') + print(_('D-Bus does not run correctly on this machine')) + print(_('D-Bus capabilities of Gajim cannot be used')) except exceptions.SystemBusNotPresent: - print _('D-Bus does not run correctly on this machine: system bus not ' - 'present') + print(_('D-Bus does not run correctly on this machine: system bus not ' + 'present')) except exceptions.SessionBusNotPresent: - print _('D-Bus does not run correctly on this machine: session bus not ' - 'present') + print(_('D-Bus does not run correctly on this machine: session bus not ' + 'present')) class SystemBus: """ diff --git a/src/common/idle.py b/src/common/idle.py index 5e1bf4c0f..26f1d6993 100644 --- a/src/common/idle.py +++ b/src/common/idle.py @@ -94,6 +94,6 @@ def close(): if __name__ == '__main__': import time time.sleep(2.1) - print getIdleSec() + print(getIdleSec()) close() - print getIdleSec() + print(getIdleSec()) diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index cb289ddfe..64e4b5d02 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -401,7 +401,7 @@ class JingleTransportICEUDP(JingleTransport): if 'type' in candidate and candidate['type'] in types: cand.type = types[candidate['type']] else: - print 'Unknown type %s', candidate['type'] + print('Unknown type %s' % candidate['type']) candidates.append(cand) self.remote_candidates.extend(candidates) return candidates diff --git a/src/common/logger.py b/src/common/logger.py index 4c0d2bb67..162496cee 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -169,7 +169,7 @@ class Logger: try: self.con.commit() except sqlite.OperationalError, e: - print >> sys.stderr, str(e) + print(str(e), file=sys.stderr) self.commit_timout_id = None return False @@ -415,7 +415,7 @@ class Logger: self.con.commit() message_id = self.cur.lastrowid except sqlite.OperationalError, e: - print >> sys.stderr, str(e) + print(str(e), file=sys.stderr) else: self._timeout_commit() if message_id: diff --git a/src/common/logging_helpers.py b/src/common/logging_helpers.py index d8f73bf65..729718ce7 100644 --- a/src/common/logging_helpers.py +++ b/src/common/logging_helpers.py @@ -30,7 +30,7 @@ def parseLogLevel(arg): elif arg.isupper() and hasattr(logging, arg): return getattr(logging, arg) else: - print _('%s is not a valid loglevel') % repr(arg) + print(_('%s is not a valid loglevel') % repr(arg)) return 0 def parseLogTarget(arg): @@ -72,7 +72,7 @@ def parseAndSetLogLevels(arg): target = parseLogTarget(target.strip()) if target: logging.getLogger(target).setLevel(level) - print "Logger %s level set to %d" % (target, level) + print("Logger %s level set to %d" % (target, level)) class colors: diff --git a/src/common/multimedia_helpers.py b/src/common/multimedia_helpers.py index 98a91a26a..24bfd465c 100644 --- a/src/common/multimedia_helpers.py +++ b/src/common/multimedia_helpers.py @@ -50,7 +50,7 @@ class DeviceManager(object): except ImportError: pass except gst.ElementNotFoundError: - print 'element \'%s\' not found' % name + print('element \'%s\' not found' % name) class AudioInputManager(DeviceManager): diff --git a/src/common/optparser.py b/src/common/optparser.py index fa270d748..f99d2fae8 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -50,7 +50,8 @@ class OptionsParser: except Exception: if os.path.exists(self.__filename): #we talk about a file - print _('Error: cannot open %s for reading') % self.__filename + print(_('Error: cannot open %s for reading') % self.__filename, + file=sys.stderr) return False new_version = gajim.config.get('version') @@ -381,7 +382,7 @@ class OptionsParser: """ Apply indeces to the logs database """ - print _('migrating logs database to indices') + print(_('migrating logs database to indices')) # FIXME see #2812 back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) diff --git a/src/common/resolver.py b/src/common/resolver.py index 5c8fc3571..8d52cba51 100644 --- a/src/common/resolver.py +++ b/src/common/resolver.py @@ -329,7 +329,7 @@ if __name__ == '__main__': global resolver host = text_view.get_text() def on_result(host, result_array): - print 'Result:\n' + repr(result_array) + print('Result:\n' + repr(result_array)) resolver.resolve(host, on_result) win = Gtk.Window() win.set_border_width(6) diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index 28f25c77e..b60bc5174 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -28,7 +28,7 @@ try: from docutils import nodes, utils from docutils.parsers.rst.roles import set_classes except ImportError: - print "Requires docutils 0.4 for set_classes to be available" + print("Requires docutils 0.4 for set_classes to be available") def create_xhtml(text): return None else: @@ -147,7 +147,7 @@ else: if __name__ == '__main__': - print "test 1\n", Generator.create_xhtml(""" + print("test 1\n" + Generator.create_xhtml(""" test:: >>> print 1 @@ -157,10 +157,10 @@ test:: this `` should trigger`` should trigger the   problem. -""") - print "test 2\n", Generator.create_xhtml(""" +""")) + print("test 2\n" + Generator.create_xhtml(""" *test1 test2_ -""") - print "test 3\n", Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""") +""")) + print("test 3\n" + Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""")) diff --git a/src/common/zeroconf/roster_zeroconf.py b/src/common/zeroconf/roster_zeroconf.py index 307fd392e..472ded7b6 100644 --- a/src/common/zeroconf/roster_zeroconf.py +++ b/src/common/zeroconf/roster_zeroconf.py @@ -32,7 +32,6 @@ class Roster: self.setItem(val[zeroconf.C_NAME]) def getRoster(self): - #print 'roster_zeroconf.py: getRoster' if self._data is None: self._data = {} self.update_roster() @@ -50,11 +49,9 @@ class Roster: if key in self._data: if old_data[key] != self._data[key]: diffs[key] = self._data[key]['status'] - #print 'roster_zeroconf.py: diffs:' + str(diffs) return diffs def setItem(self, jid, name='', groups=''): - #print 'roster_zeroconf.py: setItem %s' % jid contact = self.zeroconf.get_contact(jid) if not contact: return @@ -96,34 +93,27 @@ class Roster: self.setItem(jid=i['jid'], name=i['name'], groups=i['groups']) def delItem(self, jid): - #print 'roster_zeroconf.py: delItem %s' % jid if jid in self._data: del self._data[jid] def getItem(self, jid): - #print 'roster_zeroconf.py: getItem: %s' % jid if jid in self._data: return self._data[jid] def __getitem__(self, jid): - #print 'roster_zeroconf.py: __getitem__' return self._data[jid] def getItems(self): - #print 'roster_zeroconf.py: getItems' # Return list of all [bare] JIDs that the roster currently tracks. return self._data.keys() def keys(self): - #print 'roster_zeroconf.py: keys' return self._data.keys() def getRaw(self): - #print 'roster_zeroconf.py: getRaw' return self._data def getResources(self, jid): - #print 'roster_zeroconf.py: getResources(%s)' % jid return {} def getGroups(self, jid): @@ -142,14 +132,12 @@ class Roster: return self._data[jid]['txt_dict']['msg'] def getShow(self, jid): - #print 'roster_zeroconf.py: getShow' return self.getStatus(jid) def getPriority(self, jid): return 5 def getSubscription(self, jid): - #print 'roster_zeroconf.py: getSubscription' return 'both' def Subscribe(self, jid): diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index cf35d0ebb..e686062b8 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -75,7 +75,7 @@ class DataFormWidget(Gtk.Alignment, object): selection.set_mode(Gtk.SelectionMode.MULTIPLE) def on_data_form_vbox_key_press_event(self, widget, event): - print 'key pressed' + print('key pressed') def set_data_form(self, dataform): """ diff --git a/src/dialogs.py b/src/dialogs.py index 7a2977774..723891ae4 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -4812,7 +4812,6 @@ class AddSpecialNotificationDialog: if active == 1: # user selected 'choose sound' def on_ok(widget, path_to_snd_file): pass - #print path_to_snd_file def on_cancel(widget): widget.set_active(0) # go back to No Sound diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 4de6866b6..1c216782a 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -42,7 +42,7 @@ except Exception: def send_error(error_message): '''Writes error message to stderr and exits''' - print >> sys.stderr, error_message.encode(PREFERRED_ENCODING) + print(error_message.encode(PREFERRED_ENCODING), file=sys.stderr) sys.exit(1) try: @@ -52,7 +52,7 @@ try: # test if dbus-x11 is installed bus = dbus.SessionBus() except Exception: - print _('D-Bus is not present on this machine or python module is missing') + print(_('D-Bus is not present on this machine or python module is missing')) sys.exit(1) OBJ_PATH = '/org/gajim/dbus/RemoteObject' @@ -310,14 +310,15 @@ class GajimRemote: self.command = sys.argv[1] if self.command == 'help': if self.argv_len == 3: - print self.help_on_command(sys.argv[2]).encode(PREFERRED_ENCODING) + print(self.help_on_command(sys.argv[2]).encode( + PREFERRED_ENCODING)) else: - print self.compose_help().encode(PREFERRED_ENCODING) + print(self.compose_help().encode(PREFERRED_ENCODING)) sys.exit(0) if self.command == 'handle_uri': self.handle_uri() if self.command == 'check_gajim_running': - print self.check_gajim_running() + print(self.check_gajim_running()) sys.exit(0) self.init_connection() self.check_arguments() @@ -354,27 +355,27 @@ class GajimRemote: if isinstance(res, list): for account in res: if isinstance(account, unicode): - print account.encode(PREFERRED_ENCODING) + print(account.encode(PREFERRED_ENCODING)) else: - print account + print(account) elif self.command == 'account_info': if res: - print self.print_info(0, res, True) + print(self.print_info(0, res, True)) elif self.command == 'list_contacts': for account_dict in res: - print self.print_info(0, account_dict, True) + print(self.print_info(0, account_dict, True)) elif self.command == 'prefs_list': pref_keys = sorted(res.keys()) for pref_key in pref_keys: result = '%s = %s' % (pref_key, res[pref_key]) if isinstance(result, unicode): - print result.encode(PREFERRED_ENCODING) + print(result.encode(PREFERRED_ENCODING)) else: - print result + print(result) elif self.command == 'contact_info': - print self.print_info(0, res, True) + print(self.print_info(0, res, True)) elif res: - print unicode(res).encode(PREFERRED_ENCODING) + print(unicode(res).encode(PREFERRED_ENCODING)) def check_gajim_running(self): if not self.sbus: diff --git a/src/gajim.py b/src/gajim.py index 825a96e5f..efd70cea4 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -42,7 +42,7 @@ import warnings if os.name == 'nt': log_path = os.path.join(os.environ['APPDATA'], 'Gajim') if not os.path.exists(log_path): - os.mkdir(log_path, 0700) + os.mkdir(log_path, 0o700) log_file = os.path.join(log_path, 'gajim.log') fout = open(log_file, 'a') sys.stdout = fout @@ -65,7 +65,7 @@ if os.name == 'nt': try: import nbxmpp except ImportError: - print 'Gajim needs python-nbxmpp to run. Quiting...' + print('Gajim needs python-nbxmpp to run. Quiting...') sys.exit() #from common import demandimport @@ -131,15 +131,15 @@ def parseOpts(): longargs += ' class= name= screen= gtk-module= sync g-fatal-warnings' longargs += ' sm-client-id= sm-client-state-file= sm-disable' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] - except getopt.error, msg1: - print msg1 - print 'for help use --help' + except getopt.error as msg1: + print(msg1) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print 'gajim [--help] [--quiet] [--verbose] ' + \ + print('gajim [--help] [--quiet] [--verbose] ' + \ '[--loglevel subsystem=level[,subsystem=level[...]]] ' + \ - '[--profile name] [--config-path]' + '[--profile name] [--config-path]') sys.exit() elif o in ('-q', '--quiet'): logging_helpers.set_quiet() @@ -182,7 +182,7 @@ if os.name == 'nt': if self._file is None and self._error is None: try: self._file = open(fname, 'a') - except Exception, details: + except Exception as details: self._error = details if self._file is not None: self._file.write(text) @@ -200,11 +200,11 @@ try: GObject.set_prgname('gajim') from gi.repository import Gtk from gi.repository import Gdk -except Warning, msg2: +except Warning as msg2: if str(msg2) == 'could not open display': - print >> sys.stderr, _('Gajim needs X server to run. Quiting...') + print(_('Gajim needs X server to run. Quiting...'), file=sys.stderr) else: - print >> sys.stderr, _('importing PyGTK failed: %s') % str(msg2) + print(_('importing PyGTK failed: %s') % str(msg2), file=sys.stderr) sys.exit() warnings.resetwarnings() @@ -357,7 +357,7 @@ def pid_alive(): try: f1 = open('/proc/%d/cmdline'% pid) - except IOError, e1: + except IOError as e1: if e1.errno == errno.ENOENT: return False # file/pid does not exist raise @@ -419,7 +419,7 @@ try: f2 = open(pid_filename, 'w') f2.write(str(os.getpid())) f2.close() -except IOError, e2: +except IOError as e2: dlg = dialogs.ErrorDialog(_('Disk Write Error'), str(e2)) dlg.run() dlg.destroy() @@ -464,4 +464,4 @@ if __name__ == '__main__': if os.name != 'nt': Gdk.threads_leave() except KeyboardInterrupt: - print >> sys.stderr, 'KeyboardInterrupt' + print('KeyboardInterrupt', file=sys.stderr) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 016342435..3e62de3d1 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -198,8 +198,8 @@ def get_default_font(): return line[start:line.find('"', start)].decode('utf-8') except Exception: #we talk about file - print >> sys.stderr, _('Error: cannot open %s for reading') % \ - xfce_config_file + print(_('Error: cannot open %s for reading') % xfce_config_file, + file=sys.stderr) elif os.path.exists(kde_config_file): try: @@ -214,8 +214,8 @@ def get_default_font(): return font_string.decode('utf-8') except Exception: #we talk about file - print >> sys.stderr, _('Error: cannot open %s for reading') % \ - kde_config_file + print(_('Error: cannot open %s for reading') % kde_config_file, + file=sys.stderr) return None @@ -343,10 +343,10 @@ def parse_server_xml(path_to_file): return handler.servers # handle exception if unable to open file except IOError, message: - print >> sys.stderr, _('Error reading file:'), message + print(_('Error reading file:') + message, file=sys.stderr) # handle exception parsing file except xml.sax.SAXParseException, message: - print >> sys.stderr, _('Error parsing file:'), message + print(_('Error parsing file:') + message, file=sys.stderr) def set_unset_urgency_hint(window, unread_messages_no): """ @@ -389,7 +389,7 @@ def get_abspath_for_script(scriptname, want_type = False): #we talk about a file here s = _('Could not write to %s. Session Management support will ' 'not work') % path_to_script - print >> sys.stderr, s + print(s, file=sys.stderr) else: # normal user (not svn user) type_ = 'install' diff --git a/src/gui_interface.py b/src/gui_interface.py index 156ac5587..4a1d11ae3 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2446,7 +2446,7 @@ class Interface: def save_config(self): err_str = parser.write() if err_str is not None: - print >> sys.stderr, err_str + print(err_str, file=sys.stderr) # it is good to notify the user # in case he or she cannot see the output of the console dialogs.ErrorDialog(_('Could not save your settings and ' @@ -2608,7 +2608,7 @@ class Interface: try: from ipython_view import IPythonView except ImportError: - print 'ipython_view not found' + print('ipython_view not found') return from gi.repository import Pango diff --git a/src/ipython_view.py b/src/ipython_view.py index e816c7805..763f05950 100644 --- a/src/ipython_view.py +++ b/src/ipython_view.py @@ -309,11 +309,11 @@ class IterableIPShell: @param header: Header to be printed before output @type header: string """ - if verbose or debug: print header+cmd + if verbose or debug: print(header+cmd) # flush stdout so we don't mangle python's buffering if not debug: input_, output = os.popen4(cmd) - print output.read() + print(output.read()) output.close() input_.close() diff --git a/src/music_track_listener.py b/src/music_track_listener.py index 30ee57ce3..4d68901ac 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -290,14 +290,14 @@ class MusicTrackListener(GObject.GObject): if __name__ == '__main__': def music_track_change_cb(listener, music_track_info): if music_track_info is None: - print 'Stop!' + print('Stop!') else: - print music_track_info.title + print(music_track_info.title) listener = MusicTrackListener.get() listener.connect('music-track-changed', music_track_change_cb) track = listener.get_playing_track() if track is None: - print 'Now not playing anything' + print('Now not playing anything') else: - print 'Now playing: "%s" by %s' % (track.title, track.artist) + print('Now playing: "%s" by %s' % (track.title, track.artist)) GObject.MainLoop().run() diff --git a/test/integration/test_resolver.py b/test/integration/test_resolver.py index d80ffee87..2de36d8e8 100644 --- a/test/integration/test_resolver.py +++ b/test/integration/test_resolver.py @@ -46,7 +46,7 @@ class TestResolver(unittest.TestCase): def testLibAsyncNSResolver(self): self._reset() if not resolver.USE_LIBASYNCNS: - print 'testLibAsyncResolver: libasyncns-python not installed' + print('testLibAsyncResolver: libasyncns-python not installed') return self.resolver = resolver.LibAsyncNSResolver() diff --git a/test/integration/test_xmpp_client_nb.py b/test/integration/test_xmpp_client_nb.py index 971f321de..3159552ba 100644 --- a/test/integration/test_xmpp_client_nb.py +++ b/test/integration/test_xmpp_client_nb.py @@ -132,7 +132,7 @@ class TestNonBlockingClient(unittest.TestCase): self.assert_(self.connection.con) features = self.client.Dispatcher.Stream.features if not features.getTag('auth'): - print "Server doesn't support old authentication type, ignoring test" + print("Server doesn't support old authentication type, ignoring test") else: self.assert_(self.connection.auth=='old_auth', msg='Unable to auth via old_auth') diff --git a/test/runtests.py b/test/runtests.py index 663f7d5b2..e199b9052 100755 --- a/test/runtests.py +++ b/test/runtests.py @@ -18,12 +18,12 @@ try: longargs = 'help no-x verbose=' opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) except getopt.error, msg: - print msg - print 'for help use --help' + print(msg) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print 'runtests [--help] [--no-x] [--verbose level]' + print('runtests [--help] [--no-x] [--verbose level]') sys.exit() elif o in ('-n', '--no-x'): use_x = False @@ -31,7 +31,7 @@ for o, a in opts: try: verbose = int(a) except Exception: - print 'verbose must be a number >= 0' + print('verbose must be a number >= 0') sys.exit(2) # new test modules need to be added manually diff --git a/test/unit/test_socks5.py b/test/unit/test_socks5.py index 3d5d92943..86f46d033 100644 --- a/test/unit/test_socks5.py +++ b/test/unit/test_socks5.py @@ -16,10 +16,10 @@ from common import jingle_xtls class fake_sock(Mock): def __init__(self, sockobj): Mock.__init__(self) - + self.sockobj = sockobj - - + + def setup_stream(self): sha1 = self.sockobj._get_sha1_auth() @@ -36,29 +36,29 @@ class fake_sock(Mock): def switch_stream(self): # Roles are reversed, client will be expecting server stream # and server will be expecting client stream - + temp = self.incoming self.incoming = self.outgoing self.outgoing = temp def _recv(self, foo): return self.incoming.pop(0) - + def _send(self, data): - # This method is surrounded by a try block, + # This method is surrounded by a try block, # we can't use assert here - + if data != self.outgoing[0]: - print 'FAILED SENDING TEST' + print('FAILED SENDING TEST') self.outgoing.pop(0) class fake_idlequeue(Mock): def __init__(self): - Mock.__init__(self) - + Mock.__init__(self) + def plug_idle(self, obj, writable=True, readable=True): - + if readable: obj.pollin() if writable: @@ -77,7 +77,7 @@ class TestSocks5(unittest.TestCase): queue.file_props = {} #self.sockobj = Socks5Receiver(fake_idlequeue(), streamhost, None) self.sockobj = Socks5Sender(fake_idlequeue(), None, 'server', Mock() , - None, None, True, file_props={}) + None, None, True, file_props={}) sock = fake_sock(self.sockobj) self.sockobj._sock = sock self.sockobj._recv = sock._recv @@ -85,70 +85,70 @@ class TestSocks5(unittest.TestCase): self.sockobj.state = 1 self.sockobj.connected = True self.sockobj.pollend = self._pollend - + # Something that the receiver needs #self.sockobj.file_props['type'] = 'r' - + # Something that the sender needs self.sockobj.file_props = {} self.sockobj.file_props['type'] = 'r' self.sockobj.file_props['paused'] = '' self.sockobj.queue = Mock() self.sockobj.queue.process_result = self._pollend - + def _pollend(self, foo = None, duu = None): # This is a disconnect function sys.exit("end of the road") def _check_inout(self): # Check if there isn't anything else to receive or send - sock = self.sockobj._sock + sock = self.sockobj._sock assert(sock.incoming == []) assert(sock.outgoing == []) - + def test_connection_server(self): return mocksock = self.sockobj._sock mocksock.setup_stream() - #self.sockobj._sock.switch_stream() + #self.sockobj._sock.switch_stream() s = socket.socket(2, 1, 6) server = ('127.0.0.1', 28000) s.connect(server) - - s.send(mocksock.outgoing.pop(0)) - self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) - + s.send(mocksock.outgoing.pop(0)) self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) - + + s.send(mocksock.outgoing.pop(0)) + self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) + def test_connection_client(self): - - + + mocksock = self.sockobj._sock mocksock.setup_stream() - mocksock.switch_stream() + mocksock.switch_stream() s = socket.socket(10, 1, 6) - - + + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - + netadd = ('::', 28000, 0, 0) s.bind(netadd) s.listen(socket.SOMAXCONN) (s, address) = s.accept() - - - self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) + + + self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) s.send(mocksock.outgoing.pop(0)) - + buff = s.recv(64) inco = mocksock.incoming.pop(0) #self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) s.send(mocksock.outgoing.pop(0)) - + def test_client_negoc(self): return self.sockobj._sock.setup_stream() @@ -156,22 +156,22 @@ class TestSocks5(unittest.TestCase): self.sockobj.pollout() except SystemExit: pass - - self._check_inout() - + + self._check_inout() + def test_server_negoc(self): return self.sockobj._sock.setup_stream() - self.sockobj._sock.switch_stream() + self.sockobj._sock.switch_stream() try: self.sockobj.idlequeue.plug_idle(self.sockobj, False, True) except SystemExit: pass self._check_inout() - - - + + + if __name__ == '__main__': - + unittest.main() From 414e3493453630eaf69abb69f1bddd578a9461e1 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 19:44:25 +0100 Subject: [PATCH 018/592] python uses unicode internally --- src/adhoc_commands.py | 4 +- src/advanced_configuration_window.py | 32 +++-- src/atom_window.py | 6 +- src/chat_control.py | 4 +- src/common/atom.py | 6 +- src/common/check_paths.py | 32 ++--- src/common/commands.py | 18 +-- src/common/configpaths.py | 60 ++++----- src/common/connection_handlers.py | 2 +- src/common/dataforms.py | 8 +- src/common/helpers.py | 21 ++-- src/common/i18n.py | 8 +- src/common/kwalletbinding.py | 2 +- src/common/logger.py | 5 +- src/common/optparser.py | 4 +- src/common/rst_xhtml_generator.py | 4 +- src/config.py | 133 ++++++++++---------- src/dataforms_widget.py | 6 +- src/dialogs.py | 91 +++++++------- src/disco.py | 52 ++++---- src/features_window.py | 2 +- src/filetransfers_window.py | 20 +-- src/gajim_themes_window.py | 5 +- src/groupchat_control.py | 32 +++-- src/gtkgui_helpers.py | 6 +- src/gui_interface.py | 6 +- src/history_manager.py | 14 +-- src/history_window.py | 4 +- src/htmltextview.py | 4 +- src/plugins/gui.py | 2 +- src/plugins/plugin.py | 10 +- src/profile_window.py | 4 +- src/roster_window.py | 175 +++++++++++++-------------- src/statusicon.py | 2 +- test/integration/test_roster.py | 4 +- test/lib/data.py | 90 +++++++------- test/unit/test_jingle.py | 78 ++++++------ test/unit/test_xmpp_transports_nb.py | 30 ++--- 38 files changed, 482 insertions(+), 504 deletions(-) diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index a22bea8e7..2013807f7 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -452,7 +452,7 @@ class CommandWindow: note = command.getTag('note') if note: - self.notes_label.set_text(note.getData().decode('utf-8')) + self.notes_label.set_text(note.getData()) self.notes_label.set_no_show_all(False) self.notes_label.show() else: @@ -510,7 +510,7 @@ class CommandWindow: try: errorname = nbxmpp.NS_STANZAS + ' ' + str(errorid) errordesc = nbxmpp.ERRORS[errorname][2] - error = errordesc.decode('utf-8') + error = errordesc del errorname, errordesc except KeyError: # when stanza doesn't have error description error = _('Service returned an error.') diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 7463b6f7d..84847b6d9 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -141,8 +141,7 @@ class AdvancedConfigurationWindow(object): """ optname = model[iter_][C_PREFNAME] opttype = model[iter_][C_TYPE] - - if opttype.decode('utf-8') == self.types['boolean'] or optname == 'password': + if opttype == self.types['boolean'] or optname == 'password': cell.set_property('editable', False) else: cell.set_property('editable', True) @@ -153,10 +152,10 @@ class AdvancedConfigurationWindow(object): # path[1] is the key name # path[2] is the root of tree # last two is optional - path = [model[iter_][0].decode('utf-8')] + path = [model[iter_][0]] parent = model.iter_parent(iter_) while parent: - path.append(model[parent][0].decode('utf-8')) + path.append(model[parent][0]) parent = model.iter_parent(parent) return path @@ -194,17 +193,17 @@ class AdvancedConfigurationWindow(object): def on_advanced_treeview_row_activated(self, treeview, path, column): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') - if modelrow[2].decode('utf-8') == self.types['boolean']: + option = modelrow[0] + if modelrow[2] == self.types['boolean']: for key in self.right_true_dict.keys(): - if self.right_true_dict[key] == modelrow[1].decode('utf-8'): + if self.right_true_dict[key] == modelrow[1]: modelrow[1] = str(key) newval = {'False': True, 'True': False}[modelrow[1]] if len(modelpath.get_indices()) > 1: optnamerow = self.model[modelpath.get_indices()[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath.get_indices()[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], newval) gajim.config.set_per(optname, key, option, newval) @@ -234,13 +233,12 @@ class AdvancedConfigurationWindow(object): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] modelpath = modelpath.get_indices() - option = modelrow[0].decode('utf-8') - text = text.decode('utf-8') + option = modelrow[0] if len(modelpath) > 1: optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], text) gajim.config.set_per(optname, key, option, text) @@ -269,12 +267,12 @@ class AdvancedConfigurationWindow(object): return modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') + option = modelrow[0] if len(modelpath) > 1: optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[C_VALUE], default) gajim.config.set_per(optname, key, option, default) @@ -317,7 +315,7 @@ class AdvancedConfigurationWindow(object): self.model.append(parent, [name, value, type_]) def visible_func(self, model, treeiter, data): - search_string = self.entry.get_text().decode('utf-8').lower() + search_string = self.entry.get_text().lower() for it in tree_model_pre_order(model, treeiter): if model[it][C_TYPE] != '': opt_path = self.get_option_path(model, it) diff --git a/src/atom_window.py b/src/atom_window.py index f0cb83f76..247a20758 100644 --- a/src/atom_window.py +++ b/src/atom_window.py @@ -84,20 +84,20 @@ class AtomWindow: # fill the fields if newentry.feed_link is not None: self.feed_title_label.set_markup( - u'%s' % \ + '%s' % \ GObject.markup_escape_text(newentry.feed_title)) else: self.feed_title_label.set_markup( GObject.markup_escape_text(newentry.feed_title)) self.feed_tagline_label.set_markup( - u'%s' % \ + '%s' % \ GObject.markup_escape_text(newentry.feed_tagline)) if newentry.title: if newentry.uri is not None: self.entry_title_label.set_markup( - u'%s' % \ + '%s' % \ GObject.markup_escape_text(newentry.title)) else: self.entry_title_label.set_markup( diff --git a/src/chat_control.py b/src/chat_control.py index 29aa2b781..80d374119 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -620,7 +620,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): message_buffer = self.msg_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter, False).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, False) xhtml = self.msg_textview.get_xhtml() # send the message @@ -2842,7 +2842,7 @@ class ChatControl(ChatControlBase): type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return - dropped_jid = data.decode('utf-8') + dropped_jid = data dropped_transport = gajim.get_transport_name_from_jid(dropped_jid) c_transport = gajim.get_transport_name_from_jid(c.jid) diff --git a/src/common/atom.py b/src/common/atom.py index a5ec628ef..d9ec2f067 100644 --- a/src/common/atom.py +++ b/src/common/atom.py @@ -100,13 +100,13 @@ class OldEntry(nbxmpp.Node, object): if main_feed is not None and source_feed is not None: - return u'%s: %s' % (main_feed, source_feed) + return '%s: %s' % (main_feed, source_feed) elif main_feed is not None: return main_feed elif source_feed is not None: return source_feed else: - return u'' + return '' feed_title = property(get_feed_title, None, None, ''' Title of feed. It is built from entry''s original feed title and title of feed @@ -173,4 +173,4 @@ class OldEntry(nbxmpp.Node, object): updated = property(get_updated, None, None, ''' Last significant modification time. ''') - feed_tagline = u'' + feed_tagline = '' diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 6dbab7945..e45497179 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -133,11 +133,11 @@ def split_db(): try: import configpaths OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( - os.environ[u'appdata']), u'Gajim') + os.environ['appdata']), 'Gajim') except KeyError: - OLD_LOG_DB_FOLDER = u'.' + OLD_LOG_DB_FOLDER = '.' else: - OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') + OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') tmp = logger.CACHE_DB_PATH logger.CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') @@ -148,7 +148,7 @@ def split_db(): os.chdir(back) cur = con.cursor() cur.execute('''SELECT name FROM sqlite_master WHERE type = 'table';''') - tables = cur.fetchall() # we get [(u'jids',), (u'unread_messages',), ... + tables = cur.fetchall() # we get [('jids',), ('unread_messages',), ... tables = [t[0] for t in tables] cur.execute("ATTACH DATABASE '%s' AS cache" % logger.CACHE_DB_PATH) for table in ('caps_cache', 'rooms_last_message_time', 'roster_entry', @@ -189,22 +189,22 @@ def check_and_possibly_move_config(): if os.name == 'nt': try: OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( - os.environ[u'appdata']), u'Gajim') + os.environ['appdata']), 'Gajim') except KeyError: - OLD_LOG_DB_FOLDER = u'.' + OLD_LOG_DB_FOLDER = '.' else: - OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') + OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') if not os.path.exists(OLD_LOG_DB_FOLDER): return - OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'logs.db') - OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'cache.db') - vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'vcards') - vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'avatars') - vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'emoticons') - vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'iconsets') - vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'moods') + OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'logs.db') + OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') + vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'vcards') + vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'avatars') + vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'emoticons') + vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'iconsets') + vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'moods') vars['OLD_MY_ACTIVITY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, - u'activities') + 'activities') OLD_CONFIG_FILES = [] OLD_DATA_FILES = [] for f in os.listdir(OLD_LOG_DB_FOLDER): @@ -345,7 +345,7 @@ def check_and_possibly_create_paths(): print(_('%s is a directory but should be a file') % CACHE_DB_PATH) print(_('Gajim will now exit')) sys.exit() - + if not os.path.exists(XTLS_CERTS): create_path(XTLS_CERTS) if not os.path.exists(LOCAL_XTLS_CERTS): diff --git a/src/common/commands.py b/src/common/commands.py index 4c2c90ad5..b76a4b014 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -104,12 +104,12 @@ class ChangeStatusCommand(AdHocCommand): var = 'presence-type', label = 'Type of presence:', options = [ - (u'chat', _('Free for chat')), - (u'online', _('Online')), - (u'away', _('Away')), - (u'xa', _('Extended away')), - (u'dnd', _('Do not disturb')), - (u'offline', _('Offline - disconnect'))], + ('chat', _('Free for chat')), + ('online', _('Online')), + ('away', _('Away')), + ('xa', _('Extended away')), + ('dnd', _('Do not disturb')), + ('offline', _('Offline - disconnect'))], value = 'online', required = True), dataforms.Field('text-multi', @@ -146,7 +146,7 @@ class ChangeStatusCommand(AdHocCommand): try: presencedesc = form['presence-desc'].value except Exception: # same exceptions as in last comment - presencedesc = u'' + presencedesc = '' response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('The status has been changed.')) @@ -197,7 +197,7 @@ class LeaveGroupchatsCommand(AdHocCommand): options = [] account = self.connection.name for gc in find_current_groupchats(account): - options.append((u'%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ + options.append(('%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ {'nickname': gc[1], 'room_jid': gc[0]})) if not len(options): response, cmd = self.buildResponse(request, status = 'completed') @@ -367,7 +367,7 @@ class ConnectionCommands: if cmd.isVisibleFor(self.isSameJID(jid)): q.addChild('item', { # TODO: find the jid - 'jid': self.getOurBareJID() + u'/' + self.server_resource, + 'jid': self.getOurBareJID() + '/' + self.server_resource, 'node': node, 'name': cmd.commandname}) diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 214d7891e..0a9d90982 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -82,10 +82,10 @@ class ConfigPaths: # variable 'appdata' is in? Assuming it to be in filesystem # encoding. self.config_root = self.cache_root = self.data_root = \ - os.path.join(fse(os.environ[u'appdata']), u'Gajim') + os.path.join(fse(os.environ['appdata']), 'Gajim') except KeyError: # win9x, in cwd - self.config_root = self.cache_root = self.data_root = u'.' + self.config_root = self.cache_root = self.data_root = '.' else: # Unices # Pass in an Unicode string, and hopefully get one back. if HAVE_XDG: @@ -93,23 +93,23 @@ class ConfigPaths: if not self.config_root: # Folder doesn't exist yet. self.config_root = os.path.join(xdg.BaseDirectory.\ - xdg_config_dirs[0], u'gajim') + xdg_config_dirs[0], 'gajim') self.cache_root = os.path.join(xdg.BaseDirectory.xdg_cache_home, - u'gajim') + 'gajim') self.data_root = xdg.BaseDirectory.save_data_path('gajim') if not self.data_root: self.data_root = os.path.join(xdg.BaseDirectory.\ - xdg_data_dirs[0], u'gajim') + xdg_data_dirs[0], 'gajim') else: expand = os.path.expanduser - base = os.getenv('XDG_CONFIG_HOME') or expand(u'~/.config') - self.config_root = os.path.join(base, u'gajim') - base = os.getenv('XDG_CACHE_HOME') or expand(u'~/.cache') - self.cache_root = os.path.join(base, u'gajim') - base = os.getenv('XDG_DATA_HOME') or expand(u'~/.local/share') - self.data_root = os.path.join(base, u'gajim') + base = os.getenv('XDG_CONFIG_HOME') or expand('~/.config') + self.config_root = os.path.join(base, 'gajim') + base = os.getenv('XDG_CACHE_HOME') or expand('~/.cache') + self.cache_root = os.path.join(base, 'gajim') + base = os.getenv('XDG_DATA_HOME') or expand('~/.local/share') + self.data_root = os.path.join(base, 'gajim') def add(self, name, type_, path): self.paths[name] = (type_, path) @@ -138,27 +138,27 @@ class ConfigPaths: if root is not None: self.config_root = self.cache_root = self.data_root = root - d = {'MY_DATA': '', 'LOG_DB': u'logs.db', 'MY_CACERTS': u'cacerts.pem', - 'MY_EMOTS': u'emoticons', 'MY_ICONSETS': u'iconsets', - 'MY_MOOD_ICONSETS': u'moods', 'MY_ACTIVITY_ICONSETS': u'activities', - 'PLUGINS_USER': u'plugins', 'MY_PEER_CERTS': u'certs'} + d = {'MY_DATA': '', 'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem', + 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets', + 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities', + 'PLUGINS_USER': 'plugins', 'MY_PEER_CERTS': 'certs'} for name in d: self.add(name, TYPE_DATA, windowsify(d[name])) - d = {'MY_CACHE': '', 'CACHE_DB': u'cache.db', 'VCARD': u'vcards', - 'AVATAR': u'avatars'} + d = {'MY_CACHE': '', 'CACHE_DB': 'cache.db', 'VCARD': 'vcards', + 'AVATAR': 'avatars'} for name in d: self.add(name, TYPE_CACHE, windowsify(d[name])) self.add('MY_CONFIG', TYPE_CONFIG, '') self.add('MY_CERT', TYPE_CONFIG, '') - basedir = fse(os.environ.get(u'GAJIM_BASEDIR', defs.basedir)) - self.add('DATA', None, os.path.join(basedir, windowsify(u'data'))) - self.add('ICONS', None, os.path.join(basedir, windowsify(u'icons'))) + basedir = fse(os.environ.get('GAJIM_BASEDIR', defs.basedir)) + self.add('DATA', None, os.path.join(basedir, windowsify('data'))) + self.add('ICONS', None, os.path.join(basedir, windowsify('icons'))) self.add('HOME', None, fse(os.path.expanduser('~'))) self.add('PLUGINS_BASE', None, os.path.join(basedir, - windowsify(u'plugins'))) + windowsify('plugins'))) try: self.add('TMP', None, fse(tempfile.gettempdir())) except IOError, e: @@ -173,17 +173,17 @@ class ConfigPaths: pass def init_profile(self, profile=''): - conffile = windowsify(u'config') - pidfile = windowsify(u'gajim') - secretsfile = windowsify(u'secrets') - pluginsconfdir = windowsify(u'pluginsconfig') + conffile = windowsify('config') + pidfile = windowsify('gajim') + secretsfile = windowsify('secrets') + pluginsconfdir = windowsify('pluginsconfig') if len(profile) > 0: - conffile += u'.' + profile - pidfile += u'.' + profile - secretsfile += u'.' + profile - pluginsconfdir += u'.' + profile - pidfile += u'.pid' + conffile += '.' + profile + pidfile += '.' + profile + secretsfile += '.' + profile + pluginsconfdir += '.' + profile + pidfile += '.pid' self.add('CONFIG_FILE', TYPE_CONFIG, conffile) self.add('PID_FILE', TYPE_CACHE, pidfile) self.add('SECRETS_FILE', TYPE_DATA, secretsfile) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index bf23ecac7..7aa8e532a 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1017,7 +1017,7 @@ class ConnectionHandlersBase: gc_contact = gajim.contacts.get_gc_contact(self.name, obj.jid, nick) if obj.receipt_request_tag and gajim.config.get_per('accounts', self.name, 'answer_receipts') and ((contact and contact.sub \ - not in (u'to', u'none')) or gc_contact) and obj.mtype != 'error': + not in ('to', 'none')) or gc_contact) and obj.mtype != 'error': receipt = nbxmpp.Message(to=obj.fjid, typ='chat') receipt.setID(obj.id_) receipt.setTag('received', namespace='urn:xmpp:receipts', diff --git a/src/common/dataforms.py b/src/common/dataforms.py index 1129ba2e3..bccd35d8a 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -195,7 +195,7 @@ class DataField(ExtendedNode): Human-readable description of field meaning """ def fget(self): - return self.getTagData('desc') or u'' + return self.getTagData('desc') or '' def fset(self, value): assert isinstance(value, basestring) @@ -348,7 +348,7 @@ class StringField(DataField): Value of field. May be any unicode string """ def fget(self): - return self.getTagData('value') or u'' + return self.getTagData('value') or '' def fset(self, value): assert isinstance(value, basestring) @@ -494,7 +494,7 @@ class TextMultiField(DataField): Value held in field """ def fget(self): - value = u'' + value = '' for element in self.iterTags('value'): value += '\n' + element.getData() return value[1:] @@ -643,7 +643,7 @@ class DataForm(ExtendedNode): """ # TODO: the same code is in TextMultiField. join them def fget(self): - value = u'' + value = '' for valuenode in self.getTags('instructions'): value += '\n' + valuenode.getData() return value[1:] diff --git a/src/common/helpers.py b/src/common/helpers.py index 0dbac4c40..7704c1c61 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -144,7 +144,7 @@ def parse_resource(resource): if resource: try: from nbxmpp.stringprepare import resourceprep - return resourceprep.prepare(unicode(resource)) + return resourceprep.prepare(resource) except UnicodeError: raise InvalidFormat, 'Invalid character in resource.' @@ -159,7 +159,7 @@ def prep(user, server, resource): raise InvalidFormat, _('Username must be between 1 and 1023 chars') try: from nbxmpp.stringprepare import nodeprep - user = nodeprep.prepare(unicode(user)) + user = nodeprep.prepare(unicode(user)).encode('utf-8') except UnicodeError: raise InvalidFormat, _('Invalid character in username.') else: @@ -170,7 +170,7 @@ def prep(user, server, resource): raise InvalidFormat, _('Server must be between 1 and 1023 chars') try: from nbxmpp.stringprepare import nameprep - server = nameprep.prepare(unicode(server)) + server = nameprep.prepare(unicode(server)).encode('utf-8') except UnicodeError: raise InvalidFormat, _('Invalid character in hostname.') else: @@ -181,7 +181,7 @@ def prep(user, server, resource): raise InvalidFormat, _('Resource must be between 1 and 1023 chars') try: from nbxmpp.stringprepare import resourceprep - resource = resourceprep.prepare(unicode(resource)) + resource = resourceprep.prepare(unicode(resource)).encode('utf-8') except UnicodeError: raise InvalidFormat, _('Invalid character in resource.') else: @@ -264,7 +264,7 @@ def get_uf_show(show, use_mnemonic = False): uf_show = Q_('?contact has status:Unknown') else: uf_show = Q_('?contact has status:Has errors') - return unicode(uf_show) + return uf_show def get_uf_sub(sub): if sub == 'none': @@ -278,7 +278,7 @@ def get_uf_sub(sub): else: uf_sub = sub - return unicode(uf_sub) + return uf_sub def get_uf_ask(ask): if ask is None: @@ -288,7 +288,7 @@ def get_uf_ask(ask): else: uf_ask = ask - return unicode(uf_ask) + return uf_ask def get_uf_role(role, plural = False): ''' plural determines if you get Moderators or Moderator''' @@ -577,9 +577,6 @@ def reduce_chars_newlines(text, max_chars = 0, max_lines = 0): string = string[:max_chars - 3] + '...' return string - if isinstance(text, str): - text = text.decode('utf-8') - if max_lines == 0: lines = text.split('\n') else: @@ -1431,7 +1428,7 @@ def get_proxy_info(account): login = ['', ''] addr = env_http_proxy[0].split(':') - proxy = {'host': addr[0], 'type' : u'http', 'user':login[0]} + proxy = {'host': addr[0], 'type' : 'http', 'user':login[0]} if len(addr) == 2: proxy['port'] = addr[1] @@ -1442,7 +1439,7 @@ def get_proxy_info(account): proxy['pass'] = login[1] proxy['useauth'] = True else: - proxy['pass'] = u'' + proxy['pass'] = '' return proxy except Exception: diff --git a/src/common/i18n.py b/src/common/i18n.py index 6de7eee31..feea54f2d 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -37,11 +37,11 @@ def paragraph_direction_mark(text): for char in text: bidi = unicodedata.bidirectional(char) if bidi == 'L': - return u'\u200E' + return '\u200E' elif bidi == 'AL' or bidi == 'R': - return u'\u200F' + return '\u200F' - return u'\u200E' + return '\u200E' APP = 'gajim' DIR = defs.localedir @@ -61,7 +61,7 @@ if os.name == 'nt': if lang: os.environ['LANG'] = lang -gettext.install(APP, DIR, unicode = True) +gettext.install(APP, DIR, unicode=False) if gettext._translations: _translation = gettext._translations.values()[0] else: diff --git a/src/common/kwalletbinding.py b/src/common/kwalletbinding.py index af320c2f8..4ae4043b0 100644 --- a/src/common/kwalletbinding.py +++ b/src/common/kwalletbinding.py @@ -53,7 +53,7 @@ def kwallet_get(folder, entry): "-e", entry.encode('utf-8')], stdout=subprocess.PIPE) pw = p.communicate()[0] if p.returncode == 0: - return unicode(pw.decode('utf-8')) + return pw if p.returncode == 1 or p.returncode == 4: # ENOENT return False diff --git a/src/common/logger.py b/src/common/logger.py index 162496cee..693e8aeb3 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -188,7 +188,7 @@ class Logger: def get_jids_already_in_db(self): try: self.cur.execute('SELECT jid FROM jids') - # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + # list of tupples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() except sqlite.DatabaseError: raise exceptions.DatabaseMalformed @@ -1048,6 +1048,8 @@ class Logger: FROM roster_entry re, jids j WHERE re.account_jid_id=? AND j.jid_id=re.jid_id''', (account_jid_id,)) for jid, jid_id, name, subscription, ask in self.cur: + jid = jid.encode('utf-8') + name = name.encode('utf-8') data[jid] = {} if name: data[jid]['name'] = name @@ -1071,6 +1073,7 @@ class Logger: WHERE account_jid_id=? AND jid_id=?''', (account_jid_id, data[jid]['id'])) for (group_name,) in self.cur: + group_name = group_name.encode('utf-8') data[jid]['groups'].append(group_name) del data[jid]['id'] diff --git a/src/common/optparser.py b/src/common/optparser.py index f99d2fae8..29a4966e2 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -61,7 +61,7 @@ class OptionsParser: for line in fd: try: - line = line.decode('utf-8') + line = helpers.ensure_utf8_string(line) except UnicodeDecodeError: line = line.decode(locale.getpreferredencoding()) optname, key, subname, value = regex.match(line).groups() @@ -715,7 +715,7 @@ class OptionsParser: """ dirs = ['../data', gajim.gajimpaths.data_root, gajim.DATA_DIR] if os.name != 'nt': - dirs.append(os.path.expanduser(u'~/.gajim')) + dirs.append(os.path.expanduser('~/.gajim')) for evt in gajim.config.get_per('soundevents'): path = gajim.config.get_per('soundevents', evt, 'path') # absolute and relative passes are necessary diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index b60bc5174..35907a03d 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -120,7 +120,7 @@ else: # in the JEP #   == u"\u00a0" self.pub.writer.translator_class.attribution_formats['dash'] = ( - u'\u2014', '') + '\u2014', '') self.pub.process_programmatic_settings(settings_spec, settings_overrides, config_section) @@ -137,7 +137,7 @@ else: output = self.pub.publish(enable_exit_status=enable_exit_status) # kludge until we can get docutils to stop generating (rare)   # entities - return u'\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( + return '\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( ' ')) Generator = HTMLGenerator() diff --git a/src/config.py b/src/config.py index 8b22f571e..a0693e1c6 100644 --- a/src/config.py +++ b/src/config.py @@ -684,7 +684,7 @@ class PreferencesWindow: def on_emoticons_combobox_changed(self, widget): active = widget.get_active() model = widget.get_model() - emot_theme = model[active][0].decode('utf-8') + emot_theme = model[active][0] if emot_theme == _('Disabled'): gajim.config.set('emoticons_theme', '') else: @@ -770,7 +770,7 @@ class PreferencesWindow: def on_theme_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() - config_theme = model[active][0].decode('utf-8').replace(' ', '_') + config_theme = model[active][0].replace(' ', '_') gajim.config.set('roster_theme', config_theme) @@ -800,7 +800,7 @@ class PreferencesWindow: def on_iconset_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() - icon_string = model[active][1].decode('utf-8') + icon_string = model[active][1] gajim.config.set('iconset', icon_string) gtkgui_helpers.reload_jabber_state_images() @@ -1019,7 +1019,7 @@ class PreferencesWindow: gajim.config.get('autoxatime') * 60) def on_auto_away_message_entry_changed(self, widget): - gajim.config.set('autoaway_message', widget.get_text().decode('utf-8')) + gajim.config.set('autoaway_message', widget.get_text()) def on_auto_xa_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autoxa', @@ -1033,7 +1033,7 @@ class PreferencesWindow: gajim.config.get('autoxatime') * 60) def on_auto_xa_message_entry_changed(self, widget): - gajim.config.set('autoxa_message', widget.get_text().decode('utf-8')) + gajim.config.set('autoxa_message', widget.get_text()) def on_prompt_online_status_message_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'ask_online_status') @@ -1067,7 +1067,7 @@ class PreferencesWindow: def on_default_msg_treemodel_row_changed(self, model, path, iter_): status = model[iter_][0] - message = model[iter_][2].decode('utf-8') + message = model[iter_][2] message = helpers.to_one_line(message) gajim.config.set_per('defaultstatusmsg', status, 'enabled', model[iter_][3]) @@ -1084,20 +1084,18 @@ class PreferencesWindow: gajim.config.del_per('statusmsg', msg) iter_ = model.get_iter_first() while iter_: - val = model[iter_][0].decode('utf-8') + val = model[iter_][0] if model[iter_][1]: # we have a preset message if not val: # no title, use message text for title val = model[iter_][1] gajim.config.add_per('statusmsg', val) - msg = helpers.to_one_line(model[iter_][1].decode('utf-8')) + msg = helpers.to_one_line(model[iter_][1]) gajim.config.set_per('statusmsg', val, 'message', msg) i = 2 # store mood / activity for subname in ('activity', 'subactivity', 'activity_text', 'mood', 'mood_text'): val = model[iter_][i] - if val: - val = val.decode('utf-8') gajim.config.set_per('statusmsg', val, subname, val) i += 1 iter_ = model.iter_next(iter_) @@ -1111,7 +1109,7 @@ class PreferencesWindow: def on_av_combobox_changed(self, combobox, config_name): model = combobox.get_model() active = combobox.get_active() - device = model[active][1].decode('utf-8') + device = model[active][1] gajim.config.set(config_name, device) def on_audio_input_combobox_changed(self, widget): @@ -1137,7 +1135,7 @@ class PreferencesWindow: [self.xml.get_object('stun_server_entry')]) def stun_server_entry_changed(self, widget): - gajim.config.set('stun_server', widget.get_text().decode('utf-8')) + gajim.config.set('stun_server', widget.get_text()) def on_applications_combobox_changed(self, widget): if widget.get_active() == 0: @@ -1148,13 +1146,13 @@ class PreferencesWindow: self.xml.get_object('custom_apps_frame').show() def on_custom_browser_entry_changed(self, widget): - gajim.config.set('custombrowser', widget.get_text().decode('utf-8')) + gajim.config.set('custombrowser', widget.get_text()) def on_custom_mail_client_entry_changed(self, widget): - gajim.config.set('custommailapp', widget.get_text().decode('utf-8')) + gajim.config.set('custommailapp', widget.get_text()) def on_custom_file_manager_entry_changed(self, widget): - gajim.config.set('custom_file_manager', widget.get_text().decode('utf-8')) + gajim.config.set('custom_file_manager', widget.get_text()) def on_log_show_changes_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'log_contact_status_changes') @@ -1260,7 +1258,7 @@ class PreferencesWindow: def on_proxies_combobox_changed(self, widget): active = widget.get_active() - proxy = widget.get_model()[active][0].decode('utf-8') + proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' @@ -1371,7 +1369,7 @@ class ManageProxiesWindow: (model, iter_) = sel.get_selected() if not iter_: return - proxy = model[iter_][0].decode('utf-8') + proxy = model[iter_][0] model.remove(iter_) gajim.config.del_per('proxies', proxy) self.xml.get_object('remove_proxy_button').set_sensitive(False) @@ -1386,7 +1384,7 @@ class ManageProxiesWindow: if self.block_signal: return act = widget.get_active() - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'useauth', act) self.xml.get_object('proxyuser_entry').set_sensitive(act) self.xml.get_object('proxypass_entry').set_sensitive(act) @@ -1395,7 +1393,7 @@ class ManageProxiesWindow: if self.block_signal: return act = widget.get_active() - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'bosh_useproxy', act) self.xml.get_object('proxyhost_entry').set_sensitive(act) self.xml.get_object('proxyport_entry').set_sensitive(act) @@ -1484,8 +1482,8 @@ class ManageProxiesWindow: (model, iter_) = sel.get_selected() if not iter_: return - old_name = model.get_value(iter_, 0).decode('utf-8') - new_name = widget.get_text().decode('utf-8') + old_name = model.get_value(iter_, 0) + new_name = widget.get_text() if new_name == '': return if new_name == old_name: @@ -1503,42 +1501,42 @@ class ManageProxiesWindow: types = ['http', 'socks5', 'bosh'] type_ = self.proxytype_combobox.get_active() self.show_bosh_fields(types[type_]=='bosh') - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'type', types[type_]) def on_proxyhost_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'host', value) def on_proxyport_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'port', value) def on_proxyuser_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'user', value) def on_boshuri_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'bosh_uri', value) def on_proxypass_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'pass', value) @@ -1613,7 +1611,7 @@ class AccountsWindow: model = self.accounts_treeview.get_model() iter_ = model.get_iter_first() while iter_: - acct = model[iter_][0].decode('utf-8') + acct = model[iter_][0] if account == acct: self.accounts_treeview.set_cursor(model.get_path(iter_)) return @@ -1693,7 +1691,7 @@ class AccountsWindow: if sel: (model, iter_) = sel.get_selected() if iter_: - account = model[iter_][0].decode('utf-8') + account = model[iter_][0] else: account = None else: @@ -2342,7 +2340,7 @@ class AccountsWindow: def on_proxies_combobox1_changed(self, widget): active = widget.get_active() - proxy = widget.get_model()[active][0].decode('utf-8') + proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' @@ -2384,7 +2382,7 @@ class AccountsWindow: def on_custom_host_entry1_changed(self, widget): if self.ignore_events: return - host = widget.get_text().decode('utf-8') + host = widget.get_text() if self.option_changed('custom_host', host): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, 'custom_host', @@ -2655,7 +2653,7 @@ class AccountsWindow: def on_first_name_entry2_changed(self, widget): if self.ignore_events: return - name = widget.get_text().decode('utf-8') + name = widget.get_text() if self.option_changed('zeroconf_first_name', name): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2664,7 +2662,7 @@ class AccountsWindow: def on_last_name_entry2_changed(self, widget): if self.ignore_events: return - name = widget.get_text().decode('utf-8') + name = widget.get_text() if self.option_changed('zeroconf_last_name', name): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2673,7 +2671,7 @@ class AccountsWindow: def on_jabber_id_entry2_changed(self, widget): if self.ignore_events: return - id_ = widget.get_text().decode('utf-8') + id_ = widget.get_text() if self.option_changed('zeroconf_jabber_id', id_): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2682,7 +2680,7 @@ class AccountsWindow: def on_email_entry2_changed(self, widget): if self.ignore_events: return - email = widget.get_text().decode('utf-8') + email = widget.get_text() if self.option_changed('zeroconf_email', email): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2733,7 +2731,7 @@ class FakeDataForm(Gtk.Table, object): def get_infos(self): for name in self.entries.keys(): - self.infos[name] = self.entries[name].get_text().decode('utf-8') + self.infos[name] = self.entries[name].get_text() return self.infos class ServiceRegistrationWindow: @@ -2906,7 +2904,7 @@ class GroupchatConfigWindow: def on_cell_edited(self, cell, path, new_text): model = self.affiliation_treeview['outcast'].get_model() - new_text = new_text.decode('utf-8') + new_text = new_text iter_ = model.get_iter(path) model[iter_][1] = new_text @@ -2984,12 +2982,12 @@ class GroupchatConfigWindow: iter_ = model.get_iter_first() # add new jid while iter_: - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] actual_jid_list.append(jid) if jid not in self.start_users_dict[affiliation] or \ (affiliation == 'outcast' and 'reason' in self.start_users_dict[ affiliation][jid] and self.start_users_dict[affiliation][jid]\ - ['reason'] != model[iter_][1].decode('utf-8')): + ['reason'] != model[iter_][1]): users_dict[jid] = {'affiliation': affiliation} if affiliation == 'outcast': users_dict[jid]['reason'] = model[iter_][1].decode( @@ -3236,7 +3234,7 @@ class ManageBookmarksWindow: # No parent, so we got an account -> add to this. add_to = iter_ - account = model[add_to][1].decode('utf-8') + account = model[add_to][1] nick = gajim.nicks[account] iter_ = self.treestore.append(add_to, [account, _('New Group Chat'), '@', False, False, '', nick, 'in_and_out']) @@ -3269,8 +3267,8 @@ class ManageBookmarksWindow: #Account data can't be changed return - if self.server_entry.get_text().decode('utf-8') == '' or \ - self.room_entry.get_text().decode('utf-8') == '': + if self.server_entry.get_text() == '' or \ + self.room_entry.get_text() == '': dialogs.ErrorDialog(_('This bookmark has invalid data'), _('Please be sure to fill out server and room fields or remove this' ' bookmark.')) @@ -3290,7 +3288,7 @@ class ManageBookmarksWindow: return for account in self.treestore: - account_unicode = account[1].decode('utf-8') + account_unicode = account[1] gajim.connections[account_unicode].bookmarks = [] for bm in account.iterchildren(): @@ -3298,17 +3296,9 @@ class ManageBookmarksWindow: autojoin = unicode(int(bm[3])) minimize = unicode(int(bm[4])) name = bm[1] - if name: - name = name.decode('utf-8') jid = bm[2] - if jid: - jid = jid.decode('utf-8') pw = bm[5] - if pw: - pw = pw.decode('utf-8') nick = bm[6] - if nick: - nick = nick.decode('utf-8') # create the bookmark-dict bmdict = { 'name': name, 'jid': jid, 'autojoin': autojoin, @@ -3353,7 +3343,7 @@ class ManageBookmarksWindow: # Fill in the data for childs self.title_entry.set_text(model[iter_][1]) - room_jid = model[iter_][2].decode('utf-8') + room_jid = model[iter_][2] (room, server) = room_jid.split('@') self.room_entry.set_text(room) self.server_entry.set_text(server) @@ -3364,7 +3354,7 @@ class ManageBookmarksWindow: self.minimize_checkbutton.set_sensitive(model[iter_][3]) if model[iter_][5] is not None: - password = model[iter_][5].decode('utf-8') + password = model[iter_][5] else: password = None @@ -3374,7 +3364,6 @@ class ManageBookmarksWindow: self.pass_entry.set_text('') nick = model[iter_][6] if nick: - nick = nick.decode('utf-8') self.nick_entry.set_text(nick) else: self.nick_entry.set_text('') @@ -3393,7 +3382,7 @@ class ManageBookmarksWindow: def on_nick_entry_changed(self, widget): (model, iter_) = self.selection.get_selected() if iter_: - nick = self.nick_entry.get_text().decode('utf-8') + nick = self.nick_entry.get_text() try: nick = helpers.parse_resource(nick) except helpers.InvalidFormat, e: @@ -3407,12 +3396,12 @@ class ManageBookmarksWindow: (model, iter_) = self.selection.get_selected() if not iter_: return - server = widget.get_text().decode('utf-8') + server = widget.get_text() if '@' in server: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) widget.set_text(server.replace('@', '')) - room_jid = self.room_entry.get_text().decode('utf-8').strip() + '@' + \ + room_jid = self.room_entry.get_text().strip() + '@' + \ server.strip() try: room_jid = helpers.parse_resource(room_jid) @@ -3427,12 +3416,12 @@ class ManageBookmarksWindow: (model, iter_) = self.selection.get_selected() if not iter_: return - room = widget.get_text().decode('utf-8') + room = widget.get_text() if '@' in room: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) widget.set_text(room.replace('@', '')) room_jid = room.strip() + '@' + \ - self.server_entry.get_text().decode('utf-8').strip() + self.server_entry.get_text().strip() try: room_jid = helpers.parse_resource(room_jid) except helpers.InvalidFormat, e: @@ -3641,7 +3630,7 @@ class AccountCreationWizardWindow: dialogs.ErrorDialog(pritext, sectext) return server = self.xml.get_object('server_comboboxentry').get_child().\ - get_text().decode('utf-8').strip() + get_text().strip() savepass = self.xml.get_object('save_password_checkbutton').\ get_active() password = self.xml.get_object('password_entry').get_text().decode( @@ -3675,7 +3664,7 @@ class AccountCreationWizardWindow: elif cur_page == 2: # We are creating a new account server = self.xml.get_object('server_comboboxentry1').get_child().\ - get_text().decode('utf-8') + get_text() if not server: dialogs.ErrorDialog(_('Invalid server'), @@ -3691,7 +3680,7 @@ class AccountCreationWizardWindow: # Get advanced options proxies_combobox = self.xml.get_object('proxies_combobox') active = proxies_combobox.get_active() - proxy = proxies_combobox.get_model()[active][0].decode('utf-8') + proxy = proxies_combobox.get_model()[active][0] if proxy == _('None'): proxy = '' config['proxy'] = proxy @@ -3707,7 +3696,7 @@ class AccountCreationWizardWindow: return config['custom_port'] = custom_port config['custom_host'] = self.xml.get_object( - 'custom_host_entry').get_text().decode('utf-8') + 'custom_host_entry').get_text() if self.xml.get_object('anonymous_checkbutton2').get_active(): self.modify = True @@ -4161,11 +4150,11 @@ class ManageSoundsWindow: self.window.show_all() def on_sounds_treemodel_row_changed(self, model, path, iter_): - sound_event = model[iter_][3].decode('utf-8') + sound_event = model[iter_][3] gajim.config.set_per('soundevents', sound_event, 'enabled', - bool(model[path][0])) + bool(model[path][0])) gajim.config.set_per('soundevents', sound_event, 'path', - model[iter_][2].decode('utf-8')) + model[iter_][2]) def sound_toggled_cb(self, cell, path): model = self.sound_tree.get_model() @@ -4238,7 +4227,7 @@ class ManageSoundsWindow: def on_cancel(widget): self.dialog.destroy() - path_to_snd_file = model[iter_][2].decode('utf-8') + path_to_snd_file = model[iter_][2] self.dialog = dialogs.SoundChooserDialog(path_to_snd_file, on_ok, on_cancel) diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index e686062b8..c6c72138b 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -114,12 +114,12 @@ class DataFormWidget(Gtk.Alignment, object): def get_title(self): """ Get the title of data form, as a unicode object. If no title or no form, - returns u''. Useful for setting window title + returns ''. Useful for setting window title """ if self._data_form is not None: if self._data_form.title is not None: return self._data_form.title - return u'' + return '' title = property(get_title, None, None, 'Data form title') @@ -540,7 +540,7 @@ class SingleForm(Gtk.Table, object): field) widget.set_sensitive(readwrite) if field.value is None: - field.value = u'' + field.value = '' widget.set_text(field.value) else: commonwidget=False diff --git a/src/dialogs.py b/src/dialogs.py index 723891ae4..af57189ea 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -127,7 +127,7 @@ class EditGroupsDialog: gajim.interface.roster.draw_group(_('General'), account) def on_add_button_clicked(self, widget): - group = self.xml.get_object('group_entry').get_text().decode('utf-8') + group = self.xml.get_object('group_entry').get_text() if not group: return # Do not allow special groups @@ -137,7 +137,7 @@ class EditGroupsDialog: model = self.treeview.get_model() iter_ = model.get_iter_first() while iter_: - if model.get_value(iter_, 0).decode('utf-8') == group: + if model.get_value(iter_, 0) == group: return iter_ = model.iter_next(iter_) self.changes_made = True @@ -153,7 +153,7 @@ class EditGroupsDialog: model[path][1] = True else: model[path][1] = not model[path][1] - group = model[path][0].decode('utf-8') + group = model[path][0] if model[path][1]: self.add_group(group) else: @@ -251,7 +251,7 @@ class PassphraseDialog: if not self.ok_handler: return - passph = self.passphrase_entry.get_text().decode('utf-8') + passph = self.passphrase_entry.get_text() if self.check: checked = self.xml.get_object('save_passphrase_checkbutton').\ @@ -325,8 +325,7 @@ class ChooseGPGKeyDialog: selection = self.keys_treeview.get_selection() (model, iter_) = selection.get_selected() if iter_ and response == Gtk.ResponseType.OK: - keyID = [ model[iter_][0].decode('utf-8'), - model[iter_][1].decode('utf-8') ] + keyID = [ model[iter_][0], model[iter_][1] ] else: keyID = None self.on_response(keyID) @@ -458,7 +457,7 @@ class ChangeActivityDialog: """ if self.checkbutton.get_active(): self.on_response(self.activity, self.subactivity, - self.entry.get_text().decode('utf-8')) + self.entry.get_text()) else: self.on_response(None, None, '') self.window.destroy() @@ -541,7 +540,7 @@ class ChangeMoodDialog: def on_ok_button_clicked(self, widget): '''Return mood and messsage (None if no mood selected)''' - message = self.entry.get_text().decode('utf-8') + message = self.entry.get_text() self.on_response(self.mood, message) self.window.destroy() @@ -713,8 +712,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): def on_dialog_response(self, dialog, response): if response == Gtk.ResponseType.OK: beg, end = self.message_buffer.get_bounds() - message = self.message_buffer.get_text(beg, end, True).decode('utf-8')\ - .strip() + message = self.message_buffer.get_text(beg, end, True).strip() message = helpers.remove_invalid_xml_chars(message) msg = helpers.to_one_line(message) if self.show: @@ -742,7 +740,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): active = widget.get_active() if active < 0: return None - name = model[active][0].decode('utf-8') + name = model[active][0] self.message_buffer.set_text(self.preset_messages_dict[name][0]) self.pep_dict['activity'] = self.preset_messages_dict[name][1] self.pep_dict['subactivity'] = self.preset_messages_dict[name][2] @@ -778,10 +776,10 @@ class ChangeStatusMessageDialog(TimeoutDialog): status_message_to_save_as_preset = self.message_buffer.get_text( start_iter, finish_iter, True) def on_ok(msg_name): - msg_text = status_message_to_save_as_preset.decode('utf-8') + msg_text = status_message_to_save_as_preset msg_text_1l = helpers.to_one_line(msg_text) if not msg_name: # msg_name was '' - msg_name = msg_text_1l.decode('utf-8') + msg_name = msg_text_1l def on_ok2(): self.preset_messages_dict[msg_name] = [ @@ -1034,7 +1032,7 @@ class AddNewContactWindow: self._nec_gateway_prompt_received) def on_register_button_clicked(self, widget): - jid = self.protocol_jid_combobox.get_active_text().decode('utf-8') + jid = self.protocol_jid_combobox.get_active_text() gajim.connections[self.account].request_register_agent_info(jid) def on_add_new_contact_window_key_press_event(self, widget, event): @@ -1051,7 +1049,7 @@ class AddNewContactWindow: """ When Subscribe button is clicked """ - jid = self.uid_entry.get_text().decode('utf-8').strip() + jid = self.uid_entry.get_text().strip() if not jid: return @@ -1091,7 +1089,7 @@ class AddNewContactWindow: ErrorDialog(pritext, _('You cannot add yourself to your roster.')) return - nickname = self.nickname_entry.get_text().decode('utf-8') or '' + nickname = self.nickname_entry.get_text() or '' # get value of account combobox, if account was not specified if not self.account: model = self.account_combobox.get_model() @@ -1110,14 +1108,14 @@ class AddNewContactWindow: message_buffer = self.message_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter, True).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, True) if self.save_message_checkbutton.get_active(): msg = helpers.to_one_line(message) gajim.config.set_per('accounts', self.account, 'subscription_request_msg', msg) else: message= '' - group = self.group_comboboxentry.get_child().get_text().decode('utf-8') + group = self.group_comboboxentry.get_child().get_text() groups = [] if group: groups = [group] @@ -1268,7 +1266,7 @@ class AboutDialog: dlg.set_transient_for(gajim.interface.roster.window) dlg.set_name('Gajim') dlg.set_version(gajim.version) - s = u'Copyright © 2003-2012 Gajim Team' + s = 'Copyright © 2003-2012 Gajim Team' dlg.set_copyright(s) copying_file_path = self.get_path('COPYING') if copying_file_path: @@ -2006,7 +2004,7 @@ class InputDialog(CommonInputDialog): self.input_entry.select_region(0, -1) # select all def get_text(self): - return self.input_entry.get_text().decode('utf-8') + return self.input_entry.get_text() class InputDialogCheck(InputDialog): """ @@ -2032,7 +2030,7 @@ class InputDialogCheck(InputDialog): def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: - user_input = user_input.decode('utf-8') + user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): @@ -2041,7 +2039,7 @@ class InputDialogCheck(InputDialog): self.ok_handler(user_input, self.is_checked()) def get_text(self): - return self.input_entry.get_text().decode('utf-8') + return self.input_entry.get_text() def is_checked(self): """ @@ -2110,7 +2108,7 @@ class ChangeNickDialog(InputDialogCheck): def on_okbutton_clicked(self, widget): nick = self.get_text() if nick: - nick = nick.decode('utf-8') + nick = nick # send presence to room try: nick = helpers.parse_resource(nick) @@ -2162,7 +2160,7 @@ class InputTextDialog(CommonInputDialog): def get_text(self): start_iter, end_iter = self.input_buffer.get_bounds() - return self.input_buffer.get_text(start_iter, end_iter, True).decode('utf-8') + return self.input_buffer.get_text(start_iter, end_iter, True) class DoubleInputDialog: """ @@ -2207,8 +2205,8 @@ class DoubleInputDialog: self.cancel_handler() def on_okbutton_clicked(self, widget): - user_input1 = self.input_entry1.get_text().decode('utf-8') - user_input2 = self.input_entry2.get_text().decode('utf-8') + user_input1 = self.input_entry1.get_text() + user_input2 = self.input_entry2.get_text() self.cancel_handler = None self.dialog.destroy() if not self.ok_handler: @@ -2457,7 +2455,7 @@ class JoinGroupchatWindow: def on_account_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() - self.account = model[iter_][0].decode('utf-8') + self.account = model[iter_][0] self.on_required_entry_changed(self._nickname_entry) def _set_room_jid(self, room_jid): @@ -2468,11 +2466,11 @@ class JoinGroupchatWindow: def on_recently_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() - room_jid = model[iter_][0].decode('utf-8') + room_jid = model[iter_][0] self._set_room_jid(room_jid) def on_browse_rooms_button_clicked(self, widget): - server = self.server_comboboxentry.get_child().get_text().decode('utf-8') + server = self.server_comboboxentry.get_child().get_text() if server in gajim.interface.instances[self.account]['disco']: gajim.interface.instances[self.account]['disco'][server].window.\ present() @@ -2508,12 +2506,11 @@ class JoinGroupchatWindow: _('You have to choose an account from which you want to join the ' 'groupchat.')) return - nickname = self._nickname_entry.get_text().decode('utf-8') - server = self.server_comboboxentry.get_child().get_text().decode('utf-8').\ - strip() - room = self._room_jid_entry.get_text().decode('utf-8').strip() + nickname = self._nickname_entry.get_text() + server = self.server_comboboxentry.get_child().get_text().strip() + room = self._room_jid_entry.get_text().strip() room_jid = room + '@' + server - password = self._password_entry.get_text().decode('utf-8') + password = self._password_entry.get_text() try: nickname = helpers.parse_resource(nickname) except Exception: @@ -2613,7 +2610,7 @@ class SynchroniseSelectAccountDialog: (model, iter_) = sel.get_selected() if not iter_: return - remote_account = model.get_value(iter_, 0).decode('utf-8') + remote_account = model.get_value(iter_, 0) if gajim.connections[remote_account].connected < 2: ErrorDialog(_('This account is not connected to the server'), @@ -2686,7 +2683,7 @@ class SynchroniseSelectContactsDialog: while iter_: if model[iter_][0]: # it is selected - remote_jid = model[iter_][1].decode('utf-8') + remote_jid = model[iter_][1] message = 'I\'m synchronizing my contacts from my %s account, could you please add this address to your contact list?' % \ gajim.get_hostname_from_account(self.remote_account) remote_contact = gajim.contacts.get_first_contact_from_jid( @@ -2773,11 +2770,11 @@ class ChangePasswordDialog: dialog.destroy() self.on_response(None) return - password1 = self.password1_entry.get_text().decode('utf-8') + password1 = self.password1_entry.get_text() if not password1: ErrorDialog(_('Invalid password'), _('You must enter a password.')) return - password2 = self.password2_entry.get_text().decode('utf-8') + password2 = self.password2_entry.get_text() if password1 != password2: ErrorDialog(_('Passwords do not match'), _('The passwords typed in both fields must be identical.')) @@ -3129,7 +3126,7 @@ class SingleMessageWindow: else: sender_list.append(i[0].jid) else: - sender_list = [self.to_entry.get_text().decode('utf-8')] + sender_list = [self.to_entry.get_text()] for to_whom_jid in sender_list: if to_whom_jid in self.completion_dict: @@ -3142,9 +3139,9 @@ class SingleMessageWindow: 'valid.') % to_whom_jid) return True - subject = self.subject_entry.get_text().decode('utf-8') + subject = self.subject_entry.get_text() begin, end = self.message_tv_buffer.get_bounds() - message = self.message_tv_buffer.get_text(begin, end, True).decode('utf-8') + message = self.message_tv_buffer.get_text(begin, end, True) if '/announce/' in to_whom_jid: gajim.connections[self.account].send_motd(to_whom_jid, subject, @@ -3551,14 +3548,14 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - #remote_jid = model[iter_][1].decode('utf-8') + #remote_jid = model[iter_][1] message = _('%s suggested me to add you in my roster.' % self.jid_from) # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: groups = [] - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] if gajim.jid_is_transport(self.jid_from): gajim.connections[self.account].automatically_added.append( jid) @@ -3574,7 +3571,7 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: @@ -3599,7 +3596,7 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] gajim.connections[self.account].unsubscribe(jid) gajim.interface.roster.remove_contact(jid, self.account) gajim.contacts.remove_jid(self.account, jid) @@ -4154,7 +4151,7 @@ class PrivacyListWindow: self.active_rule = '' else: self.active_rule = \ - self.list_of_rules_combobox.get_active_text().decode('utf-8') + self.list_of_rules_combobox.get_active_text() if self.active_rule != '': rule_info = self.global_rules[self.active_rule] self.edit_order_spinbutton.set_value(int(rule_info['order'])) @@ -4952,7 +4949,7 @@ class TransformChatToMUC: guests = self.guests_treeview.get_selection().get_selected_rows() for guest in guests[1]: iter_ = self.store.get_iter(guest) - guest_list.append(self.store[iter_][2].decode('utf-8')) + guest_list.append(self.store[iter_][2]) for guest in self.auto_jids: guest_list.append(guest) room_jid = obj.room_id + '@' + obj.server diff --git a/src/disco.py b/src/disco.py index c3a51f7a9..4d7aed9da 100644 --- a/src/disco.py +++ b/src/disco.py @@ -800,7 +800,7 @@ _('This type of service does not contain any items to browse.')) def on_address_comboboxentry_changed(self, widget): if self.address_comboboxentry.get_active() != -1: # user selected one of the entries so do auto-visit - jid = self.address_comboboxentry.get_child().get_text().decode('utf-8') + jid = self.address_comboboxentry.get_child().get_text() try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat, s: @@ -810,7 +810,7 @@ _('This type of service does not contain any items to browse.')) self.travel(jid, '') def on_go_button_clicked(self, widget): - jid = self.address_comboboxentry.get_child().get_text().decode('utf-8') + jid = self.address_comboboxentry.get_child().get_text() try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat, s: @@ -998,9 +998,9 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] if jid: - node = model[iter_][1].decode('utf-8') + node = model[iter_][1] self.window.open(jid, node) def update_actions(self): @@ -1012,8 +1012,8 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + jid = model[iter_][0] + node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._update_actions, nofetch = True) @@ -1035,8 +1035,8 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + jid = model[iter_][0] + node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._default_action, nofetch = True) @@ -1077,8 +1077,8 @@ class AgentBrowser: """ iter_ = self.model.get_iter_first() while iter_: - cjid = self.model.get_value(iter_, 0).decode('utf-8') - cnode = self.model.get_value(iter_, 1).decode('utf-8') + cjid = self.model.get_value(iter_, 0) + cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) @@ -1226,10 +1226,10 @@ class ToplevelAgentBrowser(AgentBrowser): # These can be None, apparently descr1 = model.get_value(iter1, 3) if descr1: - descr1 = descr1.decode('utf-8') + descr1 = descr1 descr2 = model.get_value(iter2, 3) if descr2: - descr2 = descr2.decode('utf-8') + descr2 = descr2 # Compare strings return cmp(descr1, descr2) return statecmp @@ -1402,7 +1402,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if service in gajim.interface.instances[self.account]['search']: gajim.interface.instances[self.account]['search'][service].window.\ present() @@ -1428,8 +1428,8 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + service = model[iter_][0] + node = model[iter_][1] adhoc_commands.CommandWindow(self.account, service, commandnode=node) def on_register_button_clicked(self, widget = None): @@ -1440,7 +1440,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] if jid: gajim.connections[self.account].request_register_agent_info(jid) self.window.destroy(chain = True) @@ -1453,7 +1453,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if 'join_gc' not in gajim.interface.instances[self.account]: try: dialogs.JoinGroupchatWindow(self.account, service) @@ -1486,7 +1486,7 @@ class ToplevelAgentBrowser(AgentBrowser): self.register_button.set_sensitive(True) # Guess what kind of service we're dealing with if self.browse_button: - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] type_ = gajim.get_transport_name_from_jid(jid, use_config_setting = False) if type_: @@ -1614,7 +1614,7 @@ class ToplevelAgentBrowser(AgentBrowser): cat = self._friendly_category(cat, type_)[0] iter_ = self.model.get_iter_first() while iter_: - if self.model.get_value(iter_, 3).decode('utf-8') == cat: + if self.model.get_value(iter_, 3) == cat: break iter_ = self.model.iter_next(iter_) if iter_: @@ -1627,8 +1627,8 @@ class ToplevelAgentBrowser(AgentBrowser): while cat_iter and not iter_: iter_ = self.model.iter_children(cat_iter) while iter_: - cjid = self.model.get_value(iter_, 0).decode('utf-8') - cnode = self.model.get_value(iter_, 1).decode('utf-8') + cjid = self.model.get_value(iter_, 0) + cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) @@ -1699,7 +1699,7 @@ class ToplevelAgentBrowser(AgentBrowser): # Check if we have to move categories old_cat_iter = self.model.iter_parent(iter_) - old_cat = self.model.get_value(old_cat_iter, 3).decode('utf-8') + old_cat = self.model.get_value(old_cat_iter, 3) if self.model.get_value(old_cat_iter, 3) == cat: # Already in the right category, just update self.model[iter_][2] = pix @@ -1819,7 +1819,7 @@ class MucBrowser(AgentBrowser): if not iter: return name = gajim.config.get_per('accounts', self.account, 'name') - room_jid = model[iter][0].decode('utf-8') + room_jid = model[iter][0] bm = { 'name': room_jid.split('@')[0], 'jid': room_jid, @@ -1853,7 +1853,7 @@ class MucBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if 'join_gc' not in gajim.interface.instances[self.account]: try: dialogs.JoinGroupchatWindow(self.account, service) @@ -1926,8 +1926,8 @@ class MucBrowser(AgentBrowser): pass while iter_ and self.model.get_path(iter_) != end: if not self.model.get_value(iter_, 6): - jid = self.model.get_value(iter_, 0).decode('utf-8') - node = self.model.get_value(iter_, 1).decode('utf-8') + jid = self.model.get_value(iter_, 0) + node = self.model.get_value(iter_, 1) self.cache.get_info(jid, node, self._agent_info) self._fetch_source = True return diff --git a/src/features_window.py b/src/features_window.py index 1bf2bbe1a..396080a51 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -149,7 +149,7 @@ class FeaturesWindow: if not rows: return path = rows[0] - feature = self.model[path][0].decode('utf-8') + feature = self.model[path][0] text = self.features[feature][1] + '\n' if os.name == 'nt': text = text + self.features[feature][3] diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 33ae185b8..ce281023a 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -484,7 +484,7 @@ class FileTransfersWindow: iter_ = self.get_iter_by_sid(file_props.type_, file_props.sid) if iter_ is None: return - self.model[iter_][C_SID].decode('utf-8') + self.model[iter_][C_SID] if status == 'stop': file_props.stopped = True elif status == 'ok': @@ -677,7 +677,7 @@ class FileTransfersWindow: """ iter_ = self.model.get_iter_first() while iter_: - if typ + sid == self.model[iter_][C_SID].decode('utf-8'): + if typ + sid == self.model[iter_][C_SID]: return iter_ iter_ = self.model.iter_next(iter_) @@ -769,7 +769,7 @@ class FileTransfersWindow: except Exception: self.tooltip.hide_tooltip() return - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if file_props is not None: if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: @@ -824,7 +824,7 @@ class FileTransfersWindow: self.set_all_insensitive() return current_iter = self.model.get_iter(path) - sid = self.model[current_iter][C_SID].decode('utf-8') + sid = self.model[current_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self.remove_menuitem.set_sensitive(is_row_selected) self.open_folder_menuitem.set_sensitive(is_row_selected) @@ -882,7 +882,7 @@ class FileTransfersWindow: i = len(self.model) - 1 while i >= 0: iter_ = self.model.get_iter((i)) - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_stopped(file_props): self._remove_transfer(iter_, sid, file_props) @@ -917,7 +917,7 @@ class FileTransfersWindow: if selected is None or selected[1] is None: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_paused(file_props): file_props.last_time = time.time() @@ -939,7 +939,7 @@ class FileTransfersWindow: if selected is None or selected[1] is None: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) account = file_props.tt_account if account not in gajim.connections: @@ -958,7 +958,7 @@ class FileTransfersWindow: # as it was before setting the timeout if props and self.tooltip.id == props[0]: iter_ = self.model.get_iter(props[0]) - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) # bounding rectangle of coordinates for the cell within the treeview rect = self.tree.get_cell_area(props[0], props[1]) @@ -1046,7 +1046,7 @@ class FileTransfersWindow: if not selected or not selected[1]: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if not file_props.file_name: return @@ -1068,7 +1068,7 @@ class FileTransfersWindow: if not selected or not selected[1]: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self._remove_transfer(s_iter, sid, file_props) self.set_all_insensitive() diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index b6ff4e4af..4bac43b8e 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -89,8 +89,7 @@ class GajimThemesWindow: def on_theme_cell_edited(self, cell, row, new_name): model = self.themes_tree.get_model() iter_ = model.get_iter_from_string(row) - old_name = model.get_value(iter_, 0).decode('utf-8') - new_name = new_name.decode('utf-8') + old_name = model.get_value(iter_, 0) if old_name == new_name: return if old_name == 'default': @@ -150,7 +149,7 @@ class GajimThemesWindow: self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) return - self.current_theme = model.get_value(iter_, 0).decode('utf-8') + self.current_theme = model.get_value(iter_, 0) self.current_theme = self.current_theme.replace(' ', '_') self.set_theme_options(self.current_theme) if self.current_theme == 'default': diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 210b9a398..6ade68c4f 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -364,7 +364,7 @@ class GroupchatControl(ChatControlBase): self.handlers[id_] = widget self.room_jid = self.contact.jid - self.nick = contact.name.decode('utf-8') + self.nick = contact.name self.new_nick = '' self.name = '' for bm in gajim.connections[self.account].bookmarks: @@ -528,8 +528,6 @@ class GroupchatControl(ChatControlBase): nick2 = model[iter2][C_NICK] if not nick1 or not nick2: return 0 - nick1 = nick1.decode('utf-8') - nick2 = nick2.decode('utf-8') if type1 == 'role': return locale.strcoll(nick1, nick2) if type1 == 'contact': @@ -631,7 +629,7 @@ class GroupchatControl(ChatControlBase): """ # Get the room_jid from treeview for contact in self.iter_contact_rows(): - nick = contact[C_NICK].decode('utf-8') + nick = contact[C_NICK] self.draw_contact(nick) def on_list_treeview_selection_changed(self, selection): @@ -643,7 +641,7 @@ class GroupchatControl(ChatControlBase): self._last_selected_contact = None return contact = model[selected_iter] - nick = contact[C_NICK].decode('utf-8') + nick = contact[C_NICK] self._last_selected_contact = nick if contact[C_TYPE] != 'contact': return @@ -1042,7 +1040,7 @@ class GroupchatControl(ChatControlBase): while role_iter: user_iter = self.model.iter_children(role_iter) while user_iter: - if nick == self.model[user_iter][C_NICK].decode('utf-8'): + if nick == self.model[user_iter][C_NICK]: return user_iter else: user_iter = self.model.iter_next(user_iter) @@ -1379,7 +1377,7 @@ class GroupchatControl(ChatControlBase): contact in a room """ if nick is None: - nick = model[iter_][C_NICK].decode('utf-8') + nick = model[iter_][C_NICK] ctrl = self._start_private_message(nick) if ctrl and msg: @@ -1832,7 +1830,7 @@ class GroupchatControl(ChatControlBase): def get_role_iter(self, role): role_iter = self.model.get_iter_first() while role_iter: - role_name = self.model[role_iter][C_NICK].decode('utf-8') + role_name = self.model[role_iter][C_NICK] if role == role_name: return role_iter role_iter = self.model.iter_next(role_iter) @@ -2137,7 +2135,7 @@ class GroupchatControl(ChatControlBase): type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return - contact_jid = data.decode('utf-8') + contact_jid = data gajim.connections[self.account].send_invite(self.room_jid, contact_jid) self.print_conversation(_('%(jid)s has been invited in this room') % { 'jid': contact_jid}, graphics=False) @@ -2311,7 +2309,7 @@ class GroupchatControl(ChatControlBase): """ Make contact's popup menu """ - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) fjid = self.room_jid + '/' + nick jid = c.jid @@ -2478,7 +2476,7 @@ class GroupchatControl(ChatControlBase): else: widget.expand_row(path, False) else: # We want to send a private message - nick = self.model[path][C_NICK].decode('utf-8') + nick = self.model[path][C_NICK] self._start_private_message(nick) def on_list_treeview_row_activated(self, widget, path, col=0): @@ -2511,7 +2509,7 @@ class GroupchatControl(ChatControlBase): widget.get_selection().select_path(path) iter_ = self.model.get_iter(path) if len(path) == 2: - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] self._start_private_message(nick) return True @@ -2521,7 +2519,7 @@ class GroupchatControl(ChatControlBase): return True else: iter_ = self.model.get_iter(path) - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] if not nick in gajim.contacts.get_nick_list(self.account, self.room_jid): # it's a group @@ -2564,13 +2562,13 @@ class GroupchatControl(ChatControlBase): except Exception: self.tooltip.hide_tooltip() return - typ = self.model[iter_][C_TYPE].decode('utf-8') + typ = self.model[iter_][C_TYPE] if typ == 'contact': account = self.account if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, gajim.contacts.get_gc_contact( account, self.room_jid, nick)) @@ -2707,8 +2705,8 @@ class GroupchatControl(ChatControlBase): connection = gajim.connections[self.account] if fjid in connection.blocked_contacts: return - new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', - 'value' : fjid, 'child': [u'message', u'iq', u'presence-out']} + new_rule = {'order': '1', 'type': 'jid', 'action': 'deny', + 'value' : fjid, 'child': ['message', 'iq', 'presence-out']} connection.blocked_list.append(new_rule) connection.blocked_contacts.append(fjid) self.draw_contact(nick) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 3e62de3d1..b6e92a9f2 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -195,7 +195,7 @@ def get_default_font(): for line in open(xfce_config_file): if line.find('name="Gtk/FontName"') != -1: start = line.find('value="') + 7 - return line[start:line.find('"', start)].decode('utf-8') + return line[start:line.find('"', start)] except Exception: #we talk about file print(_('Error: cannot open %s for reading') % xfce_config_file, @@ -211,7 +211,7 @@ def get_default_font(): font_name = values[0] font_size = values[1] font_string = '%s %s' % (font_name, font_size) # Verdana 9 - return font_string.decode('utf-8') + return font_string except Exception: #we talk about file print(_('Error: cannot open %s for reading') % kde_config_file, @@ -684,7 +684,7 @@ def decode_filechooser_file_paths(file_paths): file_path = file_path.decode(sys.getfilesystemencoding()) except Exception: try: - file_path = file_path.decode('utf-8') + file_path = file_path except Exception: pass file_paths_list.append(file_path) diff --git a/src/gui_interface.py b/src/gui_interface.py index 4a1d11ae3..875b6adc4 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1906,8 +1906,8 @@ class Interface: self.sth_at_sth_dot_sth = r'\S+@\S+\.\S*[^\s)?]' # Invalid XML chars - self.invalid_XML_chars = u'[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x1f]|'\ - u'[\ud800-\udfff]|[\ufffe-\uffff]' + self.invalid_XML_chars = '[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x1f]|'\ + '[\ud800-\udfff]|[\ufffe-\uffff]' def popup_emoticons_under_button(self, button, parent_win): """ @@ -1969,7 +1969,7 @@ class Interface: if not self.image_is_ok(emot_file): continue for emot in emots[emot_filename]: - emot = emot.decode('utf-8') + emot = emot # This avoids duplicated emoticons with the same image eg. :) # and :-) if not emot_file in self.emoticons.values(): diff --git a/src/history_manager.py b/src/history_manager.py index 1d005cb2a..34e757722 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -65,12 +65,12 @@ def parseOpts(): longargs = 'help config_path=' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] except getopt.error, msg: - print str(msg) - print 'for help use --help' + print(str(msg)) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print 'history_manager [--help] [--config-path]' + print('history_manager [--help] [--config-path]') sys.exit() elif o in ('-c', '--config-path'): config_path = a @@ -264,7 +264,7 @@ class HistoryManager: # get those jids that have at least one entry in logs self.cur.execute('SELECT jid, jid_id FROM jids WHERE jid_id IN (' 'SELECT distinct logs.jid_id FROM logs) ORDER BY jid') - # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + # list of tupples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() for row in rows: self.jids_already_in.append(row[0]) # jid @@ -291,7 +291,7 @@ class HistoryManager: path = rowref.get_path() if path is None: continue - jid = liststore[path][0].decode('utf-8') # jid + jid = liststore[path][0] # jid self._fill_logs_listview(jid) def _get_jid_id(self, jid): @@ -642,7 +642,7 @@ class HistoryManager: dialog.set_transient_for(self.window) def on_search_db_button_clicked(self, widget): - text = self.search_entry.get_text().decode('utf-8') + text = self.search_entry.get_text() if not text: return @@ -655,7 +655,7 @@ class HistoryManager: def on_search_results_listview_row_activated(self, widget, path, column): # get log_line_id, jid_id from row we double clicked log_line_id = self.search_results_liststore[path][0] - jid = self.search_results_liststore[path][1].decode('utf-8') + jid = self.search_results_liststore[path][1] # make it string as in gtk liststores I have them all as strings # as this is what db returns so I don't have to fight with types jid_id = self._get_jid_id(jid) diff --git a/src/history_window.py b/src/history_window.py index a774b83b0..00d1c186f 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -165,7 +165,7 @@ class HistoryWindow: keys = completion_dict.keys() # Move the actual jid at first so we load history faster - actual_jid = self.jid_entry.get_text().decode('utf-8') + actual_jid = self.jid_entry.get_text() if actual_jid in keys: keys.remove(actual_jid) keys.insert(0, actual_jid) @@ -244,7 +244,7 @@ class HistoryWindow: # Don't disable querybox when we have changed the combobox # to GC or All and hit enter return - jid = self.jid_entry.get_text().decode('utf-8') + jid = self.jid_entry.get_text() account = None # we don't know the account, could be any. Search for it! self._load_history(jid, account) self.results_window.set_property('visible', False) diff --git a/src/htmltextview.py b/src/htmltextview.py index b668466c2..208bbf8ba 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -762,7 +762,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): try: self.textbuf.insert_pixbuf(self.iter, self.textview.focus_out_line_pixbuf) - #self._insert_text(u'\u2550'*40) + #self._insert_text('\u2550'*40) self._jump_line() except Exception, e: log.debug(str('Error in hr'+e)) @@ -913,7 +913,7 @@ class HtmlTextView(Gtk.TextView): while (search_iter.compare(end)): character = search_iter.get_char() - if character == u'\ufffc': + if character == '\ufffc': anchor = search_iter.get_child_anchor() if anchor: text = anchor.get_data('plaintext') diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 1ace7a595..5f4a04213 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -237,7 +237,7 @@ class PluginsWindow(object): model, iter = selection.get_selected() if iter: plugin = model.get_value(iter, PLUGIN) - plugin_name = model.get_value(iter, NAME).decode('utf-8') + plugin_name = model.get_value(iter, NAME) is_active = model.get_value(iter, ACTIVE) try: gajim.plugin_manager.remove_plugin(plugin) diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py index b668c2765..f53424f11 100644 --- a/src/plugins/plugin.py +++ b/src/plugins/plugin.py @@ -40,7 +40,7 @@ class GajimPlugin(object): ''' Base class for implementing Gajim plugins. ''' - name = u'' + name = '' ''' Name of plugin. @@ -48,7 +48,7 @@ class GajimPlugin(object): :type: unicode ''' - short_name = u'' + short_name = '' ''' Short name of plugin. @@ -59,7 +59,7 @@ class GajimPlugin(object): :todo: decide whether we really need this one, because class name (with module name) can act as such short name ''' - version = u'' + version = '' ''' Version of plugin. @@ -71,7 +71,7 @@ class GajimPlugin(object): same plugin class but with different version and we want only the newest one to be active - is such policy good? ''' - description = u'' + description = '' ''' Plugin description. @@ -88,7 +88,7 @@ class GajimPlugin(object): :todo: should we decide on any particular format of author strings? Especially: should we force format of giving author's e-mail? ''' - homepage = u'' + homepage = '' ''' URL to plug-in's homepage. diff --git a/src/profile_window.py b/src/profile_window.py index 7e7fc76e7..04d596294 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -344,7 +344,7 @@ class ProfileWindow: 'ADR_WORK_REGION', 'ADR_WORK_PCODE', 'ADR_WORK_CTRY'] vcard_ = {} for e in entries: - txt = self.xml.get_object(e + '_entry').get_text().decode('utf-8') + txt = self.xml.get_object(e + '_entry').get_text() if txt != '': vcard_ = self.add_to_vcard(vcard_, e, txt) @@ -354,7 +354,7 @@ class ProfileWindow: end_iter = buff.get_end_iter() txt = buff.get_text(start_iter, end_iter, False) if txt != '': - vcard_['DESC'] = txt.decode('utf-8') + vcard_['DESC'] = txt # Avatar if self.avatar_encoded: diff --git a/src/roster_window.py b/src/roster_window.py index 5860fc774..9687d574a 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -459,7 +459,7 @@ class RosterWindow: account_group = 'MERGED' else: account_group = account - group = self.model[parent_i][C_JID].decode('utf-8') + group = self.model[parent_i][C_JID] if group in gajim.groups[account]: del gajim.groups[account][group] to_be_removed = parent_i @@ -1144,8 +1144,8 @@ class RosterWindow: if self.model[parent_iter][C_TYPE] != 'contact': # parent is not a contact return - parent_jid = self.model[parent_iter][C_JID].decode('utf-8') - parent_account = self.model[parent_iter][C_ACCOUNT].decode('utf-8') + parent_jid = self.model[parent_iter][C_JID] + parent_account = self.model[parent_iter][C_ACCOUNT] self.draw_contact(parent_jid, parent_account) return False @@ -1203,7 +1203,7 @@ class RosterWindow: if nb_connected_contact > 1: # switch back to default writing direction name += i18n.paragraph_direction_mark(unicode(name)) - name += u' (%d)' % nb_connected_contact + name += ' (%d)' % nb_connected_contact # add status msg, if not empty, under contact name in # the treeview @@ -1256,8 +1256,8 @@ class RosterWindow: iterC = self.model.iter_children(child_iter) while iterC: # a child has awaiting messages? - jidC = self.model[iterC][C_JID].decode('utf-8') - accountC = self.model[iterC][C_ACCOUNT].decode('utf-8') + jidC = self.model[iterC][C_JID] + accountC = self.model[iterC][C_ACCOUNT] if len(gajim.events.get_events(accountC, jidC)): icon_name = 'event' break @@ -1350,7 +1350,7 @@ class RosterWindow: iters = self._get_contact_iter(jid, account, model=self.model) if not iters or not gajim.config.get('show_avatars_in_roster'): return - jid = self.model[iters[0]][C_JID].decode('utf-8') + jid = self.model[iters[0]][C_JID] pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf in (None, 'ask'): scaled_pixbuf = empty_pixbuf @@ -1496,8 +1496,8 @@ class RosterWindow: def _readjust_expand_collapse_state(self): def func(model, path, iter_): type_ = model[iter_][C_TYPE] - acct = model[iter_][C_ACCOUNT].decode('utf-8') - jid = model[iter_][C_JID].decode('utf-8') + acct = model[iter_][C_ACCOUNT] + jid = model[iter_][C_JID] key = None if type_ == 'account': key = acct @@ -1507,7 +1507,7 @@ class RosterWindow: parent_iter = model.iter_parent(iter_) ptype = model[parent_iter][C_TYPE] if ptype == 'group': - grp = model[parent_iter][C_JID].decode('utf-8') + grp = model[parent_iter][C_JID] key = acct + grp + jid if key: if key in self.collapsed_rows: @@ -1611,11 +1611,10 @@ class RosterWindow: if not account: return False - account = account.decode('utf-8') jid = model[titer][C_JID] if not jid: return False - jid = jid.decode('utf-8') + if type_ == 'group': group = jid if group == _('Transports'): @@ -1713,8 +1712,8 @@ class RosterWindow: name2 = model[iter2][C_NAME] if not name1 or not name2: return 0 - name1 = name1.decode('utf-8') - name2 = name2.decode('utf-8') + name1 = name1 + name2 = name2 type1 = model[iter1][C_TYPE] type2 = model[iter2][C_TYPE] if type1 == 'self_contact': @@ -1724,10 +1723,10 @@ class RosterWindow: if type1 == 'group': name1 = model[iter1][C_JID] if name1: - name1 = name1.decode('utf-8') + name1 = name1 name2 = model[iter2][C_JID] if name2: - name2 = name2.decode('utf-8') + name2 = name2 if name1 == _('Transports'): return 1 if name2 == _('Transports'): @@ -1744,12 +1743,12 @@ class RosterWindow: account2 = model[iter2][C_ACCOUNT] if not account1 or not account2: return 0 - account1 = account1.decode('utf-8') - account2 = account2.decode('utf-8') + account1 = account1 + account2 = account2 if type1 == 'account': return locale.strcoll(account1, account2) - jid1 = model[iter1][C_JID].decode('utf-8') - jid2 = model[iter2][C_JID].decode('utf-8') + jid1 = model[iter1][C_JID] + jid2 = model[iter2][C_JID] if type1 == 'contact': lcontact1 = gajim.contacts.get_contacts(account1, jid1) contact1 = gajim.contacts.get_first_contact_from_jid(account1, jid1) @@ -2861,8 +2860,8 @@ class RosterWindow: if model[titer][C_TYPE] in ('contact', 'self_contact'): # we're on a contact entry in the roster if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') - jid = model[titer][C_JID].decode('utf-8') + account = model[titer][C_ACCOUNT] + jid = model[titer][C_JID] self.tooltip.id = row contacts = gajim.contacts.get_contacts(account, jid) connected_contacts = [] @@ -2877,8 +2876,8 @@ class RosterWindow: self.show_tooltip, connected_contacts) elif model[titer][C_TYPE] == 'groupchat': if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') - jid = model[titer][C_JID].decode('utf-8') + account = model[titer][C_ACCOUNT] + jid = model[titer][C_JID] self.tooltip.id = row contact = gajim.contacts.get_contacts(account, jid) self.tooltip.account = account @@ -2887,7 +2886,7 @@ class RosterWindow: elif model[titer][C_TYPE] == 'account': # we're on an account entry in the roster if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] if account == 'all': self.tooltip.id = row self.tooltip.account = None @@ -3025,9 +3024,9 @@ class RosterWindow: continue accounts.append(account) self.send_status(account, 'offline', msg, to=contact.jid) - new_rule = {'order': u'1', 'type': u'jid', - 'action': u'deny', 'value' : contact.jid, - 'child': [u'message', u'iq', u'presence-out']} + new_rule = {'order': '1', 'type': 'jid', + 'action': 'deny', 'value' : contact.jid, + 'child': ['message', 'iq', 'presence-out']} gajim.connections[account].blocked_list.append(new_rule) # needed for draw_contact: gajim.connections[account].blocked_contacts.append( @@ -3045,9 +3044,9 @@ class RosterWindow: self.draw_group(group, account) self.send_status(account, 'offline', msg, to=contact.jid) self.draw_contact(contact.jid, account) - new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', - 'value' : group, 'child': [u'message', u'iq', - u'presence-out']} + new_rule = {'order': '1', 'type': 'group', 'action': 'deny', + 'value' : group, 'child': ['message', 'iq', + 'presence-out']} # account is the same for all when we block a group gajim.connections[list_[0][1]].blocked_list.append(new_rule) for account in accounts: @@ -3485,8 +3484,8 @@ class RosterWindow: path = list_of_paths[0] type_ = model[path][C_TYPE] if type_ in ('contact', 'group', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] self.on_rename(widget, type_, jid, account) elif event.keyval == Gdk.KEY_Delete: @@ -3495,7 +3494,7 @@ class RosterWindow: if not len(list_of_paths): return type_ = model[list_of_paths[0]][C_TYPE] - account = model[list_of_paths[0]][C_ACCOUNT].decode('utf-8') + account = model[list_of_paths[0]][C_ACCOUNT] if type_ in ('account', 'group', 'self_contact') or \ account == gajim.ZEROCONF_ACC_NAME: return @@ -3503,8 +3502,8 @@ class RosterWindow: for path in list_of_paths: if model[path][C_TYPE] != type_: return - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority( account, jid) list_.append((contact, account)) @@ -3616,7 +3615,7 @@ class RosterWindow: if type_ in ('agent', 'contact', 'self_contact', 'groupchat'): self.on_row_activated(widget, path) elif type_ == 'account': - account = model[path][C_ACCOUNT].decode('utf-8') + account = model[path][C_ACCOUNT] if account != 'all': show = gajim.connections[account].connected if show > 1: # We are connected @@ -3830,7 +3829,7 @@ class RosterWindow: 'contacts.')) self.update_status_combobox() return - status = model[active][2].decode('utf-8') + status = model[active][2] # status "desync'ed" or not statuses_unified = helpers.statuses_unified() if (active == 7 and statuses_unified) or (active == 9 and \ @@ -4047,7 +4046,7 @@ class RosterWindow: """ jid = contact.jid if resource is not None: - jid = jid + u'/' + resource + jid = jid + '/' + resource adhoc_commands.CommandWindow(account, jid) def on_roster_window_focus_in_event(self, widget, event): @@ -4095,8 +4094,8 @@ class RosterWindow: for path in list_of_paths: type_ = model[path][C_TYPE] if type_ in ('contact', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_info(widget, contact, account) @@ -4109,8 +4108,8 @@ class RosterWindow: path = list_of_paths[0] type_ = model[path][C_TYPE] if type_ in ('contact', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_history(widget, contact, account) @@ -4125,7 +4124,7 @@ class RosterWindow: this way) """ model = self.modelfilter - account = model[path][C_ACCOUNT].decode('utf-8') + account = model[path][C_ACCOUNT] type_ = model[path][C_TYPE] if type_ in ('group', 'account'): if self.tree.row_expanded(path): @@ -4133,7 +4132,7 @@ class RosterWindow: else: self.tree.expand_row(path, False) return - jid = model[path][C_JID].decode('utf-8') + jid = model[path][C_JID] resource = None contact = gajim.contacts.get_contact_with_highest_priority(account, jid) titer = model.get_iter(path) @@ -4160,7 +4159,7 @@ class RosterWindow: if not first_ev and model.iter_has_child(titer): child_iter = model.iter_children(titer) while not first_ev and child_iter: - child_jid = model[child_iter][C_JID].decode('utf-8') + child_jid = model[child_iter][C_JID] first_ev = gajim.events.get_first_event(account, child_jid) if first_ev: jid = child_jid @@ -4205,11 +4204,11 @@ class RosterWindow: if self.regroup: # merged accounts accounts = gajim.connections.keys() else: - accounts = [model[titer][C_ACCOUNT].decode('utf-8')] + accounts = [model[titer][C_ACCOUNT]] type_ = model[titer][C_TYPE] if type_ == 'group': - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] child_model[child_iter][C_IMG] = \ gajim.interface.jabber_state_images['16']['opened'] if self.rfilter_enabled: @@ -4242,8 +4241,8 @@ class RosterWindow: self.tree.expand_row(path, False) elif type_ == 'contact': # Metacontact got toggled, update icon - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact(account, jid) for group in contact.groups: if account + group + jid in self.collapsed_rows: @@ -4269,7 +4268,7 @@ class RosterWindow: if self.regroup: # merged accounts accounts = gajim.connections.keys() else: - accounts = [model[titer][C_ACCOUNT].decode('utf-8')] + accounts = [model[titer][C_ACCOUNT]] type_ = model[titer][C_TYPE] if type_ == 'group': @@ -4277,7 +4276,7 @@ class RosterWindow: jabber_state_images['16']['closed'] if self.rfilter_enabled: return - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] for account in accounts: if group in gajim.groups[account]: # This account has this group gajim.groups[account][group]['expand'] = False @@ -4290,8 +4289,8 @@ class RosterWindow: self.draw_account(account) elif type_ == 'contact': # Metacontact got toggled, update icon - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact(account, jid) groups = contact.groups if not groups: @@ -4323,8 +4322,6 @@ class RosterWindow: if not account: return - account = account.decode('utf-8') - if type_ == 'contact': child_iter = model.convert_iter_to_child_iter(titer) if self.model.iter_has_child(child_iter): @@ -4332,10 +4329,10 @@ class RosterWindow: # redraw us to show/hide expand icon if self.filtering: # Prevent endless loops - jid = model[titer][C_JID].decode('utf-8') + jid = model[titer][C_JID] GObject.idle_add(self.draw_contact, jid, account) elif type_ == 'group': - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] self._adjust_group_expand_collapse_state(group, account) elif type_ == 'account': self._adjust_account_expand_collapse_state(account) @@ -4365,8 +4362,8 @@ class RosterWindow: # if row[C_TYPE] != 'contact': # self._last_selected_contact = [] # return -# jid = row[C_JID].decode('utf-8') -# account = row[C_ACCOUNT].decode('utf-8') +# jid = row[C_JID] +# account = row[C_ACCOUNT] # self._last_selected_contact.append((jid, account)) # GObject.idle_add(self.draw_contact, jid, account, True) @@ -4704,9 +4701,9 @@ class RosterWindow: path_dest = (path_dest[0], path_dest[1]-1) # destination: the row something got dropped on iter_dest = model.get_iter(path_dest) - type_dest = model[iter_dest][C_TYPE].decode('utf-8') - jid_dest = model[iter_dest][C_JID].decode('utf-8') - account_dest = model[iter_dest][C_ACCOUNT].decode('utf-8') + type_dest = model[iter_dest][C_TYPE] + jid_dest = model[iter_dest][C_JID] + account_dest = model[iter_dest][C_ACCOUNT] # drop on account row in merged mode, we cannot know the desired account if account_dest == 'all': @@ -4770,7 +4767,7 @@ class RosterWindow: path_source = treeview.get_selection().get_selected_rows()[1][0] iter_source = model.get_iter(path_source) type_source = model[iter_source][C_TYPE] - account_source = model[iter_source][C_ACCOUNT].decode('utf-8') + account_source = model[iter_source][C_ACCOUNT] if gajim.config.get_per('accounts', account_source, 'is_zeroconf'): return @@ -4788,14 +4785,14 @@ class RosterWindow: if account_source != account_dest: # drop on another account return - grp_source = model[iter_source][C_JID].decode('utf-8') + grp_source = model[iter_source][C_JID] delimiter = gajim.connections[account_source].nested_group_delimiter grp_source_list = grp_source.split(delimiter) new_grp = None if type_dest == 'account': new_grp = grp_source_list[-1] elif type_dest == 'group': - new_grp = model[iter_dest][C_JID].decode('utf-8') + delimiter +\ + new_grp = model[iter_dest][C_JID] + delimiter +\ grp_source_list[-1] if new_grp: self.move_group(grp_source, new_grp, account_source) @@ -4817,26 +4814,26 @@ class RosterWindow: it = iter_source while model[it][C_TYPE] == 'contact': it = model.iter_parent(it) - grp_source = model[it][C_JID].decode('utf-8') + grp_source = model[it][C_JID] if grp_source in helpers.special_groups and \ grp_source not in ('Not in Roster', 'Observers'): # a transport or a minimized groupchat was dragged # we can add it to other accounts but not move it to another group, # see below return - jid_source = data.decode('utf-8') + jid_source = data c_source = gajim.contacts.get_contact_with_highest_priority( account_source, jid_source) # Get destination group grp_dest = None if type_dest == 'group': - grp_dest = model[iter_dest][C_JID].decode('utf-8') + grp_dest = model[iter_dest][C_JID] elif type_dest in ('contact', 'agent'): it = iter_dest while model[it][C_TYPE] != 'group': it = model.iter_parent(it) - grp_dest = model[it][C_JID].decode('utf-8') + grp_dest = model[it][C_JID] if grp_dest in helpers.special_groups: return @@ -5092,8 +5089,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append when at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) parent_iter = model.iter_parent(titer) if model[parent_iter][C_TYPE] == 'contact': @@ -5141,8 +5138,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append when at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] color = None if type_ == 'groupchat': ctrl = gajim.interface.minimized_controls[account].get(jid, @@ -5190,8 +5187,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, @@ -5217,8 +5214,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) else: renderer.set_property('visible', False) @@ -5727,7 +5724,7 @@ class RosterWindow: Make account's popup menu """ model = self.modelfilter - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] if account != 'all': # not in merged mode menu = self.build_account_menu(account) @@ -5762,8 +5759,8 @@ class RosterWindow: """ model = self.modelfilter path = model.get_path(titer) - group = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + group = model[titer][C_JID] + account = model[titer][C_ACCOUNT] list_ = [] # list of (jid, account) tuples list_online = [] # list of (jid, account) tuples @@ -5923,8 +5920,8 @@ class RosterWindow: Make contact's popup menu """ model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gui_menu_builder.get_contact_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) @@ -5941,8 +5938,8 @@ class RosterWindow: is_blocked = True privacy_rules_supported = True for titer in iters: - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] if gajim.connections[account].connected < 2: one_account_offline = True if not gajim.connections[account].privacy_rules_supported: @@ -6040,9 +6037,9 @@ class RosterWindow: Make transport's popup menu """ model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') + jid = model[titer][C_JID] path = model.get_path(titer) - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = Gtk.Menu() @@ -6177,8 +6174,8 @@ class RosterWindow: def make_groupchat_menu(self, event, titer): model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = Gtk.Menu() diff --git a/src/statusicon.py b/src/statusicon.py index ceb4a5bee..8f5b82a38 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -477,7 +477,7 @@ class StatusIcon: def on_change_status_message_activate(self, widget): model = gajim.interface.roster.status_combobox.get_model() active = gajim.interface.roster.status_combobox.get_active() - status = model[active][2].decode('utf-8') + status = model[active][2] def on_response(message, pep_dict): if message is None: # None if user press Cancel return diff --git a/test/integration/test_roster.py b/test/integration/test_roster.py index 43f40ed76..5b81f5824 100644 --- a/test/integration/test_roster.py +++ b/test/integration/test_roster.py @@ -186,13 +186,13 @@ class TestRosterWindowMetaContacts(TestRosterWindowRegrouped): def test_connect_new_metacontact(self): self.test_fill_roster_model() - jid = u'coolstuff@gajim.org' + jid = 'coolstuff@gajim.org' contact = gajim.contacts.create_contact(jid, account1) gajim.contacts.add_contact(account1, contact) self.roster.add_contact(jid, account1) self.roster.chg_contact_status(contact, 'offline', '', account1) - gajim.contacts.add_metacontact(account1, u'samejid@gajim.org', + gajim.contacts.add_metacontact(account1, 'samejid@gajim.org', account1, jid) self.roster.chg_contact_status(contact, 'online', '', account1) diff --git a/test/lib/data.py b/test/lib/data.py index af2a87057..584af050e 100755 --- a/test/lib/data.py +++ b/test/lib/data.py @@ -1,77 +1,77 @@ # -*- coding: utf-8 -*- -account1 = u'acc1' -account2 = u'Cool"chârßéµö' -account3 = u'dingdong.org' +account1 = 'acc1' +account2 = 'Cool"chârßéµö' +account3 = 'dingdong.org' contacts = {} contacts[account1] = { - u'myjid@'+account1: { + 'myjid@'+account1: { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default1@gajim.org': { + 'subscription': 'both'}, + 'default1@gajim.org': { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default2@gajim.org': { - 'ask': None, 'groups': [u'GroupA',], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'Cool"chârßéµö@gajim.org': { - 'ask': None, 'groups': [u' @@ -38,10 +38,10 @@ session_init = ''' - + ''' - - + + transport_info = ''' ") - + def _simulate_jingle_session(self): - + self.dispatcher.RegisterHandler('iq', self.con._JingleCB, 'set' , common.xmpp.NS_JINGLE) self.dispatcher.ProcessNonBlocking(session_init) @@ -142,15 +142,15 @@ class TestJingle(unittest.TestCase): # we have to manually simulate this behavior session.approve_session() self.con.send_file_approval(self.recieve_file) - + self.dispatcher.ProcessNonBlocking(transport_info) - + def test_jingle_session(self): self._simulate_connect() self._simulate_jingle_session() - - + + if __name__ == '__main__': diff --git a/test/unit/test_xmpp_transports_nb.py b/test/unit/test_xmpp_transports_nb.py index 633549560..771bf5f1b 100644 --- a/test/unit/test_xmpp_transports_nb.py +++ b/test/unit/test_xmpp_transports_nb.py @@ -40,38 +40,38 @@ class TestModuleLevelFunctions(unittest.TestCase): self.assertEqual(_user, user) self.assertEqual(_passwd, passwd) - bosh_dict = {'bosh_content': u'text/xml; charset=utf-8', + bosh_dict = {'bosh_content': 'text/xml; charset=utf-8', 'bosh_hold': 2, 'bosh_http_pipelining': False, - 'bosh_uri': u'http://gajim.org:5280/http-bind', + 'bosh_uri': 'http://gajim.org:5280/http-bind', 'bosh_useproxy': False, 'bosh_wait': 30, 'bosh_wait_for_restart_response': False, - 'host': u'172.16.99.11', - 'pass': u'pass', + 'host': '172.16.99.11', + 'pass': 'pass', 'port': 3128, - 'type': u'bosh', + 'type': 'bosh', 'useauth': True, - 'user': u'user'} - check_dict(bosh_dict, host=u'gajim.org', port=5280, user=u'user', - passwd=u'pass') + 'user': 'user'} + check_dict(bosh_dict, host='gajim.org', port=5280, user='user', + passwd='pass') - proxy_dict = {'bosh_content': u'text/xml; charset=utf-8', + proxy_dict = {'bosh_content': 'text/xml; charset=utf-8', 'bosh_hold': 2, 'bosh_http_pipelining': False, 'bosh_port': 5280, - 'bosh_uri': u'', + 'bosh_uri': '', 'bosh_useproxy': True, 'bosh_wait': 30, 'bosh_wait_for_restart_response': False, - 'host': u'172.16.99.11', - 'pass': u'pass', + 'host': '172.16.99.11', + 'pass': 'pass', 'port': 3128, 'type': 'socks5', 'useauth': True, - 'user': u'user'} - check_dict(proxy_dict, host=u'172.16.99.11', port=3128, user=u'user', - passwd=u'pass') + 'user': 'user'} + check_dict(proxy_dict, host='172.16.99.11', port=3128, user='user', + passwd='pass') if __name__ == '__main__': From 069bddbbcb4d2ba2a4f9c1727e12963ce8e80eab Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 21:06:16 +0100 Subject: [PATCH 019/592] remove call to unicode() --- src/adhoc_commands.py | 3 - src/chat_control.py | 2 +- src/command_system/dispatcher.py | 2 +- src/command_system/framework.py | 8 +- src/command_system/implementation/custom.py | 2 +- src/command_system/implementation/execute.py | 2 +- src/command_system/implementation/standard.py | 4 +- src/command_system/mapping.py | 8 +- src/common/check_paths.py | 2 +- src/common/commands.py | 6 +- src/common/configpaths.py | 2 +- src/common/connection.py | 10 +- src/common/connection_handlers.py | 8 +- src/common/connection_handlers_events.py | 8 +- src/common/dataforms.py | 4 +- src/common/gajim.py | 11 +-- src/common/gpg.py | 2 +- src/common/helpers.py | 94 +++++++++---------- src/common/i18n.py | 4 +- src/common/jingle_xtls.py | 2 +- src/common/kwalletbinding.py | 2 +- src/common/logger.py | 4 +- src/common/logging_helpers.py | 2 +- src/common/message_archiving.py | 2 +- src/common/optparser.py | 9 +- src/common/protocol/bytestream.py | 42 ++++----- src/common/proxy65_manager.py | 2 +- src/common/zeroconf/client_zeroconf.py | 11 +-- src/common/zeroconf/connection_zeroconf.py | 7 +- src/common/zeroconf/zeroconf_avahi.py | 9 +- src/config.py | 22 ++--- src/conversation_textview.py | 4 - src/dataforms_widget.py | 2 +- src/dialogs.py | 2 +- src/filetransfers_window.py | 14 +-- src/gajim-remote.py | 16 +--- src/gajim.py | 6 +- src/gajim_themes_window.py | 6 +- src/groupchat_control.py | 10 +- src/gui_interface.py | 14 +-- src/message_window.py | 6 +- src/plugins/plugin.py | 14 +-- src/plugins/pluginmanager.py | 6 +- src/remote_control.py | 12 +-- src/roster_window.py | 6 +- src/tooltips.py | 15 +-- src/vcard.py | 16 ++-- 47 files changed, 189 insertions(+), 256 deletions(-) diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index 2013807f7..5a5d81cfc 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -281,8 +281,6 @@ class CommandWindow: # close old stage self.stage_finish() - assert isinstance(self.commandnode, unicode) - self.form_status = None self.stages_notebook.set_current_page( @@ -608,7 +606,6 @@ class CommandWindow: Send the command with data form. Wait for reply """ # create the stanza - assert isinstance(self.commandnode, unicode) assert action in ('execute', 'prev', 'next', 'complete') stanza = nbxmpp.Iq(typ='set', to=self.jid) diff --git a/src/chat_control.py b/src/chat_control.py index 80d374119..d13351b7c 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -2505,7 +2505,7 @@ class ChatControl(ChatControlBase): if num_unread == 1 and not gajim.config.get('show_unread_tab_icon'): unread = '*' elif num_unread > 1: - unread = '[' + unicode(num_unread) + ']' + unread = '[' + str(num_unread) + ']' # Draw tab label using chatstate theme = gajim.config.get('roster_theme') diff --git a/src/command_system/dispatcher.py b/src/command_system/dispatcher.py index cc9f0ea7a..398edae9c 100644 --- a/src/command_system/dispatcher.py +++ b/src/command_system/dispatcher.py @@ -32,7 +32,7 @@ over the process. """ from types import NoneType -from tools import remove +from .tools import remove COMMANDS = {} CONTAINERS = {} diff --git a/src/command_system/framework.py b/src/command_system/framework.py index 9c2dd4cb0..d57ab7e5e 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -23,10 +23,10 @@ import re from types import FunctionType from inspect import getargspec, getdoc -from dispatcher import Host, Container -from dispatcher import get_command, list_commands -from mapping import parse_arguments, adapt_arguments -from errors import DefinitionError, CommandError, NoCommandError +from .dispatcher import Host, Container +from .dispatcher import get_command, list_commands +from mmapping import parse_arguments, adapt_arguments +from .errors import DefinitionError, CommandError, NoCommandError class CommandHost(object): """ diff --git a/src/command_system/implementation/custom.py b/src/command_system/implementation/custom.py index cc33ae39c..95198fc52 100644 --- a/src/command_system/implementation/custom.py +++ b/src/command_system/implementation/custom.py @@ -35,7 +35,7 @@ detected. """ from ..framework import CommandContainer, command, doc -from hosts import * +from .hosts import * class CustomCommonCommands(CommandContainer): """ diff --git a/src/command_system/implementation/execute.py b/src/command_system/implementation/execute.py index 5089d5128..48253dfae 100644 --- a/src/command_system/implementation/execute.py +++ b/src/command_system/implementation/execute.py @@ -38,7 +38,7 @@ from os.path import expanduser from glib import timeout_add from ..framework import CommandContainer, command, doc -from hosts import * +from .hosts import * class Execute(CommandContainer): AUTOMATIC = True diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 7bdf96096..7bcd400a4 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -30,8 +30,8 @@ from ..errors import CommandError from ..framework import CommandContainer, command, doc from ..mapping import generate_usage -from hosts import * -import execute +from .hosts import * +from . import execute # This holds constants fron the logger, which we'll be using in some of our # commands. diff --git a/src/command_system/mapping.py b/src/command_system/mapping.py index 3ba68ff4c..dcb7a96c2 100644 --- a/src/command_system/mapping.py +++ b/src/command_system/mapping.py @@ -26,7 +26,7 @@ import re from types import BooleanType, UnicodeType from operator import itemgetter -from errors import DefinitionError, CommandError +from .errors import DefinitionError, CommandError # Quite complex piece of regular expression logic to parse options and # arguments. Might need some tweaking along the way. @@ -269,12 +269,6 @@ def adapt_arguments(command, arguments, args, opts): if not isinstance(value, BooleanType): raise CommandError("%s: Switch can not take an argument" % key, command) - # We need to encode every keyword argument to a simple string, not - # the unicode one, because ** expansion does not support it. - for index, (key, value) in enumerate(opts): - if isinstance(key, UnicodeType): - opts[index] = (key.encode(KEY_ENCODING), value) - # Inject the source arguments as a string as a first argument, if # command has enabled the corresponding option. if command.source: diff --git a/src/common/check_paths.py b/src/common/check_paths.py index e45497179..e046d38aa 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -29,7 +29,7 @@ import sys import stat from common import gajim -import logger +from common import logger from common import jingle_xtls # DO NOT MOVE ABOVE OF import gajim diff --git a/src/common/commands.py b/src/common/commands.py index b76a4b014..5fd067dc6 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -23,9 +23,9 @@ ## import nbxmpp -import helpers -import dataforms -import gajim +from common import helpers +from common import dataforms +from common import gajim import logging log = logging.getLogger('gajim.c.commands') diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 0a9d90982..c09191709 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -61,7 +61,7 @@ def fse(s): """ Convert from filesystem encoding if not already Unicode """ - return unicode(s, sys.getfilesystemencoding()) + return s def windowsify(s): if os.name == 'nt': diff --git a/src/common/connection.py b/src/common/connection.py index be4641aac..2e113f084 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -616,7 +616,7 @@ class CommonConnection: if realm == '': if event == nbxmpp.transports_nb.DATA_RECEIVED: gajim.nec.push_incoming_event(StanzaReceivedEvent(None, - conn=self, stanza_str=unicode(data, errors='ignore'))) + conn=self, stanza_str=data)) elif event == nbxmpp.transports_nb.DATA_SENT: gajim.nec.push_incoming_event(StanzaSentEvent(None, conn=self, stanza_str=data)) @@ -1446,7 +1446,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.connection.send(' ') def _on_xmpp_ping_answer(self, iq_obj): - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') assert id_ == self.awaiting_xmpp_ping_id self.awaiting_xmpp_ping_id = None @@ -1607,7 +1607,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.activate_privacy_rule('invisible') self.connected = gajim.SHOW_LIST.index('invisible') self.status = msg - priority = unicode(gajim.get_priority(self.name, 'invisible')) + priority = gajim.get_priority(self.name, 'invisible') p = nbxmpp.Presence(priority=priority) p = self.add_sha(p, True) if msg: @@ -1781,7 +1781,7 @@ class Connection(CommonConnection, ConnectionHandlers): p.setStatus(msg) else: signed = self.get_signed_presence(msg) - priority = unicode(gajim.get_priority(self.name, sshow)) + priority = gajim.get_priority(self.name, sshow) p = nbxmpp.Presence(typ=None, priority=priority, show=sshow, to=jid) p = self.add_sha(p) if msg: @@ -1805,7 +1805,7 @@ class Connection(CommonConnection, ConnectionHandlers): def _update_status(self, show, msg): xmpp_show = helpers.get_xmpp_show(show) - priority = unicode(gajim.get_priority(self.name, xmpp_show)) + priority = gajim.get_priority(self.name, xmpp_show) p = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show) p = self.add_sha(p) if msg: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 7aa8e532a..4f87ced39 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -39,7 +39,7 @@ from time import (altzone, daylight, gmtime, localtime, mktime, strftime, from calendar import timegm import nbxmpp -import common.caps_cache as capscache +from common import caps_cache as capscache from common import helpers from common import gajim @@ -181,8 +181,8 @@ class ConnectionDisco: if not self.connection or self.connected < 2: return frm = helpers.get_full_jid_from_iq(iq_obj) - to = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) + to = iq_obj.getAttr('to') + id_ = iq_obj.getAttr('id') iq = nbxmpp.Iq(to=frm, typ='result', queryNS=nbxmpp.NS_DISCO, frm=to) iq.setAttr('id', id_) query = iq.setTag('query') @@ -235,7 +235,7 @@ class ConnectionDisco: if self.commandInfoQuery(con, iq_obj): raise nbxmpp.NodeProcessed - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') if id_[:6] == 'Gajim_': # We get this request from echo.server raise nbxmpp.NodeProcessed diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index c07d2cf3d..55430de2d 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -39,7 +39,7 @@ from nbxmpp.protocol import NS_CHATSTATES from common.jingle_transport import JingleTransportSocks5 from common.file_props import FilesProp -import gtkgui_helpers +from . import gtkgui_helpers import logging log = logging.getLogger('gajim.c.connection_handlers_events') @@ -1169,7 +1169,6 @@ class ZeroconfMessageReceivedEvent(MessageReceivedEvent): self.fjid = key break - self.fjid = unicode(self.fjid) self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid) def generate(self): @@ -1986,7 +1985,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.FT_content.session.ourjid) self.FT_content.transport.set_connection( self.FT_content.session.connection) - sid = unicode(self.stanza.getTag('jingle').getAttr('sid')) + sid = self.stanza.getTag('jingle').getAttr('sid') self.file_props = FilesProp.getNewFileProp(self.conn.name, sid) self.file_props.transport_sid = self.FT_content.transport.sid self.FT_content.file_props = self.file_props @@ -2033,8 +2032,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): else: si = self.stanza.getTag('si') self.file_props = FilesProp.getNewFileProp(self.conn.name, - unicode(si.getAttr('id')) - ) + si.getAttr('id')) profile = si.getAttr('profile') if profile != nbxmpp.NS_FILE: self.conn.send_file_rejection(self.file_props, code='400', diff --git a/src/common/dataforms.py b/src/common/dataforms.py index bccd35d8a..bab233bca 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -27,7 +27,7 @@ information how to use them, read documentation """ import nbxmpp -import helpers +from common import helpers # exceptions used in this module # base class @@ -345,7 +345,7 @@ class StringField(DataField): @nested_property def value(): """ - Value of field. May be any unicode string + Value of field. May be any string """ def fget(self): return self.getTagData('value') or '' diff --git a/src/common/gajim.py b/src/common/gajim.py index 120e09018..8ccf9fc1a 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -31,10 +31,10 @@ import sys import logging import locale -import config +from common import config import nbxmpp -import defs -import common.ged +from common import defs +from common import ged interface = None # The actual interface (the gtk one for the moment) thread_interface = None # Interface to run a thread and then a callback @@ -280,13 +280,8 @@ def get_jid_without_resource(jid): return jid.split('/')[0] def construct_fjid(room_jid, nick): - """ - Nick is in UTF-8 (taken from treeview); room_jid is in unicode - """ # fake jid is the jid for a contact in a room # gaim@conference.jabber.org/nick - if isinstance(nick, str): - nick = unicode(nick, 'utf-8') return room_jid + '/' + nick def get_resource_from_jid(jid): diff --git a/src/common/gpg.py b/src/common/gpg.py index 5a29a69fa..b8a470284 100644 --- a/src/common/gpg.py +++ b/src/common/gpg.py @@ -26,7 +26,7 @@ from gajim import HAVE_GPG import os if HAVE_GPG: - import gnupg + from common import gnupg class GnuPG(gnupg.GPG): def __init__(self, use_agent=False): diff --git a/src/common/helpers.py b/src/common/helpers.py index 7704c1c61..27ad2fdc9 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -42,7 +42,7 @@ import select import base64 import hashlib import shlex -import caps_cache +from common import caps_cache import socket import time @@ -159,7 +159,7 @@ def prep(user, server, resource): raise InvalidFormat, _('Username must be between 1 and 1023 chars') try: from nbxmpp.stringprepare import nodeprep - user = nodeprep.prepare(unicode(user)).encode('utf-8') + user = nodeprep.prepare(user) except UnicodeError: raise InvalidFormat, _('Invalid character in username.') else: @@ -170,7 +170,7 @@ def prep(user, server, resource): raise InvalidFormat, _('Server must be between 1 and 1023 chars') try: from nbxmpp.stringprepare import nameprep - server = nameprep.prepare(unicode(server)).encode('utf-8') + server = nameprep.prepare(server) except UnicodeError: raise InvalidFormat, _('Invalid character in hostname.') else: @@ -181,7 +181,7 @@ def prep(user, server, resource): raise InvalidFormat, _('Resource must be between 1 and 1023 chars') try: from nbxmpp.stringprepare import resourceprep - resource = resourceprep.prepare(unicode(resource)).encode('utf-8') + resource = resourceprep.prepare(resource) except UnicodeError: raise InvalidFormat, _('Invalid character in resource.') else: @@ -448,43 +448,43 @@ def get_output_of_command(command): return output -def decode_string(string): - """ - Try to decode (to make it Unicode instance) given string - """ - if isinstance(string, unicode): - return string - # by the time we go to iso15 it better be the one else we show bad characters - encodings = (locale.getpreferredencoding(), 'utf-8', 'iso-8859-15') - for encoding in encodings: - try: - string = string.decode(encoding) - except UnicodeError: - continue - break +#def decode_string(string): + #""" + #Try to decode (to make it Unicode instance) given string + #""" + #if isinstance(string, unicode): + #return string + ## by the time we go to iso15 it better be the one else we show bad characters + #encodings = (locale.getpreferredencoding(), 'utf-8', 'iso-8859-15') + #for encoding in encodings: + #try: + #string = string.decode(encoding) + #except UnicodeError: + #continue + #break - return string + #return string -def ensure_utf8_string(string): - """ - Make sure string is in UTF-8 - """ - try: - string = decode_string(string).encode('utf-8') - except Exception: - pass - return string +#def ensure_utf8_string(string): + #""" + #Make sure string is in UTF-8 + #""" + #try: + #string = decode_string(string).encode('utf-8') + #except Exception: + #pass + #return string -def wrapped_ensure_utf8_string(fn): - def wrapped(n): - return ensure_utf8_string(n) - return wrapped +#def wrapped_ensure_utf8_string(fn): + #def wrapped(n): + #return ensure_utf8_string(n) + #return wrapped -@wrapped_ensure_utf8_string -def escape_text(text): - return GObject.markup_escape_text(text) +#@wrapped_ensure_utf8_string +#def escape_text(text): + #return GObject.markup_escape_text(text) -GObject.markup_escape_text = escape_text +#GObject.markup_escape_text = escape_text def get_windows_reg_env(varname, default=''): """ @@ -645,13 +645,13 @@ def convert_bytes(string): # but do we use the standard? use_kib_mib = gajim.config.get('use_kib_mib') align = 1024. - bytes = float(string) - if bytes >= align: - bytes = round(bytes/align, 1) - if bytes >= align: - bytes = round(bytes/align, 1) - if bytes >= align: - bytes = round(bytes/align, 1) + bytes_ = float(string) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) if use_kib_mib: #GiB means gibibyte suffix = _('%s GiB') @@ -675,7 +675,7 @@ def convert_bytes(string): else: #B means bytes suffix = _('%s B') - return suffix % unicode(bytes) + return suffix % str(bytes_) def get_contact_dict_for_account(account): """ @@ -901,13 +901,13 @@ def get_icon_name_to_show(contact, account = None): def get_full_jid_from_iq(iq_obj): """ - Return the full jid (with resource) from an iq as unicode + Return the full jid (with resource) from an iq """ - return parse_jid(str(iq_obj.getFrom())) + return parse_jid(iq_obj.getFrom()) def get_jid_from_iq(iq_obj): """ - Return the jid (without resource) from an iq as unicode + Return the jid (without resource) from an iq """ jid = get_full_jid_from_iq(iq_obj) return gajim.get_jid_without_resource(jid) diff --git a/src/common/i18n.py b/src/common/i18n.py index feea54f2d..1970e239e 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -24,7 +24,7 @@ import locale import gettext import os -import defs +from common import defs import unicodedata def paragraph_direction_mark(text): @@ -61,7 +61,7 @@ if os.name == 'nt': if lang: os.environ['LANG'] = lang -gettext.install(APP, DIR, unicode=False) +gettext.install(APP, DIR) if gettext._translations: _translation = gettext._translations.values()[0] else: diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index 39d62bca6..9742f0bd7 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -158,7 +158,7 @@ def send_cert_request(con, to_jid): pubkey = iq.setTag('pubkeys') pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY) con.connection.send(iq) - return unicode(id_) + return str(id_) # the following code is partly due to pyopenssl examples diff --git a/src/common/kwalletbinding.py b/src/common/kwalletbinding.py index 4ae4043b0..750f3c8c1 100644 --- a/src/common/kwalletbinding.py +++ b/src/common/kwalletbinding.py @@ -46,7 +46,7 @@ def kwallet_get(folder, entry): • folder: The top-level category to use (normally the programme name) • entry: The key of the entry to retrieve - Returns the passphrase as unicode, False if it cannot be found, + Returns the passphrase, False if it cannot be found, or None if an error occured. """ p = subprocess.Popen(["kwalletcli", "-q", "-f", folder.encode('utf-8'), diff --git a/src/common/logger.py b/src/common/logger.py index 693e8aeb3..0a67fe3e2 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -884,8 +884,7 @@ class Logger: # ..., 'FEAT', feature1, feature2, ...).join(' ')) # NOTE: if there's a need to do more gzip, put that to a function try: - data = GzipFile(fileobj=StringIO(str(data))).read().decode( - 'utf-8').split('\0') + data = GzipFile(fileobj=StringIO(str(data))).read().split('\0') except IOError: # This data is corrupted. It probably contains non-ascii chars to_be_removed.append((hash_method, hash_)) @@ -927,7 +926,6 @@ class Logger: # if there's a need to do more gzip, put that to a function string = StringIO() gzip = GzipFile(fileobj=string, mode='w') - data = data.encode('utf-8') # the gzip module can't handle unicode objects gzip.write(data) gzip.close() data = string.getvalue() diff --git a/src/common/logging_helpers.py b/src/common/logging_helpers.py index 729718ce7..50b22f3b0 100644 --- a/src/common/logging_helpers.py +++ b/src/common/logging_helpers.py @@ -19,7 +19,7 @@ ## import logging -import i18n +from common import i18n def parseLogLevel(arg): """ diff --git a/src/common/message_archiving.py b/src/common/message_archiving.py index 5a5388f63..69cf9a21d 100644 --- a/src/common/message_archiving.py +++ b/src/common/message_archiving.py @@ -96,7 +96,7 @@ class ConnectionArchive: def get_item_pref(self, jid): jid = nbxmpp.JID(jid) - if unicode(jid) in self.items: + if str(jid) in self.items: return self.items[jid] if jid.getStripped() in self.items: diff --git a/src/common/optparser.py b/src/common/optparser.py index 29a4966e2..cbb1bb033 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -87,19 +87,12 @@ class OptionsParser: if value is None: return # convert to utf8 before writing to file if needed - if isinstance(value, unicode): - value = value.encode('utf-8') - else: - value = str(value) - if isinstance(opt, unicode): - opt = opt.encode('utf-8') + value = str(value) s = '' if parents: if len(parents) == 1: return for p in parents: - if isinstance(p, unicode): - p = p.encode('utf-8') s += p + '.' s += opt fd.write(s + ' = ' + value + '\n') diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index e362dec5c..e2b7e41fb 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -163,7 +163,7 @@ class ConnectionBytestream: session.approve_content('file', content.name) return - iq = nbxmpp.Iq(to=unicode(file_props.sender), typ='result') + iq = nbxmpp.Iq(to=file_props.sender, typ='result') iq.setAttr('id', file_props.request_id) si = iq.setTag('si', namespace=nbxmpp.NS_SI) if file_props.offset: @@ -195,7 +195,7 @@ class ConnectionBytestream: jingle = self._sessions[file_props.sid] jingle.cancel_session() return - iq = nbxmpp.Iq(to=unicode(file_props.sender), typ='error') + iq = nbxmpp.Iq(to=file_props.sender, typ='error') iq.setAttr('id', file_props.request_id) if code == '400' and typ in ('stream', 'profile'): name = 'bad-request' @@ -296,7 +296,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): for file_props in FilesProp.getAllFileProp(): if is_transfer_stopped(file_props): continue - receiver_jid = unicode(file_props.receiver) + receiver_jid = file_props.receiver if contact.get_full_jid() == receiver_jid: file_props.error = -5 self.remove_transfer(file_props) @@ -305,7 +305,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): gajim.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=contact.jid, file_props=file_props, error_msg='')) - sender_jid = unicode(file_props.sender) + sender_jid = file_props.sender if contact.get_full_jid() == sender_jid: file_props.error = -3 self.remove_transfer(file_props) @@ -354,11 +354,11 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): file_props.error = -5 from common.connection_handlers_events import FileRequestErrorEvent gajim.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, - jid=unicode(receiver), file_props=file_props, error_msg='')) - self._connect_error(unicode(receiver), file_props.sid, + jid=receiver, file_props=file_props, error_msg='')) + self._connect_error(receiver, file_props.sid, file_props.sid, code=406) else: - iq = nbxmpp.Iq(to=unicode(receiver), typ='set') + iq = nbxmpp.Iq(to=receiver, typ='set') file_props.request_id = 'id_' + file_props.sid iq.setID(file_props.request_id) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) @@ -374,7 +374,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): for host in hosts: streamhost = nbxmpp.Node(tag='streamhost') query.addChild(node=streamhost) - streamhost.setAttr('port', unicode(port)) + streamhost.setAttr('port', str(port)) streamhost.setAttr('host', host) streamhost.setAttr('jid', sender) @@ -489,8 +489,8 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _add_proxy_streamhosts_to_query(self, query, file_props): proxyhosts = self._get_file_transfer_proxies_from_config(file_props) if proxyhosts: - file_props.proxy_receiver = unicode(file_props.receiver) - file_props.proxy_sender = unicode(file_props.sender) + file_props.proxy_receiver = file_props.receiver + file_props.proxy_sender = file_props.sender file_props.proxyhosts = proxyhosts for proxyhost in proxyhosts: @@ -518,12 +518,12 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): continue host_dict = { 'state': 0, - 'target': unicode(file_props.receiver), + 'target': file_props.receiver, 'id': file_props.sid, 'sid': file_props.sid, 'initiator': proxy, 'host': host, - 'port': unicode(_port), + 'port': str(_port), 'jid': jid } proxyhost_dicts.append(host_dict) @@ -563,7 +563,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): iq = nbxmpp.Iq(to=to, typ='error') iq.setAttr('id', file_props.sid) err = iq.setTag('error') - err.setAttr('code', unicode(code)) + err.setAttr('code', str(code)) err.setData(msg) self.connection.send(iq) if code == 404: @@ -593,7 +593,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): # register xmpppy handlers for bytestream and FT stanzas def _bytestreamErrorCB(self, con, iq_obj): - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') frm = helpers.get_full_jid_from_iq(iq_obj) query = iq_obj.getTag('query') gajim.proxy65_manager.error_cb(frm, query) @@ -609,10 +609,10 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): raise nbxmpp.NodeProcessed def _bytestreamSetCB(self, con, iq_obj): - target = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) + target = iq_obj.getAttr('to') + id_ = iq_obj.getAttr('id') query = iq_obj.getTag('query') - sid = unicode(query.getAttr('sid')) + sid = query.getAttr('sid') file_props = FilesProp.getFileProp(self.name, sid) streamhosts = [] for item in query.getChildren(): @@ -657,7 +657,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _ResultCB(self, con, iq_obj): # if we want to respect xep-0065 we have to check for proxy # activation result in any result iq - real_id = unicode(iq_obj.getAttr('id')) + real_id = iq_obj.getAttr('id') if not real_id.startswith('au_'): return frm = self._ft_get_from(iq_obj) @@ -671,7 +671,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _bytestreamResultCB(self, con, iq_obj): frm = self._ft_get_from(iq_obj) - real_id = unicode(iq_obj.getAttr('id')) + real_id = iq_obj.getAttr('id') query = iq_obj.getTag('query') gajim.proxy65_manager.resolve_result(frm, query) @@ -692,7 +692,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): raise nbxmpp.NodeProcessed for host in file_props.proxyhosts: if host['initiator'] == frm and \ - unicode(query.getAttr('sid')) == file_props.sid: + query.getAttr('sid') == file_props.sid: gajim.socks5queue.activate_proxy(host['idx']) break raise nbxmpp.NodeProcessed @@ -983,7 +983,7 @@ class ConnectionIBBytestream(ConnectionBytestream): class ConnectionSocks5BytestreamZeroconf(ConnectionSocks5Bytestream): def _ft_get_from(self, iq_obj): - return unicode(iq_obj.getFrom()) + return iq_obj.getFrom() def _ft_get_our_jid(self): return gajim.get_jid_from_account(self.name) diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 8a906a01b..71d782f19 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -117,7 +117,7 @@ class ProxyResolver: """ self.host = str(host) self.port = int(port) - self.jid = unicode(jid) + self.jid = str(jid) if not self.testit: self.state = S_FINISHED return diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 52a7ca1f0..ebac0209e 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -418,19 +418,12 @@ class P2PConnection(IdleObject, PlugIn): """ Append stanza to the queue of messages to be send if now is False, else send it instantly - - If supplied data is unicode string, encode it to UTF-8. """ if self.state <= 0: return r = packet - if isinstance(r, unicode): - r = r.encode('utf-8') - elif not isinstance(r, str): - r = ustr(r).encode('utf-8') - if now: self.sendqueue.insert(0, (r, is_message)) self._do_send() @@ -737,7 +730,7 @@ class ClientZeroconf: def send(self, stanza, is_message=False, now=False, on_ok=None, on_not_ok=None): stanza.setFrom(self.roster.zeroconf.name) - to = unicode(stanza.getTo()) + to = stanza.getTo() to = gajim.get_jid_without_resource(to) try: @@ -802,7 +795,7 @@ class ClientZeroconf: def on_ok(_waitid): # if timeout: # self._owner.set_timeout(timeout) - to = unicode(stanza.getTo()) + to = stanza.getTo() to = gajim.get_jid_without_resource(to) try: diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 2b7967a67..0f2319517 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -91,7 +91,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'is_zeroconf', True) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'use_ft_proxies', False) - self.host = unicode(socket.gethostname(), locale.getpreferredencoding()) + self.host = socket.gethostname() gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', self.host) self.port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, @@ -110,8 +110,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'zeroconf_email') if not self.username: - self.username = unicode(getpass.getuser(), - locale.getpreferredencoding()) + self.username = getpass.getuser() gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name', self.username) else: @@ -427,7 +426,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): if realm == '': if event == nbxmpp.transports_nb.DATA_ERROR: thread_id = data[1] - frm = unicode(data[0]) + frm = data[0] session = self.get_or_create_session(frm, thread_id) gajim.nec.push_incoming_event(MessageErrorEvent( None, conn=self, fjid=frm, error_code=-1, error_msg=_( diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index 5ce4f8398..c146b73f1 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -224,14 +224,7 @@ class Zeroconf: return show def avahi_txt(self): - utf8_dict = {} - for key in self.txt: - val = self.txt[key] - if isinstance(val, unicode): - utf8_dict[key] = val.encode('utf-8') - else: - utf8_dict[key] = val - return self.avahi.dict_to_txt_array(utf8_dict) + return self.avahi.dict_to_txt_array(self.txt) def create_service(self): try: diff --git a/src/config.py b/src/config.py index a0693e1c6..8c395585f 100644 --- a/src/config.py +++ b/src/config.py @@ -1355,11 +1355,11 @@ class ManageProxiesWindow: model = self.proxies_treeview.get_model() proxies = gajim.config.get_per('proxies') i = 1 - while ('proxy' + unicode(i)) in proxies: + while ('proxy' + str(i)) in proxies: i += 1 iter_ = model.append() - model.set(iter_, 0, 'proxy' + unicode(i)) - gajim.config.add_per('proxies', 'proxy' + unicode(i)) + model.set(iter_, 0, 'proxy' + str(i)) + gajim.config.add_per('proxies', 'proxy' + str(i)) self.proxies_treeview.set_cursor(model.get_path(iter_)) def on_remove_proxy_button_clicked(self, widget): @@ -1453,7 +1453,7 @@ class ManageProxiesWindow: self.xml.get_object('proxy_table').set_sensitive(True) proxyhost_entry.set_text(gajim.config.get_per('proxies', proxy, 'host')) - proxyport_entry.set_text(unicode(gajim.config.get_per('proxies', + proxyport_entry.set_text(str(gajim.config.get_per('proxies', proxy, 'port'))) proxyuser_entry.set_text(gajim.config.get_per('proxies', proxy, 'user')) @@ -1955,7 +1955,7 @@ class AccountsWindow: if not custom_port: custom_port = 5222 gajim.config.set_per('accounts', account, 'custom_port', custom_port) - self.xml.get_object('custom_port_entry1').set_text(unicode(custom_port)) + self.xml.get_object('custom_port_entry1').set_text(str(custom_port)) # Personal tab gpg_key_label = self.xml.get_object('gpg_key_label1') @@ -3288,13 +3288,13 @@ class ManageBookmarksWindow: return for account in self.treestore: - account_unicode = account[1] - gajim.connections[account_unicode].bookmarks = [] + acct = account[1] + gajim.connections[acct].bookmarks = [] for bm in account.iterchildren(): # Convert True/False/None to '1' or '0' - autojoin = unicode(int(bm[3])) - minimize = unicode(int(bm[4])) + autojoin = str(int(bm[3])) + minimize = str(int(bm[4])) name = bm[1] jid = bm[2] pw = bm[5] @@ -3305,9 +3305,9 @@ class ManageBookmarksWindow: 'minimize': minimize, 'password': pw, 'nick': nick, 'print_status': bm[7]} - gajim.connections[account_unicode].bookmarks.append(bmdict) + gajim.connections[acct].bookmarks.append(bmdict) - gajim.connections[account_unicode].store_bookmarks() + gajim.connections[acct].store_bookmarks() gajim.interface.roster.set_actions_menu_needs_rebuild() self.window.destroy() diff --git a/src/conversation_textview.py b/src/conversation_textview.py index d02fd244a..5496a976c 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -1313,10 +1313,6 @@ class ConversationTextview(GObject.GObject): timestamp_str = helpers.from_one_line(timestamp_str) format_ += timestamp_str tim_format = time.strftime(format_, tim) - if locale.getpreferredencoding() not in ('KOI8-R', 'cp1251'): - # if tim_format comes as unicode because of day_str. - # we convert it to the encoding that we want (and that is utf-8) - tim_format = helpers.ensure_utf8_string(tim_format) return tim_format def detect_other_text_tag(self, text, kind): diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index c6c72138b..f5e306f45 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -113,7 +113,7 @@ class DataFormWidget(Gtk.Alignment, object): def get_title(self): """ - Get the title of data form, as a unicode object. If no title or no form, + Get the title of data form. If no title or no form, returns ''. Useful for setting window title """ if self._data_form is not None: diff --git a/src/dialogs.py b/src/dialogs.py index af57189ea..a6f2010af 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -3110,7 +3110,7 @@ class SingleMessageWindow: def update_char_counter(self, widget): characters_no = self.message_tv_buffer.get_char_count() - self.count_chars_label.set_text(unicode(characters_no)) + self.count_chars_label.set_text(characters_no) def send_single_message(self): if gajim.connections[self.account].connected <= 1: diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index ce281023a..42b0f3851 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -153,12 +153,12 @@ class FileTransfersWindow: for file_props in allfp: if file_props.type_ == 's' and file_props.tt_account == account: # 'account' is the sender - receiver_jid = unicode(file_props.receiver).split('/')[0] + receiver_jid = file_props.receiver.split('/')[0] if jid == receiver_jid and not is_transfer_stopped(file_props): active_transfers[0].append(file_props) elif file_props.type_ == 'r' and file_props.tt_account == account: # 'account' is the recipient - sender_jid = unicode(file_props.sender).split('/')[0] + sender_jid = file_props.sender.split('/')[0] if jid == sender_jid and not is_transfer_stopped(file_props): active_transfers[1].append(file_props) else: @@ -188,7 +188,7 @@ class FileTransfersWindow: sectext += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.type_ == 'r': - jid = unicode(file_props.sender).split('/')[0] + jid = file_props.sender.split('/')[0] sender_name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() sender = sender_name @@ -198,7 +198,7 @@ class FileTransfersWindow: sectext += '\n\t' + _('Sender: %s') % sender sectext += '\n\t' + _('Recipient: ') if file_props.type_ == 's': - jid = unicode(file_props.receiver).split('/')[0] + jid = file_props.receiver.split('/')[0] receiver_name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() recipient = receiver_name @@ -533,7 +533,7 @@ class FileTransfersWindow: _str += ' ' if percent < 10: _str += ' ' - _str += unicode(percent) + '% \n' + _str += str(percent) + '% \n' return _str def _format_time(self, _time): @@ -585,7 +585,7 @@ class FileTransfersWindow: other = file_props.sender else: # we send a file other = file_props.receiver - if isinstance(other, unicode): + if isinstance(other, str): jid = gajim.get_jid_without_resource(other) else: # It's a Contact instance jid = other.jid @@ -713,7 +713,7 @@ class FileTransfersWindow: file_props.type_ = 's' file_props.desc = file_desc file_props.elapsed_time = 0 - file_props.size = unicode(stat[6]) + file_props.size = str(stat[6]) file_props.sender = account file_props.receiver = contact file_props.tt_account = account diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 1c216782a..1df48a5ea 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -354,10 +354,7 @@ class GajimRemote: elif self.command == 'list_accounts': if isinstance(res, list): for account in res: - if isinstance(account, unicode): - print(account.encode(PREFERRED_ENCODING)) - else: - print(account) + print(account) elif self.command == 'account_info': if res: print(self.print_info(0, res, True)) @@ -368,14 +365,11 @@ class GajimRemote: pref_keys = sorted(res.keys()) for pref_key in pref_keys: result = '%s = %s' % (pref_key, res[pref_key]) - if isinstance(result, unicode): - print(result.encode(PREFERRED_ENCODING)) - else: - print(result) + print(result) elif self.command == 'contact_info': print(self.print_info(0, res, True)) elif res: - print(unicode(res).encode(PREFERRED_ENCODING)) + print(res) def check_gajim_running(self): if not self.sbus: @@ -470,7 +464,7 @@ class GajimRemote: ret_str +='\t' elif isinstance(val, int): ret_str +='\t' + str(val) - elif isinstance(val, (str, unicode)): + elif isinstance(val, str): ret_str +='\t' + val elif isinstance(val, (list, tuple)): res = '' @@ -485,7 +479,7 @@ class GajimRemote: for key in prop_dict.keys(): val = prop_dict[key] spacing = ' ' * level * 4 - if isinstance(val, (unicode, int, str)): + if isinstance(val, (int, str)): if val is not None: val = val.strip() ret_str += '%s%-10s: %s\n' % (spacing, key, val) diff --git a/src/gajim.py b/src/gajim.py index efd70cea4..babf2e567 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -84,7 +84,7 @@ if os.name == 'nt': os.environ['LANG'] = lang gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) - gettext.install(APP, DIR, unicode=True) + gettext.install(APP, DIR) locale.setlocale(locale.LC_ALL, '') import ctypes @@ -155,12 +155,8 @@ def parseOpts(): import locale profile, config_path = parseOpts() -if config_path: - config_path = unicode(config_path, locale.getpreferredencoding()) del parseOpts -profile = unicode(profile, locale.getpreferredencoding()) - import common.configpaths common.configpaths.gajimpaths.init(config_path) del config_path diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 4bac43b8e..e6c715942 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -168,10 +168,10 @@ class GajimThemesWindow: # don't confuse translators theme_name = _('theme name') theme_name_ns = theme_name.replace(' ', '_') - while theme_name_ns + unicode(i) in gajim.config.get_per('themes'): + while theme_name_ns + str(i) in gajim.config.get_per('themes'): i += 1 - model.set_value(iter_, 0, theme_name + unicode(i)) - gajim.config.add_per('themes', theme_name_ns + unicode(i)) + model.set_value(iter_, 0, theme_name + str(i)) + gajim.config.add_per('themes', theme_name_ns + str(i)) self.themes_tree.get_selection().select_iter(iter_) col = self.themes_tree.get_column(0) path = model.get_path(iter_) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 6ade68c4f..11c58f43a 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -687,7 +687,7 @@ class GroupchatControl(ChatControlBase): if num_unread == 1: unread = '*' elif num_unread > 1: - unread = '[' + unicode(num_unread) + ']' + unread = '[' + str(num_unread) + ']' label_str = unread + label_str return (label_str, color) @@ -1048,9 +1048,7 @@ class GroupchatControl(ChatControlBase): return None def print_old_conversation(self, text, contact='', tim=None, xhtml = None, - displaymarking=None): - if isinstance(text, str): - text = unicode(text, 'utf-8') + displaymarking=None): if contact: if contact == self.nick: # it's us kind = 'outgoing' @@ -1076,8 +1074,6 @@ class GroupchatControl(ChatControlBase): (contact = 'info' in such a case). If contact is not set: it's a message from the server or help. """ - if isinstance(text, str): - text = unicode(text, 'utf-8') other_tags_for_name = [] other_tags_for_text = [] if contact: @@ -2200,7 +2196,7 @@ class GroupchatControl(ChatControlBase): self.nick_hits = [] # clear the hit list list_nick = gajim.contacts.get_nick_list(self.account, self.room_jid) - list_nick.sort(key=unicode.lower) # case-insensitive sort + list_nick.sort(key=str.lower) # case-insensitive sort if begin == '': # empty message, show lasts nicks that highlighted us first for nick in self.attention_list: diff --git a/src/gui_interface.py b/src/gui_interface.py index 875b6adc4..f3d92c09d 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -164,7 +164,7 @@ class Interface: def handle_event_iq_error(self, obj): #('ERROR_ANSWER', account, (id_, fjid, errmsg, errcode)) - if unicode(obj.errcode) in ('400', '403', '406') and obj.id_: + if str(obj.errcode) in ('400', '403', '406') and obj.id_: # show the error dialog ft = self.instances['file_transfers'] sid = obj.id_ @@ -172,7 +172,7 @@ class Interface: sid = obj.id_[3:] file_props = FilesProp.getFileProp(obj.conn.name, sid) if file_props : - if unicode(obj.errcode) == '400': + if str(obj.errcode) == '400': file_props.error = -3 else: file_props.error = -4 @@ -181,7 +181,7 @@ class Interface: error_msg=obj.errmsg)) obj.conn.disconnect_transfer(file_props) return - elif unicode(obj.errcode) == '404': + elif str(obj.errcode) == '404': sid = obj.id_ if len(obj.id_) > 3 and obj.id_[2] == '_': sid = obj.id_[3:] @@ -951,7 +951,7 @@ class Interface: ft_win = self.instances['file_transfers'] if not file_props.hash_: # We disn't get the hash, sender probably don't support that - jid = unicode(file_props.sender) + jid = file_props.sender self.popup_ft_result(account, jid, file_props) ft_win.set_status(file_props, 'ok') h = Hashes() @@ -963,7 +963,7 @@ class Interface: file_.close() # If the hash we received and the hash of the file are the same, # then the file is not corrupt - jid = unicode(file_props.sender) + jid = file_props.sender if file_props.hash_ == hash_: GObject.idle_add(self.popup_ft_result, account, jid, file_props) GObject.idle_add(ft_win.set_status, file_props, 'ok') @@ -995,7 +995,7 @@ class Interface: self.hashThread.start() gajim.socks5queue.remove_receiver(file_props.sid, True, True) else: # we send a file - jid = unicode(file_props.receiver) + jid = file_props.receiver gajim.socks5queue.remove_sender(file_props.sid, True, True) self.popup_ft_result(account, jid, file_props) @@ -1042,7 +1042,7 @@ class Interface: if file_props is not None: if file_props.type_ == 'r': # get the name of the sender, as it is in the roster - sender = unicode(file_props.sender).split('/')[0] + sender = file_props.sender.split('/')[0] name = gajim.contacts.get_first_contact_from_jid(account, sender).get_shown_name() filename = os.path.basename(file_props.file_name) diff --git a/src/message_window.py b/src/message_window.py index 2cf5cdaeb..e2912fe56 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -498,7 +498,7 @@ class MessageWindow(object): unread_str = '' if unread > 1: - unread_str = '[' + unicode(unread) + '] ' + unread_str = '[' + str(unread) + '] ' elif unread == 1: unread_str = '* ' else: @@ -693,10 +693,8 @@ class MessageWindow(object): Return the MessageControl for jid or n, where n is a notebook page index. When key is an int index acct may be None """ - if isinstance(key, str): - key = unicode(key, 'utf-8') - if isinstance(key, unicode): + if isinstance(key, str): jid = key try: return self._controls[acct][jid] diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py index f53424f11..49de73cf0 100644 --- a/src/plugins/plugin.py +++ b/src/plugins/plugin.py @@ -46,7 +46,7 @@ class GajimPlugin(object): Will be shown in plugins management GUI. - :type: unicode + :type: str ''' short_name = '' ''' @@ -54,7 +54,7 @@ class GajimPlugin(object): Used for quick indentification of plugin. - :type: unicode + :type: str :todo: decide whether we really need this one, because class name (with module name) can act as such short name @@ -63,7 +63,7 @@ class GajimPlugin(object): ''' Version of plugin. - :type: unicode + :type: str :todo: decide how to compare version between each other (which one is higher). Also rethink: do we really need to compare versions @@ -75,7 +75,7 @@ class GajimPlugin(object): ''' Plugin description. - :type: unicode + :type: str :todo: should be allow rich text here (like HTML or reStructuredText)? ''' @@ -83,7 +83,7 @@ class GajimPlugin(object): ''' Plugin authors. - :type: [] of unicode + :type: [] of str :todo: should we decide on any particular format of author strings? Especially: should we force format of giving author's e-mail? @@ -92,7 +92,7 @@ class GajimPlugin(object): ''' URL to plug-in's homepage. - :type: unicode + :type: str :todo: should we check whether provided string is valid URI? (Maybe using 'property') @@ -120,7 +120,7 @@ class GajimPlugin(object): Values are tuples: (default_value, option_description). The first one can be anything (this is the advantage of using shelve/pickle instead of - custom-made config I/O handling); the second one should be unicode (gettext + custom-made config I/O handling); the second one should be str (gettext can be used if need and/or translation is planned). :type: {} of 2-element tuples diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 0a3dc9b75..d9fce1295 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -158,7 +158,7 @@ class PluginManager(object): active yet). :param gui_extpoint_name: name of GUI extension point. - :type gui_extpoint_name: unicode + :type gui_extpoint_name: str :param args: parameters to be passed to extension point handlers (typically and object that invokes `gui_extension_point`; however, this can be practically anything) @@ -209,7 +209,7 @@ class PluginManager(object): freedom, but is this necessary? :param gui_extpoint_name: name of GUI extension point. - :type gui_extpoint_name: unicode + :type gui_extpoint_name: str :param args: arguments that `PluginManager.gui_extension_point` was called with for this extension point. This is used (along with extension point name) to identify element to be removed. @@ -394,7 +394,7 @@ class PluginManager(object): Scans given directory for plugin classes. :param path: directory to scan for plugins - :type path: unicode + :type path: str :return: list of found plugin classes (subclasses of `GajimPlugin` :rtype: [] of class objects diff --git a/src/remote_control.py b/src/remote_control.py index 5216201bb..a5d8cf115 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -72,7 +72,7 @@ def get_dbus_struct(obj): """ if obj is None: return DBUS_NONE() - if isinstance(obj, (unicode, str)): + if isinstance(obj, str): return DBUS_STRING(obj) if isinstance(obj, int): return DBUS_INT32(obj) @@ -613,8 +613,8 @@ class SignalObject(dbus.service.Object): """ Get vcard info for a contact. Return cached value of the vcard """ - if not isinstance(jid, unicode): - jid = unicode(jid) + if not isinstance(jid, str): + jid = str(jid) if not jid: raise dbus_support.MissingArgument() jid = self._get_real_jid(jid) @@ -652,9 +652,9 @@ class SignalObject(dbus.service.Object): result['name'] = DBUS_STRING(con.name) result['jid'] = DBUS_STRING(gajim.get_jid_from_account(con.name)) result['message'] = DBUS_STRING(con.status) - result['priority'] = DBUS_STRING(unicode(con.priority)) - result['resource'] = DBUS_STRING(unicode(gajim.config.get_per( - 'accounts', con.name, 'resource'))) + result['priority'] = DBUS_STRING(str(con.priority)) + result['resource'] = DBUS_STRING(gajim.config.get_per('accounts', + con.name, 'resource')) return result @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') diff --git a/src/roster_window.py b/src/roster_window.py index 9687d574a..a447f908f 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1202,7 +1202,7 @@ class RosterWindow: nb_connected_contact += 1 if nb_connected_contact > 1: # switch back to default writing direction - name += i18n.paragraph_direction_mark(unicode(name)) + name += i18n.paragraph_direction_mark(name) name += ' (%d)' % nb_connected_contact # add status msg, if not empty, under contact name in @@ -3512,8 +3512,8 @@ class RosterWindow: elif type_ == 'agent': self.on_remove_agent(widget, list_) - elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.MOD1_MASK)) and\ - Gdk.keyval_to_unicode(event.keyval): + elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | \ + Gdk.ModifierType.MOD1_MASK)) and Gdk.keyval_to_unicode(event.keyval): # if we got unicode symbol without ctrl / alt num = Gdk.keyval_to_unicode(event.keyval) self.enable_rfilter(unichr(num)) diff --git a/src/tooltips.py b/src/tooltips.py index 40c189d80..9e09e33e5 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -235,13 +235,10 @@ class StatusTable: self.current_row + 1) def get_status_info(self, resource, priority, show, status): - str_status = resource + ' (' + unicode(priority) + ')' + str_status = resource + ' (' + str(priority) + ')' if status: status = status.strip() if status != '': - # make sure 'status' is unicode before we send to to reduce_chars - if isinstance(status, str): - status = unicode(status, encoding='utf-8') # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) str_status = GObject.markup_escape_text(str_status) @@ -301,10 +298,6 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] - # before reducing the chars we should assure we send unicode, else - # there are possible pango TBs on 'set_markup' - if isinstance(message, str): - message = unicode(message, encoding = 'utf-8') message = helpers.reduce_chars_newlines(message, 100, 1) message = GObject.markup_escape_text(message) if acct['name'] in gajim.con_types and \ @@ -606,7 +599,7 @@ class RosterTooltip(NotificationAreaTooltip): if num_resources == 1 and contact.resource: properties.append((_('Resource: '), GObject.markup_escape_text(contact.resource) +\ - ' (' + unicode(contact.priority) + ')')) + ' (' + str(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: @@ -670,7 +663,7 @@ class RosterTooltip(NotificationAreaTooltip): vcard_current_row + 1, Gtk.AttachOptions.EXPAND | \ Gtk.AttachOptions.FILL, vertical_fill, 0, 0) else: - if isinstance(property_[0], (unicode, str)): # FIXME: rm unicode? + if isinstance(property_[0], str): label.set_markup(property_[0]) label.set_line_wrap(True) else: @@ -743,7 +736,7 @@ class FileTransfersTooltip(BaseTooltip): if file_props.type_ == 'r': type_ = _('Download') actor = _('Sender: ') - sender = unicode(file_props.sender).split('/')[0] + sender = file_props.sender.split('/')[0] name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, sender).get_shown_name() else: diff --git a/src/vcard.py b/src/vcard.py index 4adf4f961..35c194f30 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -408,10 +408,10 @@ class VcardWindow: tt_text = _("There is no pending subscription request.") eb.set_tooltip_text(tt_text) - resources = '%s (%s)' % (self.contact.resource, unicode( - self.contact.priority)) + resources = '%s (%s)' % (self.contact.resource, str( + self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ - + unicode(self.contact.priority) + + str(self.contact.priority) if not self.contact.status: self.contact.status = '' @@ -462,9 +462,9 @@ class VcardWindow: for c in contact_list: if c.resource != self.contact.resource: resources += '\n%s (%s)' % (c.resource, - unicode(c.priority)) + str(c.priority)) uf_resources += '\n' + c.resource + \ - _(' resource with priority ') + unicode(c.priority) + _(' resource with priority ') + str(c.priority) if c.show not in ('offline', 'error'): GObject.idle_add( gajim.connections[self.account].request_os_info, c.jid, @@ -584,10 +584,10 @@ class ZeroconfVcardWindow: '') self.xml.get_object('local_jid_label').set_text(self.contact.jid) - resources = '%s (%s)' % (self.contact.resource, unicode( - self.contact.priority)) + resources = '%s (%s)' % (self.contact.resource, str( + self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ - + unicode(self.contact.priority) + + str(self.contact.priority) if not self.contact.status: self.contact.status = '' From d27591076fa0ec8ab046aa805581e88e5c612585 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 23:18:36 +0100 Subject: [PATCH 020/592] fix exception handling --- plugins/dbus_plugin/plugin.py | 2 +- src/command_system/framework.py | 2 +- .../implementation/middleware.py | 4 +- src/common/check_paths.py | 2 +- src/common/configpaths.py | 2 +- src/common/connection.py | 2 +- src/common/connection_handlers.py | 6 +-- src/common/connection_handlers_events.py | 6 +-- src/common/contacts.py | 2 +- src/common/dbus_support.py | 2 +- src/common/ged.py | 4 +- src/common/helpers.py | 10 ++--- src/common/idle.py | 2 +- src/common/jingle_rtp.py | 6 +-- src/common/jingle_xtls.py | 4 +- src/common/logger.py | 44 +++++++++---------- src/common/optparser.py | 8 ++-- src/common/passwords.py | 2 +- src/common/proxy65_manager.py | 4 +- src/common/rst_xhtml_generator.py | 2 +- src/common/socks5.py | 38 ++++++++-------- src/common/zeroconf/client_zeroconf.py | 8 ++-- src/common/zeroconf/zeroconf_avahi.py | 12 ++--- src/common/zeroconf/zeroconf_bonjour.py | 8 ++-- src/config.py | 12 ++--- src/conversation_textview.py | 2 +- src/dataforms_widget.py | 2 +- src/dialogs.py | 6 +-- src/disco.py | 4 +- src/gtkgui_helpers.py | 10 ++--- src/gui_interface.py | 6 +-- src/history_manager.py | 2 +- src/history_window.py | 2 +- src/htmltextview.py | 4 +- src/notify.py | 10 ++--- src/plugins/gui.py | 6 +-- src/plugins/pluginmanager.py | 24 +++++----- src/plugins/plugins_i18n.py | 2 +- src/profile_window.py | 2 +- src/remote_control.py | 2 +- src/roster_window.py | 2 +- src/session.py | 14 +++--- test/integration/test_xmpp_transports_nb.py | 2 +- test/runtests.py | 2 +- 44 files changed, 149 insertions(+), 149 deletions(-) diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index 43f3840e8..98dda772c 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -508,7 +508,7 @@ if dbus_support.supported: def prefs_store(self): try: gajim.interface.save_config() - except Exception, e: + except Exception as e: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) diff --git a/src/command_system/framework.py b/src/command_system/framework.py index d57ab7e5e..f410d594a 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -165,7 +165,7 @@ class Command(object): # command or name attributes set. They will be set to a # corresponding values right here in case if they was not set by # the one who raised an exception. - except CommandError, error: + except CommandError as error: if not error.command and not error.name: raise CommandError(error.message, self) raise diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index 494444a32..64396d0f6 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -62,13 +62,13 @@ class ChatCommandProcessor(CommandProcessor): try: parents = super(ChatCommandProcessor, self) parents.execute_command(name, arguments) - except NoCommandError, error: + except NoCommandError as error: details = dict(name=error.name, message=error.message) message = "%(name)s: %(message)s\n" % details message += "Try using the //%(name)s or /say /%(name)s " % details message += "construct if you intended to send it as a text." self.echo_error(message) - except CommandError, error: + except CommandError as error: self.echo_error("%s: %s" % (error.name, error.message)) except Exception: self.echo_error(_("Error during command execution!")) diff --git a/src/common/check_paths.py b/src/common/check_paths.py index e046d38aa..9ea3bd898 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -161,7 +161,7 @@ def split_db(): con.commit() cur.executescript('DROP TABLE %s;' % table) con.commit() - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: print('error moving table %s to cache.db: %s' % (table, str(e)), file=sys.stderr) con.close() diff --git a/src/common/configpaths.py b/src/common/configpaths.py index c09191709..94550b988 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -161,7 +161,7 @@ class ConfigPaths: windowsify('plugins'))) try: self.add('TMP', None, fse(tempfile.gettempdir())) - except IOError, e: + except IOError as e: print('Error opening tmp folder: %s\nUsing %s' % (str(e), os.path.expanduser('~')), file=sys.stderr) self.add('TMP', None, fse(os.path.expanduser('~'))) diff --git a/src/common/connection.py b/src/common/connection.py index 2e113f084..6734ede28 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -455,7 +455,7 @@ class CommonConnection: log_msg = '%s' % ( nbxmpp.NS_XHTML, xhtml) gajim.logger.write(kind, jid, log_msg) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 4f87ced39..5db5a96ac 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -331,7 +331,7 @@ class ConnectionVcard: fil = open(path_to_file, 'w') fil.write(str(card)) fil.close() - except IOError, e: + except IOError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self, level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) @@ -947,7 +947,7 @@ class ConnectionHandlersBase: gajim.config.should_log(self.name, obj.jid): try: gajim.logger.write('status', obj.jid, obj.status, obj.show) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') @@ -1069,7 +1069,7 @@ class ConnectionHandlersBase: try: gajim.logger.write('error', frm, error_msg, tim=tim, subject=subject) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 55430de2d..5dd2690d8 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -220,11 +220,11 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ') - except ValueError, e: + except ValueError as e: try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%S.%fZ') - except ValueError, e: + except ValueError as e: log.info('Wrong time format: %s' % str(e)) return @@ -905,7 +905,7 @@ class GcPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: gajim.logger.write('gcstatus', self.fjid, st, self.show) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: diff --git a/src/common/contacts.py b/src/common/contacts.py index 88c073242..7f7ff283c 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -32,7 +32,7 @@ try: from common import caps_cache from common.account import Account import common.gajim -except ImportError, e: +except ImportError as e: if __name__ != "__main__": raise ImportError(e) diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index 5b1424a1c..8109c36ed 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -154,7 +154,7 @@ def get_interface(interface, path, start_service=True): return None obj = bus.get_object(interface, path) return dbus.Interface(obj, interface) - except Exception, e: + except Exception as e: gajim.log.debug(str(e)) return None diff --git a/src/common/ged.py b/src/common/ged.py index 9ac3604a2..d46214fc5 100644 --- a/src/common/ged.py +++ b/src/common/ged.py @@ -79,7 +79,7 @@ class GlobalEventsDispatcher(object): if event_name in self.handlers: try: self.handlers[event_name].remove((priority, handler)) - except ValueError, error: + except ValueError as error: log.warn('''Function (%s) with priority "%s" never registered as handler of event "%s". Couldn\'t remove. Error: %s''' %(handler, priority, event_name, error)) @@ -94,7 +94,7 @@ class GlobalEventsDispatcher(object): return True except NodeProcessed: node_processed = True - except Exception, e: + except Exception as e: log.error('Error while running an even handler: %s' % \ handler) traceback.print_exc() diff --git a/src/common/helpers.py b/src/common/helpers.py index 27ad2fdc9..6a86be88d 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -207,7 +207,7 @@ def temp_failure_retry(func, *args, **kwargs): while True: try: return func(*args, **kwargs) - except (os.error, IOError, select.error), ex: + except (os.error, IOError, select.error) as ex: if ex.errno == errno.EINTR: continue else: @@ -1465,7 +1465,7 @@ def _get_img_direct(attrs): req = urllib2.Request(attrs['src']) req.add_header('User-Agent', 'Gajim ' + gajim.version) f = urllib2.urlopen(req) - except Exception, ex: + except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') @@ -1488,7 +1488,7 @@ def _get_img_direct(attrs): break try: temp = f.read(100) - except socket.timeout, ex: + except socket.timeout as ex: log.debug('Timeout loading image %s ' % attrs['src'] + str(ex)) alt = attrs.get('alt', '') if alt: @@ -1540,7 +1540,7 @@ def _get_img_proxy(attrs, proxy): c.close() t = b.getvalue() return (t, attrs.get('alt', '')) - except pycurl.error, ex: + except pycurl.error as ex: alt = attrs.get('alt', '') if alt: alt += '\n' @@ -1550,7 +1550,7 @@ def _get_img_proxy(attrs, proxy): alt += _('Timeout loading image') else: alt += _('Error loading image') - except Exception, ex: + except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') diff --git a/src/common/idle.py b/src/common/idle.py index 26f1d6993..c2cccdd4b 100644 --- a/src/common/idle.py +++ b/src/common/idle.py @@ -68,7 +68,7 @@ try: rootwindow = libX11.XDefaultRootWindow(dpy_p) xss_available = True -except OSError, e: +except OSError as e: # Logging? xss_available = False diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index c28a48457..26ac22544 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -86,8 +86,8 @@ class JingleRTPContent(JingleContent): try: ip = socket.getaddrinfo(stun_server, 0, socket.AF_UNSPEC, socket.SOCK_STREAM)[0][4][0] - except socket.gaierror, (errnum, errstr): - log.warn('Lookup of stun ip failed: %s' % errstr) + except socket.gaierror as e: + log.warn('Lookup of stun ip failed: %s' % str(e)) else: params['stun-ip'] = ip @@ -104,7 +104,7 @@ class JingleRTPContent(JingleContent): try: bin = gst.parse_bin_from_description(pipeline, True) return bin - except GError, error_str: + except GError as error_str: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.session.connection, level='error', pri_txt=_('%s configuration error') % text.capitalize(), diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index 9742f0bd7..3a251179f 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -63,7 +63,7 @@ def load_cert_file(cert_path, cert_store): return try: f = open(cert_path) - except IOError, e: + except IOError as e: log.warning('Unable to open certificate file %s: %s' % (cert_path, str(e))) return @@ -79,7 +79,7 @@ def load_cert_file(cert_path, cert_store): x509cert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, cert) cert_store.add_cert(x509cert) - except OpenSSL.crypto.Error, exception_obj: + except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to load a certificate from file %s: %s' %\ (cert_path, exception_obj.args[0][0][2])) except: diff --git a/src/common/logger.py b/src/common/logger.py index 0a67fe3e2..1f25d940e 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -149,7 +149,7 @@ class Logger: def attach_cache_database(self): try: self.cur.execute("ATTACH DATABASE '%s' AS cache" % CACHE_DB_PATH) - except sqlite.Error, e: + except sqlite.Error as e: log.debug("Failed to attach cache database: %s" % str(e)) def set_synchronous(self, sync): @@ -158,7 +158,7 @@ class Logger: self.cur.execute("PRAGMA synchronous = NORMAL") else: self.cur.execute("PRAGMA synchronous = OFF") - except sqlite.Error, e: + except sqlite.Error as e: log.debug("Failed to set_synchronous(%s): %s" % (sync, str(e))) def init_vars(self): @@ -168,7 +168,7 @@ class Logger: def _really_commit(self): try: self.con.commit() - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: print(str(e), file=sys.stderr) self.commit_timout_id = None return False @@ -256,11 +256,11 @@ class Logger: self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) self.con.commit() - except sqlite.IntegrityError, e: + except sqlite.IntegrityError as e: # Jid already in DB, maybe added by another instance. re-read DB self.get_jids_already_in_db() return self.get_jid_id(jid, typestr) - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) jid_id = self.cur.lastrowid self.jids_already_in.append(jid) @@ -407,14 +407,14 @@ class Logger: self.cur.execute(sql, values) except sqlite.DatabaseError: raise exceptions.DatabaseMalformed - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) message_id = None if write_unread: try: self.con.commit() message_id = self.cur.lastrowid - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: print(str(e), file=sys.stderr) else: self._timeout_commit() @@ -522,7 +522,7 @@ class Logger: # status for roster items try: jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) if show is None: # show is None (xmpp), but we say that 'online' show_col = constants.SHOW_ONLINE @@ -535,7 +535,7 @@ class Logger: try: # re-get jid_id for the new jid jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) contact_name_col = nick @@ -549,13 +549,13 @@ class Logger: try: # re-get jid_id for the new jid jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) contact_name_col = nick else: try: jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) if kind == 'chat_msg_recv': if not self.jid_is_from_pm(jid): @@ -580,7 +580,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -624,7 +624,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -653,14 +653,14 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] if False: # query.startswith('SELECT '): # it's SQL query (FIXME) try: self.cur.execute(query) - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: results = [('', '', '', '', str(e))] return results @@ -694,7 +694,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] days_with_logs = [] @@ -736,7 +736,7 @@ class Logger: else: try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = ?' @@ -762,7 +762,7 @@ class Logger: """ try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = %s' % jid_id @@ -802,7 +802,7 @@ class Logger: for user in family: try: jid_id = self.get_jid_id(user['jid']) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: continue where_sql += 'jid_id = ?' jid_tuple += (jid_id,) @@ -988,7 +988,7 @@ class Logger: try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) self.cur.execute( 'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?', @@ -1010,7 +1010,7 @@ class Logger: try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) # Update groups information @@ -1150,7 +1150,7 @@ class Logger: # when we quit this muc obj.conn.last_history_time[obj.jid] = tim_f - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: obj.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') diff --git a/src/common/optparser.py b/src/common/optparser.py index cbb1bb033..39a20c851 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -102,11 +102,11 @@ class OptionsParser: self.__tempfile = os.path.join(base_dir, '.' + filename) try: f = open(self.__tempfile, 'w') - except IOError, e: + except IOError as e: return str(e) try: gajim.config.foreach(self.write_line, f) - except IOError, e: + except IOError as e: return str(e) f.flush() os.fsync(f.fileno()) @@ -120,7 +120,7 @@ class OptionsParser: pass try: os.rename(self.__tempfile, self.__filename) - except IOError, e: + except IOError as e: return str(e) os.chmod(self.__filename, 0600) @@ -648,7 +648,7 @@ class OptionsParser: ''' ) con.commit() - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: pass con.close() gajim.config.set('version', '0.11.4.4') diff --git a/src/common/passwords.py b/src/common/passwords.py index 5a5cbd5f8..d61d2afd9 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -81,7 +81,7 @@ class GnomePasswordStorage(PasswordStorage): ## migrate the password over to keyring try: self.save_password(account_name, password, update=False) - except GnomeKeyringError, e: + except GnomeKeyringError as e: if e.error == GnomeKeyring.Result.NO_KEYRING_DAEMON: ## no keyring daemon: in the future, stop using it set_storage(SimplePasswordStorage()) diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 71d782f19..ccf20d6c0 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -333,7 +333,7 @@ class HostTester(Socks5, IdleObject): log.debug('Host Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv - except Exception, ee: + except Exception as ee: errnum = ee[0] # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): @@ -461,7 +461,7 @@ class ReceiverTester(Socks5, IdleObject): log.debug('Receiver Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv - except Exception, ee: + except Exception as ee: errnum = ee[0] # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index 35907a03d..7d4e366ff 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -65,7 +65,7 @@ else: options={}, content=[]): try: valid_text = validator(text) - except ValueError, e: + except ValueError as e: msg = inliner.reporter.error( e.message % dict(text=text), line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] diff --git a/src/common/socks5.py b/src/common/socks5.py index a8ce7ecd5..f7dae87a1 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -463,7 +463,7 @@ class Socks5: self._sock.setblocking(False) self._server = ai[4] break - except socket.error, e: + except socket.error as e: if not isinstance(e, basestring) and e[0] == EINPROGRESS: break # for all other errors, we try other addresses @@ -481,7 +481,7 @@ class Socks5: self._sock.setblocking(False) self._send=self._sock.send self._recv=self._sock.recv - except Exception, ee: + except Exception as ee: errnum = ee[0] self.connect_timeout += 1 if errnum == 111 or self.connect_timeout > 1000: @@ -533,7 +533,7 @@ class Socks5: self.size = self.file_props.offset self.file.seek(self.size) self.file_props.received_len = self.size - except IOError, e: + except IOError as e: self.close_file() raise IOError, e @@ -583,7 +583,7 @@ class Socks5: try: add = self._recv(64) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request : ' + repr(e)) raise e except Exception: @@ -600,10 +600,10 @@ class Socks5: try: self._send(raw_data) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception, e: + except Exception as e: self.disconnect() return len(raw_data) @@ -614,7 +614,7 @@ class Socks5: else: try: self.open_file_for_reading() - except IOError, e: + except IOError as e: self.state = 8 # end connection self.disconnect() self.file_props.error = -7 # unable to read from file @@ -625,10 +625,10 @@ class Socks5: try: lenn = self._send(buff) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception, e: + except Exception as e: if e.args[0] not in (EINTR, ENOBUFS, EWOULDBLOCK): # peer stopped reading self.state = 8 # end connection @@ -671,7 +671,7 @@ class Socks5: if self.remaining_buff != '': try: fd = self.get_fd() - except IOError, e: + except IOError as e: self.disconnect(False) self.file_props.error = -6 # file system error return 0 @@ -692,14 +692,14 @@ class Socks5: else: try: fd = self.get_fd() - except IOError, e: + except IOError as e: self.disconnect(False) self.file_props.error = -6 # file system error return 0 try: buff = self._recv(MAX_BUFF_LEN) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception: @@ -718,7 +718,7 @@ class Socks5: return 0 try: fd.write(buff) - except IOError, e: + except IOError as e: self.rem_fd(fd) self.disconnect() self.file_props.error = -6 # file system error @@ -842,7 +842,7 @@ class Socks5: try: buff = self._recv() except (SSL.WantReadError, SSL.WantWriteError, - SSL.WantX509LookupError), e: + SSL.WantX509LookupError) as e: log.info("SSL rehandshake request : " + repr(e)) raise e try: @@ -1085,7 +1085,7 @@ class Socks5Server(Socks5): result = self.start_transfer() # send self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') else: self.disconnect() @@ -1123,7 +1123,7 @@ class Socks5Server(Socks5): else: self.disconnect() except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return if self.state < 5: @@ -1229,7 +1229,7 @@ class Socks5Client(Socks5): result = self.start_transfer() # receive self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return else: @@ -1253,7 +1253,7 @@ class Socks5Client(Socks5): self.queue.process_result(result, self) return except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return self.state += 1 @@ -1346,7 +1346,7 @@ class Socks5Listener(IdleObject): if self.fingerprint is not None: self._serv = OpenSSL.SSL.Connection( jingle_xtls.get_context('server'), self._serv) - except socket.error, e: + except socket.error as e: if e.args[0] == EAFNOSUPPORT: self.ai = None continue diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index ebac0209e..69f1a4e6f 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -356,7 +356,7 @@ class P2PConnection(IdleObject, PlugIn): try: self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) - except socket.gaierror, e: + except socket.gaierror as e: log.info('Lookup failure for %s: %s[%s]', host, e[1], repr(e[0]), exc_info=True) else: @@ -448,7 +448,7 @@ class P2PConnection(IdleObject, PlugIn): try: self._sock.connect(self._server) self._sock.setblocking(False) - except Exception, ee: + except Exception as ee: (errnum, errstr) = ee errors = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK) if 'WSAEINVAL' in errno.__dict__: @@ -488,7 +488,7 @@ class P2PConnection(IdleObject, PlugIn): try: # get as many bites, as possible, but not more than RECV_BUFSIZE received = self._sock.recv(MAX_BUFF_LEN) - except Exception, e: + except Exception as e: if len(e.args) > 0 and isinstance(e.args[0], int): errnum = e[0] # "received" will be empty anyhow @@ -559,7 +559,7 @@ class P2PConnection(IdleObject, PlugIn): self._plug_idle() self._on_send() - except socket.error, e: + except socket.error as e: if e[0] == socket.SSL_ERROR_WANT_WRITE: return True if self.state < 0: diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index c146b73f1..acfa85885 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -22,7 +22,7 @@ log = logging.getLogger('gajim.c.z.zeroconf_avahi') try: import dbus.exceptions -except ImportError, e: +except ImportError as e: pass from common.zeroconf.zeroconf import C_BARE_NAME, C_INTERFACE, C_PROTOCOL, C_DOMAIN @@ -267,7 +267,7 @@ class Zeroconf: return True - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) return False @@ -327,7 +327,7 @@ class Zeroconf: self.bus.add_signal_receiver(self.avahi_dbus_connect_cb, 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.freedesktop.Avahi') - except Exception, e: + except Exception as e: # System bus is not present self.bus = None log.debug(str(e)) @@ -354,7 +354,7 @@ class Zeroconf: self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) self.server.connect_to_signal('StateChanged', self.server_state_changed_callback) - except Exception, e: + except Exception as e: # Avahi service is not present self.server = None log.debug(str(e)) @@ -395,14 +395,14 @@ class Zeroconf: if self.service_browser: try: self.service_browser.Free() - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) self.service_browser._obj._bus = None self.service_browser._obj = None if self.domain_browser: try: self.domain_browser.Free() - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) self.domain_browser._obj._bus = None self.domain_browser._obj = None diff --git a/src/common/zeroconf/zeroconf_bonjour.py b/src/common/zeroconf/zeroconf_bonjour.py index c8270c178..7d1566e34 100644 --- a/src/common/zeroconf/zeroconf_bonjour.py +++ b/src/common/zeroconf/zeroconf_bonjour.py @@ -24,7 +24,7 @@ from common.zeroconf.zeroconf import C_BARE_NAME, C_DOMAIN try: import pybonjour -except ImportError, e: +except ImportError as e: pass @@ -224,7 +224,7 @@ class Zeroconf: regtype = self.stype, port = self.port, txtRecord = self.txt, callBack = self.service_added_callback) self.service_sdRef = sdRef - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: self.service_add_fail_callback(e) else: gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) @@ -248,7 +248,7 @@ class Zeroconf: self.service_sdRef.close() self.announced = False return True - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: gajim.log.debug(e) return False @@ -282,7 +282,7 @@ class Zeroconf: gajim.log.debug('starting to browse') try: self.browse_sdRef = pybonjour.DNSServiceBrowse(regtype=self.stype, domain=domain, callBack=self.browse_callback) - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: self.error_CB("Error while browsing: %s" % e) def browse_loop(self): diff --git a/src/config.py b/src/config.py index 8c395585f..9c748e58c 100644 --- a/src/config.py +++ b/src/config.py @@ -2161,7 +2161,7 @@ class AccountsWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) @@ -2238,7 +2238,7 @@ class AccountsWindow: 'utf-8') try: resource = helpers.parse_resource(resource) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) @@ -3385,7 +3385,7 @@ class ManageBookmarksWindow: nick = self.nick_entry.get_text() try: nick = helpers.parse_resource(nick) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid nickname'), _('Character not allowed')) self.nick_entry.set_text(model[iter_][6]) @@ -3405,7 +3405,7 @@ class ManageBookmarksWindow: server.strip() try: room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) self.server_entry.set_text(model[iter_][2].split('@')[1]) @@ -3424,7 +3424,7 @@ class ManageBookmarksWindow: self.server_entry.get_text().strip() try: room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid room'), _('Character not allowed')) self.room_entry.set_text(model[iter_][2].split('@')[0]) @@ -3644,7 +3644,7 @@ class AccountCreationWizardWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) return diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 5496a976c..2fbb89567 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -1366,7 +1366,7 @@ class ConversationTextview(GObject.GObject): xhtml = xhtml.replace('/me', '* %s' % (name,), 1) self.tv.display_html(xhtml.encode('utf-8'), self) return - except Exception, e: + except Exception as e: gajim.log.debug('Error processing xhtml' + str(e)) gajim.log.debug('with |' + xhtml + '|') diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index f5e306f45..766e51477 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -629,7 +629,7 @@ class SingleForm(Gtk.Table, object): return try: newtext = helpers.parse_jid(newtext) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: dialogs.ErrorDialog(_('Invalid Jabber ID'), str(s)) return if newtext in field.values: diff --git a/src/dialogs.py b/src/dialogs.py index a6f2010af..f8f3402ce 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1073,7 +1073,7 @@ class AddNewContactWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return @@ -2740,7 +2740,7 @@ class NewChatDialog(InputDialog): else: try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: ErrorDialog(_('Invalid JID'), e[0]) return except: @@ -3672,7 +3672,7 @@ class ItemArchivingPreferencesWindow: if self.item != 'Default': try: item = helpers.parse_jid(item) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return diff --git a/src/disco.py b/src/disco.py index 4d7aed9da..84e19f18c 100644 --- a/src/disco.py +++ b/src/disco.py @@ -803,7 +803,7 @@ _('This type of service does not contain any items to browse.')) jid = self.address_comboboxentry.get_child().get_text() try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return @@ -813,7 +813,7 @@ _('This type of service does not contain any items to browse.')) jid = self.address_comboboxentry.get_child().get_text() try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index b6e92a9f2..824355cf0 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -48,7 +48,7 @@ gtk_icon_theme.append_search_path(gajim.ICONS_DIR) def get_icon_pixmap(icon_name, size=16): try: return gtk_icon_theme.load_icon(icon_name, size, 0) - except GObject.GError, e: + except GObject.GError as e: log.error('Unable to load icon %s: %s' % (icon_name, str(e))) def get_icon_path(icon_name, size=16): @@ -59,7 +59,7 @@ def get_icon_path(icon_name, size=16): return "" else: return icon_info.get_filename() - except GObject.GError, e: + except GObject.GError as e: log.error("Unable to find icon %s: %s" % (icon_name, str(e))) import vcard @@ -342,10 +342,10 @@ def parse_server_xml(path_to_file): xml.sax.parse(path_to_file, handler) return handler.servers # handle exception if unable to open file - except IOError, message: + except IOError as message: print(_('Error reading file:') + message, file=sys.stderr) # handle exception parsing file - except xml.sax.SAXParseException, message: + except xml.sax.SAXParseException as message: print(_('Error parsing file:') + message, file=sys.stderr) def set_unset_urgency_hint(window, unread_messages_no): @@ -829,7 +829,7 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): # Save image try: pixbuf.savev(file_path, image_format, [], []) - except Exception, e: + except Exception as e: log.debug('Error saving avatar: %s' % str(e)) if os.path.exists(file_path): os.remove(file_path) diff --git a/src/gui_interface.py b/src/gui_interface.py index f3d92c09d..ae4b8dbaf 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2490,7 +2490,7 @@ class Interface: path_to_original_file = path_to_file + extension try: pixbuf.savev(path_to_original_file, typ, [], []) - except Exception, e: + except Exception as e: log.error('Error writing avatar file %s: %s' % ( path_to_original_file, str(e))) # Generate and save the resized, color avatar @@ -2500,7 +2500,7 @@ class Interface: extension try: pixbuf.savev(path_to_normal_file, 'png', [], []) - except Exception, e: + except Exception as e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) # Generate and save the resized, black and white avatar @@ -2510,7 +2510,7 @@ class Interface: path_to_bw_file = path_to_file + '_notif_size_bw' + extension try: bwbuf.savev(path_to_bw_file, 'png', [], []) - except Exception, e: + except Exception as e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) diff --git a/src/history_manager.py b/src/history_manager.py index 34e757722..dc2d0b15f 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -64,7 +64,7 @@ def parseOpts(): shortargs = 'hc:' longargs = 'help config_path=' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] - except getopt.error, msg: + except getopt.error as msg: print(str(msg)) print('for help use --help') sys.exit(2) diff --git a/src/history_window.py b/src/history_window.py index 00d1c186f..d305e8799 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -352,7 +352,7 @@ class HistoryWindow: try: log_days = gajim.logger.get_days_with_logs(self.jid, year, month, days_in_this_month, self.account) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: dialogs.ErrorDialog(_('Disk Error'), str(e)) return for day in log_days: diff --git a/src/htmltextview.py b/src/htmltextview.py index 208bbf8ba..a34373dd5 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -587,7 +587,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.textbuf.delete_mark(tmpmark) else: self._insert_text('[IMG: %s]' % alt, working_iter) - except Exception, ex: + except Exception as ex: log.error('Error loading image ' + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') @@ -764,7 +764,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.textview.focus_out_line_pixbuf) #self._insert_text('\u2550'*40) self._jump_line() - except Exception, e: + except Exception as e: log.debug(str('Error in hr'+e)) elif name in LIST_ELEMS: self.list_counters.pop() diff --git a/src/notify.py b/src/notify.py index f2b8d5b11..a9ca09216 100644 --- a/src/notify.py +++ b/src/notify.py @@ -91,10 +91,10 @@ text=None, timeout=-1): DesktopNotification(event_type, jid, account, msg_type, path_to_image, title, GObject.markup_escape_text(text), timeout) return # sucessfully did D-Bus Notification procedure! - except dbus.DBusException, e: + except dbus.DBusException as e: # Connection to D-Bus failed gajim.log.debug(str(e)) - except TypeError, e: + except TypeError as e: # This means that we sent the message incorrectly gajim.log.debug(str(e)) @@ -129,7 +129,7 @@ text=None, timeout=-1): try: notification.show() return - except GObject.GError, e: + except GObject.GError as e: # Connection to notification-daemon failed, see #2893 gajim.log.debug(str(e)) @@ -397,7 +397,7 @@ class DesktopNotification: dbus.UInt32(self.timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) - except Exception, e: + except Exception as e: self.notify_another_way(e) else: try: @@ -412,7 +412,7 @@ class DesktopNotification: dbus.UInt32(self.timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) - except Exception, e: + except Exception as e: self.notify_another_way(e) def attach_by_id(self, id_): diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 5f4a04213..ca4a63da0 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -196,7 +196,7 @@ class PluginsWindow(object): else: try: gajim.plugin_manager.activate_plugin(plugin) - except GajimPluginActivateException, e: + except GajimPluginActivateException as e: WarningDialog(_('Plugin failed'), str(e), transient_for=self.window) return @@ -241,7 +241,7 @@ class PluginsWindow(object): is_active = model.get_value(iter, ACTIVE) try: gajim.plugin_manager.remove_plugin(plugin) - except PluginsystemError, e: + except PluginsystemError as e: WarningDialog(_('Unable to properly remove the plugin'), str(e), self.window) return @@ -280,7 +280,7 @@ class PluginsWindow(object): def _try_install(zip_filename): try: plugin = gajim.plugin_manager.install_from_zip(zip_filename) - except PluginsystemError, er_type: + except PluginsystemError as er_type: error_text = str(er_type) if error_text == _('Plugin already exists'): _on_plugin_exists(zip_filename) diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index d9fce1295..4e7de9de2 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -302,7 +302,7 @@ class PluginManager(object): self.active_plugins.append(plugin) try: plugin.activate() - except GajimPluginException, e: + except GajimPluginException as e: self.deactivate_plugin(plugin) raise GajimPluginActivateException(str(e)) self._set_plugin_active_in_global_config(plugin) @@ -426,9 +426,9 @@ class PluginManager(object): module_name = os.path.splitext(elem_name)[0] try: module = __import__(module_name) - except ValueError, value_error: + except ValueError as value_error: log.debug(value_error) - except ImportError, import_error: + except ImportError as import_error: log.debug(import_error) elif os.path.isdir(file_path) and scan_dirs: @@ -439,9 +439,9 @@ class PluginManager(object): file_path += os.path.sep try: module = __import__(module_name) - except ValueError, value_error: + except ValueError as value_error: log.debug(value_error) - except ImportError, import_error: + except ImportError as import_error: log.debug(import_error) @@ -477,21 +477,21 @@ class PluginManager(object): plugins_found.append(module_attr) - except TypeError, type_error: + except TypeError as type_error: # set plugin localization try: module_attr._ = _ - except AttributeError, type_error: + except AttributeError as type_error: pass - except ConfigParser.NoOptionError, type_error: + except ConfigParser.NoOptionError as type_error: # all fields are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. all fields are required!')) - except ConfigParser.NoSectionError, type_error: + except ConfigParser.NoSectionError as type_error: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. info section are required!')) - except ConfigParser.MissingSectionHeaderError, type_error: + except ConfigParser.MissingSectionHeaderError as type_error: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. section are required!')) @@ -504,10 +504,10 @@ class PluginManager(object): ''' try: zip_file = zipfile.ZipFile(zip_filename) - except zipfile.BadZipfile, e: + except zipfile.BadZipfile as e: # it is not zip file raise PluginsystemError(_('Archive corrupted')) - except IOError,e: + except IOError as e: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): diff --git a/src/plugins/plugins_i18n.py b/src/plugins/plugins_i18n.py index 769d8b060..9eb983eff 100644 --- a/src/plugins/plugins_i18n.py +++ b/src/plugins/plugins_i18n.py @@ -36,6 +36,6 @@ if os.name != 'nt': try: t = gettext.translation(APP, plugins_locale_dir) _ = t.gettext -except IOError, msg: +except IOError as msg: from common import i18n _ = gettext.gettext diff --git a/src/profile_window.py b/src/profile_window.py index 04d596294..614af3add 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -139,7 +139,7 @@ class ProfileWindow: # and hope that user did not specify in ACE crazy size scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except GObject.GError, msg: # unknown format + except GObject.GError as msg: # unknown format # msg should be string, not object instance msg = str(msg) invalid_file = True diff --git a/src/remote_control.py b/src/remote_control.py index a5d8cf115..b2a193d32 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -743,7 +743,7 @@ class SignalObject(dbus.service.Object): def prefs_store(self): try: gajim.interface.save_config() - except Exception, e: + except Exception as e: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) diff --git a/src/roster_window.py b/src/roster_window.py index a447f908f..f842027bd 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3282,7 +3282,7 @@ class RosterWindow: # get the image at 'tooltip size' # and hope that user did not specify in ACE crazy size pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except GObject.GError, msg: # unknown format + except GObject.GError as msg: # unknown format # msg should be string, not object instance msg = str(msg) dialogs.ErrorDialog(_('Could not load image'), msg) diff --git a/src/session.py b/src/session.py index c43f5c930..eb3df3f19 100644 --- a/src/session.py +++ b/src/session.py @@ -90,7 +90,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): msg_to_log = obj.msgtxt obj.msg_id = gajim.logger.write(log_type, obj.fjid, msg_to_log, tim=obj.timestamp, subject=obj.subject) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.conn, level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) @@ -423,7 +423,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): 'submit': try: self.archiving_accepted(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return @@ -452,7 +452,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): try: self.accept_e2e_alice(form, negotiated) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) def reject_nondefault_options(): @@ -476,7 +476,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): else: try: self.accept_e2e_alice(form, negotiated) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return @@ -484,21 +484,21 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): 'result': try: self.we_accept_archiving(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'responded-e2e' and form.getType() == 'result': try: self.accept_e2e_bob(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'identified-alice' and form.getType() == 'result': try: self.final_steps_alice(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return diff --git a/test/integration/test_xmpp_transports_nb.py b/test/integration/test_xmpp_transports_nb.py index 98f2c87fc..9f7fb0d5d 100644 --- a/test/integration/test_xmpp_transports_nb.py +++ b/test/integration/test_xmpp_transports_nb.py @@ -72,7 +72,7 @@ class TestNonBlockingTCP(AbstractTransportTest): ips = socket.getaddrinfo('gajim.org', 5222, socket.AF_UNSPEC, socket.SOCK_STREAM) ip = ips[0] - except socket.error, e: + except socket.error as e: self.testcase.fail(msg=str(e)) self.socket = transports_nb.NonBlockingTCP( diff --git a/test/runtests.py b/test/runtests.py index e199b9052..9686f6683 100755 --- a/test/runtests.py +++ b/test/runtests.py @@ -17,7 +17,7 @@ try: shortargs = 'hnv:' longargs = 'help no-x verbose=' opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) -except getopt.error, msg: +except getopt.error as msg: print(msg) print('for help use --help') sys.exit(2) From 912f0e921d52f2296932c6779ad35f3bd0d144d0 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 2 Jan 2013 13:54:02 +0100 Subject: [PATCH 021/592] fix imports and many py3 changements --- plugins/dbus_plugin/plugin.py | 2 +- src/advanced_configuration_window.py | 1 - src/chat_control.py | 4 +- src/command_system/dispatcher.py | 5 +- src/command_system/framework.py | 4 +- src/command_system/implementation/execute.py | 4 +- .../implementation/middleware.py | 3 +- src/command_system/mapping.py | 23 ++++---- src/common/caps_cache.py | 9 +-- src/common/check_paths.py | 10 ++-- src/common/commands.py | 2 +- src/common/config.py | 14 +---- src/common/configpaths.py | 4 +- src/common/connection.py | 2 +- src/common/connection_handlers.py | 4 +- src/common/connection_handlers_events.py | 30 ++++++++-- src/common/contacts.py | 4 +- src/common/gajim.py | 16 ++--- src/common/gpg.py | 2 +- src/common/helpers.py | 37 ++++++------ src/common/i18n.py | 2 +- src/common/jingle.py | 12 ++-- src/common/jingle_content.py | 4 +- src/common/jingle_ft.py | 8 +-- src/common/jingle_ftstates.py | 4 +- src/common/jingle_rtp.py | 11 ++-- src/common/jingle_session.py | 11 ++-- src/common/jingle_transport.py | 2 +- src/common/jingle_xtls.py | 5 +- src/common/logger.py | 18 +++--- src/common/nec.py | 2 +- src/common/optparser.py | 8 +-- src/common/pep.py | 40 ------------- src/common/protocol/bytestream.py | 2 +- src/common/proxy65_manager.py | 2 +- src/common/pubsub.py | 14 +++-- src/common/sleepy.py | 3 +- src/common/socks5.py | 6 +- src/common/stanza_session.py | 2 +- src/common/zeroconf/connection_zeroconf.py | 2 +- src/common/zeroconf/zeroconf_avahi.py | 2 +- src/config.py | 4 +- src/conversation_textview.py | 8 +-- src/dialogs.py | 15 +++-- src/disco.py | 4 +- src/gajim.py | 4 ++ src/gtkexcepthook.py | 6 +- src/gtkgui_helpers.py | 59 +++++++++++-------- src/gui_interface.py | 20 +++---- src/htmltextview.py | 9 +-- src/notify.py | 3 + src/plugins/__init__.py | 4 +- src/plugins/helpers.py | 2 +- src/plugins/plugin.py | 8 +-- src/plugins/pluginmanager.py | 24 ++++---- src/remote_control.py | 2 +- src/roster_window.py | 18 +++--- src/tooltips.py | 4 +- test/lib/mock.py | 2 +- test/unit/test_jingle.py | 4 +- 60 files changed, 261 insertions(+), 279 deletions(-) diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index 98dda772c..8bf8d55a3 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -407,7 +407,7 @@ if dbus_support.supported: return DBUS_DICT_SV() jid = self._get_real_jid(jid) - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) + cached_vcard = list(gajim.connections.values())[0].get_cached_vcard(jid) if cached_vcard: return get_dbus_struct(cached_vcard) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 84847b6d9..a2266a55f 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -311,7 +311,6 @@ class AdvancedConfigurationWindow(object): value = str(option) except: value = option - value = helpers.ensure_utf8_string(value) self.model.append(parent, [name, value, type_]) def visible_func(self, model, treeiter, data): diff --git a/src/chat_control.py b/src/chat_control.py index d13351b7c..61738933d 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1785,7 +1785,7 @@ class ChatControl(ChatControlBase): pep = self.contact.pep img = self._pep_images[pep_type] if pep_type in pep: - img.set_from_pixbuf(pep[pep_type].asPixbufIcon()) + img.set_from_pixbuf(gtkgui_helpers.get_pep_as_pixbuf(pep[pep_type])) img.set_tooltip_markup(pep[pep_type].asMarkupText()) img.show() else: @@ -3020,7 +3020,7 @@ class ChatControl(ChatControlBase): # It's why I set it transparent. image = self.xml.get_object('avatar_image') pixbuf = image.get_pixbuf() - pixbuf.fill(0xffffff00L) # RGBA + pixbuf.fill(0xffffff00) # RGBA image.queue_draw() screen_w = Gdk.Screen.width() diff --git a/src/command_system/dispatcher.py b/src/command_system/dispatcher.py index 398edae9c..4b88e5fb3 100644 --- a/src/command_system/dispatcher.py +++ b/src/command_system/dispatcher.py @@ -31,7 +31,6 @@ to automatic discovery and dispatching, also features manual control over the process. """ -from types import NoneType from .tools import remove COMMANDS = {} @@ -71,7 +70,7 @@ def is_command(attribute): return isinstance(attribute, Command) def is_root(namespace): - metaclass = namespace.get("__metaclass__", NoneType) + metaclass = namespace.get("__metaclass__", None) return issubclass(metaclass, Dispatchable) def get_command(host, name): @@ -83,7 +82,7 @@ def get_command(host, name): def list_commands(host): for container in CONTAINERS[host]: commands = COMMANDS[container] - for name, command in commands.iteritems(): + for name, command in commands.items(): yield name, command class Dispatchable(type): diff --git a/src/command_system/framework.py b/src/command_system/framework.py index f410d594a..29ebe5c83 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -25,7 +25,7 @@ from inspect import getargspec, getdoc from .dispatcher import Host, Container from .dispatcher import get_command, list_commands -from mmapping import parse_arguments, adapt_arguments +from .mapping import parse_arguments, adapt_arguments from .errors import DefinitionError, CommandError, NoCommandError class CommandHost(object): @@ -153,7 +153,7 @@ class Command(object): # Automatically set all the properties passed to a constructor # by the command decorator. - for key, value in properties.iteritems(): + for key, value in properties.items(): setattr(self, key, value) def __call__(self, *args, **kwargs): diff --git a/src/command_system/implementation/execute.py b/src/command_system/implementation/execute.py index 48253dfae..688347a1f 100644 --- a/src/command_system/implementation/execute.py +++ b/src/command_system/implementation/execute.py @@ -35,7 +35,7 @@ commands as a frontend. from subprocess import Popen, PIPE from os.path import expanduser -from glib import timeout_add +from gi.repository import GObject from ..framework import CommandContainer, command, doc from .hosts import * @@ -64,7 +64,7 @@ class Execute(CommandContainer): @classmethod def monitor(cls, processor, popen): poller = cls.poller(processor, popen) - timeout_add(cls.POLL_INTERVAL, poller.next) + GObject.timeout_add(cls.POLL_INTERVAL, poller.next) @classmethod def poller(cls, processor, popen): diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index 64396d0f6..40e4bdf4e 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -31,7 +31,6 @@ support interaction between the two and a few utility methods so you don't need to dig up the code itself to write basic commands. """ -from types import StringTypes from traceback import print_exc from gi.repository import Pango @@ -98,7 +97,7 @@ class ChatCommandProcessor(CommandProcessor): def command_postprocessor(self, command, name, arguments, args, kwargs, value): # If command returns a string - print it to a user. A convenient # and sufficient in most simple cases shortcut to a using echo. - if value and isinstance(value, StringTypes): + if value and isinstance(value, str): self.echo(value) class CommandTools: diff --git a/src/command_system/mapping.py b/src/command_system/mapping.py index dcb7a96c2..82283df71 100644 --- a/src/command_system/mapping.py +++ b/src/command_system/mapping.py @@ -23,7 +23,6 @@ according to the command properties. """ import re -from types import BooleanType, UnicodeType from operator import itemgetter from .errors import DefinitionError, CommandError @@ -62,7 +61,7 @@ def parse_arguments(arguments): """ args, opts = [], [] - def intersects_opts((given_start, given_end)): + def intersects_opts(given_start, given_end): """ Check if given span intersects with any of options. """ @@ -71,7 +70,7 @@ def parse_arguments(arguments): return True return False - def intersects_args((given_start, given_end)): + def intersects_args(given_start, given_end): """ Check if given span intersects with any of arguments. """ @@ -97,14 +96,14 @@ def parse_arguments(arguments): # conflicted sectors. Remove any arguments that intersect with # options. for arg, position in args[:]: - if intersects_opts(position): + if intersects_opts(*position): args.remove((arg, position)) # Primitive but sufficiently effective way of disposing of # conflicted sectors. Remove any options that intersect with # arguments. for key, value, position in opts[:]: - if intersects_args(position): + if intersects_args(*position): opts.remove((key, value, position)) return args, opts @@ -207,7 +206,7 @@ def adapt_arguments(command, arguments, args, opts): # corresponding optin has been given. if command.expand: expanded = [] - for spec_key, spec_value in norm_kwargs.iteritems(): + for spec_key, spec_value in norm_kwargs.items(): letter = spec_key[0] if len(spec_key) > 1 else None if letter and letter not in expanded: for index, (key, value, position) in enumerate(opts): @@ -219,7 +218,7 @@ def adapt_arguments(command, arguments, args, opts): # Detect switches and set their values accordingly. If any of them # carries a value - append it to args. for index, (key, value, position) in enumerate(opts): - if isinstance(norm_kwargs.get(key), BooleanType): + if isinstance(norm_kwargs.get(key), bool): opts[index] = (key, True, position) if value: args.append((value, position)) @@ -231,8 +230,8 @@ def adapt_arguments(command, arguments, args, opts): # Stripping down position information supplied with arguments and # options as it won't be needed again. - args = map(lambda (arg, position): arg, args) - opts = map(lambda (key, value, position): (key, value), opts) + args = map(lambda t: t[0], t[1]) + opts = map(lambda t: (t[0], t[1]), opts) # If command has extra option enabled - collect all extra arguments # and pass them to a last positional argument command defines as a @@ -265,8 +264,8 @@ def adapt_arguments(command, arguments, args, opts): # Normally this does not happen unless overlapping is enabled. for key, value in opts: initial = norm_kwargs.get(key) - if isinstance(initial, BooleanType): - if not isinstance(value, BooleanType): + if isinstance(initial, bool): + if not isinstance(value, bool): raise CommandError("%s: Switch can not take an argument" % key, command) # Inject the source arguments as a string as a first argument, if @@ -299,7 +298,7 @@ def generate_usage(command, complete=True): letter = key[0] key = key.replace('_', '-') - if isinstance(value, BooleanType): + if isinstance(value, bool): value = str() else: value = '=%s' % value diff --git a/src/common/caps_cache.py b/src/common/caps_cache.py index 6c8286188..bbf25c477 100644 --- a/src/common/caps_cache.py +++ b/src/common/caps_cache.py @@ -130,7 +130,8 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): return 1 S = '' - identities.sort(cmp=sort_identities_func) + from functools import cmp_to_key + identities.sort(key=cmp_to_key(sort_identities_func)) for i in identities: c = i['category'] type_ = i.get('type', '') @@ -140,7 +141,7 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): features.sort() for f in features: S += '%s<' % f - dataforms.sort(cmp=sort_dataforms_func) + dataforms.sort(key=cmp_to_key(sort_dataforms_func)) for dataform in dataforms: # fields indexed by var fields = {} @@ -157,9 +158,9 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): S += '%s<' % value if hash_method == 'sha-1': - hash_ = hashlib.sha1(S) + hash_ = hashlib.sha1(S.encode('utf-8')) elif hash_method == 'md5': - hash_ = hashlib.md5(S) + hash_ = hashlib.md5(S.encode('utf-8')) else: return '' return base64.b64encode(hash_.digest()) diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 9ea3bd898..f9ad30983 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -38,7 +38,7 @@ import sqlite3 as sqlite def create_log_db(): print(_('creating logs database')) con = sqlite.connect(logger.LOG_DB_PATH) - os.chmod(logger.LOG_DB_PATH, 0600) # rw only for us + os.chmod(logger.LOG_DB_PATH, 0o600) # rw only for us cur = con.cursor() # create the tables # kind can be @@ -86,7 +86,7 @@ def create_log_db(): def create_cache_db(): print(_('creating cache database')) con = sqlite.connect(logger.CACHE_DB_PATH) - os.chmod(logger.CACHE_DB_PATH, 0600) # rw only for us + os.chmod(logger.CACHE_DB_PATH, 0o600) # rw only for us cur = con.cursor() cur.executescript( ''' @@ -177,7 +177,7 @@ def check_and_possibly_move_config(): vars['MY_ICONSETS_PATH'] = gajim.MY_ICONSETS_PATH vars['MY_MOOD_ICONSETS_PATH'] = gajim.MY_MOOD_ICONSETS_PATH vars['MY_ACTIVITY_ICONSETS_PATH'] = gajim.MY_ACTIVITY_ICONSETS_PATH - import configpaths + from common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] @@ -263,7 +263,7 @@ def check_and_possibly_create_paths(): VCARD_PATH = gajim.VCARD_PATH AVATAR_PATH = gajim.AVATAR_PATH - import configpaths + from common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] @@ -364,4 +364,4 @@ def create_path(directory): if os.path.exists(directory): return print(('creating %s directory') % directory) - os.mkdir(directory, 0700) + os.mkdir(directory, 0o700) diff --git a/src/common/commands.py b/src/common/commands.py index 5fd067dc6..aaf6c8536 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -363,7 +363,7 @@ class ConnectionCommands: # buildReply don't copy the node attribute. Re-add it q.setAttr('node', nbxmpp.NS_COMMANDS) - for node, cmd in self.__commands.iteritems(): + for node, cmd in self.__commands.items(): if cmd.isVisibleFor(self.isSameJID(jid)): q.addChild('item', { # TODO: find the jid diff --git a/src/common/config.py b/src/common/config.py index c31003f45..d3eb50875 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -35,7 +35,7 @@ import sys import re import copy -import defs +from common import defs from gi.repository import GObject ( @@ -568,7 +568,7 @@ class Config: Tree-like interface """ if node is None: - for child, option in self.__options[1].iteritems(): + for child, option in self.__options[1].items(): yield (child, ), option for grandparent in self.__options_per_key: yield (grandparent, ), None @@ -579,7 +579,7 @@ class Config: elif len(node) == 2: grandparent, parent = node children = self.__options_per_key[grandparent][1][parent] - for child, option in children.iteritems(): + for child, option in children.items(): yield (grandparent, parent, child), option else: raise ValueError('Invalid node') @@ -625,11 +625,9 @@ class Config: def set(self, optname, value): if optname not in self.__options[1]: -# raise RuntimeError, 'option %s does not exist' % optname return value = self.is_valid(self.__options[0][optname][OPT_TYPE], value) if value is None: -# raise RuntimeError, 'value of %s cannot be None' % optname return self.__options[1][optname] = value @@ -666,7 +664,6 @@ class Config: def add_per(self, typename, name): # per_group_of_option if typename not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % typename return opt = self.__options_per_key[typename] @@ -680,7 +677,6 @@ class Config: def del_per(self, typename, name, subname = None): # per_group_of_option if typename not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % typename return opt = self.__options_per_key[typename] @@ -693,22 +689,18 @@ class Config: def set_per(self, optname, key, subname, value): # per_group_of_option if optname not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % optname return if not key: return dict_ = self.__options_per_key[optname][1] if key not in dict_: -# raise RuntimeError, '%s is not a key of %s' % (key, dict_) self.add_per(optname, key) obj = dict_[key] if subname not in obj: -# raise RuntimeError, '%s is not a key of %s' % (subname, obj) return typ = self.__options_per_key[optname][0][subname][OPT_TYPE] value = self.is_valid(typ, value) if value is None: -# raise RuntimeError, '%s of %s cannot be None' % optname return obj[subname] = value self._timeout_save() diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 94550b988..75df82e42 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -25,7 +25,7 @@ import os import sys import tempfile -import defs +from common import defs HAVE_XDG = True try: __import__(xdg) @@ -130,7 +130,7 @@ class ConfigPaths: except KeyError: return default - def iteritems(self): + def items(self): for key in self.paths.iterkeys(): yield (key, self[key]) diff --git a/src/common/connection.py b/src/common/connection.py index 6734ede28..861b51d96 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -59,7 +59,7 @@ from common import gpg from common import passwords from common import exceptions from common import check_X509 -from connection_handlers import * +from common.connection_handlers import * from nbxmpp import Smacks from string import Template diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 5db5a96ac..11bc078fe 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -322,7 +322,7 @@ class ConnectionVcard: os.remove(path) # create folder if needed if not os.path.isdir(path): - os.mkdir(path, 0700) + os.mkdir(path, 0o700) puny_nick = helpers.sanitize_filename(nick) path_to_file = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) else: @@ -706,7 +706,7 @@ class ConnectionVcard: puny_nick = helpers.sanitize_filename(resource) # create folder if needed if not os.path.isdir(begin_path): - os.mkdir(begin_path, 0700) + os.mkdir(begin_path, 0o700) begin_path = os.path.join(begin_path, puny_nick) frm_jid += '/' + resource if photo_decoded: diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 5dd2690d8..2f1ae0932 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -39,8 +39,6 @@ from nbxmpp.protocol import NS_CHATSTATES from common.jingle_transport import JingleTransportSocks5 from common.file_props import FilesProp -from . import gtkgui_helpers - import logging log = logging.getLogger('gajim.c.connection_handlers_events') @@ -2181,8 +2179,6 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.popup_title = _('New Message from %(nickname)s') % \ {'nickname': nick} - self.popup_image = gtkgui_helpers.get_icon_path(self.popup_image, 48) - if not gajim.config.get('notify_on_new_message') or \ not self.first_unread: self.do_popup = False @@ -2237,6 +2233,28 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.do_popup = False + def get_path_to_generic_or_avatar(self, generic, jid=None, suffix=None): + """ + Choose between avatar image and default image + + Returns full path to the avatar image if it exists, otherwise returns full + path to the image. generic must be with extension and suffix without + """ + if jid: + # we want an avatar + puny_jid = helpers.sanitize_filename(jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix + path_to_local_file = path_to_file + '_local' + for extension in ('.png', '.jpeg'): + path_to_local_file_full = path_to_local_file + extension + if os.path.exists(path_to_local_file_full): + return path_to_local_file_full + for extension in ('.png', '.jpeg'): + path_to_file_full = path_to_file + extension + if os.path.exists(path_to_file_full): + return path_to_file_full + return os.path.abspath(generic) + def handle_incoming_pres_event(self, pres_obj): if gajim.jid_is_transport(pres_obj.jid): return True @@ -2315,8 +2333,8 @@ class NotificationEvent(nec.NetworkIncomingEvent): iconset = gajim.config.get('iconset') img_path = os.path.join(helpers.get_iconset_path(iconset), '48x48', show_image) - self.popup_image = gtkgui_helpers.get_path_to_generic_or_avatar( - img_path, jid=self.jid, suffix=suffix) + self.popup_image = self.get_path_to_generic_or_avatar(img_path, + jid=self.jid, suffix=suffix) self.popup_timeout = gajim.config.get('notification_timeout') diff --git a/src/common/contacts.py b/src/common/contacts.py index 7f7ff283c..1d6f891b6 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -94,6 +94,8 @@ class Contact(CommonContact): sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id=None, last_activity_time=None): + if not isinstance(jid, str): + print('no str') CommonContact.__init__(self, jid, account, resource, show, status, name, our_chatstate, chatstate, client_caps=client_caps) @@ -494,7 +496,7 @@ class Contacts(): return self._contacts.keys() def get_contacts_jid_list(self): - return [jid for jid, contact in self._contacts.iteritems() if not + return [jid for jid, contact in self._contacts.items() if not contact[0].is_groupchat()] def get_contact_from_full_jid(self, fjid): diff --git a/src/common/gajim.py b/src/common/gajim.py index 8ccf9fc1a..b6f1db9ff 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -34,7 +34,7 @@ import locale from common import config import nbxmpp from common import defs -from common import ged +from common import ged as ged_module interface = None # The actual interface (the gtk one for the moment) thread_interface = None # Interface to run a thread and then a callback @@ -43,16 +43,15 @@ version = config.get('version') connections = {} # 'account name': 'account (connection.Connection) instance' ipython_window = None -ged = common.ged.GlobalEventsDispatcher() # Global Events Dispatcher +ged = ged_module.GlobalEventsDispatcher() # Global Events Dispatcher nec = None # Network Events Controller plugin_manager = None # Plugins Manager log = logging.getLogger('gajim') -import logger -logger = logger.Logger() # init the logger +logger = None -import configpaths +from common import configpaths gajimpaths = configpaths.gajimpaths VCARD_PATH = gajimpaths['VCARD'] @@ -84,8 +83,8 @@ else: os_info = None # used to cache os information -from contacts import LegacyContactsAPI -from events import Events +from common.contacts import LegacyContactsAPI +from common.events import Events gmail_domains = ['gmail.com', 'googlemail.com'] @@ -221,9 +220,6 @@ gajim_optional_features = {} # Capabilities hash per account caps_hash = {} -import caps_cache -caps_cache.initialize(logger) - global_id = 0 def get_an_id(): global global_id diff --git a/src/common/gpg.py b/src/common/gpg.py index b8a470284..fafb56333 100644 --- a/src/common/gpg.py +++ b/src/common/gpg.py @@ -22,7 +22,7 @@ ## along with Gajim. If not, see . ## -from gajim import HAVE_GPG +from common.gajim import HAVE_GPG import os if HAVE_GPG: diff --git a/src/common/helpers.py b/src/common/helpers.py index 6a86be88d..32c922400 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -35,7 +35,7 @@ import locale import os import subprocess import urllib -import urllib2 +import urllib import webbrowser import errno import select @@ -50,8 +50,8 @@ from gi.repository import GObject from encodings.punycode import punycode_encode from string import Template -from i18n import Q_ -from i18n import ngettext +from common.i18n import Q_ +from common.i18n import ngettext try: import winsound # windows-only built-in module for playing wav @@ -122,7 +122,7 @@ def idn_to_ascii(host): labels = idna.dots.split(host) converted_labels = [] for label in labels: - converted_labels.append(idna.ToASCII(label)) + converted_labels.append(idna.ToASCII(label).decode('utf-8')) return ".".join(converted_labels) def ascii_to_idn(host): @@ -146,7 +146,7 @@ def parse_resource(resource): from nbxmpp.stringprepare import resourceprep return resourceprep.prepare(resource) except UnicodeError: - raise InvalidFormat, 'Invalid character in resource.' + raise InvalidFormat('Invalid character in resource.') def prep(user, server, resource): """ @@ -156,34 +156,34 @@ def prep(user, server, resource): #http://svn.twistedmatrix.com/cvs/trunk/twisted/words/protocols/jabber/jid.py if user is not None: if len(user) < 1 or len(user) > 1023: - raise InvalidFormat, _('Username must be between 1 and 1023 chars') + raise InvalidFormat(_('Username must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import nodeprep user = nodeprep.prepare(user) except UnicodeError: - raise InvalidFormat, _('Invalid character in username.') + raise InvalidFormat(_('Invalid character in username.')) else: user = None if server is not None: if len(server) < 1 or len(server) > 1023: - raise InvalidFormat, _('Server must be between 1 and 1023 chars') + raise InvalidFormat(_('Server must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import nameprep server = nameprep.prepare(server) except UnicodeError: - raise InvalidFormat, _('Invalid character in hostname.') + raise InvalidFormat(_('Invalid character in hostname.')) else: - raise InvalidFormat, _('Server address required.') + raise InvalidFormat(_('Server address required.')) if resource is not None: if len(resource) < 1 or len(resource) > 1023: - raise InvalidFormat, _('Resource must be between 1 and 1023 chars') + raise InvalidFormat(_('Resource must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import resourceprep resource = resourceprep.prepare(resource) except UnicodeError: - raise InvalidFormat, _('Invalid character in resource.') + raise InvalidFormat(_('Invalid character in resource.')) else: resource = None @@ -493,7 +493,7 @@ def get_windows_reg_env(varname, default=''): 'AppData' = %USERPROFILE%\Application Data (also an ENV) 'Desktop' = %USERPROFILE%\Desktop 'Favorites' = %USERPROFILE%\Favorites - 'NetHood' = %USERPROFILE%\NetHood + 'NetHood' = %USERPROFILE%\ NetHood 'Personal' = D:\My Documents (PATH TO MY DOCUMENTS) 'PrintHood' = %USERPROFILE%\PrintHood 'Programs' = %USERPROFILE%\Start Menu\Programs @@ -555,7 +555,8 @@ def sanitize_filename(filename): hash = hashlib.md5(filename) filename = base64.b64encode(hash.digest()) - filename = punycode_encode(filename) # make it latin chars only + # make it latin chars only + filename = punycode_encode(filename).decode('utf-8') filename = filename.replace('/', '_') if os.name == 'nt': filename = filename.replace('?', '_').replace(':', '_')\ @@ -634,10 +635,10 @@ def datetime_tuple(timestamp): # import gajim only when needed (after decode_string is defined) see #4764 -import gajim +from common import gajim if gajim.HAVE_PYCURL: import pycurl - from cStringIO import StringIO + from io import StringIO def convert_bytes(string): suffix = '' @@ -1462,9 +1463,9 @@ def _get_img_direct(attrs): # Wait maximum 5s for connection socket.setdefaulttimeout(5) try: - req = urllib2.Request(attrs['src']) + req = urllib.request.Request(attrs['src']) req.add_header('User-Agent', 'Gajim ' + gajim.version) - f = urllib2.urlopen(req) + f = urllib.request.urlopen(req) except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None diff --git a/src/common/i18n.py b/src/common/i18n.py index 1970e239e..9c3c3bb03 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -63,7 +63,7 @@ if os.name == 'nt': gettext.install(APP, DIR) if gettext._translations: - _translation = gettext._translations.values()[0] + _translation = list(gettext._translations.values())[0] else: _translation = gettext.NullTranslations() diff --git a/src/common/jingle.py b/src/common/jingle.py index 57e26c3b1..3fd311daa 100644 --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -27,14 +27,14 @@ Handles the jingle signalling protocol # - codecs import nbxmpp -import helpers -import gajim +from common import helpers +from common import gajim -from jingle_session import JingleSession, JingleStates +from common.jingle_session import JingleSession, JingleStates if gajim.HAVE_FARSTREAM: - from jingle_rtp import JingleAudio, JingleVideo -from jingle_ft import JingleFileTransfer -from jingle_transport import JingleTransportSocks5, JingleTransportIBB + from common.jingle_rtp import JingleAudio, JingleVideo +from common.jingle_ft import JingleFileTransfer +from common.jingle_transport import JingleTransportSocks5, JingleTransportIBB import logging logger = logging.getLogger('gajim.c.jingle') diff --git a/src/common/jingle_content.py b/src/common/jingle_content.py index df04d729f..04e3b8740 100644 --- a/src/common/jingle_content.py +++ b/src/common/jingle_content.py @@ -15,9 +15,9 @@ Handles Jingle contents (XEP 0166) """ -import gajim +from common import gajim import nbxmpp -from jingle_transport import JingleTransportIBB +from common.jingle_transport import JingleTransportIBB contents = {} diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index 8ac9330c4..c050cf6b3 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -20,16 +20,16 @@ Handles Jingle File Transfer (XEP 0234) """ import hashlib -import gajim +from common import gajim import nbxmpp -from jingle_content import contents, JingleContent -from jingle_transport import * +from common.jingle_content import contents, JingleContent +from common.jingle_transport import * from common import helpers from common.socks5 import Socks5ReceiverClient, Socks5SenderClient from common.connection_handlers_events import FileRequestReceivedEvent import threading import logging -from jingle_ftstates import * +from common.jingle_ftstates import * log = logging.getLogger('gajim.c.jingle_ft') STATE_NOT_STARTED = 0 diff --git a/src/common/jingle_ftstates.py b/src/common/jingle_ftstates.py index a83ab9e30..23e257392 100644 --- a/src/common/jingle_ftstates.py +++ b/src/common/jingle_ftstates.py @@ -11,9 +11,9 @@ ## GNU General Public License for more details. ## -import gajim +from common import gajim import nbxmpp -from jingle_transport import * +from common.jingle_transport import * from common.socks5 import Socks5ReceiverClient, Socks5SenderClient diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index 26ac22544..3897e48cc 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -21,14 +21,15 @@ from gi.repository import GObject import socket import nbxmpp -import farstream, gst +import farstream +import gst from glib import GError -import gajim +from common import gajim -from jingle_transport import JingleTransportICEUDP -from jingle_content import contents, JingleContent, JingleContentSetupException -from connection_handlers_events import InformationEvent +from common.jingle_transport import JingleTransportICEUDP +from common.jingle_content import contents, JingleContent, JingleContentSetupException +from common.connection_handlers_events import InformationEvent import logging diff --git a/src/common/jingle_session.py b/src/common/jingle_session.py index a19056f9b..bd9a0130b 100644 --- a/src/common/jingle_session.py +++ b/src/common/jingle_session.py @@ -26,12 +26,12 @@ Handles Jingle sessions (XEP 0166) # - Tie-breaking # * timeout -import gajim #Get rid of that? +from common import gajim import nbxmpp -from jingle_transport import get_jingle_transport, JingleTransportIBB -from jingle_content import get_jingle_content, JingleContentSetupException -from jingle_content import JingleContent -from jingle_ft import STATE_TRANSPORT_REPLACE +from common.jingle_transport import get_jingle_transport, JingleTransportIBB +from common.jingle_content import get_jingle_content, JingleContentSetupException +from common.jingle_content import JingleContent +from common.jingle_ft import STATE_TRANSPORT_REPLACE from common.connection_handlers_events import * import logging log = logging.getLogger("gajim.c.jingle_session") @@ -73,7 +73,6 @@ class JingleSession(object): self.contents = {} # negotiated contents self.connection = con # connection to use # our full jid - #FIXME: Get rid of gajim here? self.ourjid = gajim.get_jid_from_account(self.connection.name) if con.server_resource: self.ourjid = self.ourjid + '/' + con.server_resource diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index 64e4b5d02..a31a5d535 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -296,7 +296,7 @@ class JingleTransportSocks5(JingleTransport): cid = host['candidate_id'] break if cid is None: - raise Exception, 'cid is missing' + raise Exception('cid is missing') activated.setAttr('cid', cid) transport.addChild(node=activated) content.addChild(node=transport) diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index 3a251179f..1c61fb610 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -20,7 +20,6 @@ import os import nbxmpp import logging -import common from common import gajim log = logging.getLogger('gajim.c.jingle_xtls') @@ -201,7 +200,7 @@ def createCertRequest(pkey, digest="md5", **name): req.sign(pkey, digest) return req -def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter), digest="md5"): +def createCertificate(req, issuerCert, issuerKey, serial, notBefore, notAfter, digest="md5"): """ Generate a certificate given a certificate request. @@ -235,7 +234,7 @@ def make_certs(filepath, CN): """ key = createKeyPair(TYPE_RSA, 1024) req = createCertRequest(key, CN=CN) - cert = createCertificate(req, (req, key), 0, (0, 60*60*24*365*5)) # five years + cert = createCertificate(req, req, key, 0, 0, 60*60*24*365*5) # five years open(filepath + '.pkey', 'w').write(crypto.dump_privatekey( crypto.FILETYPE_PEM, key)) open(filepath + '.cert', 'w').write(crypto.dump_certificate( diff --git a/src/common/logger.py b/src/common/logger.py index 1f25d940e..3ce6fab62 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -33,16 +33,16 @@ import sys import time import datetime from gzip import GzipFile -from cStringIO import StringIO +from io import BytesIO from gi.repository import GObject -import exceptions -import gajim -import ged +from common import exceptions +from common import gajim +from common import ged import sqlite3 as sqlite -import configpaths +from common import configpaths LOG_DB_PATH = configpaths.gajimpaths['LOG_DB'] LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH) CACHE_DB_PATH = configpaths.gajimpaths['CACHE_DB'] @@ -884,7 +884,7 @@ class Logger: # ..., 'FEAT', feature1, feature2, ...).join(' ')) # NOTE: if there's a need to do more gzip, put that to a function try: - data = GzipFile(fileobj=StringIO(str(data))).read().split('\0') + data = GzipFile(fileobj=BytesIO(data)).read().decode('utf-8').split('\0') except IOError: # This data is corrupted. It probably contains non-ascii chars to_be_removed.append((hash_method, hash_)) @@ -1046,8 +1046,8 @@ class Logger: FROM roster_entry re, jids j WHERE re.account_jid_id=? AND j.jid_id=re.jid_id''', (account_jid_id,)) for jid, jid_id, name, subscription, ask in self.cur: - jid = jid.encode('utf-8') - name = name.encode('utf-8') + jid = jid + name = name data[jid] = {} if name: data[jid]['name'] = name @@ -1071,7 +1071,7 @@ class Logger: WHERE account_jid_id=? AND jid_id=?''', (account_jid_id, data[jid]['id'])) for (group_name,) in self.cur: - group_name = group_name.encode('utf-8') + group_name = group_name data[jid]['groups'].append(group_name) del data[jid]['id'] diff --git a/src/common/nec.py b/src/common/nec.py index eb4fdccf0..b699085c1 100644 --- a/src/common/nec.py +++ b/src/common/nec.py @@ -153,7 +153,7 @@ class NetworkEvent(object): return True def _set_kwargs_as_attributes(self, **kwargs): - for k, v in kwargs.iteritems(): + for k, v in kwargs.items(): setattr(self, k, v) diff --git a/src/common/optparser.py b/src/common/optparser.py index 39a20c851..520bd94d0 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -36,7 +36,7 @@ from common import helpers from common import caps_cache import sqlite3 as sqlite -import logger +from common import logger class OptionsParser: def __init__(self, filename): @@ -60,10 +60,6 @@ class OptionsParser: regex = re.compile(r"(?P[^.]+)(?:(?:\.(?P.+))?\.(?P[^.]+))?\s=\s(?P.*)") for line in fd: - try: - line = helpers.ensure_utf8_string(line) - except UnicodeDecodeError: - line = line.decode(locale.getpreferredencoding()) optname, key, subname, value = regex.match(line).groups() if key is None: self.old_values[optname] = value @@ -122,7 +118,7 @@ class OptionsParser: os.rename(self.__tempfile, self.__filename) except IOError as e: return str(e) - os.chmod(self.__filename, 0600) + os.chmod(self.__filename, 0o600) def update_config(self, old_version, new_version): old_version_list = old_version.split('.') # convert '0.x.y' to (0, x, y) diff --git a/src/common/pep.py b/src/common/pep.py index a2cb84c8f..92bc962d7 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -225,8 +225,6 @@ from common import helpers import nbxmpp from common import gajim -import gtkgui_helpers - class AbstractPEP(object): @@ -269,10 +267,6 @@ class AbstractPEP(object): else: acc.pep[self.type_] = self - def asPixbufIcon(self): - '''SHOULD be implemented by subclasses''' - return None - def asMarkupText(self): '''SHOULD be implemented by subclasses''' return '' @@ -300,13 +294,6 @@ class UserMoodPEP(AbstractPEP): retracted = items.getTag('retract') or not 'mood' in mood_dict return (mood_dict, retracted) - def asPixbufIcon(self): - assert not self._retracted - received_mood = self._pep_specific_data['mood'] - mood = received_mood if received_mood in MOODS else 'unknown' - pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf() - return pixbuf - def asMarkupText(self): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] @@ -346,11 +333,6 @@ class UserTunePEP(AbstractPEP): 'title' in tune_dict) return (tune_dict, retracted) - def asPixbufIcon(self): - import os - path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') - return GdkPixbuf.Pixbuf.new_from_file(path) - def asMarkupText(self): assert not self._retracted tune = self._pep_specific_data @@ -396,24 +378,6 @@ class UserActivityPEP(AbstractPEP): retracted = items.getTag('retract') or not 'activity' in activity_dict return (activity_dict, retracted) - def asPixbufIcon(self): - assert not self._retracted - pep = self._pep_specific_data - activity = pep['activity'] - - has_known_activity = activity in ACTIVITIES - has_known_subactivity = (has_known_activity and ('subactivity' in pep) - and (pep['subactivity'] in ACTIVITIES[activity])) - - if has_known_activity: - if has_known_subactivity: - subactivity = pep['subactivity'] - return gtkgui_helpers.load_activity_icon(activity, subactivity).get_pixbuf() - else: - return gtkgui_helpers.load_activity_icon(activity).get_pixbuf() - else: - return gtkgui_helpers.load_activity_icon('unknown').get_pixbuf() - def asMarkupText(self): assert not self._retracted pep = self._pep_specific_data @@ -491,10 +455,6 @@ class UserLocationPEP(AbstractPEP): con = gajim.connections[account].location_info = \ self._pep_specific_data - def asPixbufIcon(self): - path = gtkgui_helpers.get_icon_path('gajim-earth') - return GdkPixbuf.Pixbuf.new_from_file(path) - def asMarkupText(self): assert not self._retracted location = self._pep_specific_data diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index e2b7e41fb..f46fb4342 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -898,7 +898,7 @@ class ConnectionIBBytestream(ConnectionBytestream): else: if not data: err = nbxmpp.ERR_BAD_REQUEST - elif seq <> file_props.seq: + elif seq != file_props.seq: err = nbxmpp.ERR_UNEXPECTED_REQUEST else: log.debug('Successfull receive sid->%s %s+%s bytes' % (sid, diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index ccf20d6c0..38464b578 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -29,7 +29,7 @@ log = logging.getLogger('gajim.c.proxy65_manager') import nbxmpp from common import gajim from common import helpers -from socks5 import Socks5 +from common.socks5 import Socks5 from nbxmpp.idlequeue import IdleObject from common.file_props import FilesProp diff --git a/src/common/pubsub.py b/src/common/pubsub.py index d2bde78ed..6028088ff 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -22,11 +22,13 @@ ## import nbxmpp -import gajim -import connection_handlers -import ged -from connection_handlers_events import PubsubReceivedEvent -from connection_handlers_events import PubsubBookmarksReceivedEvent +from common import gajim +#TODO: Doesn't work +#from common.connection_handlers import PEP_CONFIG +PEP_CONFIG = 'pep_config' +from common import ged +from common.connection_handlers_events import PubsubReceivedEvent +from common.connection_handlers_events import PubsubBookmarksReceivedEvent import logging log = logging.getLogger('gajim.c.pubsub') @@ -218,5 +220,5 @@ class ConnectionPubSub: e = e.addChild('configure', {'node': node}) id_ = self.connection.getAnID() query.setID(id_) - self.awaiting_answers[id_] = (connection_handlers.PEP_CONFIG,) + self.awaiting_answers[id_] = (PEP_CONFIG,) self.connection.send(query) diff --git a/src/common/sleepy.py b/src/common/sleepy.py index 14568cb5c..ed5fd2022 100644 --- a/src/common/sleepy.py +++ b/src/common/sleepy.py @@ -22,7 +22,8 @@ ## from common import gajim -import os, sys +import os +import sys STATE_UNKNOWN = 'OS probably not supported' diff --git a/src/common/socks5.py b/src/common/socks5.py index f7dae87a1..725ac73a1 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -33,9 +33,9 @@ from errno import EISCONN from errno import EINPROGRESS from errno import EAFNOSUPPORT from nbxmpp.idlequeue import IdleObject -from file_props import FilesProp +from common.file_props import FilesProp from common import gajim -import jingle_xtls +from common import jingle_xtls if jingle_xtls.PYOPENSSL_PRESENT: import OpenSSL import logging @@ -535,7 +535,7 @@ class Socks5: self.file_props.received_len = self.size except IOError as e: self.close_file() - raise IOError, e + raise IOError(str(e)) def close_file(self): if self.file: diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index 2dc4bf151..2cf146b74 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -45,7 +45,7 @@ if gajim.HAVE_PYCRYPTO: from Crypto.PublicKey import RSA from common import dh - import secrets + from . import secrets XmlDsig = 'http://www.w3.org/2000/09/xmldsig#' diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 0f2319517..c3c5beaf9 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -46,7 +46,7 @@ from common import gajim from common import ged from common.zeroconf import client_zeroconf from common.zeroconf import zeroconf -from connection_handlers_zeroconf import * +from common.zeroconf.connection_handlers_zeroconf import * from common.connection_handlers_events import * import locale diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index acfa85885..73f091928 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -239,7 +239,7 @@ class Zeroconf: txt = {} # remove empty keys - for key, val in self.txt.iteritems(): + for key, val in self.txt.items(): if val: txt[key] = val diff --git a/src/config.py b/src/config.py index 9c748e58c..b5cbff3a8 100644 --- a/src/config.py +++ b/src/config.py @@ -455,8 +455,8 @@ class PreferencesWindow: else: config = gajim.config.get(opt_name + '_device') - for index, (name, value) in enumerate(sorted(device_dict.\ - iteritems(), key=key)): + for index, (name, value) in enumerate(sorted(device_dict.items(), + key=key)): model.append((name, value)) if config == value: combobox.set_active(index) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 2fbb89567..e1f308961 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -38,7 +38,7 @@ import os import tooltips import dialogs import locale -import Queue +import queue import urllib import gtkgui_helpers @@ -335,7 +335,7 @@ class ConversationTextview(GObject.GObject): # One mark at the begining then 2 marks between each lines size = gajim.config.get('max_conversation_lines') size = 2 * size - 1 - self.marks_queue = Queue.Queue(size) + self.marks_queue = queue.Queue(size) self.allow_focus_out_line = True # holds a mark at the end of --- line @@ -709,7 +709,7 @@ class ConversationTextview(GObject.GObject): buffer_.delete(start, end) size = gajim.config.get('max_conversation_lines') size = 2 * size - 1 - self.marks_queue = Queue.Queue(size) + self.marks_queue = queue.Queue(size) self.focus_out_end_mark = None self.just_cleared = True @@ -1171,7 +1171,7 @@ class ConversationTextview(GObject.GObject): all_tags = [(ttt.lookup(t) if isinstance(t, str) else t) for t in all_tags] buffer_.insert_with_tags(end_iter, special_text, *all_tags) if 'url' in tags: - puny_text = puny_encode(special_text) + puny_text = puny_encode(special_text).decode('utf-8') if not puny_text.endswith('-'): end_iter = buffer_.get_end_iter() buffer_.insert(end_iter, " (%s)" % puny_text) diff --git a/src/dialogs.py b/src/dialogs.py index f8f3402ce..e2b541daa 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1297,13 +1297,12 @@ class AboutDialog: if thanks_file_path: authors.append('\n' + _('THANKS:')) - text = helpers.ensure_utf8_string(open(thanks_file_path).read()) + text = open(thanks_file_path).read() text_splitted = text.split('\n') text = '\n'.join(text_splitted[:-2]) # remove one english sentence # and add it manually as translatable - text += helpers.ensure_utf8_string('\n%s\n' % _('Last but not ' - 'least, we would like to thank all the package maintainers.' - )) + text += '\n%s\n' % _('Last but not least, we would like to ' + 'thank all the package maintainers.') authors.append(text) dlg.set_authors(authors) @@ -2322,13 +2321,13 @@ class JoinGroupchatWindow: if room_jid != '' and room_jid in gajim.gc_connected[account] and\ gajim.gc_connected[account][room_jid]: ErrorDialog(_('You are already in group chat %s') % room_jid) - raise GajimGeneralException, 'You are already in this group chat' + raise GajimGeneralException('You are already in this group chat') if nick == '': nick = gajim.nicks[account] if gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('You can not join a group chat unless you are connected.')) - raise GajimGeneralException, 'You must be connected to join a groupchat' + raise GajimGeneralException('You must be connected to join a groupchat') self.xml = gtkgui_helpers.get_gtk_builder('join_groupchat_window.ui') @@ -2565,7 +2564,7 @@ class SynchroniseSelectAccountDialog: if not account or gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not synchronise your contacts.')) - raise GajimGeneralException, 'You are not connected to the server' + raise GajimGeneralException('You are not connected to the server') self.account = account self.xml = gtkgui_helpers.get_gtk_builder('synchronise_select_account_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_account_dialog') @@ -2754,7 +2753,7 @@ class ChangePasswordDialog: if not account or gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not change your password.')) - raise GajimGeneralException, 'You are not connected to the server' + raise GajimGeneralException('You are not connected to the server') self.account = account self.on_response = on_response self.xml = gtkgui_helpers.get_gtk_builder('change_password_dialog.ui') diff --git a/src/disco.py b/src/disco.py index 84e19f18c..12be18b34 100644 --- a/src/disco.py +++ b/src/disco.py @@ -223,7 +223,7 @@ class Closure(object): self.removeargs = removeargs if isinstance(cb, types.MethodType): self.meth_self = weakref.ref(cb.im_self, self._remove) - self.meth_name = cb.func_name + self.meth_name = cb.__name__ elif callable(cb): self.meth_self = None self.cb = weakref.ref(cb, self._remove) @@ -515,7 +515,7 @@ class ServiceDiscoveryWindow(object): if gajim.connections[account].connected < 2: dialogs.ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not browse available services')) - raise RuntimeError, 'You must be connected to browse services' + raise RuntimeError('You must be connected to browse services') # Get a ServicesCache object. try: diff --git a/src/gajim.py b/src/gajim.py index babf2e567..be2a01d00 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -219,6 +219,10 @@ except exceptions.DatabaseMalformed: 'http://trac.gajim.org/wiki/DatabaseBackup) or remove it (all history ' 'will be lost).') % common.logger.LOG_DB_PATH else: + from common import logger + gajim.logger = logger.Logger() + from common import caps_cache + caps_cache.initialize(gajim.logger) from common import dbus_support if dbus_support.supported: from music_track_listener import MusicTrackListener diff --git a/src/gtkexcepthook.py b/src/gtkexcepthook.py index 9ba17ba29..4ca60d8e3 100644 --- a/src/gtkexcepthook.py +++ b/src/gtkexcepthook.py @@ -29,9 +29,9 @@ from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango from common import i18n # installs _() function -import dialogs +from dialogs import HigDialog -from cStringIO import StringIO +from io import StringIO from common import helpers _exception_in_progress = threading.Lock() @@ -43,7 +43,7 @@ def _info(type_, value, tb): _excepthook_save(type_, value, tb) return - dialog = dialogs.HigDialog(None, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, + dialog = HigDialog(None, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, _('A programming error has been detected'), _('It probably is not fatal, but should be reported ' 'to the developers nonetheless.')) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 824355cf0..7fdb46a78 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -41,6 +41,7 @@ log = logging.getLogger('gajim.gtkgui_helpers') from common import i18n from common import gajim +from common import pep gtk_icon_theme = Gtk.IconTheme.get_default() gtk_icon_theme.append_search_path(gajim.ICONS_DIR) @@ -384,7 +385,7 @@ def get_abspath_for_script(scriptname, want_type = False): script += '\nexec python -OOt gajim.py $0 $@\n' f.write(script) f.close() - os.chmod(path_to_script, 0700) + os.chmod(path_to_script, 0o700) except OSError: # do not traceback (could be a permission problem) #we talk about a file here s = _('Could not write to %s. Session Management support will ' @@ -607,7 +608,7 @@ def get_avatar_pixbuf_from_cache(fjid, use_local=True): if not os.path.isfile(path): return 'ask' - vcard_dict = gajim.connections.values()[0].get_cached_vcard(fjid, + vcard_dict = list(gajim.connections.values())[0].get_cached_vcard(fjid, is_groupchat_contact) if not vcard_dict: # This can happen if cached vcard is too old return 'ask' @@ -645,28 +646,6 @@ def make_pixbuf_grayscale(pixbuf): pixbuf.saturate_and_pixelate(pixbuf2, 0.0, False) return pixbuf2 -def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): - """ - Choose between avatar image and default image - - Returns full path to the avatar image if it exists, otherwise returns full - path to the image. generic must be with extension and suffix without - """ - if jid: - # we want an avatar - puny_jid = helpers.sanitize_filename(jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix - path_to_local_file = path_to_file + '_local' - for extension in ('.png', '.jpeg'): - path_to_local_file_full = path_to_local_file + extension - if os.path.exists(path_to_local_file_full): - return path_to_local_file_full - for extension in ('.png', '.jpeg'): - path_to_file_full = path_to_file + extension - if os.path.exists(path_to_file_full): - return path_to_file_full - return os.path.abspath(generic) - def decode_filechooser_file_paths(file_paths): """ Decode as UTF-8 under Windows and ask sys.getfilesystemencoding() in POSIX @@ -974,6 +953,38 @@ def load_activity_icon(category, activity = None): icon_list = _load_icon_list([activity], path) return icon_list[activity] +def get_pep_as_pixbuf(pep_class): + if isinstance(pep_class, pep.UserMoodPEP): + assert not pep_class._retracted + received_mood = pep_class._pep_specific_data['mood'] + mood = received_mood if received_mood in pep.MOODS else 'unknown' + pixbuf = load_mood_icon(mood).get_pixbuf() + return pixbuf + elif isinstance(pep_class, pep.UserTunePEP): + path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') + return GdkPixbuf.Pixbuf.new_from_file(path) + elif isinstance(pep_class, pep.UserActivityPEP): + assert not pep_class._retracted + pep_ = pep_class._pep_specific_data + activity = pep_['activity'] + + has_known_activity = activity in pep.ACTIVITIES + has_known_subactivity = (has_known_activity and ('subactivity' in pep_) + and (pep_['subactivity'] in pep.ACTIVITIES[activity])) + + if has_known_activity: + if has_known_subactivity: + subactivity = pep_['subactivity'] + return load_activity_icon(activity, subactivity).get_pixbuf() + else: + return load_activity_icon(activity).get_pixbuf() + else: + return load_activity_icon('unknown').get_pixbuf() + elif isinstance(pep_class, pep.UserLocationPEP): + path = get_icon_path('gajim-earth') + return GdkPixbuf.Pixbuf.new_from_file(path) + return None + def load_icons_meta(): """ Load and return - AND + small icons to put on top left of an icon for meta diff --git a/src/gui_interface.py b/src/gui_interface.py index ae4b8dbaf..401fabdcf 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -68,7 +68,7 @@ from groupchat_control import PrivateChatControl from atom_window import AtomWindow from session import ChatControlSession -import common.sleepy +from common import sleepy from nbxmpp import idlequeue from nbxmpp import Hashes @@ -93,7 +93,7 @@ import config from threading import Thread from common import ged -gajimpaths = common.configpaths.gajimpaths +from common.configpaths import gajimpaths config_filename = gajimpaths['CONFIG_FILE'] from common import optparser @@ -1111,11 +1111,11 @@ class Interface: # Ask offline status in 1 minute so w'are sure we got all online # presences GObject.timeout_add_seconds(60, self.ask_offline_status, account) - if state != common.sleepy.STATE_UNKNOWN and connected in (2, 3): + if state != sleepy.STATE_UNKNOWN and connected in (2, 3): # we go online or free for chat, so we activate auto status gajim.sleeper_state[account] = 'online' - elif not ((state == common.sleepy.STATE_AWAY and connected == 4) or \ - (state == common.sleepy.STATE_XA and connected == 5)): + elif not ((state == sleepy.STATE_AWAY and connected == 4) or \ + (state == sleepy.STATE_XA and connected == 5)): # If we are autoaway/xa and come back after a disconnection, do # nothing # Else disable autoaway @@ -1568,7 +1568,7 @@ class Interface: This is part of rewriting whole events handling system to use GED. """ - for event_name, event_handlers in self.handlers.iteritems(): + for event_name, event_handlers in self.handlers.items(): for event_handler in event_handlers: prio = ged.GUI1 if type(event_handler) == tuple: @@ -2341,14 +2341,14 @@ class Interface: if account not in gajim.sleeper_state or \ not gajim.sleeper_state[account]: continue - if state == common.sleepy.STATE_AWAKE and \ + if state == sleepy.STATE_AWAKE and \ gajim.sleeper_state[account] in ('autoaway', 'autoxa'): # we go online self.roster.send_status(account, 'online', gajim.status_before_autoaway[account]) gajim.status_before_autoaway[account] = '' gajim.sleeper_state[account] = 'online' - elif state == common.sleepy.STATE_AWAY and \ + elif state == sleepy.STATE_AWAY and \ gajim.sleeper_state[account] == 'online' and \ gajim.config.get('autoaway'): # we save out online status @@ -2368,7 +2368,7 @@ class Interface: self.roster.send_status(account, 'away', auto_message, auto=True) gajim.sleeper_state[account] = 'autoaway' - elif state == common.sleepy.STATE_XA and \ + elif state == sleepy.STATE_XA and \ gajim.sleeper_state[account] in ('online', 'autoaway', 'autoaway-forced') and gajim.config.get('autoxa'): # we go extended away [we pass True to auto param] @@ -2912,7 +2912,7 @@ class Interface: self.show_vcard_when_connect = [] - self.sleeper = common.sleepy.Sleepy( + self.sleeper = sleepy.Sleepy( gajim.config.get('autoawaytime') * 60, # make minutes to seconds gajim.config.get('autoxatime') * 60) diff --git a/src/htmltextview.py b/src/htmltextview.py index a34373dd5..84e7205a5 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -42,8 +42,8 @@ from gi.repository import Gdk from gi.repository import GdkPixbuf import xml.sax, xml.sax.handler import re -from cStringIO import StringIO -import urllib2 +from io import StringIO +import urllib import operator if __name__ == '__main__': @@ -491,9 +491,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.title = title return tag - def _update_img(self, (mem, alt), attrs, img_mark): + def _update_img(self, output, attrs, img_mark): '''Callback function called after the function helpers.download_image. ''' + mem, alt = output self._process_img(attrs, (mem, alt, img_mark)) def _process_img(self, attrs, loaded=None): @@ -509,7 +510,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # The "data" URL scheme http://tools.ietf.org/html/rfc2397 import base64 img = attrs['src'].split(',')[1] - mem = base64.standard_b64decode(urllib2.unquote(img)) + mem = base64.standard_b64decode(urllib.parse.unquote(img)) elif loaded is not None: (mem, alt, replace_mark) = loaded update = True diff --git a/src/notify.py b/src/notify.py index a9ca09216..6979235dd 100644 --- a/src/notify.py +++ b/src/notify.py @@ -156,6 +156,9 @@ class Notification: def _nec_notification(self, obj): if obj.do_popup: + if isinstance(obj.popup_image, str): + obj.popup_image = gtkgui_helpers.get_icon_path(obj.popup_image, + 48) popup(obj.popup_event_type, obj.jid, obj.conn.name, obj.popup_msg_type, path_to_image=obj.popup_image, title=obj.popup_title, text=obj.popup_text, diff --git a/src/plugins/__init__.py b/src/plugins/__init__.py index 0d5d18fda..07b0b6c56 100644 --- a/src/plugins/__init__.py +++ b/src/plugins/__init__.py @@ -24,7 +24,7 @@ Main file of plugins package. :license: GPL ''' -from pluginmanager import PluginManager -from plugin import GajimPlugin +from .pluginmanager import PluginManager +from .plugin import GajimPlugin __all__ = ['PluginManager', 'GajimPlugin'] diff --git a/src/plugins/helpers.py b/src/plugins/helpers.py index 18c747527..b37076a87 100644 --- a/src/plugins/helpers.py +++ b/src/plugins/helpers.py @@ -97,7 +97,7 @@ class log_calls(object): :rtype: function ''' - self.full_func_name += f.func_name + self.full_func_name += f.__name__ if self.log_this_class: @functools.wraps(f) def wrapper(*args, **kwargs): diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py index 49de73cf0..b3a54a1cf 100644 --- a/src/plugins/plugin.py +++ b/src/plugins/plugin.py @@ -196,7 +196,7 @@ class GajimPlugin(object): def deactivate(self): pass -import cPickle +import pickle class GajimPluginConfig(): @log_calls('GajimPluginConfig') @@ -242,7 +242,7 @@ class GajimPluginConfig(): @log_calls('GajimPluginConfig') def save(self): fd = open(self.FILE_PATH, 'wb') - cPickle.dump(self.data, fd) + pickle.dump(self.data, fd) fd.close() @log_calls('GajimPluginConfig') @@ -250,14 +250,14 @@ class GajimPluginConfig(): if os.path.isfile(self.FILE_PATH): fd = open(self.FILE_PATH, 'rb') try: - self.data = cPickle.load(fd) + self.data = pickle.load(fd) fd.close() except: fd.close() try: import shelve s = shelve.open(self.FILE_PATH) - for (k, v) in s.iteritems(): + for (k, v) in s.items(): self.data[k] = v if not isinstance(self.data, dict): raise GajimPluginException diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 4e7de9de2..71c0c2e61 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -31,7 +31,7 @@ import sys import fnmatch import zipfile from shutil import rmtree -import ConfigParser +import configparser from common import gajim from common import nec @@ -258,14 +258,14 @@ class PluginManager(object): handlers[0](*args) def _register_events_handlers_in_ged(self, plugin): - for event_name, handler in plugin.events_handlers.iteritems(): + for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] gajim.ged.register_event_handler(event_name, priority, handler_function) def _remove_events_handler_from_ged(self, plugin): - for event_name, handler in plugin.events_handlers.iteritems(): + for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] gajim.ged.remove_event_handler(event_name, priority, @@ -312,7 +312,7 @@ class PluginManager(object): # remove GUI extension points handlers (provided by plug-in) from # handlers list for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): self.gui_extension_points_handlers[gui_extpoint_name].remove( gui_extpoint_handlers) @@ -320,7 +320,7 @@ class PluginManager(object): # cleaning up method that must be provided by plug-in developer # for each handled GUI extension point) for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: @@ -344,14 +344,14 @@ class PluginManager(object): @log_calls('PluginManager') def _add_gui_extension_points_handlers_from_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): self.gui_extension_points_handlers.setdefault(gui_extpoint_name, []).append(gui_extpoint_handlers) @log_calls('PluginManager') def _handle_all_gui_extension_points_with_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: @@ -407,7 +407,7 @@ class PluginManager(object): ''' from plugins.plugins_i18n import _ plugins_found = [] - conf = ConfigParser.ConfigParser() + conf = configparser.ConfigParser() fields = ('name', 'short_name', 'version', 'description', 'authors', 'homepage') if not os.path.isdir(path): @@ -471,7 +471,7 @@ class PluginManager(object): conf.readfp(open(manifest_path, 'r')) for option in fields: if conf.get('info', option) is '': - raise ConfigParser.NoOptionError, 'field empty' + raise configparser.NoOptionError('field empty') setattr(module_attr, option, conf.get('info', option)) conf.remove_section('info') @@ -483,15 +483,15 @@ class PluginManager(object): module_attr._ = _ except AttributeError as type_error: pass - except ConfigParser.NoOptionError as type_error: + except configparser.NoOptionError as type_error: # all fields are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. all fields are required!')) - except ConfigParser.NoSectionError as type_error: + except configparser.NoSectionError as type_error: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. info section are required!')) - except ConfigParser.MissingSectionHeaderError as type_error: + except configparser.MissingSectionHeaderError as type_error: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. section are required!')) diff --git a/src/remote_control.py b/src/remote_control.py index b2a193d32..60f22b7b1 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -619,7 +619,7 @@ class SignalObject(dbus.service.Object): raise dbus_support.MissingArgument() jid = self._get_real_jid(jid) - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) + cached_vcard = list(gajim.connections.values())[0].get_cached_vcard(jid) if cached_vcard: return get_dbus_struct(cached_vcard) diff --git a/src/roster_window.py b/src/roster_window.py index f842027bd..990df3cf5 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1062,28 +1062,28 @@ class RosterWindow: pep_dict = gajim.connections[account].pep if gajim.config.get('show_mood_in_roster') and 'mood' in pep_dict: - self.model[child_iter][C_MOOD_PIXBUF] = pep_dict['mood'].\ - asPixbufIcon() + self.model[child_iter][C_MOOD_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['mood']) else: self.model[child_iter][C_MOOD_PIXBUF] = empty_pixbuf if gajim.config.get('show_activity_in_roster') and 'activity' in \ pep_dict: - self.model[child_iter][C_ACTIVITY_PIXBUF] = pep_dict['activity'].\ - asPixbufIcon() + self.model[child_iter][C_ACTIVITY_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['activity']) else: self.model[child_iter][C_ACTIVITY_PIXBUF] = empty_pixbuf if gajim.config.get('show_tunes_in_roster') and 'tune' in pep_dict: - self.model[child_iter][C_TUNE_PIXBUF] = pep_dict['tune'].\ - asPixbufIcon() + self.model[child_iter][C_TUNE_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['tune']) else: self.model[child_iter][C_TUNE_PIXBUF] = empty_pixbuf if gajim.config.get('show_location_in_roster') and 'location' in \ pep_dict: - self.model[child_iter][C_LOCATION_PIXBUF] = pep_dict['location'].\ - asPixbufIcon() + self.model[child_iter][C_LOCATION_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['location']) else: self.model[child_iter][C_LOCATION_PIXBUF] = empty_pixbuf @@ -1340,7 +1340,7 @@ class RosterWindow: if not contact: contact = gajim.contacts.get_contact(account, jid) if pep_type in contact.pep: - pixbuf = contact.pep[pep_type].asPixbufIcon() + pixbuf = gtkgui_helpers.get_pep_as_pixbuf(contact.pep[pep_type]) else: pixbuf = empty_pixbuf for child_iter in iters: diff --git a/src/tooltips.py b/src/tooltips.py index 9e09e33e5..6fe799a89 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -637,9 +637,9 @@ class RosterTooltip(NotificationAreaTooltip): 'tooltip_idle_color') cs += '%s' properties.append((str(), None)) - idle_since = helpers.ensure_utf8_string(cs % _("Idle since %s")) + idle_since = cs % _("Idle since %s") properties.append((idle_since % formatted, None)) - idle_for = helpers.ensure_utf8_string(cs % _("Idle for %s")) + idle_for = cs % _("Idle for %s") properties.append((idle_for % str(diff), None)) while properties: diff --git a/test/lib/mock.py b/test/lib/mock.py index fdaf000db..e2a2b6c03 100644 --- a/test/lib/mock.py +++ b/test/lib/mock.py @@ -212,7 +212,7 @@ class MockCall: elif isinstance(n, str): return self.kwparams[n] else: - raise IndexError, 'illegal index type for getParam' + raise IndexError('illegal index type for getParam') def getNumParams(self): return len(self.params) diff --git a/test/unit/test_jingle.py b/test/unit/test_jingle.py index 438bdb2e0..ce9edeb66 100644 --- a/test/unit/test_jingle.py +++ b/test/unit/test_jingle.py @@ -135,8 +135,8 @@ class TestJingle(unittest.TestCase): self.dispatcher.RegisterHandler('iq', self.con._JingleCB, 'set' , common.xmpp.NS_JINGLE) self.dispatcher.ProcessNonBlocking(session_init) - session = self.con._sessions.values()[0] # The only session we have - jft = session.contents.values()[0] # jingleFT object + session = list(self.con._sessions.values())[0] # The only session we have + jft = list(session.contents.values())[0] # jingleFT object jft.file_props = self.recieve_file # We plug file_props manually # The user accepts to recieve the file # we have to manually simulate this behavior From 2c21353a8b02eb2249c7417881f1a90d0510b368 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 2 Jan 2013 17:53:42 +0100 Subject: [PATCH 022/592] remove has_key() fix base64 calls (requires and returns bytes, not str) --- plugins/dbus_plugin/plugin.py | 2 +- src/common/caps_cache.py | 2 +- src/common/connection_handlers.py | 18 +++++++++--------- src/common/file_props.py | 2 +- src/common/helpers.py | 4 +--- src/common/protocol/bytestream.py | 5 +++-- src/common/resolver.py | 25 ++++++++++++------------- src/common/zeroconf/client_zeroconf.py | 18 +++++++++--------- src/dataforms_widget.py | 3 ++- src/disco.py | 1 - src/gajim-remote.py | 2 +- src/gui_menu_builder.py | 2 +- src/profile_window.py | 3 ++- src/remote_control.py | 2 +- src/roster_window.py | 4 ++-- src/vcard.py | 2 +- 16 files changed, 47 insertions(+), 48 deletions(-) diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index 8bf8d55a3..b8de568e9 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -428,7 +428,7 @@ if dbus_support.supported: def account_info(self, account): '''show info on account: resource, jid, nick, prio, message''' result = DBUS_DICT_SS() - if gajim.connections.has_key(account): + if account in gajim.connections: # account is valid con = gajim.connections[account] index = con.connected diff --git a/src/common/caps_cache.py b/src/common/caps_cache.py index bbf25c477..6bf9b62ed 100644 --- a/src/common/caps_cache.py +++ b/src/common/caps_cache.py @@ -163,7 +163,7 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): hash_ = hashlib.md5(S.encode('utf-8')) else: return '' - return base64.b64encode(hash_.digest()) + return base64.b64encode(hash_.digest()).decode('utf-8') ################################################################################ diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 11bc078fe..df4710caf 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -431,7 +431,8 @@ class ConnectionVcard: if 'PHOTO' in vcard and isinstance(vcard['PHOTO'], dict) and \ 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')).decode( + 'utf-8') gajim.interface.save_avatar_files(our_jid, photo_decoded) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() iq2.getTag('PHOTO').setTagData('SHA', avatar_sha) @@ -684,7 +685,7 @@ class ConnectionVcard: 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] try: - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')).decode('utf-8') avatar_sha = hashlib.sha1(photo_decoded).hexdigest() except Exception: avatar_sha = '' @@ -970,7 +971,7 @@ class ConnectionHandlersBase: decmsg = self.gpg.decrypt(encmsg, keyID) decmsg = self.connection.Dispatcher.replace_non_character(decmsg) # \x00 chars are not allowed in C (so in GTK) - obj.msgtxt = helpers.decode_string(decmsg.replace('\x00', '')) + obj.msgtxt = decmsg.replace('\x00', '') obj.encrypted = 'xep27' self.gpg_messages_to_decrypt.remove([encmsg, keyID, obj]) @@ -1095,7 +1096,7 @@ class ConnectionHandlersBase: jid = gajim.get_jid_without_resource(jid) try: - return self.sessions[jid].values() + return list(self.sessions[jid].values()) except KeyError: return [] @@ -1157,7 +1158,7 @@ class ConnectionHandlersBase: received a thread_id yet and returns the session that we last sent a message to """ - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # sessions that we haven't received a thread ID in idless = [s for s in sessions if not s.received_thread_id] @@ -1178,7 +1179,7 @@ class ConnectionHandlersBase: Find an active session that doesn't have a control attached """ try: - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # filter out everything except the default session type chat_sessions = [s for s in sessions if isinstance(s, @@ -1549,9 +1550,8 @@ ConnectionJingle, ConnectionIBBytestream): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setQuery() qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime())) - qp.setTagData('tz', helpers.decode_string(tzname[daylight])) - qp.setTagData('display', helpers.decode_string(strftime('%c', - localtime()))) + qp.setTagData('tz', tzname[daylight]) + qp.setTagData('display', strftime('%c', localtime())) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ diff --git a/src/common/file_props.py b/src/common/file_props.py index 808db80fd..1d9684dcb 100644 --- a/src/common/file_props.py +++ b/src/common/file_props.py @@ -64,7 +64,7 @@ class FilesProp: @classmethod def getAllFileProp(cls): - return cls._files_props.values() + return list(cls._files_props.values()) @classmethod def setFileProp(cls, fp, account, sid): diff --git a/src/common/helpers.py b/src/common/helpers.py index 32c922400..59ffe634b 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -633,8 +633,6 @@ def datetime_tuple(timestamp): from time import strptime return strptime(timestamp, '%Y%m%dT%H:%M:%S') -# import gajim only when needed (after decode_string is defined) see #4764 - from common import gajim if gajim.HAVE_PYCURL: import pycurl @@ -904,7 +902,7 @@ def get_full_jid_from_iq(iq_obj): """ Return the full jid (with resource) from an iq """ - return parse_jid(iq_obj.getFrom()) + return parse_jid(str(iq_obj.getFrom())) def get_jid_from_iq(iq_obj): """ diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index f46fb4342..4077dbe18 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -852,7 +852,8 @@ class ConnectionIBBytestream(ConnectionBytestream): chunk = file_props.fp.read(file_props.block_size) if chunk: datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid, - 'seq': file_props.seq}, base64.encodestring(chunk)) + 'seq': file_props.seq}, base64.b64encode(chunk.encode( + 'utf-8')).decode('utf-8')) file_props.seq += 1 file_props.started = True if file_props.seq == 65536: @@ -887,7 +888,7 @@ class ConnectionIBBytestream(ConnectionBytestream): log.debug('ReceiveHandler called sid->%s seq->%s' % (sid, seq)) try: seq = int(seq) - data = base64.decodestring(data) + data = base64.b64decode(data.encode('utf-8')).decode('utf-8') except Exception: seq = '' data = '' diff --git a/src/common/resolver.py b/src/common/resolver.py index 8d52cba51..6f1200d54 100644 --- a/src/common/resolver.py +++ b/src/common/resolver.py @@ -70,33 +70,33 @@ class CommonResolver(): # empty host, return empty list of srv records on_ready([]) return - if self.resolved_hosts.has_key(host+type): + if host + type in self.resolved_hosts: # host is already resolved, return cached values log.debug('%s already resolved: %s' % (host, - self.resolved_hosts[host+type])) - on_ready(host, self.resolved_hosts[host+type]) + self.resolved_hosts[host + type])) + on_ready(host, self.resolved_hosts[host + type]) return - if self.handlers.has_key(host+type): + if host + type in self.handlers: # host is about to be resolved by another connection, # attach our callback log.debug('already resolving %s' % host) - self.handlers[host+type].append(on_ready) + self.handlers[host + type].append(on_ready) else: # host has never been resolved, start now log.debug('Starting to resolve %s using %s' % (host, self)) - self.handlers[host+type] = [on_ready] + self.handlers[host + type] = [on_ready] self.start_resolve(host, type) def _on_ready(self, host, type, result_list): # practically it is impossible to be the opposite, but who knows :) host = host.lower() log.debug('Resolving result for %s: %s' % (host, result_list)) - if not self.resolved_hosts.has_key(host+type): - self.resolved_hosts[host+type] = result_list - if self.handlers.has_key(host+type): - for callback in self.handlers[host+type]: + if host + type not in self.resolved_hosts: + self.resolved_hosts[host + type] = result_list + if host + type in self.handlers: + for callback in self.handlers[host + type]: callback(host, result_list) - del(self.handlers[host+type]) + del(self.handlers[host + type]) def start_resolve(self, host, type): pass @@ -251,8 +251,7 @@ class NSLookupResolver(CommonResolver): domain = None if line.startswith(fqdn): domain = fqdn # For nslookup 9.5 - elif helpers.decode_string(line).startswith(ufqdn): - line = helpers.decode_string(line) + elif line.startswith(ufqdn): domain = ufqdn # For nslookup 9.6 if domain: rest = line[len(domain):].split('=') diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 69f1a4e6f..3d5b43f43 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -173,7 +173,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append(( id_, thread_id)) else: @@ -195,7 +195,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append((id_, thread_id)) else: @@ -253,10 +253,10 @@ class P2PClient(IdleObject): 'Incorrect answer from server.') return if self.sock_type == TYPE_SERVER: - if attrs.has_key('from'): + if 'from' in attrs: self.to = attrs['from'] self.send_stream_header() - if attrs.has_key('version') and attrs['version'] == '1.0': + if 'version' in attrs and attrs['version'] == '1.0': # other part supports stream features features = Node('stream:features') self.Dispatcher.send(features) @@ -270,12 +270,12 @@ class P2PClient(IdleObject): def on_disconnect(self): if self.conn_holder: - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: del self.conn_holder.ids_of_awaiting_messages[self.fd] self.conn_holder.remove_connection(self.sock_hash) - if self.__dict__.has_key('Dispatcher'): + if 'Dispatcher' in self.__dict__: self.Dispatcher.PlugOut() - if self.__dict__.has_key('P2PConnection'): + if 'P2PConnection' in self.__dict__: self.P2PConnection.PlugOut() self.Connection = None self._caller = None @@ -294,7 +294,7 @@ class P2PClient(IdleObject): self.Dispatcher.Stream._document_attrs is None: return self.onreceive(None) - if self.Dispatcher.Stream._document_attrs.has_key('version') and \ + if 'version' in self.Dispatcher.Stream._document_attrs and \ self.Dispatcher.Stream._document_attrs['version'] == '1.0': #~ self.onreceive(self._on_receive_stream_features) #XXX continue with TLS @@ -710,7 +710,7 @@ class ClientZeroconf: if self.ip_to_hash[i] == sock_hash: del self.ip_to_hash[i] break - if self.hash_to_port.has_key(sock_hash): + if sock_hash in self.hash_to_port: del self.hash_to_port[sock_hash] def start_listener(self, port): diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 766e51477..7e2b8198b 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -566,7 +566,8 @@ class SingleForm(Gtk.Table, object): for uri in field.media.uris: if uri.type_.startswith('image/'): try: - img_data = base64.decodestring(uri.uri_data) + img_data = base64.b64decode(uri.uri_data.encode( + 'utf-8')).decode('utf-8') pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() diff --git a/src/disco.py b/src/disco.py index 12be18b34..9eb75e616 100644 --- a/src/disco.py +++ b/src/disco.py @@ -193,7 +193,6 @@ class CacheDictionary: def __contains__(self, key): return key in self.cache - has_key = __contains__ _icon_cache = CacheDictionary(15) diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 1df48a5ea..c01ac6f10 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -42,7 +42,7 @@ except Exception: def send_error(error_message): '''Writes error message to stderr and exits''' - print(error_message.encode(PREFERRED_ENCODING), file=sys.stderr) + print(error_message, file=sys.stderr) sys.exit(1) try: diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 17364b08f..fabef8dc8 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -122,7 +122,7 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): minimized_controls = [] for account in connected_accounts: minimized_controls += \ - gajim.interface.minimized_controls[account].values() + list(gajim.interface.minimized_controls[account].values()) for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + minimized_controls: acct = gc_control.account diff --git a/src/profile_window.py b/src/profile_window.py index 614af3add..696c66beb 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -171,7 +171,8 @@ class ProfileWindow: button.show() text_button = self.xml.get_object('NOPHOTO_button') text_button.hide() - self.avatar_encoded = base64.encodestring(data) + self.avatar_encoded = base64.b64encode(data.encode('utf-8')).decode( + 'utf-8') # returns None if unknown type self.avatar_mime_type = mimetypes.guess_type(path_to_file)[0] if must_delete: diff --git a/src/remote_control.py b/src/remote_control.py index 60f22b7b1..26b8d7020 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -907,7 +907,7 @@ class SignalObject(dbus.service.Object): if not invalid_file and filesize < 16384: fd = open(picture, 'rb') data = fd.read() - avatar = base64.encodestring(data) + avatar = base64.b64encode(data.encode('utf-8')).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard={} vcard['PHOTO'] = {'BINVAL': avatar} diff --git a/src/roster_window.py b/src/roster_window.py index 990df3cf5..fd6c6f462 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2186,7 +2186,7 @@ class RosterWindow: gajim.interface.status_sent_to_groups[account] = {} for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ - gajim.interface.minimized_controls[account].values(): + list(gajim.interface.minimized_controls[account].values()): if gc_control.account == account: if gajim.gc_connected[account][gc_control.room_jid]: gajim.connections[account].send_gc_status( @@ -3923,7 +3923,7 @@ class RosterWindow: ) def on_plugins_menuitem_activate(self, widget): - if gajim.interface.instances.has_key('plugins'): + if 'plugins' in gajim.interface.instances: gajim.interface.instances['plugins'].window.present() else: gajim.interface.instances['plugins'] = plugins.gui.PluginsWindow() diff --git a/src/vcard.py b/src/vcard.py index 35c194f30..8fa203c10 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -61,7 +61,7 @@ def get_avatar_pixbuf_encoded_mime(photo): img_encoded = photo['BINVAL'] avatar_encoded = img_encoded try: - img_decoded = base64.decodestring(img_encoded) + img_decoded = base64.b64decode(img_encoded.encode('utf-8')).decode('utf-8') except Exception: pass if img_decoded: From 3fdefe20b786e4bbec6dfa64f976cde79970baa6 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 2 Jan 2013 18:17:51 +0100 Subject: [PATCH 023/592] xrange() -> list(range()) --- src/chat_control.py | 2 +- src/command_system/implementation/execute.py | 2 +- src/common/contacts.py | 4 +++- src/common/socks5.py | 2 +- src/config.py | 10 +++++----- src/dataforms_widget.py | 5 ++--- src/gtkgui_helpers.py | 4 ++-- src/message_window.py | 6 +++--- src/plugins/gui.py | 2 +- src/roster_window.py | 2 +- 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 61738933d..8484c9e62 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -916,7 +916,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): scroll = False if pos == size else True # are we scrolling? # we don't want size of the buffer to grow indefinately max_size = gajim.config.get('key_up_lines') - for i in xrange(size - max_size + 1): + for i in range(size - max_size + 1): if pos == 0: break history.pop(0) diff --git a/src/command_system/implementation/execute.py b/src/command_system/implementation/execute.py index 688347a1f..26fda9e81 100644 --- a/src/command_system/implementation/execute.py +++ b/src/command_system/implementation/execute.py @@ -68,7 +68,7 @@ class Execute(CommandContainer): @classmethod def poller(cls, processor, popen): - for x in xrange(cls.POLL_COUNT): + for x in list(range(cls.POLL_COUNT)): yield cls.brush(processor, popen) cls.overdue(processor, popen) yield False diff --git a/src/common/contacts.py b/src/common/contacts.py index 1d6f891b6..3d411bf24 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -28,6 +28,8 @@ ## along with Gajim. If not, see . ## +from functools import cmp_to_key + try: from common import caps_cache from common.account import Account @@ -848,7 +850,7 @@ class MetacontactManager(): Which of the family will be the big brother under wich all others will be ? """ - family.sort(cmp=self._compare_metacontacts) + family.sort(key=cmp_to_key(self._compare_metacontacts)) return family[-1] diff --git a/src/common/socks5.py b/src/common/socks5.py index 725ac73a1..c57be17a5 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -781,7 +781,7 @@ class Socks5: auth_mechanisms = [] try: num_auth = struct.unpack('!xB', buff[:2])[0] - for i in xrange(num_auth): + for i in list(range(num_auth)): mechanism, = struct.unpack('!B', buff[1 + i]) auth_mechanisms.append(mechanism) except Exception: diff --git a/src/config.py b/src/config.py index b5cbff3a8..597c74876 100644 --- a/src/config.py +++ b/src/config.py @@ -173,7 +173,7 @@ class PreferencesWindow: if dir_ != '.svn': l.append(dir_) l.append(_('Disabled')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if gajim.config.get('emoticons_theme') == l[i]: emoticons_combobox.set_active(i) @@ -243,7 +243,7 @@ class PreferencesWindow: l.append(dir) if l.count == 0: l.append(' ') - for i in xrange(len(l)): + for i in range(len(l)): preview = Gtk.Image() files = [] files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', @@ -1279,7 +1279,7 @@ class PreferencesWindow: model.clear() l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) @@ -1766,7 +1766,7 @@ class AccountsWindow: proxy_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) @@ -3757,7 +3757,7 @@ class AccountCreationWizardWindow: proxies_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) proxies_combobox.set_active(0) diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 7e2b8198b..bd30db5d5 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -277,7 +277,7 @@ class DataFormWidget(Gtk.Alignment, object): selection = self.records_treeview.get_selection() model, rowrefs = selection.get_selected_rows() # rowref is a list of paths - for i in xrange(len(rowrefs)): + for i in list(range(len(rowrefs))): rowrefs[i] = Gtk.TreeRowReference(model, rowrefs[i]) # rowref is a list of row references; need to convert because we will # modify the model, paths would change @@ -566,8 +566,7 @@ class SingleForm(Gtk.Table, object): for uri in field.media.uris: if uri.type_.startswith('image/'): try: - img_data = base64.b64decode(uri.uri_data.encode( - 'utf-8')).decode('utf-8') + img_data = base64.decodestring(uri.uri_data) pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 7fdb46a78..a25fe3f14 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -317,7 +317,7 @@ class HashDigest: def __str__(self): prettydigest = '' - for i in xrange(0, len(self.digest), 2): + for i in list(range(0, len(self.digest), 2)): prettydigest += self.digest[i:i + 2] + ':' return prettydigest[:-1] @@ -1102,7 +1102,7 @@ def label_set_autowrap(widget): """ if isinstance (widget, Gtk.Container): children = widget.get_children() - for i in xrange (len (children)): + for i in list(range (len (children))): label_set_autowrap(children[i]) elif isinstance(widget, Gtk.Label): widget.set_line_wrap(True) diff --git a/src/message_window.py b/src/message_window.py index e2912fe56..13b4ed7d3 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -106,7 +106,7 @@ class MessageWindow(object): 'b', 'F4', 'w', 'Page_Up', 'Page_Down', 'Right', 'Left', 'd', 'c', 'm', 't', 'Escape'] + \ - [''+str(i) for i in xrange(10)] + [''+str(i) for i in list(range(10))] accel_group = Gtk.AccelGroup() for key in keys: keyval, mod = Gtk.accelerator_parse(key) @@ -856,7 +856,7 @@ class MessageWindow(object): to_right = False horiz = self.notebook.get_tab_pos() == Gtk.PositionType.TOP or \ self.notebook.get_tab_pos() == Gtk.PositionType.BOTTOM - for i in xrange(self.notebook.get_n_pages()): + for i in list(range(self.notebook.get_n_pages())): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) tab_alloc = tab.get_allocation() @@ -882,7 +882,7 @@ class MessageWindow(object): Find the page num of the tab label """ page_num = -1 - for i in xrange(self.notebook.get_n_pages()): + for i in list(range(self.notebook.get_n_pages())): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) if tab == tab_label: diff --git a/src/plugins/gui.py b/src/plugins/gui.py index ca4a63da0..142121839 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -264,7 +264,7 @@ class PluginsWindow(object): return model = self.installed_plugins_model - for row in xrange(len(model)): + for row in list(range(len(model))): if plugin == model[row][PLUGIN]: model.remove(model.get_iter((row, PLUGIN))) break diff --git a/src/roster_window.py b/src/roster_window.py index fd6c6f462..87e39b10b 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3225,7 +3225,7 @@ class RosterWindow: 'attached_gpg_keys').split() keys = {} keyID = _('None') - for i in xrange(len(attached_keys)/2): + for i in list(range(len(attached_keys)/2)): keys[attached_keys[2*i]] = attached_keys[2*i+1] if attached_keys[2*i] == contact.jid: keyID = attached_keys[2*i+1] From ed215649707c777d196e281b2b5eb4c9cb027858 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 2 Jan 2013 18:23:38 +0100 Subject: [PATCH 024/592] fix some dict.keys() --- src/common/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/config.py b/src/common/config.py index d3eb50875..afda4bb7f 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -635,7 +635,7 @@ class Config: def get(self, optname=None): if not optname: - return self.__options[1].keys() + return list(self.__options[1].keys()) if optname not in self.__options[1]: return None return self.__options[1][optname] @@ -710,7 +710,7 @@ class Config: return None dict_ = self.__options_per_key[optname][1] if not key: - return dict_.keys() + return list(dict_.keys()) if key not in dict_: if subname in self.__options_per_key[optname][0]: return self.__options_per_key[optname][0][subname][1] From 689fe31710dc45302f332824682aa4aca76b1f39 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 30 Dec 2012 18:54:49 +0100 Subject: [PATCH 025/592] handle nbxmpp logging with -l option (-l .nbxmpp.client_nb=INFO for example) --- src/common/logging_helpers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/common/logging_helpers.py b/src/common/logging_helpers.py index 50b22f3b0..22bc7ab73 100644 --- a/src/common/logging_helpers.py +++ b/src/common/logging_helpers.py @@ -152,6 +152,12 @@ def init(use_color=False): root_log.addHandler(consoleloghandler) root_log.propagate = False + # handle nbxmpp logs too + root_log = logging.getLogger('nbxmpp') + root_log.setLevel(logging.WARNING) + root_log.addHandler(consoleloghandler) + root_log.propagate = False + def set_loglevels(loglevels_string): parseAndSetLogLevels(loglevels_string) From 2acaa2e075d58df94579de8b230b4c03042fff95 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 30 Dec 2012 23:29:51 +0100 Subject: [PATCH 026/592] some GTK3 fixes --- src/dialogs.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index d88f3428f..64ed00836 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -201,17 +201,18 @@ class EditGroupsDialog: column.set_expand(True) self.treeview.append_column(column) renderer = Gtk.CellRendererText() - column.pack_start(renderer, True, True, 0) - column.set_attributes(renderer, text=0) + column.pack_start(renderer, True) + column.add_attribute(renderer, 'text', 0) column = Gtk.TreeViewColumn(_('In the group')) column.set_expand(False) self.treeview.append_column(column) renderer = Gtk.CellRendererToggle() - column.pack_start(renderer, True, True, 0) + column.pack_start(renderer, True) renderer.set_property('activatable', True) renderer.connect('toggled', self.group_toggled_cb) - column.set_attributes(renderer, active=1, inconsistent=2) + column.add_attribute(renderer, 'active', 1) + column.add_attribute(renderer, 'inconsistent', 2) class PassphraseDialog: """ @@ -1963,7 +1964,7 @@ class CommonInputDialog: def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: - user_input = user_input.decode('utf-8') + user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): From b6b3bcb552b9cb854adac59a9d89352bafb9c1f0 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 30 Dec 2012 23:47:31 +0100 Subject: [PATCH 027/592] [Dicson and I] fix some unicode issues --- src/common/helpers.py | 12 ++++++++++++ src/tooltips.py | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/common/helpers.py b/src/common/helpers.py index c83da177a..0dbac4c40 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -46,6 +46,7 @@ import caps_cache import socket import time +from gi.repository import GObject from encodings.punycode import punycode_encode from string import Template @@ -474,6 +475,17 @@ def ensure_utf8_string(string): pass return string +def wrapped_ensure_utf8_string(fn): + def wrapped(n): + return ensure_utf8_string(n) + return wrapped + +@wrapped_ensure_utf8_string +def escape_text(text): + return GObject.markup_escape_text(text) + +GObject.markup_escape_text = escape_text + def get_windows_reg_env(varname, default=''): """ Ask for paths commonly used but not exposed as ENVs in english Windows 2003 diff --git a/src/tooltips.py b/src/tooltips.py index 07191c506..a0e8f1fc5 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -487,11 +487,11 @@ class RosterTooltip(NotificationAreaTooltip): vcard_current_row = 1 properties = [] - name_markup = u'' + \ + name_markup = '' + \ GObject.markup_escape_text(prim_contact.get_shown_name())\ + '' if gajim.config.get('mergeaccounts'): - name_markup += u" (%s)" % ( + name_markup += " (%s)" % ( gajim.config.get('tooltip_account_name_color'), GObject.markup_escape_text(prim_contact.account.name)) From e8dab6e41c25c9972844986e3e59e51e69fd01e2 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 30 Dec 2012 23:49:05 +0100 Subject: [PATCH 028/592] fix one more unicode error --- src/common/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/connection.py b/src/common/connection.py index 6924f0eb2..be4641aac 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -619,7 +619,7 @@ class CommonConnection: conn=self, stanza_str=unicode(data, errors='ignore'))) elif event == nbxmpp.transports_nb.DATA_SENT: gajim.nec.push_incoming_event(StanzaSentEvent(None, conn=self, - stanza_str=unicode(data))) + stanza_str=data)) def change_status(self, show, msg, auto=False): if not msg: From 00a856ebbb8492e1cd26a3bf6e84738c981a8b5f Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Mon, 31 Dec 2012 15:43:53 +0400 Subject: [PATCH 029/592] fix ace --- src/advanced_configuration_window.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 3df0ebf4b..39a850ae0 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -28,6 +28,7 @@ import gtkgui_helpers from gi.repository import GObject from common import gajim +from common import helpers ( OPT_TYPE, @@ -76,7 +77,7 @@ class AdvancedConfigurationWindow(object): def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('advanced_configuration_window.ui') self.window = self.xml.get_object('advanced_configuration_window') - self.set_transient_for( + self.window.set_transient_for( gajim.interface.instances['preferences'].window) self.entry = self.xml.get_object('advanced_entry') self.desc_label = self.xml.get_object('advanced_desc_label') @@ -105,22 +106,22 @@ class AdvancedConfigurationWindow(object): self.modelfilter.set_visible_func(self.visible_func) renderer_text = Gtk.CellRendererText() - col = treeview.insert_column_with_attributes(-1, _('Preference Name'), - renderer_text, text = 0) + col = Gtk.TreeViewColumn(_('Preference Name'), renderer_text, text = 0) + treeview.insert_column(col, -1) col.set_resizable(True) renderer_text = Gtk.CellRendererText() renderer_text.connect('edited', self.on_config_edited) - col = treeview.insert_column_with_attributes(-1, _('Value'), - renderer_text, text = 1) + col = Gtk.TreeViewColumn(_('Value'),renderer_text, text = 1) + treeview.insert_column(col, -1) col.set_cell_data_func(renderer_text, self.cb_value_column_data) col.props.resizable = True col.set_max_width(250) renderer_text = Gtk.CellRendererText() - treeview.insert_column_with_attributes(-1, _('Type'), - renderer_text, text = 2) + col = Gtk.TreeViewColumn(_('Type'), renderer_text, text = 2) + treeview.insert_column(col, -1) treeview.set_model(self.modelfilter) @@ -133,7 +134,7 @@ class AdvancedConfigurationWindow(object): self.restart_label.hide() gajim.interface.instances['advanced_config'] = self - def cb_value_column_data(self, col, cell, model, iter_): + def cb_value_column_data(self, col, cell, model, iter_, data): """ Check if it's boolen or holds password stuff and if yes make the cellrenderertext not editable, else - it's editable @@ -228,8 +229,10 @@ class AdvancedConfigurationWindow(object): def on_config_edited(self, cell, path, text): # convert modelfilter path to model path + path=Gtk.TreePath.new_from_string(path) modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] + modelpath = modelpath.get_indices() option = modelrow[0].decode('utf-8') text = text.decode('utf-8') if len(modelpath) > 1: @@ -305,10 +308,14 @@ class AdvancedConfigurationWindow(object): if type_ == self.types['boolean']: value = self.right_true_dict[option] else: - value = option + try: + value = str(option) + except: + value = option + value = helpers.ensure_utf8_string(value) self.model.append(parent, [name, value, type_]) - def visible_func(self, model, treeiter): + def visible_func(self, model, treeiter, data): search_string = self.entry.get_text().decode('utf-8').lower() for it in tree_model_pre_order(model, treeiter): if model[it][C_TYPE] != '': From 841be1bf21856da2c6407cd85d3a90385640e729 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 31 Dec 2012 13:38:08 +0100 Subject: [PATCH 030/592] fix about dialog --- src/dialogs.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 64ed00836..e6131ec23 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1275,9 +1275,11 @@ class AboutDialog: text = open(copying_file_path).read() dlg.set_license(text) + gtk_ver = '%i.%i.%i' % (Gtk.get_major_version(), + Gtk.get_minor_version(), Gtk.get_micro_version()) + gobject_ver = self.tuple2str(GObject.pygobject_version) dlg.set_comments('%s\n%s %s\n%s %s' % (_('A GTK+ Jabber/XMPP client'), - _('GTK+ Version:'), self.tuple2str(Gtk.gtk_version), \ - _('PyGTK Version:'), self.tuple2str(Gtk.pygtk_version))) + _('GTK+ Version:'), gtk_ver, _('PyGobject Version:'), gobject_ver)) dlg.set_website('http://gajim.org/') authors_file_path = self.get_path('AUTHORS') @@ -1297,12 +1299,13 @@ class AboutDialog: if thanks_file_path: authors.append('\n' + _('THANKS:')) - text = open(thanks_file_path).read() + text = helpers.ensure_utf8_string(open(thanks_file_path).read()) text_splitted = text.split('\n') text = '\n'.join(text_splitted[:-2]) # remove one english sentence # and add it manually as translatable - text += '\n%s\n' % _('Last but not least, we would like to thank all ' - 'the package maintainers.') + text += helpers.ensure_utf8_string('\n%s\n' % _('Last but not ' + 'least, we would like to thank all the package maintainers.' + )) authors.append(text) dlg.set_authors(authors) From 7f83d5324e3ccdddaaf760df058c9848d8626428 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 31 Dec 2012 13:48:15 +0100 Subject: [PATCH 031/592] fix dubble click on a boolean value in ACE --- src/advanced_configuration_window.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 39a850ae0..81e1f284e 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -197,12 +197,12 @@ class AdvancedConfigurationWindow(object): if modelrow[2] == self.types['boolean']: for key in self.right_true_dict.keys(): if self.right_true_dict[key] == modelrow[1]: - modelrow[1] = key + modelrow[1] = str(key) newval = {'False': True, 'True': False}[modelrow[1]] - if len(modelpath) > 1: - optnamerow = self.model[modelpath[0]] + if len(modelpath.get_indices()) > 1: + optnamerow = self.model[modelpath.get_indices()[0]] optname = optnamerow[0].decode('utf-8') - keyrow = self.model[modelpath[:2]] + keyrow = self.model[modelpath.get_indices()[:2]] key = keyrow[0].decode('utf-8') self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], newval) From 63d0c2dcf4eb36dbfaf0cb0c0693af213b2b2173 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Mon, 31 Dec 2012 19:05:59 +0400 Subject: [PATCH 032/592] fix time in tooltips --- src/tooltips.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/tooltips.py b/src/tooltips.py index a0e8f1fc5..40c189d80 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -644,8 +644,10 @@ class RosterTooltip(NotificationAreaTooltip): 'tooltip_idle_color') cs += '%s' properties.append((str(), None)) - properties.append(((cs % _("Idle since %s")) % formatted, None)) - properties.append(((cs % _("Idle for %s")) % str(diff), None)) + idle_since = helpers.ensure_utf8_string(cs % _("Idle since %s")) + properties.append((idle_since % formatted, None)) + idle_for = helpers.ensure_utf8_string(cs % _("Idle for %s")) + properties.append((idle_for % str(diff), None)) while properties: property_ = properties.pop(0) @@ -658,14 +660,15 @@ class RosterTooltip(NotificationAreaTooltip): if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, 2, vcard_current_row, - vcard_current_row + 1, Gtk.AttachOptions.FILL, vertical_fill, 0, 0) + vcard_current_row + 1, Gtk.AttachOptions.FILL, + vertical_fill, 0, 0) label = Gtk.Label() label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, - vcard_current_row + 1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, - vertical_fill, 0, 0) + vcard_current_row + 1, Gtk.AttachOptions.EXPAND | \ + Gtk.AttachOptions.FILL, vertical_fill, 0, 0) else: if isinstance(property_[0], (unicode, str)): # FIXME: rm unicode? label.set_markup(property_[0]) @@ -673,11 +676,13 @@ class RosterTooltip(NotificationAreaTooltip): else: label = property_[0] vcard_table.attach(label, 1, 3, vcard_current_row, - vcard_current_row + 1, Gtk.AttachOptions.FILL, vertical_fill, 0) + vcard_current_row + 1, Gtk.AttachOptions.FILL, + vertical_fill, 0) self.avatar_image.set_alignment(0, 0) if table_size == 4: vcard_table.attach(self.avatar_image, 3, 4, 2, - vcard_current_row + 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 3, 3) + vcard_current_row + 1, Gtk.AttachOptions.FILL, + Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 3, 3) gajim.plugin_manager.gui_extension_point('roster_tooltip_populate', self, contacts, vcard_table) From 4e16b113b34fa805b07fd7c9ff77efe9fd7d0705 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Mon, 31 Dec 2012 19:38:32 +0400 Subject: [PATCH 033/592] fix pixbuf saves and missing import --- src/gtkgui_helpers.py | 6 +++--- src/gui_interface.py | 6 +++--- src/profile_window.py | 2 +- src/vcard.py | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 79f11591b..016342435 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -421,7 +421,7 @@ def get_pixbuf_from_data(file_data, want_type = False): return None if want_type: - typ = pixbufloader.get_format()['name'] + typ = pixbufloader.get_format().get_name() return pixbuf, typ else: return pixbuf @@ -828,14 +828,14 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): # Save image try: - pixbuf.save(file_path, image_format) + pixbuf.savev(file_path, image_format, [], []) except Exception, e: log.debug('Error saving avatar: %s' % str(e)) if os.path.exists(file_path): os.remove(file_path) new_file_path = '.'.join(file_path.split('.')[:-1]) + '.jpeg' def on_ok(file_path, pixbuf): - pixbuf.save(file_path, 'jpeg') + pixbuf.savev(file_path, 'jpeg', [], []) dialogs.ConfirmationDialog(_('Extension not supported'), _('Image cannot be saved in %(type)s format. Save as ' '%(new_filename)s?') % {'type': image_format, diff --git a/src/gui_interface.py b/src/gui_interface.py index 403c95693..156ac5587 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2489,7 +2489,7 @@ class Interface: extension = '.png' path_to_original_file = path_to_file + extension try: - pixbuf.save(path_to_original_file, typ) + pixbuf.savev(path_to_original_file, typ, [], []) except Exception, e: log.error('Error writing avatar file %s: %s' % ( path_to_original_file, str(e))) @@ -2499,7 +2499,7 @@ class Interface: path_to_normal_file = path_to_file + '_notif_size_colored' + \ extension try: - pixbuf.save(path_to_normal_file, 'png') + pixbuf.savev(path_to_normal_file, 'png', [], []) except Exception, e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) @@ -2509,7 +2509,7 @@ class Interface: if bwbuf: path_to_bw_file = path_to_file + '_notif_size_bw' + extension try: - bwbuf.save(path_to_bw_file, 'png') + bwbuf.savev(path_to_bw_file, 'png', [], []) except Exception, e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) diff --git a/src/profile_window.py b/src/profile_window.py index 058b7295d..2e698284b 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -150,7 +150,7 @@ class ProfileWindow: if scaled_pixbuf: path_to_file = os.path.join(gajim.TMP, 'avatar_scaled.png') - scaled_pixbuf.save(path_to_file, 'png') + scaled_pixbuf.savev(path_to_file, 'png', [], []) must_delete = True fd = open(path_to_file, 'rb') diff --git a/src/vcard.py b/src/vcard.py index 242316e5f..4adf4f961 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -33,6 +33,7 @@ from gi.repository import Gtk from gi.repository import GObject +from gi.repository import Gdk import base64 import time import locale From f28d5574d05c01d79859c59b6f060fe44aa3b9e5 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Mon, 31 Dec 2012 20:13:35 +0400 Subject: [PATCH 034/592] fix plugin window --- data/gui/plugins_window.ui | 4 +++- src/plugins/gui.py | 14 ++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data/gui/plugins_window.ui b/data/gui/plugins_window.ui index ffc55969d..8f8ab4969 100644 --- a/data/gui/plugins_window.ui +++ b/data/gui/plugins_window.ui @@ -115,8 +115,10 @@ True 0 &lt;empty&gt; - True True + + +
    False diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 96a5baa04..1ace7a595 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -56,7 +56,7 @@ class PluginsWindow(object): '''Initialize Plugins window''' self.xml = gtkgui_helpers.get_gtk_builder('plugins_window.ui') self.window = self.xml.get_object('plugins_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) widgets_to_extract = ('plugins_notebook', 'plugin_name_label', 'plugin_version_label', 'plugin_authors_label', @@ -67,10 +67,6 @@ class PluginsWindow(object): for widget_name in widgets_to_extract: setattr(self, widget_name, self.xml.get_object(widget_name)) - attr_list = Pango.AttrList() - attr_list.insert(Pango.AttrWeight(Pango.Weight.BOLD, 0, -1)) - self.plugin_name_label.set_attributes(attr_list) - self.installed_plugins_model = Gtk.ListStore(GObject.TYPE_PYOBJECT, GObject.TYPE_STRING, GObject.TYPE_BOOLEAN, GObject.TYPE_BOOLEAN, GdkPixbuf.Pixbuf) @@ -80,9 +76,9 @@ class PluginsWindow(object): renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Plugin'))#, renderer, text=NAME) cell = Gtk.CellRendererPixbuf() - col.pack_start(cell, False, True, 0) + col.pack_start(cell, False) col.add_attribute(cell, 'pixbuf', ICON) - col.pack_start(renderer, True, True, 0) + col.pack_start(renderer, True) col.add_attribute(renderer, 'text', NAME) self.installed_plugins_treeview.append_column(col) @@ -105,7 +101,9 @@ class PluginsWindow(object): self._clear_installed_plugin_info() self.fill_installed_plugins_model() - selection.select_iter(self.installed_plugins_model.get_iter_first()) + root_iter = self.installed_plugins_model.get_iter_first() + if root_iter: + selection.select_iter(root_iter ) self.xml.connect_signals(self) From 42b5a1c9126dc15b300ac9bacc0d072c2b5360b4 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Mon, 31 Dec 2012 21:14:21 +0400 Subject: [PATCH 035/592] fix profile window --- src/dialogs.py | 9 +++++---- src/profile_window.py | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index e6131ec23..449a01bdb 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1458,9 +1458,9 @@ class FileChooserDialog(Gtk.FileChooserDialog): select_multiple=False, current_folder=None, on_response_ok=None, on_response_cancel=None): - GObject.GObject.__init__(self, title=title_text, action=action, - buttons=buttons) - + GObject.GObject.__init__(self, title=title_text, action=action) + self.add_button(buttons[0],buttons[1]) + self.add_button(buttons[2],buttons[3]) self.set_default_response(default_response) self.set_select_multiple(select_multiple) if current_folder and os.path.isdir(current_folder): @@ -4702,7 +4702,8 @@ class ImageChooserDialog(FileChooserDialog): if path_to_file is None or os.path.isdir(path_to_file): # nothing to preview or directory # make sure you clean image do show nothing - widget.get_preview_widget().set_from_file(None) + preview = widget.get_preview_widget() + preview.clear() return try: pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(path_to_file, 100, 100) diff --git a/src/profile_window.py b/src/profile_window.py index 2e698284b..7e7fc76e7 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -23,6 +23,7 @@ # THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO) from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject import base64 @@ -46,7 +47,7 @@ class ProfileWindow: def __init__(self, account, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui') self.window = self.xml.get_object('profile_window') - self.set_transient_for(transient_for) + self.window.set_transient_for(transient_for) self.progressbar = self.xml.get_object('progressbar') self.statusbar = self.xml.get_object('statusbar') self.context_id = self.statusbar.get_context_id('profile') @@ -84,7 +85,7 @@ class ProfileWindow: return True # loop forever def remove_statusbar(self, message_id): - self.statusbar.remove_message(self.context_id, message_id) + self.statusbar.remove(self.context_id, message_id) self.remove_statusbar_timeout_id = None def on_profile_window_destroy(self, widget): @@ -288,7 +289,7 @@ class ProfileWindow: self.set_value(i + '_entry', vcard_[i]) if self.update_progressbar_timeout_id is not None: if self.message_id: - self.statusbar.remove_message(self.context_id, self.message_id) + self.statusbar.remove(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information received')) self.remove_statusbar_timeout_id = GObject.timeout_add_seconds(3, @@ -398,7 +399,7 @@ class ProfileWindow: if obj.conn.name != self.account: return if self.message_id: - self.statusbar.remove_message(self.context_id, self.message_id) + self.statusbar.remove(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information NOT published')) self.remove_statusbar_timeout_id = GObject.timeout_add_seconds(3, From 3d278f814b28176cdb3f6e60d6eab642530a8aaa Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 04:25:12 +0400 Subject: [PATCH 036/592] fix preferences_window.ui --- data/gui/preferences_window.ui | 62 +++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/data/gui/preferences_window.ui b/data/gui/preferences_window.ui index 0136e037b..3fccff7e2 100644 --- a/data/gui/preferences_window.ui +++ b/data/gui/preferences_window.ui @@ -616,6 +616,7 @@
    + False 0
    @@ -631,6 +632,8 @@
    + False + False 1
    @@ -840,6 +843,7 @@
    + False 0
    @@ -854,6 +858,7 @@
    + False 1
    @@ -902,12 +907,16 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 + 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 + 0 + 0 + 0 12 @@ -934,6 +943,7 @@ 2 1 2 + @@ -987,6 +997,7 @@ 1 2 + @@ -1007,9 +1018,13 @@ 0 + + + 2 + False @@ -1577,6 +1592,7 @@ $T will be replaced by auto-not-available timeout 3 2 3 + @@ -1616,6 +1632,7 @@ $T will be replaced by auto-not-available timeout 1 2 + @@ -1631,8 +1648,7 @@ $T will be replaced by auto-not-available timeout 2 3 - GTK_FILL - GTK_FILL + @@ -1858,6 +1874,8 @@ $T will be replaced by auto-not-available timeout
    + False + False 0
    @@ -1872,6 +1890,7 @@ $T will be replaced by auto-not-available timeout
    False + False end 1 @@ -1882,7 +1901,7 @@ $T will be replaced by auto-not-available timeout 2 1 2 - + GTK_FILL
    @@ -1898,6 +1917,8 @@ $T will be replaced by auto-not-available timeout
    + False + False 0
    @@ -1912,6 +1933,7 @@ $T will be replaced by auto-not-available timeout
    False + False end 1 @@ -1922,7 +1944,7 @@ $T will be replaced by auto-not-available timeout 4 1 2 - + GTK_FILL
    @@ -1958,9 +1980,6 @@ $T will be replaced by auto-not-available timeout True - - - True @@ -1973,7 +1992,7 @@ $T will be replaced by auto-not-available timeout False end - 1 + 0 @@ -2089,10 +2108,14 @@ $T will be replaced by auto-not-available timeout True 0 + 1 none True + 0 + 0 + 0 12 @@ -2109,6 +2132,7 @@ $T will be replaced by auto-not-available timeout 1 2 + @@ -2121,6 +2145,7 @@ $T will be replaced by auto-not-available timeout 2 1 2 + @@ -2166,10 +2191,14 @@ $T will be replaced by auto-not-available timeout True 0 + 0 none True + 0 + 0 + 0 12 @@ -2208,6 +2237,7 @@ $T will be replaced by auto-not-available timeout 1 2 + @@ -2220,6 +2250,7 @@ $T will be replaced by auto-not-available timeout 2 1 2 + @@ -2256,6 +2287,7 @@ $T will be replaced by auto-not-available timeout 2 2 3 + @@ -2268,6 +2300,7 @@ $T will be replaced by auto-not-available timeout 2 3 4 + @@ -2284,6 +2317,7 @@ $T will be replaced by auto-not-available timeout False + False 1 @@ -2291,10 +2325,14 @@ $T will be replaced by auto-not-available timeout True 0 + 0 none True + 0 + 0 + 0 12 @@ -2310,6 +2348,7 @@ $T will be replaced by auto-not-available timeout GTK_FILL + @@ -2336,6 +2375,7 @@ to discover one from server. 2 3 + @@ -2350,6 +2390,7 @@ to discover one from server. 1 2 GTK_FILL + @@ -2365,13 +2406,16 @@ to discover one from server. - False 2 + + + 5 + False From 92b50a87a6c0315fe3dd816b5fda7eb43d2262a5 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 14:10:01 +0400 Subject: [PATCH 037/592] fix gtk warnings in console --- src/roster_window.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 2f5dd2954..90de0a44c 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -90,6 +90,9 @@ from common.pep import MOODS, ACTIVITIES C_PADLOCK_PIXBUF, # use for account row only ) = range(11) +empty_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1) + + class RosterWindow: """ Class for main window of the GTK+ interface @@ -1035,7 +1038,7 @@ class RosterWindow: Gtk.STOCK_DIALOG_AUTHENTICATION, Gtk.IconSize.MENU) self.model[child_iter][C_PADLOCK_PIXBUF] = tls_pixbuf else: - self.model[child_iter][C_PADLOCK_PIXBUF] = "" + self.model[child_iter][C_PADLOCK_PIXBUF] = empty_pixbuf if self.regroup: account_name = _('Merged accounts') @@ -1060,29 +1063,29 @@ class RosterWindow: pep_dict = gajim.connections[account].pep if gajim.config.get('show_mood_in_roster') and 'mood' in pep_dict: self.model[child_iter][C_MOOD_PIXBUF] = pep_dict['mood'].\ - asPixbufIcon() + asPixbufIcon() else: - self.model[child_iter][C_MOOD_PIXBUF] = "" + self.model[child_iter][C_MOOD_PIXBUF] = empty_pixbuf if gajim.config.get('show_activity_in_roster') and 'activity' in \ pep_dict: self.model[child_iter][C_ACTIVITY_PIXBUF] = pep_dict['activity'].\ asPixbufIcon() else: - self.model[child_iter][C_ACTIVITY_PIXBUF] = "" + self.model[child_iter][C_ACTIVITY_PIXBUF] = empty_pixbuf if gajim.config.get('show_tunes_in_roster') and 'tune' in pep_dict: self.model[child_iter][C_TUNE_PIXBUF] = pep_dict['tune'].\ asPixbufIcon() else: - self.model[child_iter][C_TUNE_PIXBUF] = "" + self.model[child_iter][C_TUNE_PIXBUF] = empty_pixbuf if gajim.config.get('show_location_in_roster') and 'location' in \ pep_dict: self.model[child_iter][C_LOCATION_PIXBUF] = pep_dict['location'].\ asPixbufIcon() else: - self.model[child_iter][C_LOCATION_PIXBUF] = "" + self.model[child_iter][C_LOCATION_PIXBUF] = empty_pixbuf def _really_draw_accounts(self): for acct in self.accounts_to_draw: @@ -1339,7 +1342,7 @@ class RosterWindow: if pep_type in contact.pep: pixbuf = contact.pep[pep_type].asPixbufIcon() else: - pixbuf = "" + pixbuf = empty_pixbuf for child_iter in iters: self.model[child_iter][model_column] = pixbuf @@ -1350,7 +1353,7 @@ class RosterWindow: jid = self.model[iters[0]][C_JID].decode('utf-8') pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf in (None, 'ask'): - scaled_pixbuf = "" + scaled_pixbuf = empty_pixbuf else: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') for child_iter in iters: @@ -2279,7 +2282,7 @@ class RosterWindow: else: # No need to redraw contacts if we're quitting if child_iterA: - self.model[child_iterA][C_AVATAR_PIXBUF] = '' + self.model[child_iterA][C_AVATAR_PIXBUF] = empty_pixbuf if account in gajim.con_types: gajim.con_types[account] = None for jid in gajim.contacts.get_jid_list(account): From 3cf957db4e83fc6c022666e2ef1c97c2dfa902f9 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 14:26:25 +0400 Subject: [PATCH 038/592] fix AcronymsExpanderPlugin --- plugins/acronyms_expander/acronyms_expander.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/acronyms_expander/acronyms_expander.py b/plugins/acronyms_expander/acronyms_expander.py index d98e255ff..e6b997925 100644 --- a/plugins/acronyms_expander/acronyms_expander.py +++ b/plugins/acronyms_expander/acronyms_expander.py @@ -26,8 +26,8 @@ Acronyms expander plugin. import sys -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject from plugins import GajimPlugin from plugins.helpers import log, log_calls @@ -66,7 +66,7 @@ class AcronymsExpanderPlugin(GajimPlugin): #assert isinstance(tb,gtk.TextBuffer) ACRONYMS = self.config['ACRONYMS'] INVOKER = self.config['INVOKER'] - t = tb.get_text(tb.get_start_iter(), tb.get_end_iter()) + t = tb.get_text(tb.get_start_iter(), tb.get_end_iter(), True) #log.debug('%s %d'%(t, len(t))) if t and t[-1] == INVOKER: #log.debug('changing msg text') @@ -77,7 +77,7 @@ class AcronymsExpanderPlugin(GajimPlugin): #log.debug('head: %s'%(head)) t = ''.join((base, sep, head, INVOKER)) #log.debug("setting text: '%s'"%(t)) - gobject.idle_add(tb.set_text, t) + GObject.idle_add(tb.set_text, t) @log_calls('AcronymsExpanderPlugin') def connect_with_chat_control_base(self, chat_control): From c55354584cda2b2e2f40101e9fcd55efd8cc19e0 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 11:46:13 +0100 Subject: [PATCH 039/592] fix some set_transient_for call --- src/config.py | 12 ++++++------ src/dialogs.py | 8 ++++---- src/gajim_themes_window.py | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/config.py b/src/config.py index 002221fe5..a289a7555 100644 --- a/src/config.py +++ b/src/config.py @@ -1299,7 +1299,7 @@ class ManageProxiesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_proxies_window.ui') self.window = self.xml.get_object('manage_proxies_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.proxies_treeview = self.xml.get_object('proxies_treeview') self.proxyname_entry = self.xml.get_object('proxyname_entry') self.proxytype_combobox = self.xml.get_object('proxytype_combobox') @@ -2749,7 +2749,7 @@ class ServiceRegistrationWindow: self.is_form = is_form self.xml = gtkgui_helpers.get_gtk_builder('service_registration_window.ui') self.window = self.xml.get_object('service_registration_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) if self.is_form: dataform = dataforms.ExtendForm(node = infos) self.data_form_widget = dataforms_widget.DataFormWidget(dataform) @@ -2804,7 +2804,7 @@ class GroupchatConfigWindow: self.xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'data_form_window') self.window = self.xml.get_object('data_form_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) if self.form: config_vbox = self.xml.get_object('config_vbox') @@ -3023,7 +3023,7 @@ class RemoveAccountWindow: self.account = account xml = gtkgui_helpers.get_gtk_builder('remove_account_window.ui') self.window = xml.get_object('remove_account_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.remove_and_unregister_radiobutton = xml.get_object( 'remove_and_unregister_radiobutton') self.window.set_title(_('Removing %s account') % self.account) @@ -3130,7 +3130,7 @@ class ManageBookmarksWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_bookmarks_window.ui') self.window = self.xml.get_object('manage_bookmarks_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) # Account-JID, RoomName, Room-JID, Autojoin, Minimize, Passowrd, Nick, # Show_Status @@ -4025,7 +4025,7 @@ class ManagePEPServicesWindow: def __init__(self, account): self.xml = gtkgui_helpers.get_gtk_builder('manage_pep_services_window.ui') self.window = self.xml.get_object('manage_pep_services_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.xml.get_object('configure_button').set_sensitive(False) self.xml.get_object('delete_button').set_sensitive(False) self.xml.connect_signals(self) diff --git a/src/dialogs.py b/src/dialogs.py index 449a01bdb..7a2977774 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -287,7 +287,7 @@ class ChooseGPGKeyDialog: xml = gtkgui_helpers.get_gtk_builder('choose_gpg_key_dialog.ui') self.window = xml.get_object('choose_gpg_key_dialog') self.window.set_title(title_text) - self.set_transient_for(transient_for) + self.window.set_transient_for(transient_for) self.keys_treeview = xml.get_object('keys_treeview') prompt_label = xml.get_object('prompt_label') prompt_label.set_text(prompt_text) @@ -353,7 +353,7 @@ class ChangeActivityDialog: self.text = text self.xml = gtkgui_helpers.get_gtk_builder('change_activity_dialog.ui') self.window = self.xml.get_object('change_activity_dialog') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.checkbutton = self.xml.get_object('enable_checkbutton') self.notebook = self.xml.get_object('notebook') @@ -476,7 +476,7 @@ class ChangeMoodDialog: self.xml = gtkgui_helpers.get_gtk_builder('change_mood_dialog.ui') self.window = self.xml.get_object('change_mood_dialog') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.window.set_title(_('Set Mood')) table = self.xml.get_object('mood_icons_table') @@ -2359,7 +2359,7 @@ class JoinGroupchatWindow: self._empty_required_widgets = [] self.window = self.xml.get_object('join_groupchat_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self._room_jid_entry = self.xml.get_object('room_jid_entry') self._nickname_entry = self.xml.get_object('nickname_entry') self._password_entry = self.xml.get_object('password_entry') diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 29023acfa..6620018c9 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -34,7 +34,7 @@ class GajimThemesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('gajim_themes_window.ui') self.window = self.xml.get_object('gajim_themes_window') - self.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.roster.window) self.options = ['account', 'group', 'contact', 'banner'] self.options_combobox = self.xml.get_object('options_combobox') From a2bd7c3c0815977cbe300baaf5d4b7ca762f2af4 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 11:54:39 +0100 Subject: [PATCH 040/592] fix some windows --- src/config.py | 4 ++-- src/gajim_themes_window.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/config.py b/src/config.py index a289a7555..a2083454d 100644 --- a/src/config.py +++ b/src/config.py @@ -1343,8 +1343,8 @@ class ManageProxiesWindow: col = Gtk.TreeViewColumn('Proxies') self.proxies_treeview.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, text = 0) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 0) self.fill_proxies_treeview() self.xml.get_object('proxytype_combobox').set_active(0) diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 6620018c9..b6ff4e4af 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -23,6 +23,7 @@ ## from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import Pango import dialogs import gtkgui_helpers @@ -59,8 +60,8 @@ class GajimThemesWindow: col = Gtk.TreeViewColumn(_('Theme')) self.themes_tree.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, text = 0) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 0) renderer.connect('edited', self.on_theme_cell_edited) renderer.set_property('editable', True) self.current_theme = gajim.config.get('roster_theme') From e84168a88eabdb0070dafcd007425074283eb80f Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 1 Jan 2013 12:45:38 +0100 Subject: [PATCH 041/592] fix some windows --- data/gui/preferences_window.ui | 590 ++++++++++++++++++++++++++------- src/config.py | 25 +- 2 files changed, 490 insertions(+), 125 deletions(-) diff --git a/data/gui/preferences_window.ui b/data/gui/preferences_window.ui index 3fccff7e2..d46347613 100644 --- a/data/gui/preferences_window.ui +++ b/data/gui/preferences_window.ui @@ -1,18 +1,17 @@ - + - - + - 20 1 1440 + 20 1 10 - 12 1 720 + 12 1 10 @@ -149,58 +148,82 @@ + + + + + + + + + + + + + + + + + + + False 6 Preferences preferences dialog - - + + True - vertical + False 6 True True False - + True + False 12 - vertical 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - vertical 6 Display a_vatars of contacts in roster + False True True False If checked, Gajim will display avatars of contacts in roster window and in group chats + False True + 0 True - + False @@ -211,13 +234,16 @@ Display status _messages of contacts in roster + False True True False If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats + False True + 0 True - + False @@ -228,13 +254,16 @@ Display m_ood of contacts in roster + False True True False If checked, Gajim will display the mood of contacts in the roster window + False True + 0 True - + False @@ -245,13 +274,16 @@ Display _activity of contacts in roster + False True True False If checked, Gajim will display the activity of contacts in the roster window + False True + 0 True - + False @@ -262,13 +294,16 @@ Display _tunes of contacts in roster + False True True False If checked, Gajim will display the tunes of contacts in the roster window + False True + 0 True - + False @@ -279,14 +314,17 @@ Display _location of contacts in roster + False True True False True If checked, Gajim will display the location of contacts in the roster window + False True + 0 True - + False @@ -297,48 +335,62 @@ True + False 6 True + False Sort contacts by status False + True 0 in _roster + False True True False + False True + 0 True - + False + True 1 in _group chats + False True True False + False True + 0 True - + + True + True 2 + True + True 6 @@ -349,6 +401,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Roster Appearance</b> True @@ -357,24 +410,28 @@ False + True 0 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 2 @@ -383,6 +440,7 @@ True + False 0 1 _Window behavior: @@ -398,7 +456,8 @@ True - + False + 1 @@ -408,10 +467,12 @@ True + False If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons True + False 0 1 _Emoticons: @@ -426,12 +487,15 @@ Ma_ke message windows compact + False True False Hide all buttons in chat windows + False True + 0 True - + 2 @@ -443,13 +507,16 @@ _Ignore rich content in incoming messages + False True True False Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. + False True + 0 True - + 2 @@ -461,12 +528,15 @@ _Highlight misspelled words + False True False If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat. + False True + 0 True - + 2 @@ -479,8 +549,9 @@ 50 True + False liststore6 - + @@ -498,6 +569,7 @@ True + False 0 1 _Show roster on startup: @@ -514,8 +586,9 @@ 50 True + False liststore7 - + @@ -537,6 +610,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Chat Appearance</b> True @@ -545,6 +619,7 @@ False + True 1 @@ -553,6 +628,7 @@ True + False General @@ -562,47 +638,53 @@ True + False 12 - vertical 6 True + False 0 none True + False 6 12 True - vertical + False 6 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 When new event is received: False + True 0 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore5 - + @@ -611,25 +693,31 @@ + True + True 1 False + True 0 Notify me about contacts that sign _in + False True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False True + 0 True - + False @@ -640,13 +728,16 @@ Notify me about contacts that sign _out + False True True False Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out + False True + 0 True - + False @@ -657,12 +748,15 @@ Allow popup/notifications when I'm _away/na/busy/invisible + False True True False + False True + 0 True - + False @@ -674,28 +768,33 @@ True False + False True 0 none True + False 12 True - vertical + False 6 Notify on new _GMail email + False True True False If checked, Gajim will show a notification when a new e-mail is received via GMail + False True + 0 True - + False @@ -706,13 +805,16 @@ Display _extra email details + False True True False If checked, Gajim will also include information about the sender of the new emails + False True + 0 True - + False @@ -727,6 +829,7 @@ True + False <b>GMail Options</b> True @@ -741,22 +844,26 @@ True + False 6 True + False Show notification area icon: False + True 0 True + False liststore4 - + @@ -765,12 +872,15 @@ + True + True 1 False + True 5 @@ -781,6 +891,7 @@ True + False <b>Visual Notifications</b> True @@ -788,77 +899,93 @@ False + True 0 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 12 True - vertical + False 6 True + False 6 Play _sounds + False True True False + False True + 0 True - + False + True 0 Ma_nage... + False True True True + False True - + False + True 1 False + True 0 Allow sound when I'm _busy + False True True False + False True + 0 True - + False + True 1 @@ -869,6 +996,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Sounds</b> True @@ -877,6 +1005,7 @@ False + True 1 @@ -888,6 +1017,7 @@ True + False True Notifications @@ -899,12 +1029,13 @@ True + False 12 - vertical 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 @@ -912,6 +1043,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 0 @@ -921,6 +1053,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 2 @@ -929,8 +1062,9 @@ True + False liststore3 - + @@ -949,10 +1083,12 @@ True + False Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to display in chat windows. True + False 0 _Display chat state notifications: True @@ -968,10 +1104,12 @@ True + False Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to send to the other party. True + False 0 _Send chat state notifications: True @@ -985,8 +1123,9 @@ True + False liststore2 - + @@ -1007,6 +1146,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Chat state notifications</b> True @@ -1015,6 +1155,7 @@ False + True 0 @@ -1030,6 +1171,7 @@ True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Personal Events @@ -1041,23 +1183,26 @@ True + False 12 - vertical 12 True + False True 0 none True + False 6 12 True + False 2 4 12 @@ -1065,13 +1210,16 @@ _Away after: + False True True False If checked, Gajim will change status to Away when the computer is unused. + False True + 0 True - + GTK_FILL @@ -1081,13 +1229,16 @@ _Not available after: + False True True False If checked, Gajim will change status to Not Available when the computer has not been used even longer + False True + 0 True - + 1 @@ -1099,6 +1250,7 @@ True + False 0 minutes @@ -1112,6 +1264,7 @@ True + False 0 minutes @@ -1127,6 +1280,7 @@ True + False 1 0 @@ -1136,7 +1290,7 @@ True adjustment2 1 - + @@ -1150,6 +1304,7 @@ True + False 1 0 @@ -1159,7 +1314,7 @@ True adjustment1 1 - + @@ -1179,7 +1334,7 @@ The auto away status message. If empty, Gajim will not change the current status message $S will be replaced by previous status message $T will be replaced by auto-away timeout - + 3 @@ -1194,7 +1349,7 @@ $T will be replaced by auto-away timeout The auto not available status message. If empty, Gajim will not change the current status message $S will be replaced by previous status message $T will be replaced by auto-not-available timeout - + 3 @@ -1211,6 +1366,7 @@ $T will be replaced by auto-not-available timeout True + False <b>Auto Status</b> True @@ -1225,26 +1381,30 @@ $T will be replaced by auto-not-available timeout True + False 0 none True + False 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - vertical 6 True + False 6 True + False Ask status message when I: @@ -1256,16 +1416,20 @@ $T will be replaced by auto-not-available timeout True + False 14 Sign _in + False True True False + False True + 0 True - + False @@ -1276,12 +1440,15 @@ $T will be replaced by auto-not-available timeout Sign _out + False True True False + False True + 0 True - + False @@ -1313,10 +1480,15 @@ $T will be replaced by auto-not-available timeout True True + + + + True + True 1 @@ -1327,47 +1499,59 @@ $T will be replaced by auto-not-available timeout True + False <b>Status Messages</b> True + True + True 1 True + False 0 none True + False 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 2 6 6 + + + True + False 5 start gtk-new + False True True True False + False True - + False @@ -1378,12 +1562,14 @@ $T will be replaced by auto-not-available timeout gtk-delete + False True True True False + False True - + False @@ -1408,9 +1594,14 @@ $T will be replaced by auto-not-available timeout True True + status_message_liststore False - - + False + + + + + @@ -1437,9 +1628,6 @@ $T will be replaced by auto-not-available timeout GTK_FILL - - - @@ -1447,12 +1635,15 @@ $T will be replaced by auto-not-available timeout True + False <b>Preset Status Messages</b> True + True + True 2 @@ -1464,6 +1655,7 @@ $T will be replaced by auto-not-available timeout True + False Status @@ -1474,33 +1666,41 @@ $T will be replaced by auto-not-available timeout True + False 12 - vertical 12 True + False 0 none True + False 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 2 6 6 + + + + False True True False - + False + 1 @@ -1510,12 +1710,15 @@ $T will be replaced by auto-not-available timeout Use system _default + False True True False + False True + 0 True - + 1 @@ -1527,6 +1730,7 @@ $T will be replaced by auto-not-available timeout True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Chat message: @@ -1535,9 +1739,6 @@ $T will be replaced by auto-not-available timeout GTK_FILL - - - @@ -1545,6 +1746,7 @@ $T will be replaced by auto-not-available timeout True + False <b>Font</b> True @@ -1559,33 +1761,45 @@ $T will be replaced by auto-not-available timeout True + False GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 3 6 6 + + + + + + Use _transports icons + False True True False If checked, Gajim will use protocol-specific status icons. (eg. A contact from MSN will have the equivalent msn icon for status online, away, busy, etc...) + False True + 0 True - + 1 @@ -1598,7 +1812,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -1612,6 +1827,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Status _iconset: True @@ -1627,7 +1843,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -1638,12 +1855,14 @@ $T will be replaced by auto-not-available timeout Ma_nage... + False True True False Configure color and font of the interface + False True - + 2 @@ -1654,6 +1873,7 @@ $T will be replaced by auto-not-available timeout True + False 0 T_heme: True @@ -1664,12 +1884,6 @@ $T will be replaced by auto-not-available timeout GTK_FILL - - - - - - @@ -1677,6 +1891,7 @@ $T will be replaced by auto-not-available timeout True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Themes</b> True @@ -1685,22 +1900,26 @@ $T will be replaced by auto-not-available timeout False + True 1 True + False 0 none True + False 6 12 True + False 4 4 12 @@ -1708,6 +1927,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Contact's nickname: True @@ -1721,6 +1941,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Your nickname: True @@ -1736,6 +1957,7 @@ $T will be replaced by auto-not-available timeout True + False 0 _Status message: True @@ -1751,6 +1973,7 @@ $T will be replaced by auto-not-available timeout True + False 0 _URL highlight: True @@ -1767,34 +1990,42 @@ $T will be replaced by auto-not-available timeout True + False True + False + True False 0 + False True True False + False False - + True + False 0 0 True + False 2 True + False gtk-revert-to-saved @@ -1806,6 +2037,7 @@ $T will be replaced by auto-not-available timeout True + False _Reset to Default Colors True @@ -1837,6 +2069,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Contact's message: @@ -1850,6 +2083,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Your message: @@ -1865,13 +2099,17 @@ $T will be replaced by auto-not-available timeout True + False + False True True False + False + 0.5 True - + False @@ -1881,12 +2119,14 @@ $T will be replaced by auto-not-available timeout + False True True True + False 0 #000000000000 - + False @@ -1908,13 +2148,17 @@ $T will be replaced by auto-not-available timeout True + False + False True True False + False + 0.5 True - + False @@ -1924,12 +2168,14 @@ $T will be replaced by auto-not-available timeout + False True True True + False 0 #000000000000 - + False @@ -1951,20 +2197,24 @@ $T will be replaced by auto-not-available timeout True + False + False True True True + False 0 #000000000000 - + False + True end 1 @@ -1980,17 +2230,21 @@ $T will be replaced by auto-not-available timeout True + False + False True True True + False 0 #000000000000 - + False + True end 0 @@ -2008,20 +2262,24 @@ $T will be replaced by auto-not-available timeout True + False + False True True True + False 0 #000000000000 - + False + True end 1 @@ -2037,20 +2295,24 @@ $T will be replaced by auto-not-available timeout True + False + False True True True + False 0 #000000000000 - + False + True end 1 @@ -2072,6 +2334,7 @@ $T will be replaced by auto-not-available timeout True + False <b>Chat Line Colors</b> True @@ -2091,6 +2354,7 @@ $T will be replaced by auto-not-available timeout True + False Style @@ -2101,18 +2365,20 @@ $T will be replaced by auto-not-available timeout True + False 12 - vertical 12 True + False 0 1 none True + False 0 0 0 @@ -2120,6 +2386,7 @@ $T will be replaced by auto-not-available timeout True + False 2 2 6 @@ -2127,7 +2394,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -2138,7 +2406,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -2151,6 +2420,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Audio input device @@ -2161,6 +2431,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Audio output device @@ -2177,6 +2448,7 @@ $T will be replaced by auto-not-available timeout True + False <b>Audio</b> True @@ -2184,18 +2456,21 @@ $T will be replaced by auto-not-available timeout False + True 0 True + False 0 0 none True + False 0 0 0 @@ -2203,6 +2478,7 @@ $T will be replaced by auto-not-available timeout True + False 4 2 6 @@ -2210,6 +2486,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Video input device @@ -2220,6 +2497,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Video output device @@ -2232,7 +2510,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -2243,7 +2522,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -2256,6 +2536,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Video framerate @@ -2268,6 +2549,7 @@ $T will be replaced by auto-not-available timeout True + False 0 Video size @@ -2280,7 +2562,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -2293,7 +2576,8 @@ $T will be replaced by auto-not-available timeout True - + False + 1 @@ -2310,6 +2594,7 @@ $T will be replaced by auto-not-available timeout True + False <b>Video</b> True @@ -2324,12 +2609,14 @@ $T will be replaced by auto-not-available timeout True + False 0 0 none True + False 0 0 0 @@ -2337,12 +2624,14 @@ $T will be replaced by auto-not-available timeout True + False 4 6 6 True + False 0 STUN server: @@ -2354,6 +2643,7 @@ $T will be replaced by auto-not-available timeout True + False <i>(example: stunserver.org)</i> True @@ -2369,8 +2659,8 @@ $T will be replaced by auto-not-available timeout True STUN server hostname. If none given, Gajim will try to discover one from server. - - + + 2 @@ -2380,11 +2670,14 @@ to discover one from server. + False True True False + False + 0.5 True - + 1 @@ -2400,12 +2693,15 @@ to discover one from server. True + False <b>Connection</b> True + True + True 2 @@ -2421,6 +2717,7 @@ to discover one from server. True + False Audio / Video @@ -2431,29 +2728,32 @@ to discover one from server. True + False 12 - vertical 12 True + False 0 none True + False 6 12 True - vertical + False 6 True + False liststore1 - + @@ -2462,21 +2762,26 @@ to discover one from server. + True + True 0 + False 0 none True + False 6 12 True + False 3 2 12 @@ -2485,7 +2790,7 @@ to discover one from server. True True - + 1 @@ -2498,6 +2803,7 @@ to discover one from server. True + False 0 _File manager: True @@ -2514,7 +2820,7 @@ to discover one from server. True True - + 1 @@ -2526,7 +2832,7 @@ to discover one from server. True True - + 1 @@ -2539,6 +2845,7 @@ to discover one from server. True + False 0 _Mail client: True @@ -2554,6 +2861,7 @@ to discover one from server. True + False 0 _Browser: True @@ -2571,12 +2879,15 @@ to discover one from server. True + False <b>Custom</b> True + True + True 1 @@ -2587,6 +2898,7 @@ to discover one from server. True + False <b>Applications</b> True @@ -2601,18 +2913,21 @@ to discover one from server. True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 12 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 6 @@ -2620,13 +2935,16 @@ to discover one from server. _Ignore events from contacts not in the roster + False True True False If checked, Gajim will ignore incoming events from unauthorized contacts. Use with caution, because it blocks all messages from any contact that is not in the roster + False True + 0 True - + GTK_FILL @@ -2635,13 +2953,16 @@ to discover one from server. Allow client / _OS information to be sent + False True True False If checked, Gajim will allow others to detect the operation system you are using + False True + 0 True - + 1 @@ -2651,13 +2972,16 @@ to discover one from server. Allow local system time information to be sent + False True True False If checked, Gajim will allow others to detect the time on your system + False True + 0 True - + 2 @@ -2667,13 +2991,16 @@ to discover one from server. Log _encrypted chat session + False True True False If checked, Gajim will keep logs for encrypted messages. Please note that when using E2E encryption the remote party has to agree on logging, else the messages will not be logged. + False True + 0 True - + 3 @@ -2683,12 +3010,15 @@ to discover one from server. Allow my _idle time to be sent + False True True False + False True + 0 True - + 4 @@ -2698,22 +3028,26 @@ to discover one from server. True + False 6 True + False Global proxy: False + True 0 True + False liststore8 - + @@ -2722,20 +3056,25 @@ to discover one from server. + True + True 1 _Manage... + False True True True + False True - + False + True 2 @@ -2752,6 +3091,7 @@ to discover one from server. True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Privacy</b> True @@ -2760,33 +3100,39 @@ to discover one from server. False + True 1 True + False 0 none True + False 6 12 True - vertical + False 6 _Log status changes of contacts + False True True False + False True + 0 True - + False @@ -2797,12 +3143,15 @@ to discover one from server. Check on startup if Gajim is the _default Jabber client + False True True False + False True + 0 True - + False @@ -2817,6 +3166,7 @@ to discover one from server. True + False <b>Miscellaneous</b> True @@ -2831,33 +3181,40 @@ to discover one from server. True + False 0 none True + False 6 0 12 335 + False True True False - + False + True + False 0 0 True + False 2 True + False gtk-open @@ -2869,6 +3226,7 @@ to discover one from server. True + False _Open... True @@ -2889,6 +3247,7 @@ to discover one from server. True + False <b>Advanced Configuration Editor</b> True @@ -2908,6 +3267,7 @@ to discover one from server. True + False Advanced @@ -2917,23 +3277,28 @@ to discover one from server. + True + True 0 True + False 15 end gtk-close + False True True True False + False True - + False @@ -2944,6 +3309,7 @@ to discover one from server. False + True 1 diff --git a/src/config.py b/src/config.py index a2083454d..3e56fdec9 100644 --- a/src/config.py +++ b/src/config.py @@ -429,16 +429,13 @@ class PreferencesWindow: # Status messages self.msg_tree = self.xml.get_object('msg_treeview') - model = Gtk.ListStore(str, str, str, str, str, str, str) - self.msg_tree.set_model(model) - col = Gtk.TreeViewColumn('name') - self.msg_tree.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True) - col.add_attribute(renderer, 'text', 0) renderer.connect('edited', self.on_msg_cell_edited) renderer.set_property('editable', True) + col = Gtk.TreeViewColumn('name', renderer, text=0) + self.msg_tree.append_column(col) self.fill_msg_treeview() + buf = self.xml.get_object('msg_textview').get_buffer() buf.connect('changed', self.on_msg_textview_changed) @@ -1098,8 +1095,10 @@ class PreferencesWindow: # store mood / activity for subname in ('activity', 'subactivity', 'activity_text', 'mood', 'mood_text'): - gajim.config.set_per('statusmsg', val, subname, - model[iter_][i].decode('utf-8')) + val = model[iter_][i] + if val: + val = val.decode('utf-8') + gajim.config.set_per('statusmsg', val, subname, val) i += 1 iter_ = model.iter_next(iter_) @@ -4143,21 +4142,21 @@ class ManageSoundsWindow: renderer = Gtk.CellRendererToggle() renderer.set_property('activatable', True) renderer.connect('toggled', self.sound_toggled_cb) - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, active = 0) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'active', 0) col = Gtk.TreeViewColumn(_('Event')) self.sound_tree.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, text = 1) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 1) self.fill_sound_treeview() self.xml.connect_signals(self) self.sound_tree.get_model().connect('row-changed', - self.on_sounds_treemodel_row_changed) + self.on_sounds_treemodel_row_changed) self.window.show_all() From 87191675c928386f632496aed8e200ba3e6a806e Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 17:56:24 +0400 Subject: [PATCH 042/592] fix status treeview --- src/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.py b/src/config.py index 3e56fdec9..8b22f571e 100644 --- a/src/config.py +++ b/src/config.py @@ -437,7 +437,7 @@ class PreferencesWindow: self.fill_msg_treeview() buf = self.xml.get_object('msg_textview').get_buffer() - buf.connect('changed', self.on_msg_textview_changed) + buf.connect('end-user-action', self.on_msg_textview_changed) ### Audio / Video tab ### def create_av_combobox(opt_name, device_dict, config_name=None, From 3ec91452e8b49a0848345882278390ac69161688 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 18:34:30 +0400 Subject: [PATCH 043/592] fix dubble click on a boolean value in ACE --- src/advanced_configuration_window.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 81e1f284e..7463b6f7d 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -141,7 +141,8 @@ class AdvancedConfigurationWindow(object): """ optname = model[iter_][C_PREFNAME] opttype = model[iter_][C_TYPE] - if opttype == self.types['boolean'] or optname == 'password': + + if opttype.decode('utf-8') == self.types['boolean'] or optname == 'password': cell.set_property('editable', False) else: cell.set_property('editable', True) @@ -194,9 +195,9 @@ class AdvancedConfigurationWindow(object): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] option = modelrow[0].decode('utf-8') - if modelrow[2] == self.types['boolean']: + if modelrow[2].decode('utf-8') == self.types['boolean']: for key in self.right_true_dict.keys(): - if self.right_true_dict[key] == modelrow[1]: + if self.right_true_dict[key] == modelrow[1].decode('utf-8'): modelrow[1] = str(key) newval = {'False': True, 'True': False}[modelrow[1]] if len(modelpath.get_indices()) > 1: From 342755d58a66259c31750873527e48dcd87b930a Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 19:46:04 +0400 Subject: [PATCH 044/592] fix SeparatorMenuItem --- src/chat_control.py | 8 ++++---- src/conversation_textview.py | 4 ++-- src/groupchat_control.py | 2 +- src/gui_menu_builder.py | 2 +- src/roster_window.py | 30 +++++++++++++++--------------- src/statusicon.py | 8 ++++---- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 97e6eba90..29aa2b781 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -525,7 +525,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ Override the default context menu and add our own menutiems """ - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) menu2 = self.prepare_context_menu() @@ -573,7 +573,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): id_ = item.connect('activate', self.msg_textview.undo) self.handlers[id_] = item - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) item = Gtk.ImageMenuItem(Gtk.STOCK_CLEAR) @@ -1066,7 +1066,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): menuitem[1]) menu.append(item) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) item = Gtk.ImageMenuItem(_('Color')) @@ -1081,7 +1081,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): item.connect('activate', self.on_font_menuitem_activale) menu.append(item) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) item = Gtk.ImageMenuItem(_('Clear formating')) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 6506a40b5..d02fd244a 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -728,7 +728,7 @@ class ConversationTextview(GObject.GObject): """ separator_menuitem_was_added = False if not self.used_in_history_window: - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) separator_menuitem_was_added = True @@ -739,7 +739,7 @@ class ConversationTextview(GObject.GObject): if self.selected_phrase: if not separator_menuitem_was_added: - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) if not self.used_in_history_window: diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 2887f50a1..210b9a398 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -563,7 +563,7 @@ class GroupchatControl(ChatControlBase): and the ability to insert a nick """ ChatControlBase.on_msg_textview_populate_popup(self, textview, menu) - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) item = Gtk.MenuItem(_('Insert Nickname')) diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index e968c513c..17364b08f 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -136,7 +136,7 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): contacts_transport == gajim.get_transport_name_from_jid(room_jid): rooms.append((room_jid, acct)) if len(rooms): - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator invite_to_submenu.append(item) for (room_jid, account) in rooms: menuitem = Gtk.MenuItem(room_jid.split('@')[0]) diff --git a/src/roster_window.py b/src/roster_window.py index 90de0a44c..5860fc774 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -5470,7 +5470,7 @@ class RosterWindow: item.set_sensitive(False) # Manage GC bookmarks - newitem = Gtk.SeparatorMenuItem() # separator + newitem = Gtk.SeparatorMenuItem.new() # separator gc_sub_menu.append(newitem) newitem = Gtk.ImageMenuItem(_('_Manage Bookmarks...')) @@ -5579,7 +5579,7 @@ class RosterWindow: status_menuitem.set_submenu(sub_menu) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): - uf_show = helpers.get_uf_show(show, use_mnemonic=True) + uf_show = helpers.get_uf_show(show, use_mnemonic=False) item = Gtk.ImageMenuItem(uf_show) icon = state_images[show] item.set_image(icon) @@ -5591,7 +5591,7 @@ class RosterWindow: else: item.connect('activate', self.change_status, account, show) - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) item = Gtk.ImageMenuItem(_('_Change Status Message')) @@ -5602,7 +5602,7 @@ class RosterWindow: if gajim.connections[account].connected < 2: item.set_sensitive(False) - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) @@ -5633,7 +5633,7 @@ class RosterWindow: self.on_publish_location_toggled) pep_config = Gtk.ImageMenuItem(_('Configure Services...')) - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() pep_submenu.append(item) pep_config.set_sensitive(True) pep_submenu.append(pep_config) @@ -5699,7 +5699,7 @@ class RosterWindow: sub_menu.append(item) item.connect('activate', self.change_status, account, show) - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) item = Gtk.ImageMenuItem(_('_Change Status Message')) @@ -5853,7 +5853,7 @@ class RosterWindow: send_group_message_item.set_sensitive(False) if not group in helpers.special_groups: - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Rename @@ -5979,7 +5979,7 @@ class RosterWindow: gui_menu_builder.build_invite_submenu(invite_item, list_) menu.append(invite_item) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Manage Transport submenu @@ -5998,7 +5998,7 @@ class RosterWindow: manage_contacts_submenu.append(edit_groups_item) edit_groups_item.connect('activate', self.on_edit_groups, list_) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator manage_contacts_submenu.append(item) # Block @@ -6090,7 +6090,7 @@ class RosterWindow: status_menuitems.append(status_menuitem) menu.append(send_custom_status_menuitem) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Execute Command @@ -6131,7 +6131,7 @@ class RosterWindow: if gajim.account_is_disconnected(account): item.set_sensitive(False) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator manage_transport_submenu.append(item) # Block @@ -6157,7 +6157,7 @@ class RosterWindow: if gajim.account_is_disconnected(account): item.set_sensitive(False) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Information @@ -6207,7 +6207,7 @@ class RosterWindow: account) menu.append(disconnect_menuitem) - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) history_menuitem = Gtk.ImageMenuItem(_('_History')) @@ -6284,7 +6284,7 @@ class RosterWindow: """ Add a seperator and History Manager menuitem BELOW for account menuitems """ - item = Gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # History manager @@ -6308,7 +6308,7 @@ class RosterWindow: # User has at least one bookmark. if gajim.connections[account].bookmarks: - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() gc_sub_menu.append(item) for bookmark in gajim.connections[account].bookmarks: diff --git a/src/statusicon.py b/src/statusicon.py index 3fb273230..ea13af6a6 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -235,7 +235,7 @@ class StatusIcon: sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, show) - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) item = Gtk.ImageMenuItem(_('_Change Status Message...')) @@ -249,7 +249,7 @@ class StatusIcon: connected_accounts_with_private_storage = 0 - item = Gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic = True) @@ -336,7 +336,7 @@ class StatusIcon: gc_item.set_submenu(gc_menuitem_menu) gc_sub_menu.show_all() - newitem = Gtk.SeparatorMenuItem() # separator + newitem = Gtk.SeparatorMenuItem.new() # separator gc_sub_menu.append(newitem) newitem = Gtk.ImageMenuItem(_('_Manage Bookmarks...')) img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, Gtk.IconSize.MENU) @@ -363,7 +363,7 @@ class StatusIcon: if os.name == 'nt': if self.added_hide_menuitem is False: - self.systray_context_menu.prepend(Gtk.SeparatorMenuItem()) + self.systray_context_menu.prepend(Gtk.SeparatorMenuItem.new()) item = Gtk.MenuItem(_('Hide this menu')) self.systray_context_menu.prepend(item) self.added_hide_menuitem = True From e60d16890616fde4755807ca4624ef44e28af769 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Tue, 1 Jan 2013 19:58:57 +0400 Subject: [PATCH 045/592] typo --- src/statusicon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/statusicon.py b/src/statusicon.py index ea13af6a6..ceb4a5bee 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -299,7 +299,7 @@ class StatusIcon: connected_accounts_with_private_storage += 1 # for single message - single_message_menuitemset_submenu(None) + single_message_menuitem.set_submenu(None) self.single_message_handler_id = single_message_menuitem.\ connect('activate', self.on_single_message_menuitem_activate, account) From f67f0637690b13ba897cecaec37d73b2ca6ed276 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 2 Jan 2013 00:31:13 +0400 Subject: [PATCH 046/592] fix gtk warning in chat_control --- data/gui/chat_control.ui | 78 +++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/data/gui/chat_control.ui b/data/gui/chat_control.ui index e1ea08927..8d0547550 100644 --- a/data/gui/chat_control.ui +++ b/data/gui/chat_control.ui @@ -81,30 +81,36 @@ True - None + gtk-missing-image 1 + False + False 0 True - None + gtk-missing-image 1 + False + False 1 True - None + gtk-missing-image 1 + False + False 2 @@ -115,7 +121,7 @@ True - None + gtk-missing-image 1 @@ -128,21 +134,25 @@ - True - None + True + gtk-missing-image 1 + False + False 4 - True - None + True + gtk-missing-image 1 + False + False 5 @@ -155,6 +165,8 @@ + False + False 6 @@ -172,7 +184,7 @@ True - None + gtk-missing-image @@ -712,8 +724,8 @@ audio-mic-volume-low none - - + + @@ -727,8 +739,8 @@ audio-mic-volume-low 1 2 - - + + @@ -742,8 +754,8 @@ audio-mic-volume-low 2 3 - - + + @@ -757,8 +769,8 @@ audio-mic-volume-low 1 2 - - + + @@ -774,8 +786,8 @@ audio-mic-volume-low 2 1 2 - - + + @@ -791,8 +803,8 @@ audio-mic-volume-low 3 1 2 - - + + @@ -806,8 +818,8 @@ audio-mic-volume-low 2 3 - - + + @@ -823,8 +835,8 @@ audio-mic-volume-low 2 2 3 - - + + @@ -840,8 +852,8 @@ audio-mic-volume-low 3 2 3 - - + + @@ -855,8 +867,8 @@ audio-mic-volume-low 3 4 - - + + @@ -872,8 +884,8 @@ audio-mic-volume-low 2 3 4 - - + + @@ -889,8 +901,8 @@ audio-mic-volume-low 3 3 4 - - + + From e55985b498658aa18a5002ff895cae9200012341 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 2 Jan 2013 13:32:17 +0400 Subject: [PATCH 047/592] fix join gc dialog --- data/gui/join_groupchat_window.ui | 23 +++++++++++------------ src/dataforms_widget.py | 2 +- src/dialogs.py | 27 ++++++++++++++++++--------- src/groupchat_control.py | 15 ++++++++------- src/roster_window.py | 7 +++++-- 5 files changed, 43 insertions(+), 31 deletions(-) diff --git a/data/gui/join_groupchat_window.ui b/data/gui/join_groupchat_window.ui index c2db0bc17..58322d9cd 100644 --- a/data/gui/join_groupchat_window.ui +++ b/data/gui/join_groupchat_window.ui @@ -33,7 +33,7 @@ 2 3 4 - + @@ -48,7 +48,7 @@ 2 2 3 - + @@ -61,7 +61,7 @@ 3 4 GTK_FILL - + @@ -74,7 +74,7 @@ 2 3 GTK_FILL - + @@ -87,7 +87,7 @@ 1 2 GTK_FILL - + @@ -114,7 +114,7 @@ 5 6 GTK_FILL - + @@ -129,7 +129,7 @@ 2 5 6 - + @@ -147,7 +147,7 @@ 7 8 GTK_FILL - + @@ -158,7 +158,7 @@ GTK_FILL - + @@ -188,7 +188,7 @@ 6 7 GTK_FILL - + @@ -207,10 +207,9 @@ True 6 - + True liststore1 - 0 0 diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index cf35d0ebb..425a42ec3 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -570,7 +570,7 @@ class SingleForm(Gtk.Table, object): pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() - media = Gtk.image_new_from_pixbuf(pixbuf_l.\ + media = Gtk.Image.new_from_pixbuf(pixbuf_l.\ get_pixbuf()) except Exception: media = Gtk.Label(label=_('Unable to load image')) diff --git a/src/dialogs.py b/src/dialogs.py index 7a2977774..fbd4a7b82 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1643,7 +1643,7 @@ class YesNoDialog(HigDialog): label = Gtk.Label(label=text_label) self.vbox.pack_start(label, False, True, 0) buff = Gtk.TextBuffer() - self.textview = Gtk.TextView(buff) + self.textview = Gtk.TextView.new_with_buffer(buff) frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.IN) frame.add(self.textview) @@ -2341,7 +2341,7 @@ class JoinGroupchatWindow: liststore = Gtk.ListStore(str) account_combobox.set_model(liststore) cell = Gtk.CellRendererText() - account_combobox.pack_start(cell, True, True, 0) + account_combobox.pack_start(cell, True) account_combobox.add_attribute(cell, 'text', 0) account_combobox.set_active(-1) @@ -2350,7 +2350,7 @@ class JoinGroupchatWindow: gajim.account_is_connected(a)]: if gajim.connections[acct].is_zeroconf: continue - account_combobox.append_text(acct) + liststore.append([acct]) if account and account == acct: account_combobox.set_active(liststore.iter_n_children(None)-1) @@ -2379,7 +2379,13 @@ class JoinGroupchatWindow: self.window.set_title(title) self.server_comboboxentry = self.xml.get_object('server_comboboxentry') - self.server_model = self.server_comboboxentry.get_model() + liststore = Gtk.ListStore(str) + self.server_comboboxentry.set_model(liststore) + cell = Gtk.CellRendererText() + self.server_comboboxentry.pack_start(cell, True) + self.server_comboboxentry.add_attribute(cell, 'text', 0) + self.server_comboboxentry.set_active(-1) + self.server_model = liststore#self.server_comboboxentry.get_model() server_list = [] # get the muc server of our server if 'jabber' in gajim.connections[account].muc_jid: @@ -2389,11 +2395,11 @@ class JoinGroupchatWindow: liststore = Gtk.ListStore(str) self.recently_combobox.set_model(liststore) cell = Gtk.CellRendererText() - self.recently_combobox.pack_start(cell, True, True, 0) + self.recently_combobox.pack_start(cell, True) self.recently_combobox.add_attribute(cell, 'text', 0) self.recently_groupchat = gajim.config.get('recently_groupchat').split() for g in self.recently_groupchat: - self.recently_combobox.append_text(g) + liststore.append([g]) server = gajim.get_server_from_jid(g) if server not in server_list and not server.startswith('irc'): server_list.append(server) @@ -2463,7 +2469,9 @@ class JoinGroupchatWindow: def _set_room_jid(self, room_jid): room, server = gajim.get_name_and_server_from_jid(room_jid) self._room_jid_entry.set_text(room) - self.server_comboboxentry.get_child().set_text(server) + model = self.server_comboboxentry.get_model() + model.append([server]) + #self.server_comboboxentry.set_active(0) def on_recently_combobox_changed(self, widget): model = widget.get_model() @@ -2509,8 +2517,9 @@ class JoinGroupchatWindow: 'groupchat.')) return nickname = self._nickname_entry.get_text().decode('utf-8') - server = self.server_comboboxentry.get_child().get_text().decode('utf-8').\ - strip() + row = self.server_comboboxentry.get_child().get_displayed_row() + model = self.server_comboboxentry.get_model() + server = model[row][0].decode('utf-8').strip() room = self._room_jid_entry.get_text().decode('utf-8').strip() room_jid = room + '@' + server password = self._password_entry.get_text().decode('utf-8') diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 210b9a398..fe276c202 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -470,7 +470,7 @@ class GroupchatControl(ChatControlBase): # workaround to avoid gtk arrows to be shown column = Gtk.TreeViewColumn() # 2nd COLUMN renderer = Gtk.CellRendererPixbuf() - column.pack_start(renderer, False, True, 0) + column.pack_start(renderer, False) self.list_treeview.append_column(column) column.set_visible(False) self.list_treeview.set_expander_column(column) @@ -508,7 +508,7 @@ class GroupchatControl(ChatControlBase): def fill_column(self, col): for rend in self.renderers_list: - col.pack_start(rend[1], rend[2], True, 0) + col.pack_start(rend[1], rend[2]) col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys @@ -594,8 +594,9 @@ class GroupchatControl(ChatControlBase): """ The MUC treeview has resized. Move the hpaned in all tabs to match """ - if gparamspec.name != 'position': - return + # print pane, dir(pane) + #if gparamspec.name != 'position': + #return if self.resize_from_another_muc: # Don't send the event to other MUC return @@ -1430,7 +1431,7 @@ class GroupchatControl(ChatControlBase): gc_contact.affiliation != 'none' and gajim.config.get( 'show_affiliation_in_groupchat'): pixbuf1 = image.get_pixbuf().copy() - pixbuf2 = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, True, 8, 4, 4) + pixbuf2 = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 4, 4) if gc_contact.affiliation == 'owner': pixbuf2.fill(0xff0000ff) # Red elif gc_contact.affiliation == 'admin': @@ -1440,7 +1441,7 @@ class GroupchatControl(ChatControlBase): pixbuf2.composite(pixbuf1, 12, 12, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, GdkPixbuf.InterpType.HYPER, 127) - image = Gtk.image_new_from_pixbuf(pixbuf1) + image = Gtk.Image.new_from_pixbuf(pixbuf1) self.model[iter_][C_IMG] = image self.model[iter_][C_TEXT] = name @@ -1453,7 +1454,7 @@ class GroupchatControl(ChatControlBase): fake_jid = self.room_jid + '/' + nick pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(fake_jid) if pixbuf in ('ask', None): - scaled_pixbuf = None + scaled_pixbuf = '' else: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') self.model[iter_][C_AVATAR] = scaled_pixbuf diff --git a/src/roster_window.py b/src/roster_window.py index 5860fc774..95b81cb91 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1489,7 +1489,10 @@ class RosterWindow: # do not change selection while DND'ing return # Expand his parent, so this path is visible, don't expand it. - self.tree.expand_to_path(path[:-1]) + path_ = str(path.get_indices()[:-1])[1:-1] + path_ = path_.replace(', ', ':') + path = path.new_from_string(path_) + self.tree.expand_to_path(path) self.tree.scroll_to_cell(path) self.tree.set_cursor(path) @@ -2395,7 +2398,7 @@ class RosterWindow: if isinstance(w, dict): self.close_all_from_dict(w) else: - w.window().destroy() + w.window.destroy() def close_all(self, account, force=False): """ From 80f925f0540269b4c760ad0e2febd484ee520338 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 2 Jan 2013 14:51:55 +0400 Subject: [PATCH 048/592] create full empty pixbuf --- src/roster_window.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/roster_window.py b/src/roster_window.py index 95b81cb91..b14973be8 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -91,6 +91,7 @@ from common.pep import MOODS, ACTIVITIES ) = range(11) empty_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1) +empty_pixbuf.fill(0xffffff00) class RosterWindow: From 59a621bd8706ea276f8f9fae24af71c5c1b36473 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 2 Jan 2013 17:30:54 +0400 Subject: [PATCH 049/592] fix some CursorType --- src/chat_control.py | 2 +- src/conversation_textview.py | 6 ++++-- src/groupchat_control.py | 4 ++-- src/gui_interface.py | 3 ++- src/htmltextview.py | 10 +++++----- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 29aa2b781..a2bd86248 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1293,7 +1293,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): if not self.conv_textview.auto_scrolling: self.conv_textview.stop_scrolling() self.was_at_the_end = (adjustment.get_upper() - adjustment.get_value() \ - - adjustment.page_size) < 18 + - adjustment.get_page_size()) < 18 if self.resource: jid = self.contact.get_full_jid() else: diff --git a/src/conversation_textview.py b/src/conversation_textview.py index d02fd244a..06e7ed800 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -30,6 +30,7 @@ from threading import Timer # for smooth scrolling from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import Pango from gi.repository import GObject @@ -663,16 +664,17 @@ class ConversationTextview(GObject.GObject): tags = self.tv.get_iter_at_location(x, y).get_tags() if self.change_cursor: self.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( - Gdk.Cursor.new(Gdk.XTERM)) + Gdk.Cursor.new(Gdk.CursorType.XTERM)) self.change_cursor = False tag_table = self.tv.get_buffer().get_tag_table() over_line = False xep0184_warning = False + for tag in tags: if tag in (tag_table.lookup('url'), tag_table.lookup('mail'), \ tag_table.lookup('xmpp'), tag_table.lookup('sth_at_sth')): self.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( - Gdk.Cursor.new(Gdk.HAND2)) + Gdk.Cursor.new(Gdk.CursorType.HAND2)) self.change_cursor = True elif tag == tag_table.lookup('focus-out-line'): over_line = True diff --git a/src/groupchat_control.py b/src/groupchat_control.py index fe276c202..023795914 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -2583,11 +2583,11 @@ class GroupchatControl(ChatControlBase): self.tooltip.hide_tooltip() def show_tooltip(self, contact): - if not self.list_treeview.window: + if not self.list_treeview.get_window(): # control has been destroyed since tooltip was requested return pointer = self.list_treeview.get_pointer() - props = self.list_treeview.get_path_at_pos(pointer[1], pointer[2]) + props = self.list_treeview.get_path_at_pos(pointer[0], pointer[1]) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: diff --git a/src/gui_interface.py b/src/gui_interface.py index 156ac5587..2aea36174 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1758,7 +1758,7 @@ class Interface: self.roster.draw_contact(jid, account) if w: w.set_active_tab(ctrl) - w.window.window.focus(Gtk.get_current_event_time()) + w.window.get_window().focus(Gtk.get_current_event_time()) # Using isinstance here because we want to catch all derived types if isinstance(ctrl, ChatControlBase): tv = ctrl.conv_textview @@ -2102,6 +2102,7 @@ class Interface: gc_control = GroupchatControl(mw, contact, account, is_continued=is_continued) mw.new_tab(gc_control) + mw.set_active_tab(gc_control) def new_private_chat(self, gc_contact, account, session=None): conn = gajim.connections[account] diff --git a/src/htmltextview.py b/src/htmltextview.py index b668466c2..ab6411ae7 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -824,7 +824,7 @@ class HtmlTextView(Gtk.TextView): def __leave_event(self, widget, event): if self._changed_cursor: window = widget.get_window(Gtk.TextWindowType.TEXT) - window.set_cursor(Gdk.Cursor.new(Gdk.XTERM)) + window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.XTERM)) self._changed_cursor = False def show_tooltip(self, tag): @@ -857,13 +857,13 @@ class HtmlTextView(Gtk.TextView): self.tooltip.hide_tooltip() if not self._changed_cursor and anchor_tags: window = widget.get_window(Gtk.TextWindowType.TEXT) - window.set_cursor(Gdk.Cursor.new(Gdk.HAND2)) + window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.HAND2)) self._changed_cursor = True self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, anchor_tags[0]) elif self._changed_cursor and not anchor_tags: window = widget.get_window(Gtk.TextWindowType.TEXT) - window.set_cursor(Gdk.Cursor.new(Gdk.XTERM)) + window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.XTERM)) self._changed_cursor = False return False @@ -963,14 +963,14 @@ if __name__ == '__main__': tags = htmlview.tv.get_iter_at_location(x, y).get_tags() if change_cursor: htmlview.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( - Gdk.Cursor.new(Gdk.XTERM)) + Gdk.Cursor.new(Gdk.CursorType.XTERM)) change_cursor = None tag_table = htmlview.tv.get_buffer().get_tag_table() for tag in tags: try: if tag.is_anchor: htmlview.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( - Gdk.Cursor.new(Gdk.HAND2)) + Gdk.Cursor.new(Gdk.CursorType.HAND2)) change_cursor = tag elif tag == tag_table.lookup('focus-out-line'): over_line = True From 92ce48886c9c2470218cfd485cc7139240f1b59e Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 2 Jan 2013 20:57:20 +0400 Subject: [PATCH 050/592] fix some windows --- data/gui/chat_to_muc_window.ui | 2 +- src/chat_control.py | 13 +++++++------ src/dialogs.py | 12 ++++++++---- src/gtkgui_helpers.py | 6 +++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/data/gui/chat_to_muc_window.ui b/data/gui/chat_to_muc_window.ui index 0c0c36e7e..e99976a14 100644 --- a/data/gui/chat_to_muc_window.ui +++ b/data/gui/chat_to_muc_window.ui @@ -75,7 +75,7 @@ Select the contacts you want to invite - + True diff --git a/src/chat_control.py b/src/chat_control.py index a2bd86248..85286956c 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -119,11 +119,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): keymap = Gdk.Keymap.get_default() try: - keycode_c = keymap.get_entries_for_keyval(Gdk.KEY_c)[0][0] + keycode_c = keymap.get_entries_for_keyval(Gdk.KEY_c)[1][0].keycode except TypeError: keycode_c = 54 try: - keycode_ins = keymap.get_entries_for_keyval(Gdk.KEY_Insert)[0][0] + keycode_ins = keymap.get_entries_for_keyval(Gdk.KEY_Insert)[1][0].keycode except TypeError: keycode_ins = 118 @@ -693,10 +693,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): def _conv_textview_key_press_event(self, widget, event): # translate any layout to latin_layout - keymap = Gdk.keymap_get_default() - keycode = keymap.get_entries_for_keyval(event.keyval)[0][0] - if (event.get_state() & Gdk.ModifierType.CONTROL_MASK and keycode in (self.keycode_c, - self.keycode_ins)) or (event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + valid, entries = self.keymap.get_entries_for_keyval(event.keyval) + keycode = entries[0].keycode + if (event.get_state() & Gdk.ModifierType.CONTROL_MASK and keycode in ( + self.keycode_c, self.keycode_ins)) or ( + event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up)): return False self.parent_win.notebook.emit('key_press_event', event) diff --git a/src/dialogs.py b/src/dialogs.py index fbd4a7b82..dad6765f5 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1460,7 +1460,8 @@ class FileChooserDialog(Gtk.FileChooserDialog): GObject.GObject.__init__(self, title=title_text, action=action) self.add_button(buttons[0],buttons[1]) - self.add_button(buttons[2],buttons[3]) + if len(buttons) ==4: + self.add_button(buttons[2],buttons[3]) self.set_default_response(default_response) self.set_select_multiple(select_multiple) if current_folder and os.path.isdir(current_folder): @@ -4862,8 +4863,9 @@ class TransformChatToMUC: server_list = [] self.servers = Gtk.ListStore(str) self.server_list_comboboxentry.set_model(self.servers) - - self.server_list_comboboxentry.set_text_column(0) + cell = Gtk.CellRendererText() + self.server_list_comboboxentry.pack_start(cell, True) + self.server_list_comboboxentry.add_attribute(cell, 'text', 0) # get the muc server of our server if 'jabber' in gajim.connections[account].muc_jid: @@ -4950,7 +4952,9 @@ class TransformChatToMUC: self.window.destroy() def on_invite_button_clicked(self, widget): - server = self.server_list_comboboxentry.get_active_text() + row = self.server_list_comboboxentry.get_child().get_displayed_row() + model = self.server_list_comboboxentry.get_model() + server = model[row][0].decode('utf-8').strip() if server == '': return gajim.connections[self.account].check_unique_room_id_support(server, self) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 016342435..d97b7e29a 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -892,9 +892,9 @@ def create_combobox(value_list, selected_value = None): Value_list is [(label1, value1)] """ liststore = Gtk.ListStore(str, str) - combobox = Gtk.ComboBox(liststore) + combobox = Gtk.ComboBox.new_with_model(liststore) cell = Gtk.CellRendererText() - combobox.pack_start(cell, True, True, 0) + combobox.pack_start(cell, True) combobox.add_attribute(cell, 'text', 0) i = -1 for value in value_list: @@ -911,7 +911,7 @@ def create_list_multi(value_list, selected_values=None): Value_list is [(label1, value1)] """ liststore = Gtk.ListStore(str, str) - treeview = Gtk.TreeView(liststore) + treeview = Gtk.TreeView.new_with_model(liststore) treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) treeview.set_headers_visible(False) col = Gtk.TreeViewColumn() From 6f89a119aea2157b4084d9bd277e8d67b9dd6b9e Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Wed, 2 Jan 2013 23:46:44 +0400 Subject: [PATCH 051/592] fix dict.keys --- src/chat_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat_control.py b/src/chat_control.py index 379c71e0b..270214592 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -2700,7 +2700,7 @@ class ChatControl(ChatControlBase): backend=backend) # remove all register handlers on widgets, created by self.xml # to prevent circular references among objects - for i in self.handlers.keys(): + for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] From 785f8098b661eafea0805f77bf016f43dc37aa62 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 00:55:00 +0400 Subject: [PATCH 052/592] fix ResourceWarnings --- src/dialogs.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index cdcb7c252..6342ef9e6 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1270,7 +1270,9 @@ class AboutDialog: dlg.set_copyright(s) copying_file_path = self.get_path('COPYING') if copying_file_path: - text = open(copying_file_path).read() + fp = open(copying_file_path) + text = fp.read() + fp.close() dlg.set_license(text) gtk_ver = '%i.%i.%i' % (Gtk.get_major_version(), @@ -1283,7 +1285,9 @@ class AboutDialog: authors_file_path = self.get_path('AUTHORS') if authors_file_path: authors = [] - authors_file = open(authors_file_path).read() + fp = open(authors_file_path) + authors_file = fp.read() + fp.close() authors_file = authors_file.split('\n') for author in authors_file: if author == 'CURRENT DEVELOPERS:': @@ -1297,7 +1301,9 @@ class AboutDialog: if thanks_file_path: authors.append('\n' + _('THANKS:')) - text = open(thanks_file_path).read() + fp = open(thanks_file_path) + text = fp.read() + fp.close() text_splitted = text.split('\n') text = '\n'.join(text_splitted[:-2]) # remove one english sentence # and add it manually as translatable @@ -1317,7 +1323,9 @@ class AboutDialog: thanks_artists_file_path = self.get_path('THANKS.artists') if thanks_artists_file_path: - artists_text = open(thanks_artists_file_path).read() + fp = open(thanks_artists_file_path) + artists_text = fp.read() + fp.close() artists = artists_text.split('\n') dlg.set_artists(artists) # connect close button to destroy() function From 1a3d2fc179d41c8dea8737a851e05dad5a93dfcb Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 03:25:44 +0400 Subject: [PATCH 053/592] fix ResourceWarnings. py3 way --- src/dialogs.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 6342ef9e6..03dfd19ee 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1270,9 +1270,8 @@ class AboutDialog: dlg.set_copyright(s) copying_file_path = self.get_path('COPYING') if copying_file_path: - fp = open(copying_file_path) - text = fp.read() - fp.close() + with open(copying_file_path) as a_file: + text = a_file.read() dlg.set_license(text) gtk_ver = '%i.%i.%i' % (Gtk.get_major_version(), @@ -1285,9 +1284,8 @@ class AboutDialog: authors_file_path = self.get_path('AUTHORS') if authors_file_path: authors = [] - fp = open(authors_file_path) - authors_file = fp.read() - fp.close() + with open(authors_file_path) as a_file: + authors_file = a_file.read() authors_file = authors_file.split('\n') for author in authors_file: if author == 'CURRENT DEVELOPERS:': @@ -1300,10 +1298,8 @@ class AboutDialog: thanks_file_path = self.get_path('THANKS') if thanks_file_path: authors.append('\n' + _('THANKS:')) - - fp = open(thanks_file_path) - text = fp.read() - fp.close() + with open(thanks_file_path) as a_file: + text = a_file.read() text_splitted = text.split('\n') text = '\n'.join(text_splitted[:-2]) # remove one english sentence # and add it manually as translatable @@ -1323,9 +1319,8 @@ class AboutDialog: thanks_artists_file_path = self.get_path('THANKS.artists') if thanks_artists_file_path: - fp = open(thanks_artists_file_path) - artists_text = fp.read() - fp.close() + with open(thanks_artists_file_path) as a_file: + artists_text = a_file.read() artists = artists_text.split('\n') dlg.set_artists(artists) # connect close button to destroy() function From ce1a785484c401dfdc3a11d569a1900b2fa55b96 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 04:08:07 +0400 Subject: [PATCH 054/592] fix generator and range --- src/common/helpers.py | 2 +- src/roster_window.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/helpers.py b/src/common/helpers.py index 59ffe634b..b3568f81d 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -951,7 +951,7 @@ def get_random_string_16(): """ Create random string of length 16 """ - rng = range(65, 90) + rng = list(range(65, 90)) rng.extend(range(48, 57)) char_sequence = [chr(e) for e in rng] from random import sample diff --git a/src/roster_window.py b/src/roster_window.py index 762406359..8f32398ff 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1415,7 +1415,7 @@ class RosterWindow: yield False task = _draw_all_contacts(jids, account) - GObject.idle_add(task.next) + GObject.idle_add(next, task) def _before_fill(self): self.tree.freeze_child_notify() From 477e5a509352bb0dbe642a00c9a1f57641f7bc3a Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 04:16:14 +0400 Subject: [PATCH 055/592] fix client local time --- src/tooltips.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/tooltips.py b/src/tooltips.py index 6fe799a89..445235c6a 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -567,8 +567,7 @@ class RosterTooltip(NotificationAreaTooltip): # time.strftime returns locale encoded string local_time = time.strftime('%c', contact.last_status_time) - local_time = local_time.decode( - locale.getpreferredencoding()) + text = text % local_time show += text if self.account and \ From c4d5ccf4e087ff73d10f039a322e27e157904048 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 11:47:34 +0400 Subject: [PATCH 056/592] fix error handling --- src/common/proxy65_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 38464b578..db81598dd 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -462,7 +462,7 @@ class ReceiverTester(Socks5, IdleObject): self._send = self._sock.send self._recv = self._sock.recv except Exception as ee: - errnum = ee[0] + errnum = ee.errno # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect From 3c4a63e97e14fd4efba717d57b6e85947297c91a Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 13:41:52 +0400 Subject: [PATCH 057/592] fix gettext --- src/common/i18n.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/i18n.py b/src/common/i18n.py index 9c3c3bb03..4ad08e1f5 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -94,7 +94,7 @@ def ngettext(s_sing, s_plural, n, replace_sing = None, replace_plural = None): In other words this is a hack to ngettext() to support %s %d etc.. """ - text = _translation.ungettext(s_sing, s_plural, n) + text = _translation.ngettext(s_sing, s_plural, n) if n == 1 and replace_sing is not None: text = text % replace_sing elif n > 1 and replace_plural is not None: From d6f807bc0b3d072099b5c358f9595b31438a9e7e Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 14:58:01 +0400 Subject: [PATCH 058/592] fix avatars in roster --- src/vcard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcard.py b/src/vcard.py index 8fa203c10..49bb235e3 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -61,7 +61,7 @@ def get_avatar_pixbuf_encoded_mime(photo): img_encoded = photo['BINVAL'] avatar_encoded = img_encoded try: - img_decoded = base64.b64decode(img_encoded.encode('utf-8')).decode('utf-8') + img_decoded = base64.b64decode(img_encoded.encode('utf-8')) except Exception: pass if img_decoded: From 3911c72ba93a67c9c5a29884f3199611e95c96c3 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 17:02:14 +0400 Subject: [PATCH 059/592] fix set avatar --- src/common/connection_handlers.py | 5 ++--- src/profile_window.py | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index df4710caf..7382a5ccb 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -431,8 +431,7 @@ class ConnectionVcard: if 'PHOTO' in vcard and isinstance(vcard['PHOTO'], dict) and \ 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] - photo_decoded = base64.b64decode(photo.encode('utf-8')).decode( - 'utf-8') + photo_decoded = base64.b64decode(photo.encode('utf-8')) gajim.interface.save_avatar_files(our_jid, photo_decoded) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() iq2.getTag('PHOTO').setTagData('SHA', avatar_sha) @@ -685,7 +684,7 @@ class ConnectionVcard: 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] try: - photo_decoded = base64.b64decode(photo.encode('utf-8')).decode('utf-8') + photo_decoded = base64.b64decode(photo.encode('utf-8')) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() except Exception: avatar_sha = '' diff --git a/src/profile_window.py b/src/profile_window.py index 696c66beb..a56911cc2 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -171,8 +171,7 @@ class ProfileWindow: button.show() text_button = self.xml.get_object('NOPHOTO_button') text_button.hide() - self.avatar_encoded = base64.b64encode(data.encode('utf-8')).decode( - 'utf-8') + self.avatar_encoded = base64.b64encode(data).decode('utf-8') # returns None if unknown type self.avatar_mime_type = mimetypes.guess_type(path_to_file)[0] if must_delete: From 1202d79a3cd1b767a909b58a5b5fac7c89300e5c Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 17:03:40 +0400 Subject: [PATCH 060/592] fix set avatar in remote control --- src/remote_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/remote_control.py b/src/remote_control.py index 26b8d7020..4f9e97300 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -907,7 +907,7 @@ class SignalObject(dbus.service.Object): if not invalid_file and filesize < 16384: fd = open(picture, 'rb') data = fd.read() - avatar = base64.b64encode(data.encode('utf-8')).decode('utf-8') + avatar = base64.b64encode(data).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard={} vcard['PHOTO'] = {'BINVAL': avatar} From ec6b85a75b7fa6a90fa1cc7fd80e5a3640e6395f Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 17:09:51 +0400 Subject: [PATCH 061/592] close file automaticaly --- src/profile_window.py | 4 ++-- src/remote_control.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/profile_window.py b/src/profile_window.py index a56911cc2..868639590 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -154,8 +154,8 @@ class ProfileWindow: scaled_pixbuf.savev(path_to_file, 'png', [], []) must_delete = True - fd = open(path_to_file, 'rb') - data = fd.read() + with open(path_to_file, 'rb') as fd: + data = fd.read() pixbuf = gtkgui_helpers.get_pixbuf_from_data(data) try: # rescale it diff --git a/src/remote_control.py b/src/remote_control.py index 4f9e97300..da7e50015 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -905,8 +905,8 @@ class SignalObject(dbus.service.Object): else: invalid_file = True if not invalid_file and filesize < 16384: - fd = open(picture, 'rb') - data = fd.read() + with open(picture, 'rb') as fb: + data = fd.read() avatar = base64.b64encode(data).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard={} From 371fe86172dcbf10f5e3329c33632260c307a770 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 17:13:19 +0400 Subject: [PATCH 062/592] Close all the windows on exit --- src/roster_window.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/roster_window.py b/src/roster_window.py index 8f32398ff..876d50d33 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2394,7 +2394,7 @@ class RosterWindow: """ Close all the windows in the given dictionary """ - for w in dic.values(): + for w in list(dic.values()): if isinstance(w, dict): self.close_all_from_dict(w) else: From a12530cd257824a74ee3aba4a33ef4d91a06e4b0 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 17:26:12 +0400 Subject: [PATCH 063/592] fix change theme in gc --- src/groupchat_control.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index e744e07b9..67936efd8 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -31,6 +31,7 @@ import os import time import locale from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import Pango from gi.repository import GObject @@ -710,7 +711,7 @@ class GroupchatControl(ChatControlBase): model[iter_][C_NICK] = model[iter_][C_NICK] def change_roster_style(self): - self.model.foreach(self._change_style) + self.model.foreach(self._change_style, None) def repaint_themed_widgets(self): ChatControlBase.repaint_themed_widgets(self) @@ -1971,7 +1972,7 @@ class GroupchatControl(ChatControlBase): gajim.config.set('gc-hpaned-position', self.hpaned.get_position()) # remove all register handlers on wigets, created by self.xml # to prevent circular references among objects - for i in self.handlers.keys(): + for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] From d343e1c9770af989211e7a82522cefa8d945b1de Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 19:39:04 +0400 Subject: [PATCH 064/592] fix popup emoticons menu coordinates --- src/gtkgui_helpers.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index b9df9e42b..1677f9b1a 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -124,17 +124,22 @@ def popup_emoticons_under_button(menu, button, parent_win): Popup the emoticons menu under button, which is in parent_win """ window_x1, window_y1 = parent_win.get_origin()[1:] + def position_menu_under_button(menu, data): # inline function, which will not keep refs, when used as CB alloc = button.get_allocation() button_x, button_y = alloc.x, alloc.y - + translated_coordinates = button.translate_coordinates( + gajim.interface.roster.window, 0, 0) + if translated_coordinates: + button_x, button_y = translated_coordinates + _alloc = parent_win.notebook.get_allocation() # now convert them to X11-relative window_x, window_y = window_x1, window_y1 x = window_x + button_x y = window_y + button_y - menu_height = menu.size_request()[1] + menu_height = menu.size_request().height ## should we pop down or up? if (y + alloc.height + menu_height < Gdk.Screen.height()): From d5bf61ebf4c30a657814b913f57cc075dc13a6fa Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 20:09:40 +0400 Subject: [PATCH 065/592] fix window mode --- src/message_window.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/message_window.py b/src/message_window.py index 13b4ed7d3..eb93fb0cd 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -252,7 +252,7 @@ class MessageWindow(object): self._controls.clear() # Clean up handlers connected to the parent window, this is important since # self.window may be the RosterWindow - for i in self.handlers.keys(): + for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] @@ -1150,7 +1150,7 @@ class MessageWindowMgr(GObject.GObject): return ctrls def windows(self): - for w in self._windows.values(): + for w in list(self._windows.values()): yield w def controls(self): @@ -1237,7 +1237,7 @@ class MessageWindowMgr(GObject.GObject): else: # Stash current size so it can be restored if the MessageWindow # is not longer embedded - roster_width = w.parent_paned.get_child1().allocation.width + roster_width = w.parent_paned.get_position() gajim.config.set('roster_width', roster_width) while w.notebook.get_n_pages(): From 35355e1fa23989e01507e83289321ba88d86c055 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 20:50:01 +0400 Subject: [PATCH 066/592] fix get os info --- src/common/helpers.py | 4 +++- src/roster_window.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/helpers.py b/src/common/helpers.py index b3568f81d..d648a3367 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -992,8 +992,10 @@ def get_os_info(): p.wait() output = temp_failure_retry(p.stdout.readline).strip() # some distros put n/a in places, so remove those - output = output.replace('n/a', '').replace('N/A', '') + output = output.decode('utf-8').replace('n/a', '').replace('N/A', '') gajim.os_info = output + p.stdout.close() + p.stdin.close() return output # lsb_release executable not available, so parse files diff --git a/src/roster_window.py b/src/roster_window.py index 876d50d33..1f591c37d 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1518,7 +1518,7 @@ class RosterWindow: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) - self.modelfilter.foreach(func) + self.modelfilter.foreach(func, None) def _adjust_account_expand_collapse_state(self, account): """ @@ -4441,7 +4441,7 @@ class RosterWindow: col = self.tree.get_column(0) self.tree.set_cursor_on_cell(path, col) return True - self.modelfilter.foreach(_func) + self.modelfilter.foreach(_func, None) def on_rfilter_entry_icon_press(self, widget, icon, event): """ From 220d2d64342a8c49ed7dab5bceaa57d83340521d Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 21:04:54 +0400 Subject: [PATCH 067/592] fix urllib --- src/conversation_textview.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 4b1550fd2..8439800b5 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -756,7 +756,7 @@ class ConversationTextview(GObject.GObject): menu.prepend(item) submenu = Gtk.Menu() item.set_submenu(submenu) - phrase_for_url = urllib.quote(self.selected_phrase.encode('utf-8')) + phrase_for_url = urllib.parse.quote(self.selected_phrase.encode('utf-8')) always_use_en = gajim.config.get('always_english_wikipedia') if always_use_en: @@ -847,9 +847,8 @@ class ConversationTextview(GObject.GObject): if return_val: # if sth was selected when we right-clicked # get the selected text start_sel, finish_sel = return_val[0], return_val[1] - self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True).decode( - 'utf-8') - elif ord(iter_.get_char()) > 31: + self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True) + elif iter_.get_char() and ord(iter_.get_char()) > 31: # we clicked on a word, do as if it's selected for context menu start_sel = iter_.copy() if not start_sel.starts_word(): From 8214d37d213516c47ded33dfc2ded0e3936e494e Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 21:21:38 +0400 Subject: [PATCH 068/592] fix clipbord --- src/conversation_textview.py | 6 ++---- src/htmltextview.py | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 8439800b5..fcfaf835d 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -856,8 +856,7 @@ class ConversationTextview(GObject.GObject): finish_sel = iter_.copy() if not finish_sel.ends_word(): finish_sel.forward_word_end() - self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True).decode( - 'utf-8') + self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True) def on_open_link_activate(self, widget, kind, text): helpers.launch_browser_mailer(kind, text) @@ -970,8 +969,7 @@ class ConversationTextview(GObject.GObject): # it's a JID or mail kind = 'sth_at_sth' else: - word = self.tv.get_buffer().get_text(begin_iter, end_iter, True).decode( - 'utf-8') + word = self.tv.get_buffer().get_text(begin_iter, end_iter, True) if event.button == 3: # right click self.make_link_menu(event, kind, word) diff --git a/src/htmltextview.py b/src/htmltextview.py index 7cc18ecd7..d52ef21e3 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -904,7 +904,8 @@ class HtmlTextView(Gtk.TextView): # textview can be hidden while we add a new line in it. if self.has_screen(): clipboard = self.get_clipboard(Gdk.SELECTION_PRIMARY) - clipboard.set_text(self.get_selected_text()) + text = self.get_selected_text() + clipboard.set_text(text, len(text)) def get_selected_text(self): bounds = self.get_buffer().get_selection_bounds() From 866b23650ed79fdcd2d76a4264baa120d3d43bbc Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 21:34:19 +0400 Subject: [PATCH 069/592] fix time in log --- src/conversation_textview.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index fcfaf835d..db4956a82 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -1297,9 +1297,9 @@ class ConversationTextview(GObject.GObject): # get difference in days since epoch (86400 = 24*3600) # number of days since epoch for current time (in GMT) - # number of days since epoch for message (in GMT) - diff_day = int(timegm(time.localtime())) / 86400 -\ - int(timegm(tim)) / 86400 - if diff_day == 0: + diff_day = int(int(timegm(time.localtime())) / 86400 -\ + int(timegm(tim)) / 86400) + if diff_day == 0.0: day_str = '' else: #%i is day in year (1-365) From 11a357351d9e927e62db8828bcb7f65d62ecc029 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 3 Jan 2013 19:01:18 +0100 Subject: [PATCH 070/592] partly fix hmac usage --- src/common/connection.py | 6 +++--- src/common/connection_handlers_events.py | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index 861b51d96..54efb7e8d 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -715,7 +715,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.private_storage_supported = True self.privacy_rules_requested = False self.streamError = '' - self.secret_hmac = str(random.random())[2:] + self.secret_hmac = str(random.random())[2:].encode('utf-8') self.sm = Smacks(self) # Stream Management @@ -2374,7 +2374,7 @@ class Connection(CommonConnection, ConnectionHandlers): p = nbxmpp.Presence(to='%s/%s' % (room_jid, nick), show=show, status=self.status) - h = hmac.new(self.secret_hmac, room_jid).hexdigest()[:6] + h = hmac.new(self.secret_hmac, room_jid.encode('utf-8')).hexdigest()[:6] id_ = self.connection.getAnID() id_ = 'gajim_muc_' + id_ + '_' + h p.setID(id_) @@ -2459,7 +2459,7 @@ class Connection(CommonConnection, ConnectionHandlers): xmpp_show = helpers.get_xmpp_show(show) p = nbxmpp.Presence(to='%s/%s' % (jid, nick), typ=ptype, show=xmpp_show, status=status) - h = hmac.new(self.secret_hmac, jid).hexdigest()[:6] + h = hmac.new(self.secret_hmac, jid.encode('utf-8')).hexdigest()[:6] id_ = self.connection.getAnID() id_ = 'gajim_muc_' + id_ + '_' + h p.setID(id_) diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 2f1ae0932..1ac49596a 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -795,7 +795,8 @@ PresenceHelperEvent): and self.ptype == 'error': # Error presences may not include sent stanza, so we don't detect # it's a muc presence. So detect it by ID - h = hmac.new(self.conn.secret_hmac, self.jid).hexdigest()[:6] + h = hmac.new(self.conn.secret_hmac, self.jid.encode('utf-8')).\ + hexdigest()[:6] if self.id_.split('_')[-1] == h: self.is_gc = True self.status = self.stanza.getStatus() or '' From 6be518686f3678770a94439300376e49141fb3fb Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 3 Jan 2013 19:42:44 +0100 Subject: [PATCH 071/592] fix setting option in ACE --- src/advanced_configuration_window.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index a2266a55f..2a8ae4ad1 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -232,13 +232,14 @@ class AdvancedConfigurationWindow(object): path=Gtk.TreePath.new_from_string(path) modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - modelpath = modelpath.get_indices() option = modelrow[0] - if len(modelpath) > 1: - optnamerow = self.model[modelpath[0]] - optname = optnamerow[0] - keyrow = self.model[modelpath[:2]] + if modelpath.get_depth() > 2: + modelpath.up() # Get parent + keyrow = self.model[modelpath] key = keyrow[0] + modelpath.up() # Get parent + optnamerow = self.model[modelpath] + optname = optnamerow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], text) gajim.config.set_per(optname, key, option, text) From 6d4675d1c756d60451809aee4c9b43caf53e0389 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 23:01:24 +0400 Subject: [PATCH 072/592] fix change activity window --- src/dialogs.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 03dfd19ee..7251aebaa 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -374,12 +374,13 @@ class ChangeActivityDialog: act = category + '_other' if group: - rbtns[act] = Gtk.RadioButton(group) + rbtns[act] = new = Gtk.RadioButton() + new.join_group(group) else: rbtns[act] = group = Gtk.RadioButton() hbox = Gtk.HBox(False, 5) - hbox.pack_start(gtkgui_helpers.load_activity_icon(category, True, True, 0), False, + hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, False, 0) lbl = Gtk.Label(label='' + pep.ACTIVITIES[category]['category'] + '') lbl.set_use_markup(True) @@ -393,7 +394,6 @@ class ChangeActivityDialog: for activity in pep.ACTIVITIES[category]: activities.append(activity) activities.sort() - for activity in activities: if activity == 'category': continue @@ -401,14 +401,15 @@ class ChangeActivityDialog: act = category + '_' + activity if group: - rbtns[act] = Gtk.RadioButton(group) + rbtns[act] = new = Gtk.RadioButton() + new.join_group(group) else: rbtns[act] = group = Gtk.RadioButton() hbox = Gtk.HBox(False, 5) hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, False, 0) - hbox.pack_start(Gtk.Label(pep.ACTIVITIES[category][activity], True, True, 0), + hbox.pack_start(Gtk.Label(pep.ACTIVITIES[category][activity]), False, False, 0) rbtns[act].connect('toggled', self.on_rbtn_toggled, [category, activity]) @@ -638,7 +639,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.message_combobox = self.xml.get_object('message_combobox') self.message_combobox.set_model(self.message_liststore) cellrenderertext = Gtk.CellRendererText() - self.message_combobox.pack_start(cellrenderertext, True, True, 0) + self.message_combobox.pack_start(cellrenderertext, True) self.message_combobox.add_attribute(cellrenderertext, 'text', 0) for msg_name in sorted_keys_list: self.message_liststore.append((msg_name,)) From bbfc28242fec3548b2451a9e189ef497610b3507 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 23:28:04 +0400 Subject: [PATCH 073/592] fix change mood window --- src/dialogs.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 7251aebaa..b73dc898b 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -374,8 +374,8 @@ class ChangeActivityDialog: act = category + '_other' if group: - rbtns[act] = new = Gtk.RadioButton() - new.join_group(group) + rbtns[act] = Gtk.RadioButton() + rbtns[act].join_group(group) else: rbtns[act] = group = Gtk.RadioButton() @@ -401,8 +401,8 @@ class ChangeActivityDialog: act = category + '_' + activity if group: - rbtns[act] = new = Gtk.RadioButton() - new.join_group(group) + rbtns[act] = Gtk.RadioButton() + rbtns[act].join_group(group) else: rbtns[act] = group = Gtk.RadioButton() @@ -499,7 +499,8 @@ class ChangeMoodDialog: self.MOODS.sort() for mood in self.MOODS: - self.mood_buttons[mood] = Gtk.RadioButton(no_mood_button) + self.mood_buttons[mood] = Gtk.RadioButton() + self.mood_buttons[mood].join_group(no_mood_button) self.mood_buttons[mood].set_mode(False) self.mood_buttons[mood].add(gtkgui_helpers.load_mood_icon(mood)) self.mood_buttons[mood].set_relief(Gtk.ReliefStyle.NONE) From 1f7d676248c312e7eeaf2540e284043d564a7f09 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Thu, 3 Jan 2013 23:31:26 +0400 Subject: [PATCH 074/592] split long lines --- src/dialogs.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index b73dc898b..1f29dd638 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -380,9 +380,10 @@ class ChangeActivityDialog: rbtns[act] = group = Gtk.RadioButton() hbox = Gtk.HBox(False, 5) - hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, - False, 0) - lbl = Gtk.Label(label='' + pep.ACTIVITIES[category]['category'] + '') + hbox.pack_start(gtkgui_helpers.load_activity_icon(category, + activity), False, False, 0) + lbl = Gtk.Label(label='' + pep.ACTIVITIES[category]['category'] \ + + '') lbl.set_use_markup(True) hbox.pack_start(lbl, False, False, 0) rbtns[act].add(hbox) From 80fcd4d5771584a0d295af3765cad48e69f97d3d Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 3 Jan 2013 23:30:17 +0100 Subject: [PATCH 075/592] fix history window --- data/gui/history_window.ui | 85 ++++++++++++++++++++------------------ src/history_window.py | 81 ++++++++++++------------------------ 2 files changed, 71 insertions(+), 95 deletions(-) diff --git a/data/gui/history_window.ui b/data/gui/history_window.ui index 0b36ff7f1..181256074 100644 --- a/data/gui/history_window.ui +++ b/data/gui/history_window.ui @@ -1,63 +1,49 @@ - + - - - - - - - - - - Enter JID or Contact name - - - Groupchat Histories - - - All Chat Histories - - - + + False Conversation History history 650 450 - - + + True + False 12 - vertical 6 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - vertical 6 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - liststore1 - 0 - + + True + + True + Enter name / JID of contact or groupchat + True + True 0 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Search: @@ -68,26 +54,30 @@ - + True False True True - + False + True 2 _In date search + False True False False searching only in the selected day + False True + 0.5 True @@ -99,6 +89,7 @@ False + True 0 @@ -114,17 +105,18 @@ True - vertical + False 6 True True - - + + False + True 0 @@ -141,8 +133,6 @@ True True - automatic - automatic etched-in @@ -163,15 +153,16 @@ True True - automatic - automatic in True True True - + + + + @@ -182,25 +173,33 @@ + True + True 1 + True + True 0 True + False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Log conversation history + False True True False + False True + 0.5 True True @@ -216,23 +215,27 @@ False + True 1 True + False 6 end gtk-close + False True True True False + False True - + False diff --git a/src/history_window.py b/src/history_window.py index d305e8799..9a31491bd 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -26,6 +26,7 @@ ## from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import GObject import time import calendar @@ -69,18 +70,17 @@ class HistoryWindow: self.calendar = xml.get_object('calendar') scrolledwindow = xml.get_object('scrolledwindow') self.history_textview = conversation_textview.ConversationTextview( - account, used_in_history_window = True) + account, used_in_history_window = True) scrolledwindow.add(self.history_textview.tv) self.history_buffer = self.history_textview.tv.get_buffer() self.history_buffer.create_tag('highlight', background = 'yellow') self.checkbutton = xml.get_object('log_history_checkbutton') self.checkbutton.connect('toggled', - self.on_log_history_checkbutton_toggled) - self.query_entry = xml.get_object('query_entry') - self.query_combobox = xml.get_object('query_combobox') - self.jid_entry = self.query_combobox.get_child() + self.on_log_history_checkbutton_toggled) + self.search_entry = xml.get_object('search_entry') + self.query_liststore = xml.get_object('query_liststore') + self.jid_entry = xml.get_object('query_entry') self.jid_entry.connect('activate', self.on_jid_entry_activate) - self.query_combobox.set_active(0) self.results_treeview = xml.get_object('results_treeview') self.results_window = xml.get_object('results_scrolledwindow') self.search_in_date = xml.get_object('search_in_date') @@ -91,24 +91,24 @@ class HistoryWindow: col = Gtk.TreeViewColumn(_('Name')) self.results_treeview.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, text = C_CONTACT_NAME) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', C_CONTACT_NAME) col.set_sort_column_id(C_CONTACT_NAME) # user can click this header and sort col.set_resizable(True) col = Gtk.TreeViewColumn(_('Date')) self.results_treeview.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, text = C_UNIXTIME) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', C_UNIXTIME) col.set_sort_column_id(C_UNIXTIME) # user can click this header and sort col.set_resizable(True) col = Gtk.TreeViewColumn(_('Message')) self.results_treeview.append_column(col) renderer = Gtk.CellRendererText() - col.pack_start(renderer, True, True, 0) - col.set_attributes(renderer, text = C_MESSAGE) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', C_MESSAGE) col.set_resizable(True) self.jid = None # The history we are currently viewing @@ -118,7 +118,8 @@ class HistoryWindow: self.jids_to_search = [] # This will load history too - GObject.idle_add(self._fill_completion_dict().next) + task = self._fill_completion_dict() + GObject.idle_add(next, task) if jid: self.jid_entry.set_text(jid) @@ -152,7 +153,7 @@ class HistoryWindow: db_jids = gajim.logger.get_jids_in_db() completion_dict = dict.fromkeys(db_jids) - self.accounts_seen_online = gajim.contacts.get_accounts()[:] + self.accounts_seen_online = list(gajim.contacts.get_accounts()) # Enhance contacts of online accounts with contact. Needed for mapping below for account in self.accounts_seen_online: @@ -163,14 +164,14 @@ class HistoryWindow: muc_active_pix = muc_active_img.get_pixbuf() contact_pix = contact_img.get_pixbuf() - keys = completion_dict.keys() + keys = list(completion_dict.keys()) # Move the actual jid at first so we load history faster actual_jid = self.jid_entry.get_text() if actual_jid in keys: keys.remove(actual_jid) keys.insert(0, actual_jid) - if None in keys: - keys.remove(None) + if '' in keys: + keys.remove('') # Map jid to info tuple # Warning : This for is time critical with big DB for key in keys: @@ -240,10 +241,6 @@ class HistoryWindow: self.window.destroy() def on_jid_entry_activate(self, widget): - if not self.query_combobox.get_active() < 0: - # Don't disable querybox when we have changed the combobox - # to GC or All and hit enter - return jid = self.jid_entry.get_text() account = None # we don't know the account, could be any. Search for it! self._load_history(jid, account) @@ -300,8 +297,8 @@ class HistoryWindow: self.calendar.select_month(gtk_month, y) self.calendar.select_day(d) - self.query_entry.set_sensitive(True) - self.query_entry.grab_focus() + self.search_entry.set_sensitive(True) + self.search_entry.grab_focus() title = _('Conversation History with %s') % info_name self.window.set_title(title) @@ -313,7 +310,7 @@ class HistoryWindow: self.account = None self.history_buffer.set_text('') # clear the buffer - self.query_entry.set_sensitive(False) + self.search_entry.set_sensitive(False) self.checkbutton.set_sensitive(False) self.calendar.set_sensitive(False) @@ -491,8 +488,8 @@ class HistoryWindow: xhtml=xhtml) self.history_textview.print_real_text('\n') - def on_query_entry_activate(self, widget): - text = self.query_entry.get_text() + def on_search_entry_activate(self, widget): + text = self.search_entry.get_text() model = self.results_treeview.get_model() model.clear() if text == '': @@ -502,7 +499,7 @@ class HistoryWindow: self.results_window.set_property('visible', True) # perform search in preselected jids - # jids are preselected with the query_combobox (all, single jid...) + # jids are preselected with the query_entry for jid in self.jids_to_search: account = self.completion_dict[jid][C_INFO_ACCOUNT] if account is None: @@ -538,31 +535,7 @@ class HistoryWindow: # jid (to which log is assigned to), name, date, message, # time (full unix time) - model.append((jid, contact_name, date, message, tim)) - - def on_query_combobox_changed(self, widget): - if self.query_combobox.get_active() < 0: - return # custom entry - self.account = None - self.jid = None - self.jids_to_search = [] - self._load_history(None) # clear textview - - if self.query_combobox.get_active() == 0: - # JID or Contact name - self.query_entry.set_sensitive(False) - self.jid_entry.grab_focus() - if self.query_combobox.get_active() == 1: - # Groupchat Histories - self.query_entry.set_sensitive(True) - self.query_entry.grab_focus() - self.jids_to_search = (jid for jid in gajim.logger.get_jids_in_db() - if gajim.logger.jid_is_room_jid(jid)) - if self.query_combobox.get_active() == 2: - # All Chat Histories - self.query_entry.set_sensitive(True) - self.query_entry.grab_focus() - self.jids_to_search = gajim.logger.get_jids_in_db() + model.append((jid, contact_name, date, message, str(tim))) def on_results_treeview_row_activated(self, widget, path, column): """ @@ -641,7 +614,7 @@ class HistoryWindow: self.jid_entry.set_text(jid) if account and account not in self.accounts_seen_online: # Update dict to not only show bare jid - GObject.idle_add(self._fill_completion_dict().next) + GObject.idle_add(next, self._fill_completion_dict()) else: # Only in that case because it's called by self._fill_completion_dict() # otherwise @@ -649,7 +622,7 @@ class HistoryWindow: self.results_window.set_property('visible', False) def save_state(self): - x, y = self.window.window.get_root_origin() + x, y = self.window.get_window().get_root_origin() width, height = self.window.get_size() gajim.config.set('history_window_x-position', x) From 04e92b039893ea172f6b134f7145e6b48c687e65 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Fri, 4 Jan 2013 15:20:04 +0400 Subject: [PATCH 076/592] fix join gc dialog --- data/gui/join_groupchat_window.ui | 83 +++++++++++++++++++------------ src/dialogs.py | 35 ++++++------- 2 files changed, 68 insertions(+), 50 deletions(-) diff --git a/data/gui/join_groupchat_window.ui b/data/gui/join_groupchat_window.ui index 58322d9cd..5a498ca8b 100644 --- a/data/gui/join_groupchat_window.ui +++ b/data/gui/join_groupchat_window.ui @@ -1,21 +1,27 @@ - + - - + + + True + False + gtk-find + + False 6 Join Group Chat dialog - - + + True - vertical + False 12 True + False 8 2 12 @@ -26,7 +32,7 @@ True True True - + 1 @@ -41,7 +47,7 @@ True True True - + 1 @@ -54,6 +60,7 @@ True + False 0 Room: @@ -67,6 +74,7 @@ True + False 0 Nickname: @@ -80,6 +88,7 @@ True + False 0 Recently: @@ -93,7 +102,8 @@ True - + False + 1 @@ -107,6 +117,7 @@ True + False 0 Password: @@ -135,11 +146,14 @@ Join this room _automatically when I connect + False True False True False + False True + 0 True @@ -152,6 +166,7 @@ + False True 0 Account @@ -163,8 +178,9 @@ + False True - + 1 @@ -176,12 +192,15 @@ _Bookmark this room + False True True False + False True + 0 True - + 2 @@ -194,6 +213,7 @@ True + False 0 Server: @@ -205,27 +225,27 @@ True + False 6 - - True - liststore1 - - - 0 - + Bro_wse Rooms + False True True True + False image1 True - + + True + True + end 1 @@ -241,23 +261,27 @@ False + True 0 True + False 12 end gtk-cancel + False True True True False + False True - + False @@ -267,24 +291,29 @@ + False True True True True False - + False + True + False 0 0 True + False 2 True + False gtk-apply @@ -296,6 +325,7 @@ True + False _Join True @@ -319,6 +349,7 @@ False + True end 1 @@ -326,14 +357,4 @@ - - - - - - - - True - gtk-find - diff --git a/src/dialogs.py b/src/dialogs.py index 1f29dd638..2b8ac2f81 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -2382,18 +2382,13 @@ class JoinGroupchatWindow: title = _('Join Group Chat') self.window.set_title(title) - self.server_comboboxentry = self.xml.get_object('server_comboboxentry') - liststore = Gtk.ListStore(str) - self.server_comboboxentry.set_model(liststore) - cell = Gtk.CellRendererText() - self.server_comboboxentry.pack_start(cell, True) - self.server_comboboxentry.add_attribute(cell, 'text', 0) - self.server_comboboxentry.set_active(-1) - self.server_model = liststore#self.server_comboboxentry.get_model() - server_list = [] - # get the muc server of our server - if 'jabber' in gajim.connections[account].muc_jid: - server_list.append(gajim.connections[account].muc_jid['jabber']) + + self.server_model = Gtk.ListStore(str) + self.server_comboboxentry = Gtk.ComboBox.new_with_model_and_entry( + self.server_model) + self.server_comboboxentry.set_entry_text_column(0) + hbox1 = self.xml.get_object('hbox1') + hbox1.pack_start(self.server_comboboxentry, False, False, 0) self.recently_combobox = self.xml.get_object('recently_combobox') liststore = Gtk.ListStore(str) @@ -2402,6 +2397,11 @@ class JoinGroupchatWindow: self.recently_combobox.pack_start(cell, True) self.recently_combobox.add_attribute(cell, 'text', 0) self.recently_groupchat = gajim.config.get('recently_groupchat').split() + + server_list = [] + # get the muc server of our server + if 'jabber' in gajim.connections[account].muc_jid: + server_list.append(gajim.connections[account].muc_jid['jabber']) for g in self.recently_groupchat: liststore.append([g]) server = gajim.get_server_from_jid(g) @@ -2410,7 +2410,7 @@ class JoinGroupchatWindow: for s in server_list: self.server_model.append([s]) - self.server_comboboxentry.set_active(0) + self._set_room_jid(room_jid) @@ -2474,8 +2474,7 @@ class JoinGroupchatWindow: room, server = gajim.get_name_and_server_from_jid(room_jid) self._room_jid_entry.set_text(room) model = self.server_comboboxentry.get_model() - model.append([server]) - #self.server_comboboxentry.set_active(0) + self.server_comboboxentry.get_child().set_text(server) def on_recently_combobox_changed(self, widget): model = widget.get_model() @@ -2521,10 +2520,8 @@ class JoinGroupchatWindow: 'groupchat.')) return nickname = self._nickname_entry.get_text() - row = self.server_comboboxentry.get_child().get_displayed_row() - model = self.server_comboboxentry.get_model() - server = model[row][0].strip() - room = self._room_jid_entry.get_text().decode('utf-8').strip() + server = self.server_comboboxentry.get_child().get_text() + room = self._room_jid_entry.get_text().strip() room_jid = room + '@' + server password = self._password_entry.get_text() try: From fb6240f1c57a423ec06f98156d28471966f025c8 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Fri, 4 Jan 2013 16:40:18 +0400 Subject: [PATCH 077/592] fix get invisible cursor --- src/gtkgui_helpers.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 1677f9b1a..9591a147d 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -433,9 +433,11 @@ def get_pixbuf_from_data(file_data, want_type = False): return pixbuf def get_invisible_cursor(): - pixmap = Gdk.Pixmap(None, 1, 1, 1) - color = Gdk.Color() - cursor = Gdk.Cursor.new(pixmap, pixmap, color, color, 0, 0) + import cairo + s = cairo.ImageSurface(cairo.FORMAT_A1, 1, 1) + cursor_pixbuf = Gdk.pixbuf_get_from_surface(s, 0, 0, 1, 1) + cursor = Gdk.Cursor.new_from_pixbuf(Gdk.Display.get_default(), \ + cursor_pixbuf, 0, 0) return cursor def get_current_desktop(window): From 078abc9b7ab6f5839ffcd75e2a0bbb7f1c39dd75 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 4 Jan 2013 14:12:35 +0100 Subject: [PATCH 078/592] fix __import__ calls --- src/common/gajim.py | 2 +- src/common/passwords.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/gajim.py b/src/common/gajim.py index b6f1db9ff..276601092 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -158,7 +158,7 @@ except ImportError: HAVE_GPG = True try: - __import__('gnupg', globals(), locals(), [], -1) + __import__('gnupg', globals(), locals(), [], 0) except ImportError: HAVE_GPG = False else: diff --git a/src/common/passwords.py b/src/common/passwords.py index d61d2afd9..4ed62d7c3 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -200,7 +200,7 @@ def get_storage(): global GnomeKeyring try: gir = __import__('gi.repository', globals(), locals(), - ['GnomeKeyring'], -1) + ['GnomeKeyring'], 0) GnomeKeyring = gir.GnomeKeyring except ImportError: pass From a3b770b6366173ffc13656948b8bba3d4eff8650 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Fri, 4 Jan 2013 22:00:16 +0400 Subject: [PATCH 079/592] fix contact time --- src/vcard.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vcard.py b/src/vcard.py index 49bb235e3..fce29925d 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -346,8 +346,7 @@ class VcardWindow: stats += ': ' + self.contact.status if self.contact.last_status_time: stats += '\n' + _('since %s') % time.strftime('%c', - self.contact.last_status_time).decode( - locale.getpreferredencoding()) + self.contact.last_status_time) for c in connected_contact_list: if c.resource != self.contact.resource: stats += '\n' @@ -356,7 +355,7 @@ class VcardWindow: stats += ': ' + c.status if c.last_status_time: stats += '\n' + _('since %s') % time.strftime('%c', - c.last_status_time).decode(locale.getpreferredencoding()) + c.last_status_time) else: # Maybe gc_vcard ? stats = helpers.get_uf_show(self.contact.show) if self.contact.status: From d7501b9ebfa86341f10a7e1d66eb491a1dcf53ba Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Sat, 5 Jan 2013 01:27:22 +0400 Subject: [PATCH 080/592] fix big avatar --- src/chat_control.py | 63 +++++++++++-------------------------------- src/dialogs.py | 48 +++++++++++++++++++++++++++++++++ src/gtkgui_helpers.py | 2 +- 3 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 270214592..5befa4332 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -3007,9 +3007,9 @@ class ChatControl(ChatControlBase): Resize the avatar, if needed, so it has at max half the screen size and shows it """ - if not small_avatar.window: - # Tab has been closed since we hovered the avatar - return + #if not small_avatar.window: + ### Tab has been closed since we hovered the avatar + #return avatar_pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache( self.contact.jid) if avatar_pixbuf in ('ask', None): @@ -3022,7 +3022,8 @@ class ChatControl(ChatControlBase): image = self.xml.get_object('avatar_image') pixbuf = image.get_pixbuf() pixbuf.fill(0xffffff00) # RGBA - image.queue_draw() + image.set_from_pixbuf(pixbuf) + #image.queue_draw() screen_w = Gdk.Screen.width() screen_h = Gdk.Screen.height() @@ -3034,56 +3035,24 @@ class ChatControl(ChatControlBase): avatar_w = half_scr_w if avatar_h > half_scr_h: avatar_h = half_scr_h - window = Gtk.Window(Gtk.WindowType.POPUP) - self.bigger_avatar_window = window - pixmap, mask = avatar_pixbuf.render_pixmap_and_mask() - window.set_size_request(avatar_w, avatar_h) # we should make the cursor visible # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that - window.set_events(Gdk.EventMask.POINTER_MOTION_MASK) - window.set_app_paintable(True) - window.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) - - window.realize() - window.window.set_back_pixmap(pixmap, False) # make it transparent - window.window.shape_combine_mask(mask, 0, 0) + alloc = small_avatar.get_allocation() # make the bigger avatar window show up centered - x0, y0 = small_avatar.window.get_origin()[1:] - x0 += small_avatar.allocation.x - y0 += small_avatar.allocation.y - center_x= x0 + (small_avatar.allocation.width / 2) - center_y = y0 + (small_avatar.allocation.height / 2) + small_avatar_x, small_avatar_y = alloc.x, alloc.y + translated_coordinates = small_avatar.translate_coordinates( + gajim.interface.roster.window, 0, 0) + if translated_coordinates: + small_avatar_x, small_avatar_y = translated_coordinates + roster_x, roster_y = self.parent_win.window.get_window().get_origin()[1:] + center_x = roster_x + small_avatar_x + (alloc.width / 2) + center_y = roster_y + small_avatar_y + (alloc.height / 2) pos_x, pos_y = center_x - (avatar_w / 2), center_y - (avatar_h / 2) - window.move(pos_x, pos_y) - # make the cursor invisible so we can see the image - invisible_cursor = gtkgui_helpers.get_invisible_cursor() - window.window.set_cursor(invisible_cursor) - # we should hide the window - window.connect('leave_notify_event', - self._on_window_avatar_leave_notify_event) - window.connect('motion-notify-event', - self._on_window_motion_notify_event) - - window.show_all() - - def _on_window_avatar_leave_notify_event(self, widget, event): - """ - Just left the popup window that holds avatar - """ - self.bigger_avatar_window.destroy() - self.bigger_avatar_window = None - # Re-show the small avatar - self.show_avatar() - - def _on_window_motion_notify_event(self, widget, event): - """ - Just moved the mouse so show the cursor - """ - cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR) - self.bigger_avatar_window.window.set_cursor(cursor) + dialogs.BigAvatarWindow(avatar_pixbuf, pos_x, pos_y, avatar_w, + avatar_h, self.show_avatar) def _on_send_file_menuitem_activate(self, widget): self._on_send_file() diff --git a/src/dialogs.py b/src/dialogs.py index 2b8ac2f81..1f705a344 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -33,6 +33,7 @@ from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject +import cairo import os import gtkgui_helpers @@ -5325,3 +5326,50 @@ class SSLErrorDialog(ConfirmationDialogDoubleCheck): def on_cert_clicked(self, button): d = CertificatDialog(self, self.account, self.cert) + + +class BigAvatarWindow(Gtk.Window): + def __init__(self, avatar, pos_x, pos_y, width, height, callback): + super(BigAvatarWindow, self).__init__(type=Gtk.WindowType.POPUP) + self.set_events(Gdk.EventMask.POINTER_MOTION_MASK) + self.avatar = avatar + self.callback = callback + self.screen = self.get_screen() + self.visual = self.screen.get_rgba_visual() + if self.visual != None and self.screen.is_composited(): + self.set_visual(self.visual) + self.set_app_paintable(True) + self.set_size_request(width, height) + self.move(pos_x, pos_y) + self.connect("draw", self.area_draw) + # we should hide the window + self.connect('leave_notify_event', self._on_window_avatar_leave_notify) + self.connect('motion-notify-event', self._on_window_motion_notify) + self.realize() + # make the cursor invisible so we can see the image + invisible_cursor = gtkgui_helpers.get_invisible_cursor() + self.get_window().set_cursor(invisible_cursor) + self.show_all() + + def area_draw(self, widget, cr): + cr.set_source_rgba(.2, .2, .2, 0.0) + cr.set_operator(cairo.OPERATOR_SOURCE) + Gdk.cairo_set_source_pixbuf(cr, self.avatar, 0, 0) + cr.paint() + cr.set_operator(cairo.OPERATOR_OVER) + + def _on_window_avatar_leave_notify(self, widget, event): + """ + Just left the popup window that holds avatar + """ + self.destroy() + self.bigger_avatar_window = None + # Re-show the small avatar + self.callback() + + def _on_window_motion_notify(self, widget, event): + """ + Just moved the mouse so show the cursor + """ + cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR) + self.get_window().set_cursor(cursor) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 9591a147d..8b29f2065 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -133,7 +133,7 @@ def popup_emoticons_under_button(menu, button, parent_win): gajim.interface.roster.window, 0, 0) if translated_coordinates: button_x, button_y = translated_coordinates - _alloc = parent_win.notebook.get_allocation() + # now convert them to X11-relative window_x, window_y = window_x1, window_y1 x = window_x + button_x From b4e06e4efe3e3c8f0ee0fbd56f05d28fe45b7182 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 4 Jan 2013 22:31:30 +0100 Subject: [PATCH 081/592] fix speller --- src/gtkspell.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gtkspell.py b/src/gtkspell.py index ad578a94a..9d334c529 100644 --- a/src/gtkspell.py +++ b/src/gtkspell.py @@ -70,7 +70,8 @@ class Spell(object): if create: if spell: raise RuntimeError("Textview has already a Spell obj attached") - self.spell = libgtkspell.gtkspell_new_attach(tv, language, None) + self.spell = libgtkspell.gtkspell_new_attach(tv, language.encode( + 'utf-8'), None) if not self.spell: raise OSError("Unable to attach spell object. " "Language: '%s'" % str(language)) @@ -82,7 +83,8 @@ class Spell(object): @ensure_attached def set_language(self, language): - if libgtkspell.gtkspell_set_language(self.spell, language, None) == 0: + if libgtkspell.gtkspell_set_language(self.spell, language.encode( + 'utf-8'), None) == 0: raise OSError("Unable to set language '%s'" % str(language)) @ensure_attached From 89540b0c2e5b42e83af1b8b8eb31510f8ea8c0fa Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 4 Jan 2013 23:11:07 +0100 Subject: [PATCH 082/592] fix registering an account --- data/gui/account_creation_wizard_window.ui | 25 +++++++++++----------- src/common/connection.py | 4 ++-- src/common/connection_handlers_events.py | 11 +++++----- src/dataforms_widget.py | 3 ++- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/data/gui/account_creation_wizard_window.ui b/data/gui/account_creation_wizard_window.ui index ea32887cc..f6630681d 100644 --- a/data/gui/account_creation_wizard_window.ui +++ b/data/gui/account_creation_wizard_window.ui @@ -12,6 +12,12 @@ + + + + + + server_liststore 0 @@ -36,6 +42,7 @@ True False + False False @@ -276,7 +283,7 @@ to the Jabber network. False False True - 0.5 + 0 True @@ -404,7 +411,7 @@ to the Jabber network. False False True - 0.5 + 0 True @@ -484,7 +491,7 @@ to the Jabber network. False False True - 0.5 + 0 True @@ -649,7 +656,7 @@ SHA1 fingerprint of the certificate: False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False - 0.5 + 0 True @@ -793,7 +800,7 @@ Please wait... False False True - 0.5 + 0 True True @@ -812,7 +819,7 @@ Please wait... False False True - 0.5 + 0 True True @@ -1028,10 +1035,4 @@ Please wait... - - - - - - diff --git a/src/common/connection.py b/src/common/connection.py index 54efb7e8d..2d802af06 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -913,8 +913,8 @@ class Connection(CommonConnection, ConnectionHandlers): self.connection.SendAndCallForResponse(iq, _on_register_result) else: - if self.new_account_form.keys().sort() != \ - conf.keys().sort(): + if list(self.new_account_form.keys()).sort() != \ + list(conf.keys()).sort(): # requested config has changed since first connection reason = _('Server %s provided a different ' 'registration form') % data[0] diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 1ac49596a..a41929993 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -1560,12 +1560,13 @@ class NewAccountConnectedEvent(nec.NetworkIncomingEvent): try: self.errnum = self.conn.connection.Connection.ssl_errnum except AttributeError: - self.errnum = -1 # we don't have an errnum + self.errnum = [] # we don't have an errnum self.ssl_msg = '' - if self.errnum > 0: - from common.connection import ssl_error - self.ssl_msg = ssl_error.get(self.errnum, _( - 'Unknown SSL error: %d') % self.errnum) + for er in self.errnum: + if er > 0: + from common.connection import ssl_error + self.ssl_msg = ssl_error.get(er, _('Unknown SSL error: %d') % \ + er) self.ssl_cert = '' if hasattr(self.conn.connection.Connection, 'ssl_cert_pem'): self.ssl_cert = self.conn.connection.Connection.ssl_cert_pem diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 1d17be1de..992dbb290 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -26,6 +26,7 @@ single means these with one record of data (without element), multiple - these which may contain more data (with element).''' from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject import base64 @@ -566,7 +567,7 @@ class SingleForm(Gtk.Table, object): for uri in field.media.uris: if uri.type_.startswith('image/'): try: - img_data = base64.decodestring(uri.uri_data) + img_data = base64.b64decode(uri.uri_data) pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() From e03b3c35b67fdcfd17a80c788532987ab0642cb7 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 00:03:36 +0100 Subject: [PATCH 083/592] fix traceback handling fix struc and sha1 usage (use bytes instead of string) --- plugins/dbus_plugin/plugin.py | 2 +- src/common/connection_handlers_events.py | 2 +- src/common/contacts.py | 2 +- src/common/ged.py | 4 +- src/common/helpers.py | 7 ++- src/common/idle.py | 2 +- src/common/jingle_ft.py | 4 +- src/common/jingle_rtp.py | 4 +- src/common/logger.py | 16 ++--- src/common/optparser.py | 2 +- src/common/proxy65_manager.py | 8 +-- src/common/socks5.py | 74 +++++++++++++----------- src/common/zeroconf/client_zeroconf.py | 12 ++-- src/common/zeroconf/zeroconf_avahi.py | 2 +- src/common/zeroconf/zeroconf_bonjour.py | 4 +- src/config.py | 4 +- src/dialogs.py | 2 +- src/gajim.py | 2 +- src/gtkgui_helpers.py | 4 +- src/htmltextview.py | 2 +- src/plugins/pluginmanager.py | 22 +++---- src/plugins/plugins_i18n.py | 2 +- src/remote_control.py | 2 +- test/unit/test_socks5.py | 23 ++++---- 24 files changed, 107 insertions(+), 101 deletions(-) diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index b8de568e9..a3dcae62e 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -508,7 +508,7 @@ if dbus_support.supported: def prefs_store(self): try: gajim.interface.save_config() - except Exception as e: + except Exception: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index a41929993..412e31e73 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -218,7 +218,7 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ') - except ValueError as e: + except ValueError: try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%S.%fZ') diff --git a/src/common/contacts.py b/src/common/contacts.py index 3d411bf24..83d42f436 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -36,7 +36,7 @@ try: import common.gajim except ImportError as e: if __name__ != "__main__": - raise ImportError(e) + raise ImportError(str(e)) class XMPPEntity(object): """ diff --git a/src/common/ged.py b/src/common/ged.py index d46214fc5..79b5b3e95 100644 --- a/src/common/ged.py +++ b/src/common/ged.py @@ -79,7 +79,7 @@ class GlobalEventsDispatcher(object): if event_name in self.handlers: try: self.handlers[event_name].remove((priority, handler)) - except ValueError as error: + except ValueError: log.warn('''Function (%s) with priority "%s" never registered as handler of event "%s". Couldn\'t remove. Error: %s''' %(handler, priority, event_name, error)) @@ -94,7 +94,7 @@ class GlobalEventsDispatcher(object): return True except NodeProcessed: node_processed = True - except Exception as e: + except Exception: log.error('Error while running an even handler: %s' % \ handler) traceback.print_exc() diff --git a/src/common/helpers.py b/src/common/helpers.py index d648a3367..791935aa5 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -915,7 +915,8 @@ def get_auth_sha(sid, initiator, target): """ Return sha of sid + initiator + target used for proxy auth """ - return hashlib.sha1("%s%s%s" % (sid, initiator, target)).hexdigest() + return hashlib.sha1(("%s%s%s" % (sid, initiator, target)).encode('utf-8')).\ + hexdigest() def remove_invalid_xml_chars(string): if string: @@ -1545,9 +1546,9 @@ def _get_img_proxy(attrs, proxy): alt = attrs.get('alt', '') if alt: alt += '\n' - if ex[0] == pycurl.E_FILESIZE_EXCEEDED: + if ex.errno == pycurl.E_FILESIZE_EXCEEDED: alt += _('Image is too big') - elif ex[0] == pycurl.E_OPERATION_TIMEOUTED: + elif ex.errno == pycurl.E_OPERATION_TIMEOUTED: alt += _('Timeout loading image') else: alt += _('Error loading image') diff --git a/src/common/idle.py b/src/common/idle.py index c2cccdd4b..9e475c47d 100644 --- a/src/common/idle.py +++ b/src/common/idle.py @@ -68,7 +68,7 @@ try: rootwindow = libX11.XDefaultRootWindow(dpy_p) xss_available = True -except OSError as e: +except OSError: # Logging? xss_available = False diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index c050cf6b3..c7636d3d1 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -95,8 +95,8 @@ class JingleFileTransfer(JingleContent): if gajim.contacts.is_gc_contact(session.connection.name, session.peerjid): roomjid = session.peerjid.split('/')[0] - dstaddr = hashlib.sha1('%s%s%s' % (self.file_props['sid'], - session.ourjid, roomjid)).hexdigest() + dstaddr = hashlib.sha1(('%s%s%s' % (self.file_props['sid'], + session.ourjid, roomjid)).encode('utf-8')).hexdigest() self.file_props.dstaddr = dstaddr self.state = STATE_NOT_STARTED self.states = {STATE_INITIALIZED : StateInitialized(self), diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index 3897e48cc..497f7e216 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -105,13 +105,13 @@ class JingleRTPContent(JingleContent): try: bin = gst.parse_bin_from_description(pipeline, True) return bin - except GError as error_str: + except GError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.session.connection, level='error', pri_txt=_('%s configuration error') % text.capitalize(), sec_txt=_("Couldn't setup %s. Check your configuration.\n\n" "Pipeline was:\n%s\n\nError was:\n%s") % (text, pipeline, - error_str))) + str(e)))) raise JingleContentSetupException def add_remote_candidates(self, candidates): diff --git a/src/common/logger.py b/src/common/logger.py index 3ce6fab62..69745c7e7 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -256,7 +256,7 @@ class Logger: self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) self.con.commit() - except sqlite.IntegrityError as e: + except sqlite.IntegrityError: # Jid already in DB, maybe added by another instance. re-read DB self.get_jids_already_in_db() return self.get_jid_id(jid, typestr) @@ -580,7 +580,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -624,7 +624,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -653,7 +653,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] @@ -694,7 +694,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] days_with_logs = [] @@ -736,7 +736,7 @@ class Logger: else: try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = ?' @@ -762,7 +762,7 @@ class Logger: """ try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = %s' % jid_id @@ -802,7 +802,7 @@ class Logger: for user in family: try: jid_id = self.get_jid_id(user['jid']) - except exceptions.PysqliteOperationalError as e: + except exceptions.PysqliteOperationalError: continue where_sql += 'jid_id = ?' jid_tuple += (jid_id,) diff --git a/src/common/optparser.py b/src/common/optparser.py index 520bd94d0..95f59c674 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -644,7 +644,7 @@ class OptionsParser: ''' ) con.commit() - except sqlite.OperationalError as e: + except sqlite.OperationalError: pass con.close() gajim.config.set('version', '0.11.4.4') diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index db81598dd..1d0fe6486 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -310,7 +310,7 @@ class HostTester(Socks5, IdleObject): # read auth response if buff is None or len(buff) != 2: return None - version, method = struct.unpack('!BB', buff[:2]) + version, method = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or method == 0xff: self.pollend() return @@ -334,7 +334,7 @@ class HostTester(Socks5, IdleObject): self._send = self._sock.send self._recv = self._sock.recv except Exception as ee: - errnum = ee[0] + errnum = ee.errno # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect @@ -431,7 +431,7 @@ class ReceiverTester(Socks5, IdleObject): # read auth response if buff is None or len(buff) != 2: return None - version, method = struct.unpack('!BB', buff[:2]) + version, method = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or method == 0xff: self.pollend() return @@ -443,7 +443,7 @@ class ReceiverTester(Socks5, IdleObject): # read connect response if buff is None or len(buff) < 2: return None - version, reply = struct.unpack('!BB', buff[:2]) + version, reply = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or reply != 0x00: self.pollend() return diff --git a/src/common/socks5.py b/src/common/socks5.py index c57be17a5..c9768f3e7 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -464,7 +464,7 @@ class Socks5: self._server = ai[4] break except socket.error as e: - if not isinstance(e, basestring) and e[0] == EINPROGRESS: + if e.errno == EINPROGRESS: break # for all other errors, we try other addresses continue @@ -482,7 +482,7 @@ class Socks5: self._send=self._sock.send self._recv=self._sock.recv except Exception as ee: - errnum = ee[0] + errnum = ee.errno self.connect_timeout += 1 if errnum == 111 or self.connect_timeout > 1000: self.queue._connection_refused(self.streamhost, self.file_props, @@ -581,7 +581,7 @@ class Socks5: """ received = '' try: - add = self._recv(64) + add = self._recv(64).decode('utf-8') except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request : ' + repr(e)) @@ -603,7 +603,7 @@ class Socks5: OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception as e: + except Exception: self.disconnect() return len(raw_data) @@ -614,7 +614,7 @@ class Socks5: else: try: self.open_file_for_reading() - except IOError as e: + except IOError: self.state = 8 # end connection self.disconnect() self.file_props.error = -7 # unable to read from file @@ -629,7 +629,7 @@ class Socks5: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception as e: - if e.args[0] not in (EINTR, ENOBUFS, EWOULDBLOCK): + if e.errno not in (EINTR, ENOBUFS, EWOULDBLOCK): # peer stopped reading self.state = 8 # end connection self.disconnect() @@ -671,7 +671,7 @@ class Socks5: if self.remaining_buff != '': try: fd = self.get_fd() - except IOError as e: + except IOError: self.disconnect(False) self.file_props.error = -6 # file system error return 0 @@ -692,12 +692,12 @@ class Socks5: else: try: fd = self.get_fd() - except IOError as e: + except IOError: self.disconnect(False) self.file_props.error = -6 # file system error return 0 try: - buff = self._recv(MAX_BUFF_LEN) + buff = self._recv(MAX_BUFF_LEN).decode('utf-8') except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) @@ -718,7 +718,7 @@ class Socks5: return 0 try: fd.write(buff) - except IOError as e: + except IOError: self.rem_fd(fd) self.disconnect() self.file_props.error = -6 # file system error @@ -780,9 +780,9 @@ class Socks5: """ auth_mechanisms = [] try: - num_auth = struct.unpack('!xB', buff[:2])[0] + num_auth = struct.unpack('!xB', buff[:2].encode('utf-8'))[0] for i in list(range(num_auth)): - mechanism, = struct.unpack('!B', buff[1 + i]) + mechanism, = struct.unpack('!B', buff[1 + i].encode('utf-8')) auth_mechanisms.append(mechanism) except Exception: return None @@ -799,8 +799,8 @@ class Socks5: Connect request by domain name """ buff = struct.pack('!BBBBB%dsBB' % len(self.host), - 0x05, 0x01, 0x00, 0x03, len(self.host), self.host, self.port >> 8, - self.port & 0xff) + 0x05, 0x01, 0x00, 0x03, len(self.host), self.host.encode('utf-8'), + self.port >> 8, self.port & 0xff) return buff def _get_request_buff(self, msg, command = 0x01): @@ -809,27 +809,30 @@ class Socks5: 0096) """ buff = struct.pack('!BBBBB%dsBB' % len(msg), - 0x05, command, 0x00, 0x03, len(msg), msg, 0, 0) + 0x05, command, 0x00, 0x03, len(msg), msg.encode('utf-8'), 0, 0) return buff def _parse_request_buff(self, buff): try: # don't trust on what comes from the outside - req_type, host_type, = struct.unpack('!xBxB', buff[:4]) + req_type, host_type, = struct.unpack('!xBxB', buff[:4].encode( + 'utf-8')) if host_type == 0x01: - host_arr = struct.unpack('!iiii', buff[4:8]) + host_arr = struct.unpack('!iiii', buff[4:8].encode('utf-8')) host, = '.'.join(str(s) for s in host_arr) host_len = len(host) elif host_type == 0x03: - host_len, = struct.unpack('!B', buff[4]) - host, = struct.unpack('!%ds' % host_len, buff[5:5 + host_len]) + host_len, = struct.unpack('!B', buff[4].encode('utf-8')) + host, = struct.unpack('!%ds' % host_len, buff[5:5 + host_len].\ + encode('utf-8')) portlen = len(buff[host_len + 5:]) if portlen == 1: - port, = struct.unpack('!B', buff[host_len + 5]) + port, = struct.unpack('!B', buff[host_len + 5].encode('utf-8')) elif portlen == 2: - port, = struct.unpack('!H', buff[host_len + 5:]) + port, = struct.unpack('!H', buff[host_len + 5:].encode('utf-8')) # file data, comes with auth message (Gaim bug) else: - port, = struct.unpack('!H', buff[host_len + 5: host_len + 7]) + port, = struct.unpack('!H', buff[host_len + 5: host_len + 7].\ + encode('utf-8')) self.remaining_buff = buff[host_len + 7:] except Exception: return (None, None, None) @@ -840,13 +843,13 @@ class Socks5: Connect response: version, auth method """ try: - buff = self._recv() + buff = self._recv().decode('utf-8') except (SSL.WantReadError, SSL.WantWriteError, SSL.WantX509LookupError) as e: log.info("SSL rehandshake request : " + repr(e)) raise e try: - version, method = struct.unpack('!BB', buff) + version, method = struct.unpack('!BB', buff.encode('utf-8')) except Exception: version, method = None, None if version != 0x05 or method == 0xff: @@ -864,8 +867,8 @@ class Socks5: """ Get sha of sid + Initiator jid + Target jid """ - return hashlib.sha1('%s%s%s' % (self.sid, self.initiator, - self.target)).hexdigest() + return hashlib.sha1(('%s%s%s' % (self.sid, self.initiator, + self.target)).encode('utf-8')).hexdigest() class Socks5Sender(IdleObject): @@ -1151,7 +1154,7 @@ class Socks5Client(Socks5): if self.state == 2: # read auth response if buff is None or len(buff) != 2: return None - version, method = struct.unpack('!BB', buff[:2]) + version, method = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or method == 0xff: self.disconnect() elif self.state == 4: # get approve of our request @@ -1160,18 +1163,23 @@ class Socks5Client(Socks5): sub_buff = buff[:4] if len(sub_buff) < 4: return None - version, address_type = struct.unpack('!BxxB', buff[:4]) + version, address_type = struct.unpack('!BxxB', buff[:4].encode( + 'utf-8')) addrlen = 0 if address_type == 0x03: addrlen = ord(buff[4]) - address = struct.unpack('!%ds' % addrlen, buff[5:addrlen + 5]) + address = struct.unpack('!%ds' % addrlen, buff[5:addrlen + 5].\ + encode('utf-8')) portlen = len(buff[addrlen + 5:]) if portlen == 1: - port, = struct.unpack('!B', buff[addrlen + 5]) + port, = struct.unpack('!B', buff[addrlen + 5].encode( + 'utf-8')) elif portlen == 2: - port, = struct.unpack('!H', buff[addrlen + 5:]) + port, = struct.unpack('!H', buff[addrlen + 5:].encode( + 'utf-8')) else: # Gaim bug :) - port, = struct.unpack('!H', buff[addrlen + 5:addrlen + 7]) + port, = struct.unpack('!H', buff[addrlen + 5:addrlen + 7].\ + encode('utf-8')) self.remaining_buff = buff[addrlen + 7:] self.state = 5 # for senders: init file_props and send '\n' if self.queue.on_success: @@ -1347,7 +1355,7 @@ class Socks5Listener(IdleObject): self._serv = OpenSSL.SSL.Connection( jingle_xtls.get_context('server'), self._serv) except socket.error as e: - if e.args[0] == EAFNOSUPPORT: + if e.errno == EAFNOSUPPORT: self.ai = None continue raise diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 3d5b43f43..07f82092a 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -357,8 +357,8 @@ class P2PConnection(IdleObject, PlugIn): self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror as e: - log.info('Lookup failure for %s: %s[%s]', host, e[1], - repr(e[0]), exc_info=True) + log.info('Lookup failure for %s: %s', host, str(e), + exc_info=True) else: self.connect_to_next_ip() @@ -449,7 +449,8 @@ class P2PConnection(IdleObject, PlugIn): self._sock.connect(self._server) self._sock.setblocking(False) except Exception as ee: - (errnum, errstr) = ee + errnum = ee.errno + errstr = ee.strerror errors = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK) if 'WSAEINVAL' in errno.__dict__: errors += (errno.WSAEINVAL,) @@ -489,8 +490,7 @@ class P2PConnection(IdleObject, PlugIn): # get as many bites, as possible, but not more than RECV_BUFSIZE received = self._sock.recv(MAX_BUFF_LEN) except Exception as e: - if len(e.args) > 0 and isinstance(e.args[0], int): - errnum = e[0] + errnum = e.errno # "received" will be empty anyhow if errnum == socket.SSL_ERROR_WANT_READ: pass @@ -560,7 +560,7 @@ class P2PConnection(IdleObject, PlugIn): self._on_send() except socket.error as e: - if e[0] == socket.SSL_ERROR_WANT_WRITE: + if e.errno == socket.SSL_ERROR_WANT_WRITE: return True if self.state < 0: self.disconnect() diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index 73f091928..e2a7c1fd4 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -22,7 +22,7 @@ log = logging.getLogger('gajim.c.z.zeroconf_avahi') try: import dbus.exceptions -except ImportError as e: +except ImportError: pass from common.zeroconf.zeroconf import C_BARE_NAME, C_INTERFACE, C_PROTOCOL, C_DOMAIN diff --git a/src/common/zeroconf/zeroconf_bonjour.py b/src/common/zeroconf/zeroconf_bonjour.py index 7d1566e34..593fa95b0 100644 --- a/src/common/zeroconf/zeroconf_bonjour.py +++ b/src/common/zeroconf/zeroconf_bonjour.py @@ -24,7 +24,7 @@ from common.zeroconf.zeroconf import C_BARE_NAME, C_DOMAIN try: import pybonjour -except ImportError as e: +except ImportError: pass @@ -283,7 +283,7 @@ class Zeroconf: try: self.browse_sdRef = pybonjour.DNSServiceBrowse(regtype=self.stype, domain=domain, callBack=self.browse_callback) except pybonjour.BonjourError as e: - self.error_CB("Error while browsing: %s" % e) + self.error_CB("Error while browsing: %s" % str(e)) def browse_loop(self): ready = select.select([self.browse_sdRef], [], [], 0) diff --git a/src/config.py b/src/config.py index 597c74876..fadc0f1ba 100644 --- a/src/config.py +++ b/src/config.py @@ -3385,7 +3385,7 @@ class ManageBookmarksWindow: nick = self.nick_entry.get_text() try: nick = helpers.parse_resource(nick) - except helpers.InvalidFormat as e: + except helpers.InvalidFormat: dialogs.ErrorDialog(_('Invalid nickname'), _('Character not allowed')) self.nick_entry.set_text(model[iter_][6]) @@ -3424,7 +3424,7 @@ class ManageBookmarksWindow: self.server_entry.get_text().strip() try: room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat as e: + except helpers.InvalidFormat: dialogs.ErrorDialog(_('Invalid room'), _('Character not allowed')) self.room_entry.set_text(model[iter_][2].split('@')[0]) diff --git a/src/dialogs.py b/src/dialogs.py index 1f705a344..17ecd19e7 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -2755,7 +2755,7 @@ class NewChatDialog(InputDialog): try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat as e: - ErrorDialog(_('Invalid JID'), e[0]) + ErrorDialog(_('Invalid JID'), str(e)) return except: ErrorDialog(_('Invalid JID'), _('Unable to parse "%s".') % jid) diff --git a/src/gajim.py b/src/gajim.py index be2a01d00..d6ffabff4 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -132,7 +132,7 @@ def parseOpts(): longargs += ' sm-client-id= sm-client-state-file= sm-disable' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] except getopt.error as msg1: - print(msg1) + print(str(msg1)) print('for help use --help') sys.exit(2) for o, a in opts: diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 8b29f2065..5f236ae86 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -349,10 +349,10 @@ def parse_server_xml(path_to_file): return handler.servers # handle exception if unable to open file except IOError as message: - print(_('Error reading file:') + message, file=sys.stderr) + print(_('Error reading file:') + str(message), file=sys.stderr) # handle exception parsing file except xml.sax.SAXParseException as message: - print(_('Error parsing file:') + message, file=sys.stderr) + print(_('Error parsing file:') + str(message), file=sys.stderr) def set_unset_urgency_hint(window, unread_messages_no): """ diff --git a/src/htmltextview.py b/src/htmltextview.py index d52ef21e3..df9557be2 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -766,7 +766,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): #self._insert_text('\u2550'*40) self._jump_line() except Exception as e: - log.debug(str('Error in hr'+e)) + log.debug('Error in hr' + str(e)) elif name in LIST_ELEMS: self.list_counters.pop() elif name == 'li': diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 71c0c2e61..ed8a9d366 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -427,9 +427,9 @@ class PluginManager(object): try: module = __import__(module_name) except ValueError as value_error: - log.debug(value_error) + log.debug(str(value_error)) except ImportError as import_error: - log.debug(import_error) + log.debug(str(import_error)) elif os.path.isdir(file_path) and scan_dirs: module_name = elem_name @@ -440,9 +440,9 @@ class PluginManager(object): try: module = __import__(module_name) except ValueError as value_error: - log.debug(value_error) + log.debug(str(value_error)) except ImportError as import_error: - log.debug(import_error) + log.debug(str(import_error)) if module is None: @@ -477,21 +477,21 @@ class PluginManager(object): plugins_found.append(module_attr) - except TypeError as type_error: + except TypeError: # set plugin localization try: module_attr._ = _ - except AttributeError as type_error: + except AttributeError: pass - except configparser.NoOptionError as type_error: + except configparser.NoOptionError: # all fields are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. all fields are required!')) - except configparser.NoSectionError as type_error: + except configparser.NoSectionError: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. info section are required!')) - except configparser.MissingSectionHeaderError as type_error: + except configparser.MissingSectionHeaderError: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. section are required!')) @@ -504,10 +504,10 @@ class PluginManager(object): ''' try: zip_file = zipfile.ZipFile(zip_filename) - except zipfile.BadZipfile as e: + except zipfile.BadZipfile: # it is not zip file raise PluginsystemError(_('Archive corrupted')) - except IOError as e: + except IOError: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): diff --git a/src/plugins/plugins_i18n.py b/src/plugins/plugins_i18n.py index 9eb983eff..91ee811dc 100644 --- a/src/plugins/plugins_i18n.py +++ b/src/plugins/plugins_i18n.py @@ -36,6 +36,6 @@ if os.name != 'nt': try: t = gettext.translation(APP, plugins_locale_dir) _ = t.gettext -except IOError as msg: +except IOError: from common import i18n _ = gettext.gettext diff --git a/src/remote_control.py b/src/remote_control.py index da7e50015..e91eebe99 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -743,7 +743,7 @@ class SignalObject(dbus.service.Object): def prefs_store(self): try: gajim.interface.save_config() - except Exception as e: + except Exception: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) diff --git a/test/unit/test_socks5.py b/test/unit/test_socks5.py index 86f46d033..f137d7aed 100644 --- a/test/unit/test_socks5.py +++ b/test/unit/test_socks5.py @@ -15,24 +15,21 @@ from common import jingle_xtls class fake_sock(Mock): def __init__(self, sockobj): - Mock.__init__(self) + Mock.__init__(self) - self.sockobj = sockobj + self.sockobj = sockobj def setup_stream(self): - sha1 = self.sockobj._get_sha1_auth() + sha1 = self.sockobj._get_sha1_auth() + + self.incoming = [] + self.incoming.append(self.sockobj._get_auth_response()) + self.incoming.append(self.sockobj._get_request_buff(sha1, 0x00)) + self.outgoing = [] + self.outgoing.append(self.sockobj._get_auth_buff()) + self.outgoing.append(self.sockobj._get_request_buff(sha1)) - self.incoming = [] - self.incoming.append(self.sockobj._get_auth_response()) - self.incoming.append( - self.sockobj._get_request_buff(sha1, 0x00) - ) - self.outgoing = [] - self.outgoing.append(self.sockobj._get_auth_buff()) - self.outgoing.append(self.sockobj._get_request_buff( - sha1 - )) def switch_stream(self): # Roles are reversed, client will be expecting server stream # and server will be expecting client stream From 0312b6275a6f21f8879f89c01c1f617ae4f1fca8 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 09:52:09 +0100 Subject: [PATCH 084/592] itervalues / iterkeys doesn't exist anymore --- src/command_system/framework.py | 2 +- src/command_system/implementation/standard.py | 6 +++--- src/common/configpaths.py | 2 +- src/common/jingle_session.py | 6 +++--- src/filetransfers_window.py | 2 +- src/network_manager_listener.py | 8 ++++---- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/command_system/framework.py b/src/command_system/framework.py index 29ebe5c83..1e5e06010 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -143,7 +143,7 @@ class CommandProcessor(object): def list_commands(self): commands = list_commands(self.COMMAND_HOST) commands = dict(commands) - return sorted(set(commands.itervalues())) + return sorted(commands.values()) class Command(object): diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 7bcd400a4..d792d0a72 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -135,7 +135,7 @@ class StandardCommonCommands(CommandContainer): def status(self, status, message): if status not in ('online', 'away', 'chat', 'xa', 'dnd'): raise CommandError("Invalid status given") - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if not gajim.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue @@ -149,7 +149,7 @@ class StandardCommonCommands(CommandContainer): if not message: message = _("Away") - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if not gajim.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue @@ -163,7 +163,7 @@ class StandardCommonCommands(CommandContainer): if not message: message = _("Available") - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if not gajim.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 75df82e42..1f61e8c40 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -131,7 +131,7 @@ class ConfigPaths: return default def items(self): - for key in self.paths.iterkeys(): + for key in self.paths.keys(): yield (key, self[key]) def init(self, root=None): diff --git a/src/common/jingle_session.py b/src/common/jingle_session.py index bd9a0130b..ffcff64dd 100644 --- a/src/common/jingle_session.py +++ b/src/common/jingle_session.py @@ -270,8 +270,8 @@ class JingleSession(object): """ Return True when all codecs and candidates are ready (for all contents) """ - return (any((content.is_ready() for content in self.contents.itervalues())) - and self.accepted) + return (any((content.is_ready() for content in self.contents.values())) + and self.accepted) def accept_session(self): """ @@ -589,7 +589,7 @@ class JingleSession(object): """ Broadcast the stanza to all content handlers """ - for content in self.contents.itervalues(): + for content in self.contents.values(): content.on_stanza(stanza, None, error, action) def __parse_contents(self, jingle): diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 42b0f3851..609a015e6 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -327,7 +327,7 @@ class FileTransfersWindow: dialog.set_default_response(Gtk.ResponseType.OK) desc_hbox = Gtk.HBox(False, 5) - desc_hbox.pack_start(Gtk.Label(_('Description: ', True, True, 0)), False, False, 0) + desc_hbox.pack_start(Gtk.Label(_('Description: ')), False, False, 0) desc_hbox.pack_start(win, True, True, 0) dialog.vbox.pack_start(desc_hbox, False, False, 0) diff --git a/src/network_manager_listener.py b/src/network_manager_listener.py index 85acc6b75..204dd1154 100644 --- a/src/network_manager_listener.py +++ b/src/network_manager_listener.py @@ -29,7 +29,7 @@ def device_now_active(self, *args): """ For Network Manager 0.6 """ - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.time_to_reconnect: connection._reconnect() @@ -38,7 +38,7 @@ def device_no_longer_active(self, *args): """ For Network Manager 0.6 """ - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.connected > 1: connection._disconnectedReconnCB() @@ -49,12 +49,12 @@ def state_changed(state): """ nm_state = props.Get("org.freedesktop.NetworkManager", "State") if nm_state == 3 or nm_state == 70: - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.time_to_reconnect: connection._reconnect() else: - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.connected > 1: connection._disconnectedReconnCB() From 7b82ab7b5dc0f90557b51c9dcfbee43ccbb7330c Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 09:54:17 +0100 Subject: [PATCH 085/592] close files after they are opened --- src/common/jingle_xtls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index 1c61fb610..02ec551f6 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -86,6 +86,7 @@ def load_cert_file(cert_path, cert_store): '%s' % cert_path) begin = -1 i += 1 + f.close() def get_context(fingerprint, verify_cb=None): """ From c0a1e9ee8800898055dcaea365eba5135ec3ebe6 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 10:07:10 +0100 Subject: [PATCH 086/592] fix some pointer in filetranfer window --- src/filetransfers_window.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 609a015e6..31df4b711 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -757,7 +757,7 @@ class FileTransfersWindow: def on_transfers_list_motion_notify_event(self, widget, event): pointer = self.tree.get_pointer() props = widget.get_path_at_pos(int(event.x), int(event.y)) - self.height_diff = pointer[2] - int(event.y) + self.height_diff = pointer[1] - int(event.y) if self.tooltip.timeout > 0: if not props or self.tooltip.id != props[0]: self.tooltip.hide_tooltip() @@ -775,7 +775,7 @@ class FileTransfersWindow: if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row self.tooltip.timeout = GObject.timeout_add(500, - self.show_tooltip, widget) + self.show_tooltip, widget) def on_transfers_list_leave_notify_event(self, widget=None, event=None): if event is not None: @@ -783,7 +783,7 @@ class FileTransfersWindow: elif self.height_diff is 0: return pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[1], pointer[2] - self.height_diff) + props = self.tree.get_path_at_pos(pointer[0], pointer[1] - self.height_diff) if self.tooltip.timeout > 0: if not props or self.tooltip.id == props[0]: self.tooltip.hide_tooltip() @@ -952,8 +952,8 @@ class FileTransfersWindow: self.tooltip.hide_tooltip() return pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[1], - pointer[2] - self.height_diff) + props = self.tree.get_path_at_pos(pointer[0], + pointer[1] - self.height_diff) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: @@ -965,7 +965,7 @@ class FileTransfersWindow: # position of the treeview on the screen position = widget.get_window().get_origin()[1:] self.tooltip.show_tooltip(file_props, rect.height, - position[1] + rect.y + self.height_diff) + position[1] + rect.y + self.height_diff) else: self.tooltip.hide_tooltip() From db06bddb814020b881b18a875969085c1e505474 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 10:07:35 +0100 Subject: [PATCH 087/592] correctly close file after it's opened --- src/common/jingle_xtls.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index 02ec551f6..8ceb8dc15 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -114,11 +114,11 @@ def get_context(fingerprint, verify_cb=None): def send_cert(con, jid_from, sid): certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \ '.cert' - certfile = open(certpath, 'r') certificate = '' - for line in certfile.readlines(): - if not line.startswith('-'): - certificate += line + with open(certpath, 'r') as certfile: + for line in certfile.readlines(): + if not line.startswith('-'): + certificate += line iq = nbxmpp.Iq('result', to=jid_from); iq.setAttr('id', sid) From 936d538eba99a15122e45423a534b776dadb1bc7 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 10:09:15 +0100 Subject: [PATCH 088/592] correctly open / close file when computing hash --- src/common/jingle_ft.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index c7636d3d1..652ffd990 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -149,12 +149,13 @@ class JingleFileTransfer(JingleContent): if self.file_props.algo == None: return try: - file_ = open(self.file_props.file_name, 'r') + file_ = open(self.file_props.file_name, 'rb') except: # can't open file return h = nbxmpp.Hashes() hash_ = h.calculateHash(self.file_props.algo, file_) + file_.close() # DEBUG #hash_ = '1294809248109223' if not hash_: From 0519253ff81b6cf055d38435230bc1e30a1221f1 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 10:38:39 +0100 Subject: [PATCH 089/592] fix traceback with Gtk3.6 --- src/gui_interface.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui_interface.py b/src/gui_interface.py index 0e6708f46..4871bd746 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1932,7 +1932,8 @@ class Interface: # Calculate the side lenght of the popup to make it a square size = int(round(math.sqrt(len(self.emoticons_images)))) for image in self.emoticons_images: - item = Gtk.MenuItem() + # In Gtk 3.6, Gtk.MenuItem() doesn't contain a label child + item = Gtk.MenuItem('q') img = Gtk.Image() if isinstance(image[1], GdkPixbuf.PixbufAnimation): img.set_from_animation(image[1]) From ca2c3ec4f3a3e6fe9d8028988b68660416e30632 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Sat, 5 Jan 2013 13:29:23 +0400 Subject: [PATCH 090/592] prevent tb in tooltips and gtk warning in roster --- src/roster_window.py | 14 +++++++------- src/tooltips.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 1f591c37d..687f0b252 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1498,7 +1498,7 @@ class RosterWindow: self.tree.set_cursor(path) def _readjust_expand_collapse_state(self): - def func(model, path, iter_): + def func(model, path, iter_, param): type_ = model[iter_][C_TYPE] acct = model[iter_][C_ACCOUNT] jid = model[iter_][C_JID] @@ -2288,7 +2288,7 @@ class RosterWindow: self.model[child_iterA][C_AVATAR_PIXBUF] = empty_pixbuf if account in gajim.con_types: gajim.con_types[account] = None - for jid in gajim.contacts.get_jid_list(account): + for jid in list(gajim.contacts.get_jid_list(account)): lcontact = gajim.contacts.get_contacts(account, jid) ctrl = gajim.interface.msg_win_mgr.get_gc_control(jid, account) @@ -3520,7 +3520,7 @@ class RosterWindow: Gdk.ModifierType.MOD1_MASK)) and Gdk.keyval_to_unicode(event.keyval): # if we got unicode symbol without ctrl / alt num = Gdk.keyval_to_unicode(event.keyval) - self.enable_rfilter(unichr(num)) + self.enable_rfilter(chr(num)) elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.get_state() & Gdk.ModifierType.SHIFT_MASK and event.keyval == Gdk.KEY_U: self.enable_rfilter('') @@ -4232,7 +4232,7 @@ class RosterWindow: path = model.get_path(titer) self.tree.expand_row(path, False) elif type_ == 'account': - account = accounts[0] # There is only one cause we don't use merge + account = list(accounts)[0] # There is only one cause we don't use merge if account in self.collapsed_rows: self.collapsed_rows.remove(account) self.draw_account(account) @@ -4435,11 +4435,11 @@ class RosterWindow: self.refilter_shown_roster_items() # select first row self.tree.get_selection().unselect_all() - def _func(model, path, iter_): + def _func(model, path, iter_, param): if model[iter_][C_TYPE] == 'contact' and self.rfilter_string in \ model[iter_][C_NAME].lower(): col = self.tree.get_column(0) - self.tree.set_cursor_on_cell(path, col) + self.tree.set_cursor_on_cell(path, col, None, False) return True self.modelfilter.foreach(_func, None) @@ -5519,7 +5519,7 @@ class RosterWindow: if len(gajim.connections) == 0: # user has no accounts advanced_menuitem.set_sensitive(False) elif len(gajim.connections) == 1: # we have one acccount - account = gajim.connections.keys()[0] + account = list(gajim.connections.keys())[0] advanced_menuitem_menu = \ self.get_and_connect_advanced_menuitem_menu(account) self.advanced_menus.append(advanced_menuitem_menu) diff --git a/src/tooltips.py b/src/tooltips.py index 445235c6a..2d634b070 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -504,9 +504,9 @@ class RosterTooltip(NotificationAreaTooltip): if contact.resource: num_resources += 1 if contact.priority in contacts_dict: - contacts_dict[contact.priority].append(contact) + contacts_dict[int(contact.priority)].append(contact) else: - contacts_dict[contact.priority] = [contact] + contacts_dict[int(contact.priority)] = [contact] if num_resources > 1: properties.append((_('Status: '), ' ')) From e0b63d4a4004bfa12fff0a5770cb391574837011 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 10:58:51 +0100 Subject: [PATCH 091/592] fix gnomekeyring import --- src/common/passwords.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/passwords.py b/src/common/passwords.py index 4ed62d7c3..a3801b66e 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -200,7 +200,7 @@ def get_storage(): global GnomeKeyring try: gir = __import__('gi.repository', globals(), locals(), - ['GnomeKeyring'], 0) + ['GnomeKeyring'], 1) GnomeKeyring = gir.GnomeKeyring except ImportError: pass From 9f64f04b37eec89c64f8851be99ed356b081f220 Mon Sep 17 00:00:00 2001 From: Denis Fomin Date: Sat, 5 Jan 2013 18:29:55 +0400 Subject: [PATCH 092/592] fix traceback in xml console --- src/dialogs.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 17ecd19e7..2c314e428 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -3370,8 +3370,7 @@ class XMLConsoleWindow: self.account) return begin_iter, end_iter = self.input_tv_buffer.get_bounds() - stanza = self.input_tv_buffer.get_text(begin_iter, end_iter, True).decode( - 'utf-8') + stanza = self.input_tv_buffer.get_text(begin_iter, end_iter, True) if stanza: gajim.connections[self.account].send_stanza(stanza) self.input_tv_buffer.set_text('') # we sent ok, clear the textview From b541736407ccbe9246db549a2984d1d11261b887 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 5 Jan 2013 15:32:53 +0100 Subject: [PATCH 093/592] fix disco window (+ remove cmp() + some GTK3 changements) --- data/gui/service_discovery_window.ui | 90 +++++++++++++------ src/command_system/framework.py | 6 +- src/dialogs.py | 4 +- src/disco.py | 127 ++++++++++++++------------- src/groupchat_control.py | 2 +- src/htmltextview.py | 21 ++++- 6 files changed, 154 insertions(+), 96 deletions(-) diff --git a/data/gui/service_discovery_window.ui b/data/gui/service_discovery_window.ui index 46c83e4d0..646f85705 100644 --- a/data/gui/service_discovery_window.ui +++ b/data/gui/service_discovery_window.ui @@ -1,7 +1,6 @@ - + - - + @@ -9,27 +8,31 @@ + False 6 Service Discovery 550 420 dialog - + True - vertical + False 6