merge GTK3 branch in default

This commit is contained in:
Yann Leboulanger 2014-03-23 20:03:03 +01:00
commit 0d869cb192
167 changed files with 19080 additions and 16489 deletions

View File

@ -14,8 +14,9 @@
<h2>Runtime Requirements</h2>
<ul>
<li>python2.5 or higher</li>
<li>pygtk2.22 or higher</li>
<li>python2.7 or higher</li>
<li>python-gi</li>
<li>gir1.2-gtk-3.0</li>
<li>python-nbxmpp</li>
</ul>
@ -28,7 +29,7 @@
<li>For zeroconf (bonjour), the "enable link-local messaging" checkbox, you need dbus-glib, python-avahi</li>
<li>dnsutils (or whatever package provides the nslookup binary) for SRV support</li>
<li>gtkspell and aspell-LANG where lang is your locale eg. en, fr etc</li>
<li>gnome-python-desktop (for GnomeKeyring support as password storage)</li>
<li>gir1.2-gnomekeyring-1.0 for GnomeKeyring support as password storage</li>
<li>kwalletcli (for support of KDE Wallet as password storage)</li>
<li>notification-daemon or notify-python (and D-Bus) to get cooler popups</li>
<li>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.</li>

View File

@ -22,6 +22,9 @@ rename exe.win32-2.7 bin
copy ..\LIBEAY32.dll bin
copy ..\SSLEAY32.dll bin
REM for snarl plugin
xcopy ..\win32com bin\win32com /e /i
mkdir bin\gtk
cd ../src/gtk
hg archive ..\..\gajim_built\bin\gtk

View File

@ -12,7 +12,9 @@ soundsdir = $(pkgdatadir)/data/sounds
sounds_DATA = $(srcdir)/sounds/*.wav
otherdir = $(pkgdatadir)/data/other
other_DATA = other/servers.xml other/cacerts.pem
other_DATA = other/servers.xml other/dh4096.pem
# other/cacert.pem is used only on Windows. On Unix platforms
# use CA certificates installed in /etc/ssl/certs
man_MANS = gajim.1 gajim-remote.1 gajim-history-manager.1

View File

@ -40,7 +40,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="join_group_chat_menuitem">
<property name="label" translatable="yes">Join _Group Chat...</property>
<property name="label" translatable="yes">Join _Group Chat</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image4</property>
@ -93,7 +93,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="edit_account_menuitem">
<property name="label" translatable="yes">_Modify Account</property>
<property name="label" translatable="yes">_Modify Account...</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image8</property>

View File

@ -1,31 +1,54 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-preferences</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">None</col>
</row>
</data>
</object>
<object class="GtkWindow" id="account_creation_wizard_window">
<property name="can_focus">False</property>
<property name="border_width">12</property>
<property name="title" translatable="yes">Gajim: Account Creation Wizard</property>
<property name="resizable">False</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_wizard_window_destroy"/>
<signal name="destroy" handler="on_wizard_window_destroy" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox77">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkNotebook" id="notebook">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_tabs">False</property>
<property name="show_border">False</property>
<child>
<object class="GtkVBox" id="vbox78">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label256">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">You need to have an account in order to connect
to the Jabber network.</property>
@ -39,18 +62,20 @@ to the Jabber network.</property>
<child>
<object class="GtkFrame" id="frame33">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment68">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">5</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox83">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkRadioButton" id="use_existing_account_radiobutton">
@ -59,6 +84,7 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@ -74,6 +100,7 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<property name="group">use_existing_account_radiobutton</property>
</object>
@ -90,6 +117,7 @@ to the Jabber network.</property>
<child type="label">
<object class="GtkLabel" id="label269">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Please choose one of the options below:&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
@ -106,6 +134,7 @@ to the Jabber network.</property>
<child type="tab">
<object class="GtkLabel" id="label259">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="tab_fill">False</property>
@ -114,12 +143,13 @@ to the Jabber network.</property>
<child>
<object class="GtkVBox" id="register_vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label270">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Please fill in the data for your existing account&lt;/b&gt;</property>
<property name="use_markup">True</property>
@ -133,25 +163,30 @@ to the Jabber network.</property>
<child>
<object class="GtkTable" id="table27">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">4</property>
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkEntry" id="username_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="key_press_event" handler="on_username_entry_key_press_event"/>
<signal name="key-press-event" handler="on_username_entry_key_press_event" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label263">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Password:</property>
<property name="use_underline">True</property>
@ -161,7 +196,7 @@ to the Jabber network.</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -173,9 +208,10 @@ to the Jabber network.</property>
<property name="tooltip_text" translatable="yes">If checked, Gajim will remember the password for this account</property>
<property name="use_underline">True</property>
<property name="focus_on_click">False</property>
<property name="xalign">0.5</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_save_password_checkbutton_toggled"/>
<signal name="toggled" handler="on_save_password_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
@ -183,7 +219,7 @@ to the Jabber network.</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -198,12 +234,13 @@ to the Jabber network.</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label262">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Jabber ID:</property>
<property name="use_underline">True</property>
@ -211,30 +248,20 @@ to the Jabber network.</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label">@</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkComboBoxEntry" id="server_comboboxentry">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">3</property>
<property name="right_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
<property name="x_options"/>
</packing>
</child>
<child>
@ -244,8 +271,9 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_anonymous_checkbutton1_toggled"/>
<signal name="toggled" handler="on_anonymous_checkbutton1_toggled" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@ -260,6 +288,7 @@ to the Jabber network.</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -271,6 +300,7 @@ to the Jabber network.</property>
<child type="tab">
<object class="GtkLabel" id="label261">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="position">1</property>
@ -280,12 +310,13 @@ to the Jabber network.</property>
<child>
<object class="GtkVBox" id="vbox105">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label368">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Please select a server&lt;/b&gt;</property>
<property name="use_markup">True</property>
@ -299,10 +330,12 @@ to the Jabber network.</property>
<child>
<object class="GtkHBox" id="hbox2997">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label369">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Server:</property>
<property name="use_underline">True</property>
@ -313,14 +346,6 @@ to the Jabber network.</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBoxEntry" id="server_comboboxentry1">
<property name="visible">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -335,10 +360,12 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@ -349,6 +376,7 @@ to the Jabber network.</property>
<child>
<object class="GtkTable" id="table32">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="n_rows">3</property>
<property name="n_columns">3</property>
@ -357,18 +385,20 @@ to the Jabber network.</property>
<child>
<object class="GtkLabel" id="label381">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Prox_y:</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkComboBox" id="proxies_combobox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">liststore1</property>
<child>
<object class="GtkCellRendererText" id="cellrenderertext1"/>
@ -390,13 +420,13 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_manage_proxies_button_clicked"/>
<signal name="clicked" handler="on_manage_proxies_button_clicked" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="x_options"></property>
<property name="y_options"></property>
<property name="x_options"/>
<property name="y_options"/>
</packing>
</child>
<child>
@ -406,24 +436,27 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_custom_host_port_checkbutton_toggled"/>
<signal name="toggled" handler="on_custom_host_port_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkHBox" id="custom_host_hbox">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label380">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Hostname:</property>
<property name="use_underline">True</property>
@ -441,12 +474,15 @@ to the Jabber network.</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label379">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Port:</property>
<property name="use_underline">True</property>
@ -467,6 +503,7 @@ to the Jabber network.</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@ -484,12 +521,15 @@ to the Jabber network.</property>
<child type="label">
<object class="GtkLabel" id="label378">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Advanced</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@ -501,6 +541,7 @@ to the Jabber network.</property>
<child type="tab">
<object class="GtkLabel" id="label367">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="position">2</property>
@ -510,34 +551,41 @@ to the Jabber network.</property>
<child>
<object class="GtkVBox" id="ssl_vbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-dialog-warning</property>
<property name="icon-size">5</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="ssl_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
@ -551,9 +599,11 @@ SHA1 fingerprint of the certificate:
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
@ -566,6 +616,7 @@ SHA1 fingerprint of the certificate:
<child type="tab">
<object class="GtkLabel" id="label482">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="position">3</property>
@ -575,7 +626,7 @@ SHA1 fingerprint of the certificate:
<child>
<object class="GtkVBox" id="form_vbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
@ -587,6 +638,7 @@ SHA1 fingerprint of the certificate:
<child type="tab">
<object class="GtkLabel" id="label382">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="position">4</property>
@ -596,10 +648,11 @@ SHA1 fingerprint of the certificate:
<child>
<object class="GtkVBox" id="vbox104">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="progressbar_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Connecting to server&lt;/b&gt;
Please wait...</property>
@ -607,6 +660,7 @@ Please wait...</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
@ -614,6 +668,7 @@ Please wait...</property>
<child>
<object class="GtkProgressBar" id="progressbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pulse_step">0.10000000149</property>
</object>
<packing>
@ -630,6 +685,7 @@ Please wait...</property>
<child type="tab">
<object class="GtkLabel" id="label365">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="position">5</property>
@ -639,14 +695,16 @@ Please wait...</property>
<child>
<object class="GtkVBox" id="vbox103">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<child>
<object class="GtkHBox" id="hbox2986">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage" id="finish_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
@ -658,16 +716,21 @@ Please wait...</property>
<child>
<object class="GtkLabel" id="finish_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0.10000000149011612</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -678,6 +741,7 @@ Please wait...</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
@ -694,6 +758,7 @@ Please wait...</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
@ -711,6 +776,7 @@ Please wait...</property>
<child type="tab">
<object class="GtkLabel" id="label286">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="position">6</property>
@ -719,12 +785,15 @@ Please wait...</property>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox19">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<property name="layout_style">end</property>
<child>
@ -735,7 +804,7 @@ Please wait...</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_cancel_button_clicked"/>
<signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -752,7 +821,7 @@ Please wait...</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_back_button_clicked"/>
<signal name="clicked" handler="on_back_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -769,7 +838,7 @@ Please wait...</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_forward_button_clicked"/>
<signal name="clicked" handler="on_forward_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -779,47 +848,14 @@ Please wait...</property>
</child>
<child>
<object class="GtkButton" id="advanced_button">
<property name="label" translatable="yes">_Advanced</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="no_show_all">True</property>
<signal name="clicked" handler="on_advanced_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment96">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2996">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1265">
<property name="visible">True</property>
<property name="stock">gtk-preferences</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label364">
<property name="visible">True</property>
<property name="label" translatable="yes">_Advanced</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<property name="image">image2</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_advanced_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -829,47 +865,14 @@ Please wait...</property>
</child>
<child>
<object class="GtkButton" id="finish_button">
<property name="label" translatable="yes">_Finish</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="no_show_all">True</property>
<signal name="clicked" handler="on_finish_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment87">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2989">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1112">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label352">
<property name="visible">True</property>
<property name="label" translatable="yes">_Finish</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<property name="image">image3</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_finish_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -880,21 +883,25 @@ Please wait...</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkListStore" id="liststore1">
<object class="GtkListStore" id="server_liststore">
<columns>
<!-- column-name item -->
<!-- column-name gchararray1 -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">None</col>
</row>
</data>
</object>
<object class="GtkEntryCompletion" id="server_entrycompletion">
<property name="model">server_liststore</property>
<property name="text_column">0</property>
</object>
<object class="GtkEntryCompletion" id="server_entrycompletion1">
<property name="model">server_liststore</property>
<property name="text_column">0</property>
</object>
</interface>

View File

@ -63,42 +63,14 @@
</child>
<child>
<object class="GtkButton" id="add_button">
<property name="label" translatable="yes">Add</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_add_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment5">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label29">
<property name="visible">True</property>
<property name="label" translatable="yes">Add</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -107,42 +79,14 @@
</child>
<child>
<object class="GtkButton" id="remove_button">
<property name="label" translatable="yes">Delete</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="image">image2</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_remove_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment7">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-remove</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label26">
<property name="visible">True</property>
<property name="label" translatable="yes">Delete</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -151,46 +95,14 @@
</child>
<child>
<object class="GtkButton" id="rename_button">
<property name="label" translatable="yes">Re_name</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="image">rename_image</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_rename_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox8">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="rename_image">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label25">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Re_name</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -225,7 +137,7 @@
<property name="orientation">vertical</property>
<child>
<object class="GtkCheckButton" id="enable_checkbutton1">
<property name="label" translatable="yes">_Enable</property>
<property name="label" translatable="yes">Active</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@ -520,6 +432,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<signal name="focus_out_event" handler="on_cert_entry1_focus_out_event"/>
</object>
<packing>
<property name="position">1</property>
@ -531,6 +444,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_browse_for_client_cert_button_clicked"/>
</object>
<packing>
@ -1120,7 +1034,7 @@
<property name="orientation">vertical</property>
<child>
<object class="GtkCheckButton" id="enable_zeroconf_checkbutton2">
<property name="label" translatable="yes">_Enable</property>
<property name="label" translatable="yes">Active</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@ -1552,4 +1466,16 @@ You might consider to change possible firewall settings.</property>
<property name="step_increment">1</property>
<property name="page_increment">5</property>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-remove</property>
</object>
<object class="GtkImage" id="rename_image">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</object>
</interface>

View File

@ -1,22 +1,23 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="add_new_contact_window">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Add New Contact</property>
<property name="resizable">False</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_add_new_contact_window_destroy"/>
<signal name="key_press_event" handler="on_add_new_contact_window_key_press_event"/>
<signal name="destroy" handler="on_add_new_contact_window_destroy" swapped="no"/>
<signal name="key-press-event" handler="on_add_new_contact_window_key_press_event" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox8">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="prompt_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
@ -27,10 +28,12 @@
<child>
<object class="GtkHBox" id="account_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="account_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">A_ccount:</property>
<property name="use_underline">True</property>
@ -44,8 +47,9 @@
<child>
<object class="GtkComboBox" id="account_combobox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">liststore3</property>
<signal name="changed" handler="on_account_combobox_changed"/>
<signal name="changed" handler="on_account_combobox_changed" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext3"/>
<attributes>
@ -64,16 +68,20 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="protocol_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="protocol_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Protocol:</property>
<property name="use_underline">True</property>
@ -88,7 +96,8 @@
<child>
<object class="GtkComboBox" id="protocol_combobox">
<property name="visible">True</property>
<signal name="changed" handler="on_protocol_combobox_changed"/>
<property name="can_focus">False</property>
<signal name="changed" handler="on_protocol_combobox_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -99,9 +108,10 @@
<child>
<object class="GtkComboBox" id="protocol_jid_combobox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="model">liststore2</property>
<signal name="changed" handler="on_protocol_jid_combobox_changed"/>
<signal name="changed" handler="on_protocol_jid_combobox_changed" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes>
@ -110,17 +120,22 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkTable" id="subscription_table">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="border_width">6</property>
<property name="n_rows">3</property>
@ -130,6 +145,7 @@
<child>
<object class="GtkLabel" id="uid_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_User ID:</property>
<property name="use_underline">True</property>
@ -137,7 +153,7 @@
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -145,16 +161,18 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activates_default">True</property>
<property name="placeholder_text">Type User ID</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label188">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Nickname:</property>
<property name="use_underline">True</property>
@ -164,7 +182,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -172,18 +190,20 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activates_default">True</property>
<property name="placeholder_text">Type Nickname</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label223">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Group:</property>
<property name="use_underline">True</property>
@ -192,37 +212,48 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkComboBoxEntry" id="group_comboboxentry">
<object class="GtkComboBoxText" id="group_comboboxentry">
<property name="visible">True</property>
<property name="model">groups_liststore</property>
<property name="text_column">0</property>
<property name="can_focus">False</property>
<property name="has_entry">True</property>
<property name="entry_text_column">0</property>
<property name="id_column">1</property>
<child internal-child="entry">
<object class="GtkEntry" id="comboboxtext-entry">
<property name="can_focus">True</property>
<property name="placeholder_text">Choose a group of type a new group</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="auto_authorize_checkbutton">
<property name="label" translatable="yes">A_llow this contact to view my status</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="no_show_all">True</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
@ -238,9 +269,8 @@
<property name="can_focus">True</property>
<property name="no_show_all">True</property>
<property name="border_width">6</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">etched-in</property>
<property name="min_content_height">5</property>
<child>
<object class="GtkTextView" id="message_textview">
<property name="visible">True</property>
@ -251,30 +281,39 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="save_message_checkbutton">
<property name="label" translatable="yes">_Save subscription message</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="register_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label224">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">You have to register with this transport
to be able to add a contact from this
@ -283,18 +322,22 @@ proceed.</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="register_button">
<property name="label" translatable="yes">_Register</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_register_button_clicked"/>
<signal name="clicked" handler="on_register_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -304,12 +347,15 @@ proceed.</property>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">7</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="connected_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">You must be connected to the transport to be able
to add a contact from this protocol.</property>
@ -323,18 +369,21 @@ to add a contact from this protocol.</property>
<child>
<object class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="spacing">12</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_cancel_button_clicked"/>
<signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -345,13 +394,15 @@ to add a contact from this protocol.</property>
<child>
<object class="GtkButton" id="add_button">
<property name="label">gtk-add</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_add_button_clicked"/>
<signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -369,9 +420,6 @@ to add a contact from this protocol.</property>
</object>
</child>
</object>
<object class="GtkTextBuffer" id="textbuffer1">
<property name="text" translatable="yes">I would like to add you to my contact list.</property>
</object>
<object class="GtkListStore" id="groups_liststore">
<columns>
<!-- column-name item -->
@ -390,4 +438,7 @@ to add a contact from this protocol.</property>
<column type="gchararray"/>
</columns>
</object>
<object class="GtkTextBuffer" id="textbuffer1">
<property name="text" translatable="yes">I would like to add you to my contact list.</property>
</object>
</interface>

View File

@ -5,6 +5,7 @@
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Advanced Configuration Editor</property>
<property name="window_position">center-on-parent</property>
<property name="role">ace</property>
<property name="default_width">650</property>
<property name="default_height">540</property>

View File

@ -38,47 +38,14 @@
</child>
<child>
<object class="GtkButton" id="remove_button">
<property name="label" translatable="yes">_Unblock</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="border_width">3</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_remove_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-remove</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">_Unblock</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -89,4 +56,8 @@
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-remove</property>
</object>
</interface>

View File

@ -1,39 +1,88 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="change_status_message_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="default_width">270</property>
<property name="default_height">175</property>
<property name="default_height">330</property>
<property name="type_hint">dialog</property>
<signal name="key_press_event" handler="on_change_status_message_dialog_key_press_event"/>
<signal name="key-press-event" handler="on_change_status_message_dialog_key_press_event" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox5">
<object class="GtkBox" id="dialog-vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="ok_button">
<property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame38">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment107">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox112">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow24">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="message_textview">
@ -45,33 +94,41 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox33">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="save_as_preset_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<signal name="clicked" handler="on_save_as_preset_button_clicked"/>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_save_as_preset_button_clicked" swapped="no"/>
<child>
<object class="GtkAlignment" id="alignment106">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox3021">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1369">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save-as</property>
</object>
<packing>
@ -83,6 +140,7 @@
<child>
<object class="GtkLabel" id="label380">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Save as Preset...</property>
<property name="use_underline">True</property>
</object>
@ -106,44 +164,53 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkTable" id="under_table">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkButton" id="mood_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_mood_button_clicked"/>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_mood_button_clicked" swapped="no"/>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="mood_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="mood_button_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -155,35 +222,44 @@
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkButton" id="activity_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_activity_button_clicked"/>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_activity_button_clicked" swapped="no"/>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="activity_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="activity_button_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -195,11 +271,13 @@
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="mood_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Mood:</property>
</object>
@ -207,11 +285,13 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="activity_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Activity:</property>
</object>
@ -219,31 +299,37 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="message_combobox">
<property name="visible">True</property>
<signal name="changed" handler="on_message_combobox_changed"/>
<property name="can_focus">False</property>
<signal name="changed" handler="on_message_combobox_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label165">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Preset messages:</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@ -254,63 +340,19 @@
<child type="label">
<object class="GtkLabel" id="label383">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Type your new status message&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="ok_button">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">cancel_button</action-widget>
<action-widget response="-5">ok_button</action-widget>
</action-widgets>
</object>
</interface>

File diff suppressed because it is too large Load Diff

View File

@ -75,7 +75,7 @@ Select the contacts you want to invite</property>
</packing>
</child>
<child>
<object class="GtkComboBoxEntry" id="server_list_comboboxentry">
<object class="GtkComboBox" id="server_list_comboboxentry">
<property name="visible">True</property>
</object>
<packing>
@ -122,46 +122,13 @@ Select the contacts you want to invite</property>
</child>
<child>
<object class="GtkButton" id="invite_button">
<property name="label" translatable="yes">In_vite</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_invite_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">In_vite</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -179,4 +146,8 @@ Select the contacts you want to invite</property>
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
</interface>

View File

@ -1,50 +1,105 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="dubbleinput_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<signal name="destroy" handler="on_dubbleinput_dialog_destroy"/>
<signal name="destroy" handler="on_dubbleinput_dialog_destroy" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox10">
<object class="GtkBox" id="dialog-vbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancelbutton">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="okbutton">
<property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox76">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox2960">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage" id="image507">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-dialog-question</property>
<property name="icon-size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -63,6 +118,7 @@
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
@ -82,50 +138,10 @@
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area9">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancelbutton">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="okbutton">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>

View File

@ -1,41 +1,77 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="edit_groups_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Edit Groups</property>
<property name="modal">True</property>
<property name="default_height">290</property>
<property name="type_hint">dialog</property>
<signal name="response" handler="on_edit_groups_dialog_response"/>
<signal name="response" handler="on_edit_groups_dialog_response" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox6">
<object class="GtkBox" id="dialog-vbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="nickname_label">
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="close_button">
<property name="label">gtk-close</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="nickname_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="jid_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2926">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="group_entry">
@ -44,19 +80,23 @@
<property name="activates_default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="add_button">
<property name="label">gtk-add</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_add_button_clicked"/>
<signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -75,47 +115,24 @@
<object class="GtkScrolledWindow" id="scrolledwindow32">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="groups_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area5">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="close_button">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>

View File

@ -1,93 +1,46 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="esession_info_window">
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="border_width">5</property>
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<object class="GtkBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkHBox" id="title-hbox">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="security_image">
<property name="width_request">32</property>
<property name="height_request">32</property>
<property name="visible">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="verification_status_label">
<property name="visible">True</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="spacing">4</property>
<child>
<object class="GtkLabel" id="info_display">
<property name="visible">True</property>
<property name="label" translatable="yes">(&lt;b&gt;ESession&lt;/b&gt; info)</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">10</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="verify_now_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<signal name="clicked" handler="on_verify_now_button_clicked"/>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_verify_now_button_clicked" swapped="no"/>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
</object>
<packing>
@ -99,6 +52,7 @@
<child>
<object class="GtkLabel" id="button_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Verify</property>
<property name="use_underline">True</property>
</object>
@ -122,11 +76,13 @@
<child>
<object class="GtkButton" id="close_button3">
<property name="label">gtk-close</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_close_button_clicked"/>
<signal name="clicked" handler="on_close_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -137,10 +93,74 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="title-hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="security_image">
<property name="width_request">32</property>
<property name="height_request">32</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="verification_status_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">4</property>
<child>
<object class="GtkLabel" id="info_display">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label">(&lt;b&gt;ESession&lt;/b&gt; info)</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">10</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<action-widgets>

View File

@ -41,11 +41,11 @@
</object>
</child>
<signal name="button_press_event" handler="on_transfers_list_button_press_event"/>
<signal name="row_activated" handler="on_transfers_list_row_activated"/>
<signal name="button_release_event" handler="on_transfers_list_button_release_event"/>
<signal name="key_press_event" handler="on_transfers_list_key_press_event"/>
<signal name="leave_notify_event" handler="on_transfers_list_leave_notify_event"/>
<signal name="motion_notify_event" handler="on_transfers_list_motion_notify_event"/>
<signal name="row_activated" handler="on_transfers_list_row_activated"/>
<signal name="leave_notify_event" handler="on_transfers_list_leave_notify_event"/>
</object>
</child>
</object>
@ -81,12 +81,15 @@
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cleanup_button">
<property name="label" translatable="yes">Clean _up</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Removes completed, cancelled and failed file transfers from the list</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<child internal-child="accessible">
<object class="AtkObject" id="cleanup_button-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">Remove file transfer from the list.</property>
@ -94,42 +97,6 @@
</object>
</child>
<signal name="clicked" handler="on_cleanup_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment91">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2992">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1143">
<property name="visible">True</property>
<property name="stock">gtk-clear</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label358">
<property name="visible">True</property>
<property name="label" translatable="yes">Clean _up</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -139,48 +106,15 @@
</child>
<child>
<object class="GtkButton" id="pause_restore_button">
<property name="label" translatable="yes">_Pause</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="image">image2</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_pause_restore_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment92">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2993">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1147">
<property name="visible">True</property>
<property name="stock">gtk-media-pause</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label359">
<property name="visible">True</property>
<property name="label" translatable="yes">_Pause</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -252,7 +186,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="continue_menuitem">
<property name="label" translatable="yes">_Continue</property>
<property name="label">_Continue</property>
<property name="no_show_all">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
@ -262,7 +196,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="pause_menuitem">
<property name="label" translatable="yes">_Pause</property>
<property name="label">_Pause</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property>
@ -285,7 +219,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="open_folder_menuitem">
<property name="label" translatable="yes">_Open Containing Folder</property>
<property name="label">_Open Containing Folder</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property>
@ -294,4 +228,12 @@
</child>
</object>
<object class="GtkAccelGroup" id="accelgroup1"/>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-clear</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-media-pause</property>
</object>
</interface>

View File

@ -25,6 +25,7 @@
<object class="GtkWindow" id="gajim_themes_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Gajim Themes Customization</property>
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox97">
@ -64,6 +65,7 @@
<object class="GtkHButtonBox" id="hbuttonbox27">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="layout_style">center</property>
<child>
<object class="GtkButton" id="add_button">
<property name="label">gtk-add</property>
@ -148,7 +150,7 @@
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -165,7 +167,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -182,7 +184,7 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -197,7 +199,7 @@
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -211,8 +213,8 @@
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="x_options"></property>
<property name="y_options"></property>
<property name="x_options"/>
<property name="y_options"/>
</packing>
</child>
<child>
@ -228,8 +230,8 @@
<property name="right_attach">3</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options"></property>
<property name="y_options"></property>
<property name="x_options"/>
<property name="y_options"/>
</packing>
</child>
<child>
@ -247,7 +249,7 @@
<property name="right_attach">3</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -269,8 +271,8 @@
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options"></property>
<property name="y_options"></property>
<property name="x_options"/>
<property name="y_options"/>
</packing>
</child>
<child>
@ -292,8 +294,8 @@
<property name="right_attach">3</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options"></property>
<property name="y_options"></property>
<property name="x_options"/>
<property name="y_options"/>
</packing>
</child>
<child>
@ -348,7 +350,7 @@
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -364,7 +366,7 @@
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -380,7 +382,7 @@
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -393,7 +395,7 @@
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -406,7 +408,7 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -422,7 +424,7 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -435,7 +437,7 @@
<packing>
<property name="right_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -448,7 +450,7 @@
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -464,7 +466,7 @@
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -478,7 +480,7 @@ Messages</property>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -494,7 +496,7 @@ Messages</property>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -520,7 +522,7 @@ Messages</property>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -536,7 +538,7 @@ Messages</property>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>

View File

@ -1,29 +1,31 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkHBox" id="groupchat_control_hbox">
<property name="can_focus">True</property>
<child>
<object class="GtkVBox" id="groupchat_control_vbox">
<property name="can_focus">True</property>
<property name="border_width">3</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkAlignment" id="alignment">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="bottom_padding">1</property>
<property name="left_padding">3</property>
<property name="right_padding">3</property>
<child>
<object class="GtkEventBox" id="banner_eventbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkHBox" id="hbox3024">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="gc_banner_status_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
@ -36,34 +38,42 @@
<child>
<object class="GtkVBox" id="banner_vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="border_width">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="banner_name_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label">&lt;span weight="heavy" size="large"&gt;room jid&lt;/span&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="banner_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label">label</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -85,12 +95,12 @@
<property name="border_width">3</property>
<property name="position">495</property>
<property name="position_set">True</property>
<signal name="notify" handler="on_hpaned_notify"/>
<signal name="notify" handler="on_hpaned_notify" swapped="no"/>
<child>
<object class="GtkVBox" id="gc_textviews_vbox">
<property name="width_request">0</property>
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="conversation_scrolledwindow">
@ -98,14 +108,14 @@
<property name="height_request">60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -122,6 +132,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -137,7 +148,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="list_treeview">
@ -155,15 +165,19 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="actions_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkHBox" id="hbox3023">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="emoticons_button">
<property name="visible">True</property>
@ -176,6 +190,7 @@
<child>
<object class="GtkImage" id="emoticons_button_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
<property name="icon-size">1</property>
</object>
@ -190,6 +205,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -206,6 +222,7 @@
<child>
<object class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-bold</property>
<property name="icon-size">1</property>
</object>
@ -213,16 +230,19 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkVSeparator" id="vseparator2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@ -238,6 +258,7 @@
<child>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-edit</property>
<property name="icon-size">1</property>
@ -262,6 +283,7 @@
<child>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-properties</property>
<property name="icon-size">1</property>
@ -287,6 +309,7 @@
<child>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-add</property>
<property name="icon-size">1</property>
@ -309,8 +332,9 @@
<property name="tooltip_text" translatable="yes">Browse the chat history (Ctrl+H)</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image8">
<object class="GtkImage" id="history_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-justify-fill</property>
<property name="icon-size">1</property>
@ -326,10 +350,12 @@
<child>
<object class="GtkVSeparator" id="vseparator4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">7</property>
</packing>
</child>
@ -346,11 +372,13 @@
<child>
<object class="GtkAlignment" id="alignment104">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkImage" id="image1344">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-execute</property>
<property name="icon-size">1</property>
</object>
@ -367,65 +395,38 @@
<child>
<object class="GtkComboBox" id="label_selector">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">9</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">10</property>
</packing>
</child>
<child>
<object class="GtkButton" id="send_button">
<property name="label" translatable="yes">_Send</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Send message</property>
<child>
<object class="GtkAlignment" id="alignment105">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox3016">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1345">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label377">
<property name="visible">True</property>
<property name="label" translatable="yes" comments="Make sure the character after &quot;_&quot; is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<property name="image">image1</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -436,13 +437,21 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-jump-to</property>
</object>
</interface>

View File

@ -212,48 +212,16 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene
</child>
<child>
<object class="GtkButton" id="search_db_button">
<property name="label" translatable="yes">_Search Database</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<property name="image_position">bottom</property>
<signal name="clicked" handler="on_search_db_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">_Search Database</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -345,4 +313,8 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene
<action-widget response="-5">save_button</action-widget>
</action-widgets>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
</object>
</interface>

View File

@ -1,63 +1,49 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Enter JID or Contact name</col>
</row>
<row>
<col id="0" translatable="yes">Groupchat Histories</col>
</row>
<row>
<col id="0" translatable="yes">All Chat Histories</col>
</row>
</data>
</object>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="history_window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Conversation History</property>
<property name="role">history</property>
<property name="default_width">650</property>
<property name="default_height">450</property>
<signal name="destroy" handler="on_history_window_destroy"/>
<signal name="key_press_event" handler="on_history_window_key_press_event"/>
<signal name="destroy" handler="on_history_window_destroy" swapped="no"/>
<signal name="key-press-event" handler="on_history_window_key_press_event" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="spacing">6</property>
<child>
<object class="GtkComboBoxEntry" id="query_combobox">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="model">liststore1</property>
<property name="text_column">0</property>
<signal name="changed" handler="on_query_combobox_changed"/>
<object class="GtkEntry" id="query_entry">
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
<property name="invisible_char_set">True</property>
<property name="placeholder_text">Enter name / JID of contact or groupchat</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Search:</property>
</object>
@ -68,26 +54,30 @@
</packing>
</child>
<child>
<object class="GtkEntry" id="query_entry">
<object class="GtkEntry" id="search_entry">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="activates_default">True</property>
<signal name="activate" handler="on_query_entry_activate"/>
<signal name="activate" handler="on_search_entry_activate" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="search_in_date">
<property name="label" translatable="yes">_In date search</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Searching only in the selected day </property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@ -99,6 +89,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -114,17 +105,18 @@
<child>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCalendar" id="calendar">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="month_changed" handler="on_calendar_month_changed"/>
<signal name="day_selected" handler="on_calendar_day_selected"/>
<signal name="month-changed" handler="on_calendar_month_changed" swapped="no"/>
<signal name="day-selected" handler="on_calendar_day_selected" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -141,8 +133,6 @@
<object class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">etched-in</property>
<child>
<placeholder/>
@ -163,15 +153,16 @@
<object class="GtkScrolledWindow" id="results_scrolledwindow">
<property name="can_focus">True</property>
<property name="no_show_all">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="results_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="rules_hint">True</property>
<signal name="row_activated" handler="on_results_treeview_row_activated"/>
<signal name="row-activated" handler="on_results_treeview_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1"/>
</child>
</object>
</child>
</object>
@ -182,25 +173,33 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<object class="GtkCheckButton" id="log_history_checkbutton">
<property name="label" translatable="yes">_Log conversation history</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0.5</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
@ -230,23 +229,27 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="close_button">
<property name="label">gtk-close</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_close_button_clicked"/>
<signal name="clicked" handler="on_close_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>

View File

@ -1,51 +1,106 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="input_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<signal name="destroy" handler="on_input_dialog_destroy"/>
<signal name="delete_event" handler="on_input_dialog_delete_event"/>
<signal name="destroy" handler="on_input_dialog_destroy" swapped="no"/>
<signal name="delete-event" handler="on_input_dialog_delete_event" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox10">
<object class="GtkBox" id="dialog-vbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancelbutton">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="okbutton">
<property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox2960">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage" id="image507">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-dialog-question</property>
<property name="icon-size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -62,50 +117,10 @@
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area9">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancelbutton">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="okbutton">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>

View File

@ -1,89 +1,32 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="input_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="default_width">400</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<signal name="destroy" handler="on_input_dialog_destroy"/>
<signal name="destroy" handler="on_input_dialog_destroy" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox10">
<object class="GtkBox" id="dialog-vbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkVBox" id="vbox76">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox2960">
<property name="visible">True</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage" id="image507">
<property name="visible">True</property>
<property name="stock">gtk-dialog-question</property>
<property name="icon-size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">never</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="input_textview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="wrap_mode">word</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area9">
<object class="GtkButtonBox" id="dialog-action_area9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancelbutton">
<property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
@ -95,11 +38,13 @@
<child>
<object class="GtkButton" id="okbutton">
<property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
@ -111,10 +56,81 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox76">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox2960">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkImage" id="image507">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-dialog-question</property>
<property name="icon-size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vscrollbar_policy">never</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="input_textview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="wrap_mode">word</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>

View File

@ -1,21 +1,32 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-find</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
</object>
<object class="GtkWindow" id="join_groupchat_window">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Join Group Chat</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_join_groupchat_window_destroy"/>
<signal name="key_press_event" handler="on_join_groupchat_window_key_press_event"/>
<signal name="destroy" handler="on_join_groupchat_window_destroy" swapped="no"/>
<signal name="key-press-event" handler="on_join_groupchat_window_key_press_event" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox28">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkTable" id="table15">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">8</property>
<property name="n_columns">2</property>
<property name="column_spacing">12</property>
@ -26,14 +37,14 @@
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="activates_default">True</property>
<signal name="changed" handler="on_required_entry_changed"/>
<signal name="changed" handler="on_required_entry_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -41,19 +52,20 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activates_default">True</property>
<signal name="changed" handler="on_required_entry_changed"/>
<signal name="changed" handler="on_required_entry_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label143">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Room:</property>
</object>
@ -61,12 +73,13 @@
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label142">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Nickname:</property>
</object>
@ -74,12 +87,13 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label225">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Recently:</property>
</object>
@ -87,13 +101,14 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkComboBox" id="recently_combobox">
<property name="visible">True</property>
<signal name="changed" handler="on_recently_combobox_changed"/>
<property name="can_focus">False</property>
<signal name="changed" handler="on_recently_combobox_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@ -107,6 +122,7 @@
<child>
<object class="GtkLabel" id="label145">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Password:</property>
</object>
@ -114,7 +130,7 @@
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -129,7 +145,7 @@
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -140,6 +156,7 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@ -147,24 +164,26 @@
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="account_label">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Account</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkComboBox" id="account_combobox">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<signal name="changed" handler="on_account_combobox_changed"/>
<signal name="changed" handler="on_account_combobox_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@ -180,20 +199,22 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_bookmark_checkbutton_toggled"/>
<signal name="toggled" handler="on_bookmark_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="right_attach">2</property>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Server:</property>
</object>
@ -205,16 +226,10 @@
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkComboBoxEntry" id="server_comboboxentry">
<property name="visible">True</property>
<property name="model">liststore1</property>
<property name="text_column">0</property>
</object>
<packing>
<property name="position">0</property>
</packing>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="browse_rooms_button">
@ -224,9 +239,12 @@
<property name="receives_default">True</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_browse_rooms_button_clicked"/>
<signal name="clicked" handler="on_browse_rooms_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
@ -242,12 +260,14 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox12">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<property name="layout_style">end</property>
<child>
@ -258,7 +278,7 @@
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_cancel_button_clicked"/>
<signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -268,48 +288,15 @@
</child>
<child>
<object class="GtkButton" id="join_button">
<property name="label" translatable="yes">_Join</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<signal name="clicked" handler="on_join_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment25">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox37">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image148">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label146">
<property name="visible">True</property>
<property name="label" translatable="yes">_Join</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<property name="image">image2</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_join_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -320,6 +307,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
@ -327,14 +315,4 @@
</object>
</child>
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name gchararray1 -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
</object>
</interface>

View File

@ -51,7 +51,7 @@
<object class="GtkHButtonBox" id="hbuttonbox25">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="layout_style">end</property>
<property name="layout_style">center</property>
<child>
<object class="GtkButton" id="add_bookmark_button">
<property name="label">gtk-add</property>
@ -113,7 +113,7 @@
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -128,7 +128,7 @@
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -142,7 +142,7 @@
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -156,7 +156,7 @@
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -170,7 +170,7 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -184,7 +184,7 @@
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -198,7 +198,7 @@
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -212,7 +212,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -224,7 +224,7 @@
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -236,7 +236,7 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -250,7 +250,7 @@
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>

View File

@ -55,38 +55,14 @@
</child>
<child>
<object class="GtkButton" id="configure_button">
<property name="label" translatable="yes">_Configure</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_configure_button_clicked"/>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-preferences</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">_Configure</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -120,4 +96,8 @@
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-preferences</property>
</object>
</interface>

View File

@ -22,6 +22,7 @@
<object class="GtkWindow" id="manage_proxies_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Manage Proxy Profiles</property>
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_manage_proxies_window_destroy"/>
<child>
@ -63,7 +64,7 @@
<object class="GtkHButtonBox" id="hbuttonbox21">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="layout_style">end</property>
<property name="layout_style">center</property>
<child>
<object class="GtkButton" id="add_proxy_button">
<property name="label">gtk-add</property>
@ -137,7 +138,7 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -172,7 +173,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -185,7 +186,7 @@
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
</object>
@ -237,7 +238,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -249,7 +250,7 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -262,7 +263,7 @@
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -280,7 +281,7 @@
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -294,7 +295,7 @@
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -309,7 +310,7 @@
<property name="right_attach">2</property>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -324,7 +325,7 @@
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -339,7 +340,7 @@
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -354,7 +355,7 @@
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -368,7 +369,7 @@
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -382,7 +383,7 @@
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
@ -397,7 +398,7 @@
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
</object>

View File

@ -7,6 +7,7 @@
<property name="height_request">350</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Manage sounds</property>
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<signal name="delete_event" handler="on_manage_sounds_window_delete_event"/>
<child>

View File

@ -1,34 +1,19 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="message_window">
<property name="default_width">480</property>
<property name="default_height">440</property>
<child>
<object class="GtkAlignment" id="msg_window_alignment">
<property name="visible">True</property>
<property name="top_padding">2</property>
<child>
<object class="GtkNotebook" id="notebook">
<property name="visible">True</property>
<property name="scrollable">True</property>
<property name="tab_border">0</property>
</object>
</child>
</object>
</child>
</object>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkEventBox" id="chat_tab_ebox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="visible_window">False</property>
<child>
<object class="GtkHBox" id="tab_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">4</property>
<child>
<object class="GtkImage" id="tab_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
@ -39,25 +24,32 @@
</child>
<child>
<object class="GtkLabel" id="tab_label">
<property name="width_request">70</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">9</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="tab_close_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image1329">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-close</property>
<property name="icon-size">1</property>
</object>
@ -72,4 +64,23 @@
</object>
</child>
</object>
<object class="GtkWindow" id="message_window">
<property name="can_focus">False</property>
<property name="default_width">480</property>
<property name="default_height">440</property>
<child>
<object class="GtkAlignment" id="msg_window_alignment">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">2</property>
<child>
<object class="GtkNotebook" id="notebook">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="scrollable">True</property>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,39 +1,55 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-cancel</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-preferences</property>
</object>
<object class="GtkWindow" id="plugins_window">
<property name="width_request">650</property>
<property name="height_request">500</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Plugins</property>
<property name="default_width">650</property>
<property name="default_height">500</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_plugins_window_destroy"/>
<signal name="destroy" handler="on_plugins_window_destroy" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkNotebook" id="plugins_notebook">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="switch_page" handler="on_plugins_notebook_switch_page"/>
<signal name="switch-page" handler="on_plugins_notebook_switch_page" swapped="no"/>
<child>
<object class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="position">250</property>
<property name="position_set">True</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<child>
<object class="GtkVBox" id="vbox6">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
@ -48,50 +64,32 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkAspectFrame" id="aspectframe1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<property name="xalign">0</property>
<child>
<object class="GtkButton" id="install_plugin_button">
<property name="label" translatable="yes">Install from zip</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_install_plugin_button_clicked"/>
<child>
<object class="GtkHBox" id="hbox8">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="configure_plugin_button_label2">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Install from zip</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<property name="image">image1</property>
<signal name="clicked" handler="on_install_plugin_button_clicked" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
@ -107,104 +105,125 @@
<child>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="plugin_name_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&amp;lt;empty&amp;gt;</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Version:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="plugin_version_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;empty&gt;</property>
<property name="label">&lt;empty&gt;</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Authors:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="plugin_authors_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">&lt;empty&gt;</property>
<property name="label">&lt;empty&gt;</property>
<property name="wrap_mode">word-char</property>
<property name="selectable">True</property>
<property name="ellipsize">end</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Homepage:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLinkButton" id="plugin_homepage_linkbutton">
<property name="label" translatable="yes">homepage url</property>
<property name="label">homepage url</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@ -213,28 +232,35 @@
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Description:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -244,6 +270,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -251,56 +278,38 @@
<object class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="uninstall_plugin_button">
<property name="label" translatable="yes">Uninstall</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_uninstall_plugin_button_clicked"/>
<child>
<object class="GtkHBox" id="hbox6">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="stock">gtk-cancel</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="uninstall_plugin_button_label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Uninstall</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<property name="image">image2</property>
<signal name="clicked" handler="on_uninstall_plugin_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -310,34 +319,12 @@
</child>
<child>
<object class="GtkButton" id="configure_plugin_button">
<property name="label" translatable="yes">Configure</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_configure_plugin_button_clicked"/>
<child>
<object class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="stock">gtk-preferences</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="configure_plugin_button_label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Configure</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<property name="image">image3</property>
<signal name="clicked" handler="on_configure_plugin_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -348,13 +335,14 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
<property name="shrink">False</property>
</packing>
</child>
</object>
@ -362,6 +350,7 @@
<child type="tab">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Installed</property>
</object>
<packing>
@ -376,12 +365,15 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">15</property>
<property name="layout_style">end</property>
<child>
@ -391,7 +383,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_close_button_clicked"/>
<signal name="clicked" handler="on_close_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -402,6 +394,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>

File diff suppressed because it is too large Load Diff

View File

@ -531,6 +531,7 @@
<object class="GtkEventBox" id="eventbox1">
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">Format: YYYY-MM-DD</property>
<property name="visible_window">False</property>
<child>
<object class="GtkLabel" id="label13">
<property name="visible">True</property>
@ -1152,7 +1153,6 @@
<child>
<object class="GtkStatusbar" id="statusbar">
<property name="visible">True</property>
<property name="has_resize_grip">False</property>
</object>
<packing>
<property name="expand">False</property>

View File

@ -123,47 +123,14 @@
</child>
<child>
<object class="GtkButton" id="remove_button">
<property name="label" translatable="yes">_Remove</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_remove_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment62">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2954">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image501">
<property name="visible">True</property>
<property name="stock">gtk-delete</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label245">
<property name="visible">True</property>
<property name="label" translatable="yes">_Remove</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -181,4 +148,8 @@
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-delete</property>
</object>
</interface>

View File

@ -1,10 +1,95 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkAccelGroup" id="accelgroup1"/>
<object class="GtkImage" id="image10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-help</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-dialog-question</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image12">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-properties</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-justify-fill</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-jump-to</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image13">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-disconnect</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image14">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-info</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-new</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-connect</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-find</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-network</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-properties</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save</property>
<property name="icon-size">1</property>
</object>
<object class="GtkWindow" id="roster_window">
<property name="width_request">85</property>
<property name="height_request">200</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Gajim</property>
<property name="role">roster</property>
<property name="default_width">250</property>
@ -12,30 +97,34 @@
<accel-groups>
<group name="accelgroup1"/>
</accel-groups>
<signal name="key_press_event" handler="on_roster_window_key_press_event"/>
<signal name="delete_event" handler="on_roster_window_delete_event"/>
<signal name="focus_in_event" handler="on_roster_window_focus_in_event"/>
<signal name="focus_out_event" handler="on_roster_window_focus_out_event"/>
<signal name="popup_menu" handler="on_roster_window_popup_menu"/>
<signal name="key-press-event" handler="on_roster_window_key_press_event" swapped="no"/>
<signal name="delete-event" handler="on_roster_window_delete_event" swapped="no"/>
<signal name="focus-in-event" handler="on_roster_window_focus_in_event" swapped="no"/>
<signal name="focus-out-event" handler="on_roster_window_focus_out_event" swapped="no"/>
<signal name="popup-menu" handler="on_roster_window_popup_menu" swapped="no"/>
<child>
<object class="GtkVBox" id="roster_vbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuBar" id="menubar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="actions_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Actions</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_actions_menuitem_activate"/>
<signal name="activate" handler="on_actions_menuitem_activate" swapped="no"/>
<child type="submenu">
<object class="GtkMenu" id="actions_menu_menu">
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="new_chat_menuitem">
<property name="label" translatable="yes">_Start Chat...</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image1</property>
<property name="use_stock">False</property>
@ -45,6 +134,7 @@
<child>
<object class="GtkImageMenuItem" id="send_single_message_menuitem">
<property name="label" translatable="yes">Send Single _Message...</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image2</property>
<property name="use_stock">False</property>
@ -53,8 +143,9 @@
</child>
<child>
<object class="GtkImageMenuItem" id="join_gc_menuitem">
<property name="label" translatable="yes">Join _Group Chat...</property>
<property name="label" translatable="yes">Join _Group Chat</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image3</property>
<property name="use_stock">False</property>
@ -64,12 +155,14 @@
<child>
<object class="GtkSeparatorMenuItem" id="separatormenuitem1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="add_new_contact_menuitem">
<property name="label" translatable="yes">Add _Contact...</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image4</property>
<property name="use_stock">False</property>
@ -80,6 +173,7 @@
<object class="GtkImageMenuItem" id="service_disco_menuitem">
<property name="label" translatable="yes">_Discover Services</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image5</property>
<property name="use_stock">False</property>
@ -89,6 +183,7 @@
<child>
<object class="GtkMenuItem" id="advanced_menuitem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Advanced</property>
<property name="use_underline">True</property>
</object>
@ -96,17 +191,19 @@
<child>
<object class="GtkSeparatorMenuItem" id="separator1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="quit_menuitem">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property>
<accelerator key="Q" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="activate" handler="on_quit_request"/>
<signal name="activate" handler="on_quit_request" swapped="no"/>
</object>
</child>
</object>
@ -116,27 +213,31 @@
<child>
<object class="GtkMenuItem" id="edit_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Edit</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_edit_menuitem_activate"/>
<signal name="activate" handler="on_edit_menuitem_activate" swapped="no"/>
<child type="submenu">
<object class="GtkMenu" id="edit_menu_menu">
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="accounts_menuitem">
<property name="label" translatable="yes">_Accounts</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image6</property>
<property name="use_stock">False</property>
<property name="accel_group">accelgroup1</property>
<accelerator key="A" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
<signal name="activate" handler="on_accounts_menuitem_activate"/>
<signal name="activate" handler="on_accounts_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="profile_avatar_menuitem">
<property name="label" translatable="yes">Profile, A_vatar</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image7</property>
<property name="use_stock">False</property>
@ -146,27 +247,30 @@
<child>
<object class="GtkSeparatorMenuItem" id="separator2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="preferences_menuitem">
<property name="label">gtk-preferences</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property>
<accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="activate" handler="on_preferences_menuitem_activate"/>
<signal name="activate" handler="on_preferences_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="plugins_menuitem">
<property name="label" translatable="yes">P_lugins</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image13</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_plugins_menuitem_activate"/>
<signal name="activate" handler="on_plugins_menuitem_activate" swapped="no"/>
</object>
</child>
</object>
@ -176,75 +280,84 @@
<child>
<object class="GtkMenuItem" id="view_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_View</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_view_menu_activate"/>
<signal name="activate" handler="on_view_menu_activate" swapped="no"/>
<child type="submenu">
<object class="GtkMenu" id="view_menu_menu">
<property name="can_focus">False</property>
<child>
<object class="GtkCheckMenuItem" id="show_offline_contacts_menuitem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Show _Offline Contacts</property>
<property name="use_underline">True</property>
<accelerator key="O" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="activate" handler="on_show_offline_contacts_menuitem_activate"/>
<signal name="activate" handler="on_show_offline_contacts_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkCheckMenuItem" id="show_only_active_contacts_menuitem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Show Only _Active Contacts</property>
<property name="use_underline">True</property>
<accelerator key="Y" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="activate" handler="on_show_only_active_contacts_menuitem_activate"/>
<signal name="activate" handler="on_show_only_active_contacts_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkCheckMenuItem" id="show_transports_menuitem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Show T_ransports</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_show_transports_menuitem_activate"/>
<signal name="activate" handler="on_show_transports_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkCheckMenuItem" id="show_roster_menuitem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Show _Roster</property>
<property name="use_underline">True</property>
<property name="active">True</property>
<accelerator key="R" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="toggled" handler="on_show_roster_menuitem_toggled"/>
<signal name="toggled" handler="on_show_roster_menuitem_toggled" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="separator3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="file_transfers_menuitem">
<property name="label" translatable="yes">File _Transfers</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image8</property>
<property name="use_stock">False</property>
<property name="accel_group">accelgroup1</property>
<accelerator key="T" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="activate" handler="on_file_transfers_menuitem_activate"/>
<signal name="activate" handler="on_file_transfers_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="history_menuitem">
<property name="label" translatable="yes">_History</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="use_underline">True</property>
<property name="image">image9</property>
<property name="use_stock">False</property>
<property name="accel_group">accelgroup1</property>
<signal name="activate" handler="on_history_menuitem_activate"/>
<signal name="activate" handler="on_history_menuitem_activate" swapped="no"/>
</object>
</child>
</object>
@ -254,69 +367,77 @@
<child>
<object class="GtkMenuItem" id="help_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Help</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="help_menu_menu">
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="contents_menuitem">
<property name="label" translatable="yes">_Contents</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Help online</property>
<property name="use_underline">True</property>
<property name="image">image10</property>
<property name="use_stock">False</property>
<property name="accel_group">accelgroup1</property>
<signal name="activate" handler="on_contents_menuitem_activate"/>
<signal name="activate" handler="on_contents_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="faq_menuitem">
<property name="label" translatable="yes">_FAQ</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Frequently Asked Questions (online)</property>
<property name="use_underline">True</property>
<property name="image">image11</property>
<property name="use_stock">False</property>
<property name="accel_group">accelgroup1</property>
<signal name="activate" handler="on_faq_menuitem_activate"/>
<signal name="activate" handler="on_faq_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="keyboard_shortcuts_menuitem">
<property name="label" translatable="yes">Keyboard Shortcuts</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">image14</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_keyboard_shortcuts_menuitem_activate"/>
<signal name="activate" handler="on_keyboard_shortcuts_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="menuitem1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="features_menuitem">
<property name="label" translatable="yes">Fea_tures</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="use_underline">True</property>
<property name="image">image12</property>
<property name="use_stock">False</property>
<property name="accel_group">accelgroup1</property>
<signal name="activate" handler="on_features_menuitem_activate"/>
<signal name="activate" handler="on_features_menuitem_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="about_menuitem">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property>
<signal name="activate" handler="on_about_menuitem_activate"/>
<signal name="activate" handler="on_about_menuitem_activate" swapped="no"/>
</object>
</child>
</object>
@ -335,24 +456,24 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="notify" handler="on_roster_hpaned_notify"/>
<signal name="notify" handler="on_roster_hpaned_notify" swapped="no"/>
<child>
<object class="GtkVBox" id="roster_vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkEntry" id="rfilter_entry">
<property name="can_focus">True</property>
<property name="no_show_all">True</property>
<property name="editable">False</property>
<property name="primary_icon_stock">gtk-clear</property>
<property name="primary_icon_activatable">True</property>
<signal name="changed" handler="on_rfilter_entry_changed"/>
<signal name="icon_press" handler="on_rfilter_entry_icon_press"/>
<signal name="changed" handler="on_rfilter_entry_changed" swapped="no"/>
<signal name="icon-press" handler="on_rfilter_entry_icon_press" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -361,36 +482,40 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="roster_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="headers_visible">False</property>
<property name="reorderable">True</property>
<signal name="row_expanded" handler="on_roster_treeview_row_expanded"/>
<signal name="key_press_event" handler="on_roster_treeview_key_press_event"/>
<signal name="scroll_event" handler="on_roster_treeview_scroll_event"/>
<signal name="leave_notify_event" handler="on_roster_treeview_leave_notify_event"/>
<signal name="button_press_event" handler="on_roster_treeview_button_press_event"/>
<signal name="row_activated" handler="on_roster_treeview_row_activated"/>
<signal name="row_collapsed" handler="on_roster_treeview_row_collapsed"/>
<signal name="motion_notify_event" handler="on_roster_treeview_motion_notify_event"/>
<signal name="button_release_event" handler="on_roster_treeview_button_release_event"/>
<signal name="row-expanded" handler="on_roster_treeview_row_expanded" swapped="no"/>
<signal name="key-press-event" handler="on_roster_treeview_key_press_event" swapped="no"/>
<signal name="scroll-event" handler="on_roster_treeview_scroll_event" swapped="no"/>
<signal name="leave-notify-event" handler="on_roster_treeview_leave_notify_event" swapped="no"/>
<signal name="button-press-event" handler="on_roster_treeview_button_press_event" swapped="no"/>
<signal name="row-activated" handler="on_roster_treeview_row_activated" swapped="no"/>
<signal name="row-collapsed" handler="on_roster_treeview_row_collapsed" swapped="no"/>
<signal name="motion-notify-event" handler="on_roster_treeview_motion_notify_event" swapped="no"/>
<signal name="button-release-event" handler="on_roster_treeview_button_release_event" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="status_combobox">
<property name="visible">True</property>
<signal name="changed" handler="on_status_combobox_changed"/>
<property name="can_focus">False</property>
<signal name="changed" handler="on_status_combobox_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@ -405,81 +530,12 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAccelGroup" id="accelgroup1"/>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-new</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="stock">gtk-connect</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="stock">gtk-network</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="stock">gtk-properties</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image8">
<property name="visible">True</property>
<property name="stock">gtk-save</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="stock">gtk-justify-fill</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image10">
<property name="visible">True</property>
<property name="stock">gtk-help</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="stock">gtk-dialog-question</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image12">
<property name="visible">True</property>
<property name="stock">gtk-properties</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image13">
<property name="visible">True</property>
<property name="stock">gtk-disconnect</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image14">
<property name="visible">True</property>
<property name="stock">gtk-info</property>
<property name="icon-size">1</property>
</object>
</interface>

View File

@ -52,50 +52,15 @@
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="add_contact_button">
<property name="label" translatable="yes">_Add contact</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="no_show_all">True</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_add_contact_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-add</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">_Add contact</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -105,50 +70,15 @@
</child>
<child>
<object class="GtkButton" id="information_button">
<property name="label" translatable="yes">_Information</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="no_show_all">True</property>
<property name="image">image3</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_information_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-info</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">_Information</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -158,47 +88,14 @@
</child>
<child>
<object class="GtkButton" id="search_button">
<property name="label" translatable="yes">_Search</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="image">image2</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_search_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label58">
<property name="visible">True</property>
<property name="label" translatable="yes">_Search</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -231,4 +128,16 @@
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="stock">gtk-dialog-info</property>
</object>
</interface>

View File

@ -1,7 +1,11 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-jump-to</property>
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item -->
@ -9,27 +13,31 @@
</columns>
</object>
<object class="GtkWindow" id="service_discovery_window">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="role">Service Discovery</property>
<property name="default_width">550</property>
<property name="default_height">420</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_service_discovery_window_destroy"/>
<signal name="destroy" handler="on_service_discovery_window_destroy" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox11">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkEventBox" id="banner_agent_eventbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkHBox" id="banner_agent_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="banner_agent_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0.05000000074505806</property>
<property name="ypad">6</property>
<property name="label">&lt;span weight="heavy" size="large"&gt;Agent name&lt;/span&gt;
@ -37,18 +45,22 @@ Agent JID - node</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage" id="banner_agent_icon">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xpad">6</property>
<property name="ypad">6</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -64,99 +76,56 @@ Agent JID - node</property>
<child>
<object class="GtkTable" id="address_table">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">3</property>
<property name="column_spacing">6</property>
<child>
<object class="GtkComboBoxEntry" id="address_comboboxentry">
<property name="visible">True</property>
<property name="model">liststore1</property>
<property name="text_column">0</property>
<signal name="changed" handler="on_address_comboboxentry_changed"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="browse_button">
<property name="label" translatable="yes">G_o</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<signal name="clicked" handler="on_go_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment93">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2995">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1148">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label362">
<property name="visible">True</property>
<property name="label" translatable="yes">G_o</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_go_button_clicked" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="label224">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Address:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">address_comboboxentry</property>
</object>
<packing>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_options"/>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -164,29 +133,31 @@ Agent JID - node</property>
<object class="GtkScrolledWindow" id="services_scrollwin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">etched-in</property>
<child>
<object class="GtkTreeView" id="services_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<signal name="row_activated" handler="on_services_treeview_row_activated"/>
<signal name="row-activated" handler="on_services_treeview_row_activated" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2994">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkProgressBar" id="services_progressbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="pulse_step">0.10000000149</property>
</object>
@ -199,14 +170,18 @@ Agent JID - node</property>
<child>
<object class="GtkLabel" id="label363">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="action_buttonbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkButton" id="close_button">
@ -217,7 +192,7 @@ Agent JID - node</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_close_button_clicked"/>
<signal name="clicked" handler="on_close_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -229,12 +204,14 @@ Agent JID - node</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">2</property>
<property name="position">3</property>
</packing>

View File

@ -35,47 +35,14 @@
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">_Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="image">image2</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_cancel_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment18">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox22">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image107">
<property name="visible">True</property>
<property name="stock">gtk-cancel</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label34">
<property name="visible">True</property>
<property name="label" translatable="yes">_Cancel</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -85,48 +52,15 @@
</child>
<child>
<object class="GtkButton" id="ok_button">
<property name="label" translatable="yes">_OK</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">False</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_ok_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment17">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox21">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image106">
<property name="visible">True</property>
<property name="stock">gtk-ok</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label33">
<property name="visible">True</property>
<property name="label" translatable="yes">_OK</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -143,4 +77,12 @@
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-cancel</property>
</object>
</interface>

View File

@ -15,7 +15,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="chat_with_menuitem">
<property name="label" translatable="yes">_Start Chat</property>
<property name="label" translatable="yes">_Start Chat...</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image2</property>
@ -25,7 +25,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="join_gc_menuitem">
<property name="label" translatable="yes">_Group Chat</property>
<property name="label" translatable="yes">Join _Group Chat</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image3</property>
@ -35,7 +35,7 @@
</child>
<child>
<object class="GtkImageMenuItem" id="single_message_menuitem">
<property name="label" translatable="yes">Send Single _Message</property>
<property name="label" translatable="yes">Send Single _Message...</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image4</property>

View File

@ -201,6 +201,7 @@
<child>
<object class="GtkEventBox" id="status_label_eventbox">
<property name="visible">True</property>
<property name="visible_window">False</property>
<child>
<object class="GtkLabel" id="status_label">
<property name="visible">True</property>
@ -942,6 +943,7 @@
<object class="GtkEventBox" id="eventbox1">
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">Format: YYYY-MM-DD</property>
<property name="visible_window">False</property>
<child>
<object class="GtkLabel" id="label13">
<property name="visible">True</property>

View File

@ -1,20 +1,26 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
</object>
<object class="GtkWindow" id="xml_console_window">
<property name="can_focus">False</property>
<property name="border_width">12</property>
<property name="default_width">550</property>
<property name="default_height">450</property>
<signal name="destroy" handler="on_xml_console_window_destroy"/>
<signal name="destroy" handler="on_xml_console_window_destroy" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label342">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Jabber Traffic&lt;/b&gt;</property>
<property name="use_markup">True</property>
@ -29,8 +35,6 @@
<object class="GtkScrolledWindow" id="scrolledwindow43">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="stanzas_log_textview">
@ -42,12 +46,15 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2988">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="enable_checkbutton">
<property name="label" translatable="yes" comments="XML Console enable checkbutton">_Enable</property>
@ -55,23 +62,16 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_enable_checkbutton_toggled"/>
<signal name="toggled" handler="on_enable_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label351">
<property name="visible">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="clear_button">
<property name="label">gtk-clear</property>
@ -79,12 +79,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_clear_button_clicked"/>
<signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
<property name="position">1</property>
</packing>
</child>
</object>
@ -102,21 +102,25 @@
<child>
<object class="GtkVBox" id="input_vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="in_stanza_checkbutton">
<property name="label" translatable="yes">Hide IN stanzas</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_in_stanza_checkbutton_toggled"/>
<signal name="toggled" handler="on_in_stanza_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -126,10 +130,13 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_out_stanza_checkbutton_toggled"/>
<signal name="toggled" handler="on_out_stanza_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -139,10 +146,13 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_presence_stanza_checkbutton_toggled"/>
<signal name="toggled" handler="on_presence_stanza_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@ -152,10 +162,13 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_iq_stanza_checkbutton_toggled"/>
<signal name="toggled" handler="on_iq_stanza_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@ -165,21 +178,27 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_message_stanza_checkbutton_toggled"/>
<signal name="toggled" handler="on_message_stanza_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
@ -188,6 +207,8 @@
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@ -196,6 +217,7 @@
<child type="label">
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Filter&lt;/b&gt;</property>
<property name="use_markup">True</property>
@ -204,6 +226,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@ -212,18 +235,17 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="spacing">6</property>
<signal name="activate" handler="on_expander_activate"/>
<signal name="activate" handler="on_expander_activate" swapped="no"/>
<child>
<object class="GtkVBox" id="input_vbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow42">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="input_textview">
@ -235,12 +257,15 @@
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox31">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="layout_style">end</property>
<child>
@ -251,7 +276,7 @@
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Info/Query</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_iq_button_clicked"/>
<signal name="clicked" handler="on_iq_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -266,7 +291,7 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_presence_button_clicked"/>
<signal name="clicked" handler="on_presence_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -281,7 +306,7 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_message_button_clicked"/>
<signal name="clicked" handler="on_message_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -291,47 +316,14 @@
</child>
<child>
<object class="GtkButton" id="send_button">
<property name="label" translatable="yes">_Send</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<signal name="clicked" handler="on_send_button_clicked"/>
<child>
<object class="GtkAlignment" id="alignment80">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox2980">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image833">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label341">
<property name="visible">True</property>
<property name="label" translatable="yes">_Send</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<property name="image">image1</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_send_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -351,6 +343,7 @@
<child type="label">
<object class="GtkLabel" id="label343">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;XML Input&lt;/b&gt;</property>
<property name="use_markup">True</property>
@ -359,6 +352,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>

File diff suppressed because it is too large Load Diff

21
data/other/dh4096.pem Normal file
View File

@ -0,0 +1,21 @@
-----BEGIN DH PARAMETERS-----
MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb
IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft
awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT
mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh
fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq
5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM
fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq
ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI
ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O
+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI
HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQI=
-----END DH PARAMETERS-----
"4096-bit MODP Group" from RFC3526, Section 5.
The prime is: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }
RFC3526 specifies a generator of 2.
The generation of the group is described in RFC 2412.

View File

@ -182,8 +182,10 @@ Section "Gajim" SecGajim
File "bin\library.zip"
File "bin\pangocairo.pyd"
File "bin\pango.pyd"
File "bin\pycurl.pyd"
File "bin\pyexpat.pyd"
File "bin\python27.dll"
File "bin\pythoncom27.dll"
File "bin\pywintypes27.dll"
File "bin\OpenSSL.rand.pyd"
File "bin\select.pyd"
@ -194,8 +196,10 @@ Section "Gajim" SecGajim
File "bin\win32api.pyd"
File "bin\win32file.pyd"
File "bin\win32pipe.pyd"
File "bin\win32ui.pyd"
File "bin\winsound.pyd"
File "msvcr90.dll"
File /r "bin\win32com"
WriteRegStr HKCU "Software\Gajim" "" $INSTDIR
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayName" "Gajim"
@ -530,6 +534,7 @@ Section "Uninstall"
RMDir /r "$INSTDIR\bin\gtk\lib"
RMDir /r "$INSTDIR\bin\gtk\share"
RMDir "$INSTDIR\bin\gtk"
RMDir "$INSTDIR\bin\win32com"
Delete "$INSTDIR\bin\_bsddb.pyd"
Delete "$INSTDIR\bin\_ctypes.pyd"
Delete "$INSTDIR\bin\_hashlib.pyd"
@ -558,8 +563,10 @@ Section "Uninstall"
Delete "$INSTDIR\bin\OpenSSL.SSL.pyd"
Delete "$INSTDIR\bin\pango.pyd"
Delete "$INSTDIR\bin\pangocairo.pyd"
Delete "$INSTDIR\bin\pycurl.pyd"
Delete "$INSTDIR\bin\pyexpat.pyd"
Delete "$INSTDIR\bin\python27.dll"
Delete "$INSTDIR\bin\pythoncom27.dll"
Delete "$INSTDIR\bin\pywintypes27.dll"
Delete "$INSTDIR\bin\select.pyd"
Delete "$INSTDIR\bin\sqlite3.dll"
@ -568,6 +575,7 @@ Section "Uninstall"
Delete "$INSTDIR\bin\win32api.pyd"
Delete "$INSTDIR\bin\win32file.pyd"
Delete "$INSTDIR\bin\win32pipe.pyd"
Delete "$INSTDIR\bin\win32ui.pyd"
Delete "$INSTDIR\bin\winsound.pyd"
Delete "$INSTDIR\bin\msvcr90.dll"
RMDir /r "$INSTDIR\bin"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

View File

@ -1,6 +1,6 @@
#!/bin/sh
if [ ! $PYTHON ]; then
PYTHON="python";
PYTHON="python3";
fi
cd "$(dirname $0)/src"
exec $PYTHON -OOt gajim.py "$@"

View File

@ -1 +1 @@
from acronyms_expander import AcronymsExpanderPlugin
from .acronyms_expander import AcronymsExpanderPlugin

View File

@ -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
@ -62,7 +62,7 @@ class AcronymsExpanderPlugin(GajimPlugin):
@log_calls('AcronymsExpanderPlugin')
def get_own_acronyms_list(self):
data_file = self.local_file_path('acronyms.py')
data_file = self.local_file_path('acronyms')
data = open(data_file, 'r')
acronyms = eval(data.read())
data.close()
@ -76,7 +76,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')
@ -87,7 +87,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):

View File

@ -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)
@ -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
@ -508,7 +508,7 @@ if dbus_support.supported:
def prefs_store(self):
try:
gajim.interface.save_config()
except Exception, e:
except Exception:
return DBUS_BOOLEAN(False)
return DBUS_BOOLEAN(True)

7996
po/he.po

File diff suppressed because it is too large Load Diff

5736
po/ru.po

File diff suppressed because it is too large Load Diff

View File

@ -31,9 +31,9 @@ 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'],
'numbers', 'win32com.client', 'win32com.server'],
'base': 'Win32GUI',
'bin_excludes': [
'iconv.dll', 'intl.dll', 'libatk-1.0-0.dll',

View File

@ -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 GLib
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
@ -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):
@ -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.new_with_label_from_widget(first_radio, 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
@ -255,9 +255,9 @@ class CommandWindow:
"""
Remove widgets we created. Not needed when the window is destroyed
"""
def remove_widget(widget):
def remove_widget(widget, param):
self.command_list_vbox.remove(widget)
self.command_list_vbox.foreach(remove_widget)
self.command_list_vbox.foreach(remove_widget, None)
def stage2_close_button_clicked(self, widget):
self.stage_finish()
@ -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(
@ -321,8 +319,8 @@ class CommandWindow:
dialog.destroy()
cb()
dialog = dialogs.HigDialog(self.window, gtk.MESSAGE_WARNING,
gtk.BUTTONS_YES_NO, _('Cancel confirmation'),
dialog = dialogs.HigDialog(self.window, Gtk.MessageType.WARNING,
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()
@ -452,7 +450,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 +508,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.')
@ -550,21 +548,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 = GLib.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)
GLib.source_remove(self.pulse_id)
self.pulse_id = None
# handling xml stanzas
@ -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)

View File

@ -23,11 +23,12 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
import gtk
from gi.repository import Gtk
import gtkgui_helpers
import gobject
from gi.repository import GLib
from common import gajim
from common import helpers
(
OPT_TYPE,
@ -50,12 +51,12 @@ def rate_limit(rate):
timeout = [None]
def f(*args, **kwargs):
if timeout[0] is not None:
gobject.source_remove(timeout[0])
GLib.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] = GLib.timeout_add(int(1000.0 / rate), timeout_func)
return f
return decorator
@ -98,32 +99,32 @@ 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()
col = treeview.insert_column_with_attributes(-1, _('Preference Name'),
renderer_text, text = 0)
renderer_text = Gtk.CellRendererText()
col = Gtk.TreeViewColumn(_('Preference Name'), renderer_text, text = 0)
treeview.insert_column(col, -1)
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)
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_property('expand',True)
col.set_property('sizing',gtk.TREE_VIEW_COLUMN_FIXED)
col.props.expand = True
col.props.sizing = Gtk.TreeViewColumnSizing.FIXED
renderer_text = gtk.CellRendererText()
col = treeview.insert_column_with_attributes(-1, _('Type'),
renderer_text, text = 2)
col.set_property('expand',True)
col.set_property('sizing',gtk.TREE_VIEW_COLUMN_FIXED)
renderer_text = Gtk.CellRendererText()
col = Gtk.TreeViewColumn(_('Type'), renderer_text, text = 2)
treeview.insert_column(col, -1)
col.props.expand = True
col.props.sizing = Gtk.TreeViewColumnSizing.FIXED
treeview.set_model(self.modelfilter)
@ -136,7 +137,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
@ -154,10 +155,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
@ -195,17 +196,18 @@ 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')
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]:
modelrow[1] = key
modelrow[1] = str(key)
newval = {'False': True, 'True': False}[modelrow[1]]
if len(modelpath) > 1:
optnamerow = self.model[modelpath[0]]
optname = optnamerow[0].decode('utf-8')
keyrow = self.model[modelpath[:2]]
key = keyrow[0].decode('utf-8')
if len(modelpath.get_indices()) > 1:
optnamerow = self.model[modelpath.get_indices()[0]]
optname = optnamerow[0]
modelpath.up()
keyrow = self.model[modelpath]
key = keyrow[0]
self.remember_option(option + '\n' + key + '\n' + optname,
modelrow[1], newval)
gajim.config.set_per(optname, key, option, newval)
@ -231,15 +233,17 @@ 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]
option = modelrow[0].decode('utf-8')
text = text.decode('utf-8')
if len(modelpath) > 1:
optnamerow = self.model[modelpath[0]]
optname = optnamerow[0].decode('utf-8')
keyrow = self.model[modelpath[:2]]
key = keyrow[0].decode('utf-8')
option = modelrow[0]
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)
@ -268,12 +272,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)
@ -285,7 +289,7 @@ class AdvancedConfigurationWindow(object):
else:
if str(default) == model[iter_][C_VALUE]:
return
self.on_config_edited(None, path, str(default))
self.on_config_edited(None, path.to_string(), str(default))
def on_advanced_close_button_clicked(self, widget):
self.window.destroy()
@ -308,11 +312,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
self.model.append(parent, [name, value, type_])
def visible_func(self, model, treeiter):
search_string = self.entry.get_text().decode('utf-8').lower()
def visible_func(self, model, treeiter, data):
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)

View File

@ -22,8 +22,8 @@
##
import gtk
import gobject
from gi.repository import Gtk
from gi.repository import GLib
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):
"""
@ -84,24 +84,24 @@ class AtomWindow:
# fill the fields
if newentry.feed_link is not None:
self.feed_title_label.set_markup(
u'<span foreground="blue" underline="single">%s</span>' % \
gobject.markup_escape_text(newentry.feed_title))
'<span foreground="blue" underline="single">%s</span>' % \
GLib.markup_escape_text(newentry.feed_title))
else:
self.feed_title_label.set_markup(
gobject.markup_escape_text(newentry.feed_title))
self.feed_title_label.set_markup(GLib.markup_escape_text(
newentry.feed_title))
self.feed_tagline_label.set_markup(
u'<small>%s</small>' % \
gobject.markup_escape_text(newentry.feed_tagline))
'<small>%s</small>' % GLib.markup_escape_text(
newentry.feed_tagline))
if newentry.title:
if newentry.uri is not None:
self.entry_title_label.set_markup(
u'<span foreground="blue" underline="single">%s</span>' % \
gobject.markup_escape_text(newentry.title))
'<span foreground="blue" underline="single">%s</span>' % \
GLib.markup_escape_text(newentry.title))
else:
self.entry_title_label.set_markup(
gobject.markup_escape_text(newentry.title))
self.entry_title_label.set_markup(GLib.markup_escape_text(
newentry.title))
else:
self.entry_title_label.set_markup('')

View File

@ -21,19 +21,20 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
from gi.repository import GLib
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GObject
import gtk
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:
@ -53,71 +62,67 @@ class CellRendererImage(gtk.GenericCellRenderer):
col = tree.get_column(self.col_index)
cell_area = tree.get_cell_area(path, col)
tree.queue_draw_area(cell_area.x, cell_area.y,
cell_area.width, cell_area.height)
tree.queue_draw_area(cell_area.x, cell_area.y, 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]
iter_.advance()
timeval = GLib.TimeVal()
timeval.tv_sec = GLib.get_monotonic_time() / 1000000
iter_.advance(timeval)
model = tree.get_model()
if model:
model.foreach(self.func, (image, tree))
if self.redraw:
gobject.timeout_add(iter_.get_delay_time(),
self.animation_timeout, tree, image)
GLib.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()
timeval = GLib.TimeVal()
timeval.tv_sec = GLib.get_monotonic_time() / 1000000
iter_ = animation.get_iter(timeval)
self.iters[self.image] = iter_
gobject.timeout_add(iter_.get_delay_time(),
self.animation_timeout, widget, self.image)
GLib.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:
timeval = GLib.TimeVal()
timeval.tv_sec = GLib.get_monotonic_time() / 1000000
pix = animation.get_iter(timeval).get_pixbuf()
elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF:
pix = self.image.get_pixbuf()
else:
return 0, 0, 0, 0

File diff suppressed because it is too large Load Diff

View File

@ -31,8 +31,7 @@ to automatic discovery and dispatching, also features manual control
over the process.
"""
from types import NoneType
from tools import remove
from .tools import remove
COMMANDS = {}
CONTAINERS = {}
@ -67,11 +66,13 @@ def traverse_commands(container):
yield attribute
def is_command(attribute):
from framework import Command
from .framework import Command
return isinstance(attribute, Command)
def is_root(namespace):
metaclass = namespace.get("__metaclass__", NoneType)
metaclass = namespace.get("__metaclass__", None)
if not metaclass:
return False
return issubclass(metaclass, Dispatchable)
def get_command(host, name):
@ -83,7 +84,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):

View File

@ -23,12 +23,12 @@ 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 .mapping import parse_arguments, adapt_arguments
from .errors import DefinitionError, CommandError, NoCommandError
class CommandHost(object):
class CommandHost(metaclass=Host):
"""
Command host is a hub between numerous command processors and
command containers. Aimed to participate in a dispatching process in
@ -40,7 +40,7 @@ class CommandHost(object):
"""
__metaclass__ = Host
class CommandContainer(object):
class CommandContainer(metaclass=Container):
"""
Command container is an entity which holds defined commands,
allowing them to be dispatched and proccessed correctly. Each
@ -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(list(commands.values()), key=lambda k: k.__repr__())
class Command(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):
@ -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
@ -181,7 +181,11 @@ class Command(object):
return "<Command %s>" % ', '.join(self.names)
def __cmp__(self, other):
return cmp(self.first_name, other.first_name)
if self.first_name > other.first_name:
return 1
if self.first_name < other.first_name:
return -1
return 0
@property
def first_name(self):

View File

@ -35,7 +35,7 @@ detected.
"""
from ..framework import CommandContainer, command, doc
from hosts import *
from .hosts import *
class CustomCommonCommands(CommandContainer):
"""

View File

@ -35,10 +35,10 @@ commands as a frontend.
from subprocess import Popen, PIPE
from os.path import expanduser
from glib import timeout_add
from gi.repository import GLib
from ..framework import CommandContainer, command, doc
from hosts import *
from .hosts import *
class Execute(CommandContainer):
AUTOMATIC = True
@ -64,11 +64,11 @@ class Execute(CommandContainer):
@classmethod
def monitor(cls, processor, popen):
poller = cls.poller(processor, popen)
timeout_add(cls.POLL_INTERVAL, poller.next)
GLib.timeout_add(cls.POLL_INTERVAL, next, poller)
@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
@ -101,7 +101,7 @@ class Execute(CommandContainer):
@staticmethod
def clean(text):
strip = chr(10) + chr(32)
return text.strip(strip)
return text.decode().strip(strip)
class Show(Execute):
@ -115,6 +115,6 @@ class Show(Execute):
stdout, stderr = cls.fetch(popen)
success = popen.returncode == 0
if success and stdout:
processor.send(stdout.decode('utf8'))
processor.send(stdout)
elif not success and stderr:
processor.echo_error(stderr)

View File

@ -31,10 +31,9 @@ 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 pango import FontDescription
from gi.repository import Pango
from common import gajim
from ..framework import CommandProcessor
@ -62,13 +61,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!"))
@ -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:
@ -117,7 +116,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)

View File

@ -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.
@ -136,7 +136,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
@ -150,7 +150,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
@ -164,7 +164,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

View File

@ -23,10 +23,9 @@ according to the command properties.
"""
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.
@ -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 = list(map(lambda t: t[0], args))
opts = list(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,16 +264,10 @@ 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)
# 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:
@ -305,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

View File

@ -25,20 +25,19 @@
# 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):
if isinstance(sequence, list):
if target in sequence:
sequence.remove(target)
elif isinstance(sequence, DictType):
elif isinstance(sequence, dict):
if target in sequence:
del sequence[target]
def gconf(path):
try:
from gconf import client_get_default
client = client_get_default()
from gi.repository import GConf
client = GConf.Client.get_default()
return client.get_string(path)
except ImportError, GError:
pass
except ImportError:
pass

View File

@ -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 = ''

View File

@ -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,12 +158,12 @@ 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())
return base64.b64encode(hash_.digest()).decode('utf-8')
################################################################################

View File

@ -173,7 +173,7 @@ try:
return True
return False
except ImportError:
log.warn('Import of PyOpenSSL or pyasn1 failed. Cannot correctly check '
log.warning('Import of PyOpenSSL or pyasn1 failed. Cannot correctly check '
'SSL certificate')
def check_certificate(cert, domain):

View File

@ -29,16 +29,16 @@ 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
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
os.chmod(logger.LOG_DB_PATH, 0o600) # rw only for us
cur = con.cursor()
# create the tables
# kind can be
@ -84,9 +84,9 @@ 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
os.chmod(logger.CACHE_DB_PATH, 0o600) # rw only for us
cur = con.cursor()
cur.executescript(
'''
@ -128,16 +128,16 @@ def create_cache_db():
con.close()
def split_db():
print 'spliting database'
print('spliting database')
if os.name == 'nt':
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',
@ -161,9 +161,9 @@ def split_db():
con.commit()
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))
except sqlite.OperationalError as e:
print('error moving table %s to cache.db: %s' % (table, str(e)),
file=sys.stderr)
con.close()
logger.CACHE_DB_PATH = tmp
@ -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']
@ -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):
@ -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()
@ -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']
@ -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,18 +334,18 @@ 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):
create_path(XTLS_CERTS)
if not os.path.exists(LOCAL_XTLS_CERTS):
@ -363,5 +363,5 @@ def create_path(directory):
create_path(head)
if os.path.exists(directory):
return
print _('creating %s directory') % directory
os.mkdir(directory, 0700)
print(('creating %s directory') % directory)
os.mkdir(directory, 0o700)

View File

@ -23,9 +23,9 @@
##
import nbxmpp
import helpers
import dataforms
import gajim
from common import helpers
from common import dataforms
from common import gajim
from common.connection_handlers_events import MessageOutgoingEvent
import logging
@ -105,12 +105,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',
@ -147,7 +147,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.'))
@ -198,7 +198,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')
@ -369,11 +369,11 @@ 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
'jid': self.getOurBareJID() + u'/' + self.server_resource,
'jid': self.getOurBareJID() + '/' + self.server_resource,
'node': node,
'name': cmd.commandname})
@ -387,7 +387,7 @@ class ConnectionCommands:
try:
jid = helpers.get_full_jid_from_iq(iq_obj)
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % iq_obj.getFrom())
log.warning('Invalid JID: %s, ignoring it' % iq_obj.getFrom())
return
node = iq_obj.getTagAttr('query', 'node')

View File

@ -35,8 +35,8 @@
import sys
import re
import copy
import defs
import gobject
from common import defs
from gi.repository import GLib
(
OPT_TYPE,
@ -191,7 +191,7 @@ class Config:
'dictionary_url': [opt_str, 'WIKTIONARY', _("Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary.")],
'always_english_wikipedia': [opt_bool, False],
'always_english_wiktionary': [opt_bool, True],
'remote_control': [opt_bool, True, _('If checked, Gajim can be controlled remotely using gajim-remote.'), True],
'remote_control': [opt_bool, False, _('If checked, Gajim can be controlled remotely using gajim-remote.'), True],
'networkmanager_support': [opt_bool, True, _('If True, listen to D-Bus signals from NetworkManager and change the status of accounts (provided they do not have listen_to_network_manager set to False and they sync with global status) based upon the status of the network connection.'), True],
'outgoing_chat_state_notifications': [opt_str, 'all', _('Sent chat state notifications. Can be one of all, composing_only, disabled.')],
'displayed_chat_state_notifications': [opt_str, 'all', _('Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled.')],
@ -217,7 +217,7 @@ class Config:
'tabs_always_visible': [opt_bool, False, _('Show tab when only one conversation?')],
'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')],
'tabs_close_button': [opt_bool, True, _('Show close button in tab?')],
'esession_modp': [opt_str, '5,14', _('A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session.')],
'esession_modp': [opt_str, '15,16,14', _('A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session.')],
'chat_avatar_width': [opt_int, 52],
'chat_avatar_height': [opt_int, 52],
'roster_avatar_width': [opt_int, 32],
@ -349,7 +349,6 @@ class Config:
'enable_esessions': [opt_bool, True, _('Enable ESessions encryption for this account.')],
'autonegotiate_esessions': [opt_bool, True, _('Should Gajim automatically start an encrypted session when possible?')],
'connection_types': [ opt_str, 'tls ssl plain', _('Ordered list (space separated) of connection type to try. Can contain tls, ssl or plain')],
'tls_version': [ opt_str, '1.0', '' ],
'cipher_list': [ opt_str, 'HIGH:!aNULL:RC4-SHA', '' ],
'action_when_plaintext_connection': [ opt_str, 'warn', _('Show a warning dialog before sending password on an plaintext connection. Can be \'warn\', \'connect\', \'disconnect\'') ],
'warn_when_insecure_ssl_connection': [ opt_bool, True, _('Show a warning dialog before using standard SSL library.') ],
@ -573,7 +572,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
@ -584,7 +583,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')
@ -630,11 +629,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
@ -642,7 +639,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]
@ -671,7 +668,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]
@ -685,7 +681,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]
@ -698,22 +693,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()
@ -723,7 +714,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]
@ -812,7 +803,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 = GLib.timeout_add(1000, self._really_save)
def __init__(self):
#init default values

View File

@ -25,7 +25,7 @@
import os
import sys
import tempfile
import defs
from common import defs
HAVE_XDG = True
try:
__import__(xdg)
@ -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':
@ -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)
@ -130,40 +130,41 @@ class ConfigPaths:
except KeyError:
return default
def iteritems(self):
for key in self.paths.iterkeys():
def items(self):
for key in self.paths.keys():
yield (key, self[key])
def init(self, root=None):
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',
'RNG_SEED': 'rng_seed'}
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:
print >> sys.stderr, 'Error opening tmp folder: %s\nUsing %s' % (
str(e), os.path.expanduser('~'))
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('~')))
try:
@ -173,17 +174,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)

View File

@ -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 *
if gajim.HAVE_PYOPENSSL:
import OpenSSL.crypto
@ -312,8 +312,7 @@ class CommonConnection:
else:
def encrypt_thread(msg, keyID, always_trust=False):
# encrypt message. This function returns (msgenc, error)
return self.gpg.encrypt(msg.encode('utf-8'), [keyID],
always_trust)
return self.gpg.encrypt(msg, [keyID], always_trust)
def _on_encrypted(output):
msgenc, error = output
if error == 'NOT_TRUSTED':
@ -329,7 +328,7 @@ class CommonConnection:
form_node, user_nick, keyID, attention,
correction_msg, callback)
gajim.nec.push_incoming_event(GPGTrustKeyEvent(None,
conn=self, callback=_on_always_trust))
conn=self, keyID=keyID, callback=_on_always_trust))
else:
self._message_encrypted_cb(output, type_, msg, msgtxt,
original_message, fjid, resource, jid, xhtml,
@ -519,7 +518,7 @@ class CommonConnection:
log_msg = '<body xmlns="%s">%s</body>' % (
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:
@ -680,10 +679,10 @@ 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=unicode(data)))
stanza_str=data))
def change_status(self, show, msg, auto=False):
if not msg:
@ -779,7 +778,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
@ -981,8 +980,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]
@ -1239,11 +1238,9 @@ class Connection(CommonConnection, ConnectionHandlers):
if not os.path.exists(cacerts):
cacerts = ''
mycerts = common.gajim.MY_CACERTS
tls_version = gajim.config.get_per('accounts', self.name,
'tls_version')
cipher_list = gajim.config.get_per('accounts', self.name,
'cipher_list')
secure_tuple = (self._current_type, cacerts, mycerts, tls_version, cipher_list)
secure_tuple = (self._current_type, cacerts, mycerts, cipher_list)
con = nbxmpp.NonBlockingClient(
domain=self._hostname,
@ -1391,41 +1388,40 @@ class Connection(CommonConnection, ConnectionHandlers):
cert = con.Connection.ssl_certificate
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 invlid') \
% hostname
text = _('The authenticity of the %s certificate could be invalid'
) % hostname
if errnum in ssl_error:
text += _('\nSSL Error: <b>%s</b>') % ssl_error[errnum]
else:
text += _('\nUnknown SSL error: %d') % errnum
fingerprint = cert.digest('sha1')
fingerprint = cert.digest('sha1').decode('utf-8')
pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM,
cert)
cert).decode('utf-8')
gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self,
error_text=text, error_num=errnum, cert=pem,
fingerprint=fingerprint, certificate=cert))
return True
if cert:
fingerprint = cert.digest('sha1')
fingerprint = cert.digest('sha1').decode('utf-8')
saved_fingerprint = gajim.config.get_per('accounts', self.name,
'ssl_fingerprint_sha1')
if saved_fingerprint:
# Check sha1 fingerprint
if fingerprint != saved_fingerprint:
gajim.nec.push_incoming_event(FingerprintErrorEvent(None,
conn=self, certificate=con.Connection.ssl_certificate,
conn=self, certificate=cert,
new_fingerprint=fingerprint))
return True
else:
gajim.config.set_per('accounts', self.name,
'ssl_fingerprint_sha1', fingerprint)
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():
fingerprint = cert.digest('sha1')
if not check_X509.check_certificate(cert, hostname) and \
'100' not in gajim.config.get_per('accounts', self.name,
'ignore_ssl_errors').split():
pem = OpenSSL.crypto.dump_certificate(
OpenSSL.crypto.FILETYPE_PEM, cert)
OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8')
txt = _('The authenticity of the %s certificate could be '
'invalid.\nThe certificate does not cover this domain.') % \
'invalid.\nThe certificate does not cover this domain.') %\
hostname
gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self,
error_text=txt, error_num=100, cert=pem,
@ -1523,7 +1519,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
@ -1772,9 +1768,9 @@ class Connection(CommonConnection, ConnectionHandlers):
gajim.nec.push_incoming_event(OurShowEvent(None, conn=self,
show=gajim.SHOW_LIST[self.connected]))
gajim.nec.push_incoming_event(InformationEvent(None, conn=self,
level='error', pri_txt=_('Invisibility not supported',
level='error', pri_txt=_('Invisibility not supported'),
sec_txt=_('Account %s doesn\'t support invisibility.') % \
self.name)))
self.name))
return
# If we are already connected, and privacy rules are supported, send
# offline presence first as it's required by XEP-0126
@ -1800,7 +1796,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:
@ -1981,7 +1977,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:
@ -2005,7 +2001,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:
@ -2047,6 +2043,8 @@ class Connection(CommonConnection, ConnectionHandlers):
return
if isinstance(jid, list):
for j in jid:
if session is None:
session = self.get_or_create_session(j, '')
self.log_message(j, msg, forward_from, session,
original_message, subject, type_, xhtml)
else:
@ -2562,7 +2560,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_)
@ -2670,7 +2668,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_)
@ -2847,6 +2845,19 @@ class Connection(CommonConnection, ConnectionHandlers):
"""
Send invitation
"""
contact = gajim.contacts.get_contact_from_full_jid(self.name, to)
if contact and contact.supports(nbxmpp.NS_CONFERENCE):
# send direct invite
message=nbxmpp.Message(to=to)
attrs = {'jid': room}
if reason:
attrs['reason'] = reason
if continue_tag:
attrs['continue'] = 'true'
c = message.addChild(name='x', attrs=attrs,
namespace=nbxmpp.NS_CONFERENCE)
self.connection.send(message)
return
message=nbxmpp.Message(to=room)
c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER)
c = c.addChild(name='invite', attrs={'to': to})
@ -2889,7 +2900,7 @@ class Connection(CommonConnection, ConnectionHandlers):
return
if self.awaiting_xmpp_ping_id:
# We haven't got the pong in time, disco and reconnect
log.warn("No reply received for keepalive ping. Reconnecting.")
log.warning("No reply received for keepalive ping. Reconnecting.")
self._disconnectedReconnCB()
def _reconnect_alarm(self):

View File

@ -33,17 +33,16 @@ import base64
import sys
import operator
import hashlib
import gobject
import locale
from gi.repository import GLib
from time import (altzone, daylight, gmtime, localtime, mktime, strftime,
time as time_time, timezone, tzname)
from calendar import timegm
import nbxmpp
import common.caps_cache as capscache
from common import caps_cache as capscache
from pep import LOCATION_DATA
from common.pep import LOCATION_DATA
from common import helpers
from common import gajim
from common import exceptions
@ -188,8 +187,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')
@ -242,7 +241,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
@ -329,7 +328,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:
@ -338,7 +337,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)))
@ -438,7 +437,7 @@ 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'))
gajim.interface.save_avatar_files(our_jid, photo_decoded)
avatar_sha = hashlib.sha1(photo_decoded).hexdigest()
iq2.getTag('PHOTO').setTagData('SHA', avatar_sha)
@ -565,7 +564,7 @@ class ConnectionVcard:
self.discover_ft_proxies()
gajim.nec.push_incoming_event(RosterReceivedEvent(None,
conn=self))
gobject.timeout_add_seconds(10, self.discover_servers)
GLib.timeout_add_seconds(10, self.discover_servers)
elif self.awaiting_answers[id_][0] == PRIVACY_ARRIVED:
if iq_obj.getType() != 'error':
self.privacy_rules_supported = True
@ -619,7 +618,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):
@ -629,7 +628,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')
@ -710,7 +709,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'))
avatar_sha = hashlib.sha1(photo_decoded).hexdigest()
except Exception:
avatar_sha = ''
@ -732,7 +731,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:
@ -1139,7 +1138,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')
@ -1162,8 +1161,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 = decmsg.replace('\x00', '').encode(
locale.getpreferredencoding()).decode('utf-8')
obj.msgtxt = decmsg.replace('\x00', '')
obj.encrypted = 'xep27'
self.gpg_messages_to_decrypt.remove([encmsg, keyID, obj])
@ -1211,7 +1209,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' and \
not in ('to', 'none')) or gc_contact) and obj.mtype != 'error' and \
not obj.forwarded:
receipt = nbxmpp.Message(to=obj.fjid, typ='chat')
receipt.setID(obj.id_)
@ -1264,7 +1262,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')
@ -1290,7 +1288,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 []
@ -1352,7 +1350,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]
@ -1384,7 +1382,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,
@ -1767,9 +1765,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 + \

View File

@ -40,7 +40,8 @@ from nbxmpp.protocol import NS_CHATSTATES
from common.jingle_transport import JingleTransportSocks5
from common.file_props import FilesProp
import gtkgui_helpers
if gajim.HAVE_PYOPENSSL:
import OpenSSL.crypto
import logging
log = logging.getLogger('gajim.c.connection_handlers_events')
@ -221,11 +222,11 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try:
t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ')
except ValueError, e:
except ValueError:
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
@ -309,7 +310,7 @@ class RosterItemExchangeEvent(nec.NetworkIncomingEvent, HelperEvent):
try:
jid = helpers.parse_jid(item.getAttr('jid'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid'))
log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid'))
continue
name = item.getAttr('name')
contact = gajim.contacts.get_contact(self.conn.name, jid)
@ -367,10 +368,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 \
@ -402,7 +403,7 @@ class RosterSetReceivedEvent(nec.NetworkIncomingEvent):
try:
jid = helpers.parse_jid(item.getAttr('jid'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid'))
log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid'))
continue
name = item.getAttr('name')
sub = item.getAttr('subscription')
@ -450,7 +451,7 @@ class MucAdminReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try:
jid = helpers.parse_jid(item.getAttr('jid'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % \
log.warning('Invalid JID: %s, ignoring it' % \
item.getAttr('jid'))
continue
affiliation = item.getAttr('affiliation')
@ -492,7 +493,7 @@ class BookmarksHelper:
try:
jid = helpers.parse_jid(conf.getAttr('jid'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % conf.getAttr('jid'))
log.warning('Invalid JID: %s, ignoring it' % conf.getAttr('jid'))
continue
bm = {'name': conf.getAttr('name'),
'jid': jid,
@ -544,7 +545,7 @@ class PrivateStorageRosternotesReceivedEvent(nec.NetworkIncomingEvent):
try:
jid = helpers.parse_jid(note.getAttr('jid'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % note.getAttr('jid'))
log.warning('Invalid JID: %s, ignoring it' % note.getAttr('jid'))
continue
annotation = note.getData()
self.annotations[jid] = annotation
@ -758,7 +759,7 @@ PresenceHelperEvent):
try:
self.get_jid_resource()
except Exception:
log.warn('Invalid JID: %s, ignoring it' % self.stanza.getFrom())
log.warning('Invalid JID: %s, ignoring it' % self.stanza.getFrom())
return
jid_list = gajim.contacts.get_jid_list(self.conn.name)
self.timestamp = None
@ -798,7 +799,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 ''
@ -906,7 +908,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:
@ -1038,7 +1040,7 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try:
self.fjid = helpers.parse_jid(address.getAttr('jid'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % address.getAttr(
log.warning('Invalid JID: %s, ignoring it' % address.getAttr(
'jid'))
return
self.jid = gajim.get_jid_without_resource(self.fjid)
@ -1078,10 +1080,15 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
self.invite_tag = None
self.decline_tag = None
if not self.enc_tag:
# Direct invitation?
self.invite_tag = self.stanza.getTag('x',
namespace=nbxmpp.NS_MUC_USER)
if self.invite_tag and not self.invite_tag.getTag('invite'):
self.invite_tag = None
namespace=nbxmpp.NS_CONFERENCE)
# Mediated invitation?
if not self.invite_tag:
self.invite_tag = self.stanza.getTag('x',
namespace=nbxmpp.NS_MUC_USER)
if self.invite_tag and not self.invite_tag.getTag('invite'):
self.invite_tag = None
self.decline_tag = self.stanza.getTag('x',
namespace=nbxmpp.NS_MUC_USER)
@ -1182,7 +1189,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):
@ -1195,25 +1201,47 @@ class GcInvitationReceivedEvent(nec.NetworkIncomingEvent):
base_network_events = []
def generate(self):
self.room_jid = self.msg_obj.fjid
invite_tag = self.msg_obj.invite_tag
if invite_tag.getNamespace() == nbxmpp.NS_CONFERENCE:
# direct invitation
try:
self.room_jid = helpers.parse_jid(invite_tag.getAttr('jid'))
except helpers.InvalidFormat:
log.warning('Invalid JID: %s, ignoring it' % invite_tag.getAttr(
'jid'))
return
self.jid_from = self.msg_obj.fjid
self.reason = invite_tag.getAttr('reason')
self.password = invite_tag.getAttr('password')
self.is_continued = False
if invite_tag.getAttr('continue') == 'true':
self.is_continued = True
else:
self.room_jid = self.msg_obj.fjid
item = self.msg_obj.invite_tag.getTag('invite')
try:
self.jid_from = helpers.parse_jid(item.getAttr('from'))
except helpers.InvalidFormat:
log.warning('Invalid JID: %s, ignoring it' % item.getAttr(
'from'))
return
item = self.msg_obj.invite_tag.getTag('invite')
try:
self.jid_from = helpers.parse_jid(item.getAttr('from'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('from'))
self.reason = item.getTagData('reason')
self.password = invite_tag.getTagData('password')
self.is_continued = False
if item.getTag('continue'):
self.is_continued = True
if self.room_jid in gajim.gc_connected[self.conn.name] and \
gajim.gc_connected[self.conn.name][self.room_jid]:
# We are already in groupchat. Ignore invitation
return
jid = gajim.get_jid_without_resource(self.jid_from)
if gajim.config.get_per('accounts', self.conn.name,
'ignore_unknown_contacts') and not gajim.contacts.get_contacts(
self.conn.name, jid):
return
self.reason = item.getTagData('reason')
self.password = self.msg_obj.invite_tag.getTagData('password')
self.is_continued = False
if item.getTag('continue'):
self.is_continued = True
return True
@ -1228,7 +1256,7 @@ class GcDeclineReceivedEvent(nec.NetworkIncomingEvent):
try:
self.jid_from = helpers.parse_jid(item.getAttr('from'))
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('from'))
log.warning('Invalid JID: %s, ignoring it' % item.getAttr('from'))
return
jid = gajim.get_jid_without_resource(self.jid_from)
if gajim.config.get_per('accounts', self.conn.name,
@ -1607,12 +1635,12 @@ class NewAccountConnectedEvent(nec.NetworkIncomingEvent):
self.ssl_msg = ssl_error.get(er, _('Unknown SSL error: %d') % \
self.errnum)
self.ssl_cert = ''
if len(self.conn.connection.Connection.ssl_cert_pem):
self.ssl_cert = self.conn.connection.Connection.ssl_cert_pem
self.ssl_fingerprint = ''
if self.conn.connection.Connection.ssl_certificate:
self.ssl_fingerprint = \
self.conn.connection.Connection.ssl_certificate.digest('sha1')
cert = self.conn.connection.Connection.ssl_certificate
self.ssl_cert = OpenSSL.crypto.dump_certificate(
OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8')
self.ssl_fingerprint = cert.digest('sha1').decode('utf-8')
return True
class NewAccountNotConnectedEvent(nec.NetworkIncomingEvent):
@ -1852,6 +1880,8 @@ class MetacontactsReceivedEvent(nec.NetworkIncomingEvent):
# Metacontact tags
# http://www.xmpp.org/extensions/xep-0209.html
self.meta_list = {}
# FIXME: disable metacontacts until they work correctly
return True
query = self.stanza.getTag('query')
storage = query.getTag('storage')
metas = storage.getTags('meta')
@ -1965,7 +1995,7 @@ class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
if self.id_ in self.conn.disco_info_ids:
self.conn.disco_info_ids.remove(self.id_)
if self.id_ is None:
log.warn('Invalid IQ received without an ID. Ignoring it: %s' % \
log.warning('Invalid IQ received without an ID. Ignoring it: %s' % \
self.stanza)
return
# According to XEP-0030:
@ -2025,15 +2055,18 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
self.fjid = self.conn._ft_get_from(self.stanza)
self.jid = gajim.get_jid_without_resource(self.fjid)
if self.jingle_content:
self.FT_content.use_security = bool(self.jingle_content.getTag(
'security'))
secu = self.jingle_content.getTag('security')
self.FT_content.use_security = bool(secu)
fingerprint = secu.getTag('fingerprint')
if fingerprint:
self.FT_content.x509_fingerprint = fingerprint.getData()
if not self.FT_content.transport:
self.FT_content.transport = JingleTransportSocks5()
self.FT_content.transport.set_our_jid(
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
@ -2071,7 +2104,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
if name == 'name':
self.file_props.name = val
if name == 'size':
self.file_props.size = val
self.file_props.size = int(val)
if name == 'hash':
self.file_props.algo = child.getAttr('algo')
self.file_props.hash_ = val
@ -2080,8 +2113,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',
@ -2112,7 +2144,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
if name == 'name':
self.file_props.name = val
if name == 'size':
self.file_props.size = val
self.file_props.size = int(val)
mime_type = si.getAttr('mime-type')
if mime_type is not None:
self.file_props.mime_type = mime_type
@ -2230,8 +2262,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
@ -2286,6 +2316,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
@ -2364,8 +2416,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_path = self.get_path_to_generic_or_avatar(img_path,
jid=self.jid, suffix=suffix)
self.popup_timeout = gajim.config.get('notification_timeout')
@ -2411,6 +2463,7 @@ class NotificationEvent(nec.NetworkIncomingEvent):
self.popup_event_type = ''
self.popup_msg_type = ''
self.popup_image = ''
self.popup_image_path = ''
self.popup_timeout = -1
self.do_command = False
@ -2447,7 +2500,7 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent):
self.session = None
self.forward_from = None
self.form_node = None
self.original_message = ''
self.original_message = None
self.delayed = None
self.callback = None
self.callback_args = []

View File

@ -28,13 +28,15 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
from functools import cmp_to_key
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)
raise ImportError(str(e))
class XMPPEntity(object):
"""
@ -94,6 +96,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)
@ -484,17 +488,18 @@ class Contacts():
for c in self._contacts[jid]:
if c.resource == resource:
return c
return self._contacts[jid][0]
def iter_contacts(self):
for jid in self._contacts.keys():
for jid in list(self._contacts.keys()):
for contact in self._contacts[jid][:]:
yield contact
def get_jid_list(self):
return self._contacts.keys()
return list(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):
@ -562,7 +567,7 @@ class GC_Contacts():
gc_list = self.get_gc_list()
if not room_jid in gc_list:
return []
return self._rooms[room_jid].keys()
return list(self._rooms[room_jid].keys())
def get_gc_contact(self, room_jid, nick):
nick_list = self.get_nick_list(room_jid)
@ -846,7 +851,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]

View File

@ -19,6 +19,7 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
import sys
import os
import math
@ -75,8 +76,54 @@ def base28(n):
else:
return base28_chr[n]
def add_entropy_sources_OpenSSL():
# Other possibly variable data. This are very low quality sources of
# entropy, but some of them are installation dependent and can be hard
# to guess for the attacker.
# Data available on all platforms Unix, Windows
sources = [sys.argv, sys.builtin_module_names,
sys.copyright, sys.getfilesystemencoding(), sys.hexversion,
sys.modules, sys.path, sys.version, sys.api_version,
os.environ, os.getcwd(), os.getpid()]
for s in sources:
OpenSSL.rand.add(str(s).encode('utf-8'), 1)
# On Windows add the current contents of the screen to the PRNG state.
if os.name == 'nt':
OpenSSL.rand.screen()
# The /proc filesystem on POSIX systems contains many random variables:
# memory statistics, interrupt counts, network packet counts
if os.name == 'posix':
dirs = ['/proc', '/proc/net', '/proc/self']
for d in dirs:
if os.access(d, os.R_OK):
for filename in os.listdir(d):
OpenSSL.rand.add(filename.encode('utf-8'), 0)
try:
with open(d + os.sep + filename, "r") as fp:
# Limit the ammount of read bytes, in case a memory
# file was opened
OpenSSL.rand.add(str(fp.read(5000)).encode('utf-8'),
1)
except:
# Ignore all read and access errors
pass
PYOPENSSL_PRNG_PRESENT = False
try:
import OpenSSL.rand
PYOPENSSL_PRNG_PRESENT = True
except ImportError:
# PyOpenSSL PRNG not available
pass
def random_bytes(bytes_):
return os.urandom(bytes_)
if PYOPENSSL_PRNG_PRESENT:
OpenSSL.rand.add(os.urandom(bytes_), bytes_)
return OpenSSL.rand.bytes(bytes_)
else:
return os.urandom(bytes_)
def generate_nonce():
return random_bytes(8)

View File

@ -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
@ -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)
@ -345,10 +345,10 @@ 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 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:]

View File

@ -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:
"""
@ -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

View File

@ -27,13 +27,13 @@ docdir = '../'
basedir = '../'
localedir = '../po'
version = '0.16'
version = '0.16.10.0'
import subprocess
try:
node = subprocess.Popen('hg tip --template "{node|short}"', shell=True,
stdout=subprocess.PIPE).communicate()[0]
if node:
version += '-' + node
version += '-' + node.decode('utf-8')
except Exception:
pass

View File

@ -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)

View File

@ -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):

View File

@ -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 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']
@ -159,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:
@ -185,6 +184,7 @@ except Exception:
HAVE_FARSTREAM = True
try:
raise ImportError
farstream = __import__('farstream')
import gst
import glib
@ -201,8 +201,8 @@ except ImportError:
HAVE_UPNP_IGD = True
try:
import gupnp.igd
gupnp_igd = gupnp.igd.Simple()
from gi.repository import GUPnPIgd
gupnp_igd = GUPnPIgd.SimpleIgd()
except ImportError:
HAVE_UPNP_IGD = False
@ -223,7 +223,7 @@ gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE,
nbxmpp.NS_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK,
nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES,
nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256,
nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CORRECT]
nbxmpp.NS_HASHES_SHA512]
# Optional features gajim supports per account
gajim_optional_features = {}
@ -231,9 +231,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
@ -290,13 +287,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):

View File

@ -79,8 +79,8 @@ class GlobalEventsDispatcher(object):
if event_name in self.handlers:
try:
self.handlers[event_name].remove((priority, handler))
except ValueError, error:
log.warn('''Function (%s) with priority "%s" never registered
except ValueError:
log.warning('''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:
log.error('Error while running an even handler: %s' % \
handler)
traceback.print_exc()

View File

@ -175,7 +175,7 @@ class Verify(object):
"PLAINTEXT_LENGTH", "POLICY_URL", "DECRYPTION_INFO",
"DECRYPTION_OKAY", "INV_SGNR", "FILE_START", "FILE_ERROR",
"FILE_DONE", "PKA_TRUST_GOOD", "PKA_TRUST_BAD", "BADMDC",
"GOODMDC", "NO_SGNR"):
"GOODMDC", "NO_SGNR", "NOTATION_NAME", "NOTATION_DATA"):
pass
elif key == "BADSIG":
self.valid = False

View File

@ -22,11 +22,11 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
from gajim import HAVE_GPG
from common.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):
@ -34,7 +34,7 @@ if HAVE_GPG:
self.decode_errors = 'replace'
self.passphrase = None
self.use_agent = use_agent
self.always_trust = False
self.always_trust = [] # list of keyID to always trust
def _setup_my_options(self):
self.options.armor = 1
@ -47,8 +47,14 @@ if HAVE_GPG:
self.options.extra_args.append('--use-agent')
def encrypt(self, str_, recipients, always_trust=False):
trust = always_trust
if not trust:
trust = True
for key in recipients:
if key not in self.always_trust:
trust = False
result = super(GnuPG, self).encrypt(str_, recipients,
always_trust=always_trust, passphrase=self.passphrase)
always_trust=trust, passphrase=self.passphrase)
if result.status == 'invalid recipient':
return '', 'NOT_TRUSTED'
@ -80,14 +86,21 @@ if HAVE_GPG:
def verify(self, str_, sign):
if str_ is None:
return ''
data = '-----BEGIN PGP SIGNED MESSAGE-----' + os.linesep
data = data + 'Hash: SHA1' + os.linesep + os.linesep
data = data + str_ + os.linesep
data = data + self._addHeaderFooter(sign, 'SIGNATURE')
result = super(GnuPG, self).verify(data)
# Hash algorithm is not transfered in the signed presence stanza so try
# all algorithms. Text name for hash algorithms from RFC 4880 - section 9.4
hash_algorithms = ['SHA512', 'SHA384', 'SHA256', 'SHA224', 'SHA1', 'RIPEMD160']
for algo in hash_algorithms:
data = os.linesep.join(
['-----BEGIN PGP SIGNED MESSAGE-----',
'Hash: ' + algo,
'',
str_,
self._addHeaderFooter(sign, 'SIGNATURE')]
)
result = super(GnuPG, self).verify(data)
if result.valid:
return result.key_id
if result.valid:
return result.key_id
return ''
def get_keys(self, secret=False):

View File

@ -35,22 +35,23 @@ import locale
import os
import subprocess
import urllib
import urllib2
import urllib
import webbrowser
import errno
import select
import base64
import hashlib
import shlex
import caps_cache
from common import caps_cache
import socket
import time
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
@ -121,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):
@ -143,9 +144,9 @@ 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.'
raise InvalidFormat('Invalid character in resource.')
def prep(user, server, resource):
"""
@ -155,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(unicode(user))
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(unicode(server))
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(unicode(resource))
resource = resourceprep.prepare(resource)
except UnicodeError:
raise InvalidFormat, _('Invalid character in resource.')
raise InvalidFormat(_('Invalid character in resource.'))
else:
resource = None
@ -206,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:
@ -263,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':
@ -277,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:
@ -287,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'''
@ -397,7 +398,7 @@ def exec_command(command, use_shell=False):
if use_shell:
subprocess.Popen('%s &' % command, shell=True).wait()
else:
args = shlex.split(command.encode('utf-8'))
args = shlex.split(command)
p = subprocess.Popen(args)
gajim.thread_interface(p.wait)
@ -409,7 +410,7 @@ def build_command(executable, parameter):
return command
def get_file_path_from_dnd_dropped_uri(uri):
path = urllib.unquote(uri) # escape special chars
path = urllib.parse.unquote(uri) # escape special chars
path = path.strip('\r\n\x00') # remove \r\n and NULL
# get the path to file
if re.match('^file:///[a-zA-Z]:/', path): # windows
@ -447,33 +448,6 @@ 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
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 get_windows_reg_env(varname, default=''):
"""
Ask for paths commonly used but not exposed as ENVs in english Windows 2003
@ -481,7 +455,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
@ -540,10 +514,11 @@ def sanitize_filename(filename):
"""
# 48 is the limit
if len(filename) > 48:
hash = hashlib.md5(filename)
filename = base64.b64encode(hash.digest())
hash = hashlib.md5(filename.encode('utf-8'))
filename = base64.b64encode(hash.digest()).decode('utf-8')
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(':', '_')\
@ -565,9 +540,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:
@ -623,12 +595,10 @@ 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
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 = ''
@ -636,13 +606,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')
@ -666,7 +636,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):
"""
@ -892,13 +862,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()))
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)
@ -907,7 +877,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:
@ -943,7 +914,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
@ -984,8 +955,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
@ -1419,7 +1392,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]
@ -1430,7 +1403,7 @@ def get_proxy_info(account):
proxy['pass'] = login[1]
proxy['useauth'] = True
else:
proxy['pass'] = u''
proxy['pass'] = ''
return proxy
except Exception:
@ -1449,14 +1422,15 @@ def _get_img_direct(attrs):
"""
Download an image. This function should be launched in a separated thread.
"""
mem, alt = '', ''
mem = b''
alt = ''
# 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)
except Exception, ex:
f = urllib.request.urlopen(req)
except Exception as ex:
log.debug('Error loading image %s ' % attrs['src'] + str(ex))
pixbuf = None
alt = attrs.get('alt', 'Broken image')
@ -1479,7 +1453,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:
@ -1496,6 +1470,7 @@ def _get_img_direct(attrs):
alt += '\n'
alt += _('Image is too big')
break
f.close()
return (mem, alt)
def _get_img_proxy(attrs, proxy):
@ -1531,17 +1506,17 @@ 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'
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')
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')

View File

@ -24,11 +24,11 @@
import locale
import gettext
import os
import defs
from common import defs
import unicodedata
# May be changed after GTK is imported
direction_mark = u'\u200E'
direction_mark = '\u200E'
def paragraph_direction_mark(text):
"""
@ -40,11 +40,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
@ -64,9 +64,9 @@ if os.name == 'nt':
if lang:
os.environ['LANG'] = lang
gettext.install(APP, DIR, unicode = True)
gettext.install(APP, DIR)
if gettext._translations:
_translation = gettext._translations.values()[0]
_translation = list(gettext._translations.values())[0]
else:
_translation = gettext.NullTranslations()
@ -97,7 +97,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:

View File

@ -68,7 +68,7 @@ try:
rootwindow = libX11.XDefaultRootWindow(dpy_p)
xss_available = True
except OSError, e:
except OSError:
# Logging?
xss_available = False
@ -94,6 +94,6 @@ def close():
if __name__ == '__main__':
import time
time.sleep(2.1)
print getIdleSec()
print(getIdleSec())
close()
print getIdleSec()
print(getIdleSec())

View File

@ -29,14 +29,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')
@ -80,7 +80,7 @@ class ConnectionJingle(object):
try:
jid = helpers.get_full_jid_from_iq(stanza)
except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % stanza.getFrom())
logger.warn('Invalid JID: %s, ignoring it' % stanza.getFrom())
return
id_ = stanza.getID()
if (jid, id_) in self.__iq_responses.keys():
@ -170,14 +170,14 @@ class ConnectionJingle(object):
def __hash_support(self, contact):
if contact.supports(nbxmpp.NS_HASHES):
if contact.supports(nbxmpp.NS_HASHES_MD5):
return 'md5'
elif contact.supports(nbxmpp.NS_HASHES_SHA1):
return 'sha-1'
if contact.supports(nbxmpp.NS_HASHES_SHA512):
return 'sha-512'
elif contact.supports(nbxmpp.NS_HASHES_SHA256):
return 'sha-256'
elif contact.supports(nbxmpp.NS_HASHES_SHA512):
return 'sha-512'
elif contact.supports(nbxmpp.NS_HASHES_SHA1):
return 'sha-1'
elif contact.supports(nbxmpp.NS_HASHES_MD5):
return 'md5'
return None
def iter_jingle_sessions(self, jid, sid=None, media=None):
@ -224,4 +224,3 @@ class ConnectionJingle(object):
if session.peerjid == jid and session.get_content(media):
return session
return None

View File

@ -17,9 +17,12 @@
Handles Jingle contents (XEP 0166)
"""
import gajim
import os
from common import gajim
import nbxmpp
from jingle_transport import JingleTransportIBB
from common.jingle_transport import JingleTransportIBB
from .jingle_xtls import SELF_SIGNED_CERTIFICATE
from .jingle_xtls import load_cert_file
contents = {}
@ -193,7 +196,7 @@ class JingleContent(object):
else:
# if the file is less than 10 mb, then it is small
# lets calculate it right away
if int(self.file_props.size) < 10000000 and not \
if self.file_props.size < 10000000 and not \
self.file_props.hash_:
h = self._calcHash()
file_tag.addChild(node=h)
@ -213,12 +216,18 @@ class JingleContent(object):
if self.use_security:
security = nbxmpp.simplexml.Node(
tag=nbxmpp.NS_JINGLE_XTLS + ' security')
# TODO: add fingerprint element
for m in ('x509', ): # supported authentication methods
method = nbxmpp.simplexml.Node(tag='method')
method.setAttr('name', m)
security.addChild(node=method)
content.addChild(node=security)
certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE)\
+ '.cert'
cert = load_cert_file(certpath)
if cert:
digest_algo = cert.get_signature_algorithm().split('With')[0]
security.addChild('fingerprint').addData(cert.digest(
digest_algo))
for m in ('x509', ): # supported authentication methods
method = nbxmpp.simplexml.Node(tag='method')
method.setAttr('name', m)
security.addChild(node=method)
content.addChild(node=security)
content.addChild(node=description_node)
def destroy(self):

View File

@ -20,16 +20,17 @@ 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 . import jingle_xtls
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
@ -68,6 +69,7 @@ class JingleFileTransfer(JingleContent):
self.callbacks['transport-info'] += [self.__on_transport_info]
self.callbacks['iq-result'] += [self.__on_iq_result]
self.use_security = use_security
self.x509_fingerprint = None
self.file_props = file_props
self.weinitiate = self.session.weinitiate
self.werequest = self.session.werequest
@ -95,8 +97,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),
@ -149,12 +151,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_:
@ -164,17 +167,37 @@ class JingleFileTransfer(JingleContent):
h.addHash(hash_, self.file_props.algo)
return h
def on_cert_received(self):
self.session.approve_session()
self.session.approve_content('file', name=self.name)
def __on_session_accept(self, stanza, content, error, action):
log.info("__on_session_accept")
con = self.session.connection
# We ack the session accept
response = stanza.buildReply('result')
response.delChild(response.getQuery())
con.connection.send(response)
security = content.getTag('security')
if not security: # responder can not verify our fingerprint
self.use_security = False
else:
fingerprint = security.getTag('fingerprint')
if fingerprint:
fingerprint = fingerprint.getData()
self.x509_fingerprint = fingerprint
if not jingle_xtls.check_cert(gajim.get_jid_without_resource(
self.session.responder), fingerprint):
id_ = jingle_xtls.send_cert_request(con,
self.session.responder)
jingle_xtls.key_exchange_pend(id_,
self.continue_session_accept, [stanza])
raise nbxmpp.NodeProcessed
self.continue_session_accept(stanza)
def continue_session_accept(self, stanza):
con = self.session.connection
if self.state == STATE_TRANSPORT_REPLACE:
# We ack the session accept
response = stanza.buildReply('result')
response.delChild(response.getQuery())
con.connection.send(response)
# If we are requesting we don't have the file
if self.session.werequest:
raise nbxmpp.NodeProcessed
@ -185,16 +208,13 @@ class JingleFileTransfer(JingleContent):
# Calculate file hash in a new thread
# if we haven't sent the hash already.
if self.file_props.hash_ is None and self.file_props.algo and \
not self.werequest:
not self.werequest:
self.hashThread = threading.Thread(target=self.__send_hash)
self.hashThread.start()
for host in self.file_props.streamhosts:
host['initiator'] = self.session.initiator
host['target'] = self.session.responder
host['sid'] = self.file_props.sid
response = stanza.buildReply('result')
response.delChild(response.getQuery())
con.connection.send(response)
fingerprint = None
if self.use_security:
fingerprint = 'client'
@ -203,7 +223,7 @@ class JingleFileTransfer(JingleContent):
self.file_props.sid, self.on_connect,
self._on_connect_error, fingerprint=fingerprint,
receiving=False)
return
raise nbxmpp.NodeProcessed
self.__state_changed(STATE_TRANSFERING)
raise nbxmpp.NodeProcessed

View File

@ -13,9 +13,9 @@
## You should have received a copy of the GNU General Public License
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
import gajim
from common import gajim
import nbxmpp
from jingle_transport import *
from common.jingle_transport import *
from common.socks5 import Socks5ReceiverClient, Socks5SenderClient

View File

@ -19,19 +19,19 @@ Handles Jingle RTP sessions (XEP 0167)
from collections import deque
import gobject
from gi.repository import GLib
import socket
import nbxmpp
import farstream, gst
import gst.interfaces
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
@ -66,7 +66,6 @@ class JingleRTPContent(JingleContent):
# pipeline and bus
self.pipeline = gst.Pipeline()
bus = self.pipeline.get_bus()
bus.enable_sync_message_emission()
bus.add_signal_watch()
bus.connect('message', self._on_gst_message)
@ -90,8 +89,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.warning('Lookup of stun ip failed: %s' % str(e))
else:
params['stun-ip'] = ip
@ -108,13 +107,13 @@ class JingleRTPContent(JingleContent):
try:
bin = gst.parse_bin_from_description(pipeline, True)
return bin
except GError, 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):
@ -133,13 +132,13 @@ class JingleRTPContent(JingleContent):
events = deque(events)
self._dtmf_running = True
self._start_dtmf(events.popleft())
gobject.timeout_add(500, self._next_dtmf, events)
GLib.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)
GLib.timeout_add(500, self._next_dtmf, events)
else:
self._dtmf_running = False
@ -370,11 +369,8 @@ class JingleAudio(JingleRTPContent):
class JingleVideo(JingleRTPContent):
def __init__(self, session, transport=None, in_xid=0, out_xid=0):
def __init__(self, session, transport=None):
JingleRTPContent.__init__(self, session, 'video', transport)
self.in_xid = in_xid
self.out_xid = out_xid
self.out_xid_set = False
self.setup_stream()
def setup_stream(self):
@ -382,8 +378,6 @@ class JingleVideo(JingleRTPContent):
# sometimes, one window won't show up,
# sometimes it'll freeze...
JingleRTPContent.setup_stream(self, self._on_src_pad_added)
bus = self.pipeline.get_bus()
bus.connect('sync-message::element', self._on_sync_message)
# the local parts
if gajim.config.get('video_framerate'):
@ -399,25 +393,17 @@ class JingleVideo(JingleRTPContent):
video_size = 'video/x-raw-yuv,width=%s,height=%s ! ' % (w, h)
else:
video_size = ''
if gajim.config.get('video_see_self'):
tee = '! tee name=t ! queue ! videoscale ! ' + \
'video/x-raw-yuv,width=160,height=120 ! ffmpegcolorspace ! ' + \
'%s t. ! queue ' % gajim.config.get(
'video_output_device')
else:
tee = ''
self.src_bin = self.make_bin_from_config('video_input_device',
'%%s %s! %svideoscale ! %sffmpegcolorspace' % (tee, framerate,
video_size), _("video input"))
'%%s ! %svideoscale ! %sffmpegcolorspace' % (framerate, video_size),
_("video input"))
#caps = gst.element_factory_make('capsfilter')
#caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240'))
self.pipeline.add(self.src_bin)#, caps)
self.pipeline.set_state(gst.STATE_PLAYING)
#src_bin.link(caps)
self.sink = self.make_bin_from_config('video_output_device',
'videoscale ! ffmpegcolorspace ! %s',
'videoscale ! ffmpegcolorspace ! %s force-aspect-ratio=True',
_("video output"))
self.pipeline.add(self.sink)
@ -427,27 +413,11 @@ class JingleVideo(JingleRTPContent):
# The following is needed for farstream to process ICE requests:
self.pipeline.set_state(gst.STATE_PLAYING)
def _on_sync_message(self, bus, message):
if message.structure is None:
return False
if message.structure.get_name() == 'prepare-xwindow-id':
message.src.set_property('force-aspect-ratio', True)
imagesink = message.src
if gajim.config.get('video_see_self') and not self.out_xid_set:
imagesink.set_xwindow_id(self.out_xid)
self.out_xid_set = True
else:
imagesink.set_xwindow_id(self.in_xid)
def get_fallback_src(self):
# TODO: Use avatar?
pipeline = 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1 ! ffmpegcolorspace'
return gst.parse_bin_from_description(pipeline, True)
def destroy(self):
JingleRTPContent.destroy(self)
self.pipeline.get_bus().disconnect_by_func(self._on_sync_message)
def get_content(desc):
if desc['media'] == 'audio':
return JingleAudio

View File

@ -28,12 +28,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")
@ -75,7 +75,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
@ -273,8 +272,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):
"""
@ -592,7 +591,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):

View File

@ -156,7 +156,8 @@ class JingleTransportSocks5(JingleTransport):
candidates.append(cand)
# we need this when we construct file_props on session-initiation
self.remote_candidates = candidates
if candidates:
self.remote_candidates = candidates
return candidates
@ -177,30 +178,39 @@ class JingleTransportSocks5(JingleTransport):
return
if not self.connection:
return
local_ip_cand = []
port = int(gajim.config.get('file_transfers_port'))
#type preference of connection type. XEP-0260 section 2.2
type_preference = 126
c = {'host': self.connection.peerhost[0]}
c['candidate_id'] = self.connection.connection.getAnID()
c['port'] = port
c['type'] = 'direct'
c['jid'] = self.ourjid
c['priority'] = (2**16) * type_preference
priority = (2**16) * type_preference
hosts = set()
local_ip_cand = []
c = {'host': self.connection.peerhost[0],
'candidate_id': self.connection.connection.getAnID(),
'port': port,
'type': 'direct',
'jid': self.ourjid,
'priority': priority}
hosts.add(self.connection.peerhost[0])
local_ip_cand.append(c)
for addr in socket.getaddrinfo(socket.gethostname(), None):
if not addr[4][0] in local_ip_cand and not addr[4][0].startswith('127'):
c = {'host': addr[4][0]}
c['candidate_id'] = self.connection.connection.getAnID()
c['port'] = port
c['type'] = 'direct'
c['jid'] = self.ourjid
c['priority'] = (2**16) * type_preference
c['initiator'] = self.file_props.sender
c['target'] = self.file_props.receiver
local_ip_cand.append(c)
try:
for addrinfo in socket.getaddrinfo(socket.gethostname(), None):
addr = addrinfo[4][0]
if not addr in hosts and not addr.startswith('127'):
c = {'host': addr,
'candidate_id': self.connection.connection.getAnID(),
'port': port,
'type': 'direct',
'jid': self.ourjid,
'priority': priority,
'initiator': self.file_props.sender,
'target': self.file_props.receiver}
hosts.add(addr)
local_ip_cand.append(c)
except socket.gaierror:
pass # ignore address-related errors for getaddrinfo
self._add_candidates(local_ip_cand)
@ -208,6 +218,7 @@ class JingleTransportSocks5(JingleTransport):
if not self.connection:
return
type_preference = 126
priority = (2**16) * type_preference
additional_ip_cand = []
port = int(gajim.config.get('file_transfers_port'))
ft_add_hosts = gajim.config.get('ft_add_hosts_to_send')
@ -215,14 +226,14 @@ class JingleTransportSocks5(JingleTransport):
if ft_add_hosts:
hosts = [e.strip() for e in ft_add_hosts.split(',')]
for h in hosts:
c = {'host': h}
c['candidate_id'] = self.connection.connection.getAnID()
c['port'] = port
c['type'] = 'direct'
c['jid'] = self.ourjid
c['priority'] = (2**16) * type_preference
c['initiator'] = self.file_props.sender
c['target'] = self.file_props.receiver
c = {'host': h,
'candidate_id': self.connection.connection.getAnID(),
'port': port,
'type': 'direct',
'jid': self.ourjid,
'priority': priority,
'initiator': self.file_props.sender,
'target': self.file_props.receiver}
additional_ip_cand.append(c)
self._add_candidates(additional_ip_cand)
@ -231,6 +242,7 @@ class JingleTransportSocks5(JingleTransport):
if not self.connection:
return
type_preference = 10
priority = (2**16) * type_preference
proxy_cand = []
socks5conn = self.connection
proxyhosts = socks5conn._get_file_transfer_proxies_from_config(self.file_props)
@ -239,14 +251,14 @@ class JingleTransportSocks5(JingleTransport):
self.file_props.proxyhosts = proxyhosts
for proxyhost in proxyhosts:
c = {'host': proxyhost['host']}
c['candidate_id'] = self.connection.connection.getAnID()
c['port'] = int(proxyhost['port'])
c['type'] = 'proxy'
c['jid'] = proxyhost['jid']
c['priority'] = (2**16) * type_preference
c['initiator'] = self.file_props.sender
c['target'] = self.file_props.receiver
c = {'host': proxyhost['host'],
'candidate_id': self.connection.connection.getAnID(),
'port': int(proxyhost['port']),
'type': 'proxy',
'jid': proxyhost['jid'],
'priority': priority,
'initiator': self.file_props.sender,
'target': self.file_props.receiver}
proxy_cand.append(c)
self._add_candidates(proxy_cand)
@ -298,7 +310,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)
@ -331,6 +343,7 @@ class JingleTransportIBB(JingleTransport):
return transport
try:
raise ImportError
import farstream
except Exception:
pass
@ -402,7 +415,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

View File

@ -20,21 +20,22 @@ import os
import nbxmpp
import logging
import common
from common import gajim
log = logging.getLogger('gajim.c.jingle_xtls')
PYOPENSSL_PRESENT = False
pending_contents = {} # key-exchange id -> session, accept that session once key-exchange completes
# key-exchange id -> [callback, args], accept that session once key-exchange completes
pending_contents = {}
def key_exchange_pend(id_, content):
pending_contents[id_] = content
def key_exchange_pend(id_, cb, args):
# args is a list
pending_contents[id_] = [cb, args]
def approve_pending_content(id_):
content = pending_contents[id_]
content.session.approve_session()
content.session.approve_content('file', name=content.name)
cb = pending_contents[id_][0]
args = pending_contents[id_][1]
cb(*args)
try:
import OpenSSL.SSL
@ -50,23 +51,25 @@ if PYOPENSSL_PRESENT:
TYPE_DSA = crypto.TYPE_DSA
SELF_SIGNED_CERTIFICATE = 'localcert'
DH_PARAMS = 'dh_params.pem'
DEFAULT_DH_PARAMS = 'dh4096.pem'
def default_callback(connection, certificate, error_num, depth, return_code):
log.info("certificate: %s" % certificate)
return return_code
def load_cert_file(cert_path, cert_store):
def load_cert_file(cert_path, cert_store=None):
"""
This is almost identical to the one in nbxmpp.tls_nb
"""
if not os.path.isfile(cert_path):
return
return None
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
return None
lines = f.readlines()
i = 0
begin = -1
@ -78,8 +81,10 @@ def load_cert_file(cert_path, cert_store):
try:
x509cert = OpenSSL.crypto.load_certificate(
OpenSSL.crypto.FILETYPE_PEM, cert)
cert_store.add_cert(x509cert)
except OpenSSL.crypto.Error, exception_obj:
if cert_store:
cert_store.add_cert(x509cert)
return x509cert
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:
@ -87,13 +92,15 @@ def load_cert_file(cert_path, cert_store):
'%s' % cert_path)
begin = -1
i += 1
f.close()
def get_context(fingerprint, verify_cb=None):
def get_context(fingerprint, verify_cb=None, remote_jid=None):
"""
constructs and returns the context objects
"""
ctx = SSL.Context(SSL.SSLv23_METHOD)
flags = (SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_SINGLE_DH_USE)
flags = (SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_SINGLE_DH_USE \
| SSL.OP_NO_TICKET)
ctx.set_options(flags)
ctx.set_cipher_list('HIGH:!aNULL:!3DES')
@ -106,22 +113,46 @@ def get_context(fingerprint, verify_cb=None):
cert_name = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE)
ctx.use_privatekey_file (cert_name + '.pkey')
ctx.use_certificate_file(cert_name + '.cert')
store = ctx.get_cert_store()
for f in os.listdir(os.path.expanduser(gajim.MY_PEER_CERTS_PATH)):
load_cert_file(os.path.join(os.path.expanduser(
gajim.MY_PEER_CERTS_PATH), f), store)
log.debug('certificate file ' + f + ' loaded fingerprint ' + \
fingerprint)
# Try to load Diffie-Hellman parameters.
# First try user DH parameters, if this fails load the default DH parameters
dh_params_name = os.path.join(gajim.MY_CERT_DIR, DH_PARAMS)
try:
with open(dh_params_name, "r") as dh_params_file:
ctx.load_tmp_dh(str(dh_params_name).encode('utf-8'))
except IOError as err:
default_dh_params_name = os.path.join(common.gajim.DATA_DIR,
'other', DEFAULT_DH_PARAMS)
try:
with open(default_dh_params_name, "r") as default_dh_params_file:
ctx.load_tmp_dh(str(default_dh_params_name).encode('utf-8'))
except IOError as err:
log.error('Unable to load default DH parameter file: %s , %s'
% (default_dh_params_name, err))
raise
if remote_jid:
store = ctx.get_cert_store()
path = os.path.join(os.path.expanduser(gajim.MY_PEER_CERTS_PATH),
remote_jid) + '.cert'
if os.path.exists(path):
load_cert_file(path, cert_store=store)
log.debug('certificate file ' + path + ' loaded fingerprint ' + \
fingerprint)
return ctx
def read_cert(certpath):
certificate = ''
with open(certpath, 'r') as certfile:
for line in certfile.readlines():
if not line.startswith('-'):
certificate += line
return certificate
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
certificate = read_cert(certpath)
iq = nbxmpp.Iq('result', to=jid_from);
iq.setAttr('id', sid)
@ -151,9 +182,21 @@ def handle_new_cert(con, obj, jid_from):
f.write('-----BEGIN CERTIFICATE-----\n')
f.write(cert)
f.write('-----END CERTIFICATE-----\n')
f.close()
approve_pending_content(id_)
def check_cert(jid, fingerprint):
certpath = os.path.join(os.path.expanduser(gajim.MY_PEER_CERTS_PATH), jid)
certpath += '.cert'
if os.path.exists(certpath):
cert = load_cert_file(certpath)
if cert:
digest_algo = cert.get_signature_algorithm().split('With')[0]
if cert.digest(digest_algo) == fingerprint:
return True
return False
def send_cert_request(con, to_jid):
iq = nbxmpp.Iq('get', to=to_jid)
id_ = con.connection.getAnID()
@ -161,7 +204,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
@ -177,12 +220,12 @@ def createKeyPair(type, bits):
pkey.generate_key(type, bits)
return pkey
def createCertRequest(pkey, digest="sha1", **name):
def createCertRequest(pkey, digest="sha256", **name):
"""
Create a certificate request.
Arguments: pkey - The key to associate with the request
digest - Digestion method to use for signing, default is sha1
digest - Digestion method to use for signing, default is sha256
**name - The name of the subject of the request, possible
arguments are:
C - Country name
@ -204,7 +247,7 @@ def createCertRequest(pkey, digest="sha1", **name):
req.sign(pkey, digest)
return req
def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter), digest="sha1"):
def createCertificate(req, issuerCert, issuerKey, serial, notBefore, notAfter, digest="shai256"):
"""
Generate a certificate given a certificate request.
@ -216,7 +259,7 @@ def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter
starts being valid
notAfter - Timestamp (relative to now) when the certificate
stops being valid
digest - Digest method to use for signing, default is sha1
digest - Digest method to use for signing, default is sha256
Returns: The signed certificate in an X509 object
"""
cert = crypto.X509()
@ -238,13 +281,13 @@ def make_certs(filepath, CN):
"""
key = createKeyPair(TYPE_RSA, 4096)
req = createCertRequest(key, CN=CN)
cert = createCertificate(req, (req, key), 0, (0, 60*60*24*365*5)) # five years
private_key_file = open(filepath + '.pkey', 'w')
os.chmod(filepath + '.pkey', 0600)
private_key_file.write(crypto.dump_privatekey(
crypto.FILETYPE_PEM, key))
open(filepath + '.cert', 'w').write(crypto.dump_certificate(
crypto.FILETYPE_PEM, cert))
cert = createCertificate(req, req, key, 0, 0, 60*60*24*365*5) # five years
with open(filepath + '.pkey', 'wb') as f:
os.chmod(filepath + '.pkey', 0o600)
f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))
with open(filepath + '.cert', 'wb') as f:
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode(
'utf-8'))
if __name__ == '__main__':

View File

@ -46,14 +46,14 @@ 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'),
"-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

View File

@ -33,16 +33,16 @@ import sys
import time
import datetime
from gzip import GzipFile
from cStringIO import StringIO
import gobject
from io import BytesIO
from gi.repository import GLib
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']
@ -151,7 +151,7 @@ class Logger:
try:
self.cur.execute("ATTACH DATABASE '%s' AS cache" % \
CACHE_DB_PATH.replace("'", "''"))
except sqlite.Error, e:
except sqlite.Error as e:
log.debug("Failed to attach cache database: %s" % str(e))
def set_synchronous(self, sync):
@ -160,7 +160,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):
@ -170,15 +170,15 @@ class Logger:
def _really_commit(self):
try:
self.con.commit()
except sqlite.OperationalError, e:
print >> sys.stderr, str(e)
except sqlite.OperationalError as e:
print(str(e), file=sys.stderr)
self.commit_timout_id = None
return False
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 = GLib.timeout_add(500, self._really_commit)
def simple_commit(self, sql_to_commit):
"""
@ -190,7 +190,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
@ -258,11 +258,11 @@ class Logger:
self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid,
typ))
self.con.commit()
except sqlite.IntegrityError, 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)
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)
@ -413,15 +413,15 @@ 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:
print >> sys.stderr, str(e)
except sqlite.OperationalError as e:
print(str(e), file=sys.stderr)
else:
self._timeout_commit()
if message_id:
@ -528,7 +528,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
@ -541,7 +541,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
@ -555,13 +555,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):
@ -586,7 +586,7 @@ class Logger:
"""
try:
self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, 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)
@ -630,7 +630,7 @@ class Logger:
"""
try:
self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, 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)
@ -659,14 +659,14 @@ class Logger:
"""
try:
self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, e:
except exceptions.PysqliteOperationalError:
# 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
@ -700,7 +700,7 @@ class Logger:
"""
try:
self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, e:
except exceptions.PysqliteOperationalError:
# Error trying to create a new jid_id. This means there is no log
return []
days_with_logs = []
@ -742,7 +742,7 @@ class Logger:
else:
try:
jid_id = self.get_jid_id(jid, 'ROOM')
except exceptions.PysqliteOperationalError, e:
except exceptions.PysqliteOperationalError:
# Error trying to create a new jid_id. This means there is no log
return None
where_sql = 'jid_id = ?'
@ -768,7 +768,7 @@ class Logger:
"""
try:
jid_id = self.get_jid_id(jid, 'ROOM')
except exceptions.PysqliteOperationalError, 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
@ -808,7 +808,7 @@ class Logger:
for user in family:
try:
jid_id = self.get_jid_id(user['jid'])
except exceptions.PysqliteOperationalError, e:
except exceptions.PysqliteOperationalError:
continue
where_sql += 'jid_id = ?'
jid_tuple += (jid_id,)
@ -890,8 +890,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=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_))
@ -931,16 +930,15 @@ class Logger:
data.extend(features)
data = '\0'.join(data)
# if there's a need to do more gzip, put that to a function
string = StringIO()
string = BytesIO()
gzip = GzipFile(fileobj=string, mode='w')
data = data.encode('utf-8') # the gzip module can't handle unicode objects
gzip.write(data)
gzip.write(data.encode('utf-8'))
gzip.close()
data = string.getvalue()
self.cur.execute('''
INSERT INTO caps_cache ( hash_method, hash, data, last_seen )
VALUES (?, ?, ?, ?);
''', (hash_method, hash_, buffer(data), int(time.time())))
''', (hash_method, hash_, memoryview(data), int(time.time())))
# (1) -- note above
self._timeout_commit()
@ -996,7 +994,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=?',
@ -1018,7 +1016,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
@ -1054,6 +1052,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
name = name
data[jid] = {}
if name:
data[jid]['name'] = name
@ -1077,6 +1077,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
data[jid]['groups'].append(group_name)
del data[jid]['id']
@ -1155,7 +1156,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')

View File

@ -19,7 +19,7 @@
##
import logging
import i18n
from common import i18n
def parseLogLevel(arg):
"""
@ -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:
@ -141,7 +141,7 @@ def init(use_color=False):
consoleloghandler.setFormatter(
FancyFormatter(
'%(asctime)s %(levelname)s %(name)s %(message)s',
'%H:%M:%S',
'%x %H:%M:%S',
use_color
)
)
@ -179,13 +179,13 @@ if __name__ == '__main__':
log = logging.getLogger('gajim')
log.debug('debug')
log.info('info')
log.warn('warn')
log.warning('warn')
log.error('error')
log.critical('critical')
log = logging.getLogger('gajim.c.x.dispatcher')
log.debug('debug')
log.info('info')
log.warn('warn')
log.warning('warn')
log.error('error')
log.critical('critical')

View File

@ -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:

Some files were not shown because too many files have changed in this diff Show More