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> <h2>Runtime Requirements</h2>
<ul> <ul>
<li>python2.5 or higher</li> <li>python2.7 or higher</li>
<li>pygtk2.22 or higher</li> <li>python-gi</li>
<li>gir1.2-gtk-3.0</li>
<li>python-nbxmpp</li> <li>python-nbxmpp</li>
</ul> </ul>
@ -28,7 +29,7 @@
<li>For zeroconf (bonjour), the "enable link-local messaging" checkbox, you need dbus-glib, python-avahi</li> <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>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>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>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>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> <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 ..\LIBEAY32.dll bin
copy ..\SSLEAY32.dll bin copy ..\SSLEAY32.dll bin
REM for snarl plugin
xcopy ..\win32com bin\win32com /e /i
mkdir bin\gtk mkdir bin\gtk
cd ../src/gtk cd ../src/gtk
hg archive ..\..\gajim_built\bin\gtk hg archive ..\..\gajim_built\bin\gtk

View file

@ -12,7 +12,9 @@ soundsdir = $(pkgdatadir)/data/sounds
sounds_DATA = $(srcdir)/sounds/*.wav sounds_DATA = $(srcdir)/sounds/*.wav
otherdir = $(pkgdatadir)/data/other 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 man_MANS = gajim.1 gajim-remote.1 gajim-history-manager.1

View file

@ -40,7 +40,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="join_group_chat_menuitem"> <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="visible">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="image">image4</property> <property name="image">image4</property>
@ -93,7 +93,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="edit_account_menuitem"> <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="visible">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="image">image8</property> <property name="image">image8</property>

View file

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

View file

@ -63,42 +63,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="add_button"> <object class="GtkButton" id="add_button">
<property name="label" translatable="yes">Add</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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="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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -107,42 +79,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="remove_button"> <object class="GtkButton" id="remove_button">
<property name="label" translatable="yes">Delete</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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="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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -151,46 +95,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="rename_button"> <object class="GtkButton" id="rename_button">
<property name="label" translatable="yes">Re_name</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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="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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -225,7 +137,7 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkCheckButton" id="enable_checkbutton1"> <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="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -520,6 +432,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property> <property name="invisible_char">&#x25CF;</property>
<signal name="focus_out_event" handler="on_cert_entry1_focus_out_event"/>
</object> </object>
<packing> <packing>
<property name="position">1</property> <property name="position">1</property>
@ -531,6 +444,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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"/> <signal name="clicked" handler="on_browse_for_client_cert_button_clicked"/>
</object> </object>
<packing> <packing>
@ -1120,7 +1034,7 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkCheckButton" id="enable_zeroconf_checkbutton2"> <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="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</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="step_increment">1</property>
<property name="page_increment">5</property> <property name="page_increment">5</property>
</object> </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> </interface>

View file

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

View file

@ -5,6 +5,7 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="border_width">6</property> <property name="border_width">6</property>
<property name="title" translatable="yes">Advanced Configuration Editor</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="role">ace</property>
<property name="default_width">650</property> <property name="default_width">650</property>
<property name="default_height">540</property> <property name="default_height">540</property>

View file

@ -38,47 +38,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="remove_button"> <object class="GtkButton" id="remove_button">
<property name="label" translatable="yes">_Unblock</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="border_width">3</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -89,4 +56,8 @@
</object> </object>
</child> </child>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-remove</property>
</object>
</interface> </interface>

View file

@ -1,39 +1,88 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.16"/> <!-- interface-requires gtk+ 3.0 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="change_status_message_dialog"> <object class="GtkDialog" id="change_status_message_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property> <property name="border_width">6</property>
<property name="default_width">270</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> <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"> <child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox5"> <object class="GtkBox" id="dialog-vbox5">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">6</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> <child>
<object class="GtkFrame" id="frame38"> <object class="GtkFrame" id="frame38">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
<property name="shadow_type">none</property> <property name="shadow_type">none</property>
<child> <child>
<object class="GtkAlignment" id="alignment107"> <object class="GtkAlignment" id="alignment107">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property> <property name="left_padding">12</property>
<child> <child>
<object class="GtkVBox" id="vbox112"> <object class="GtkVBox" id="vbox112">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property> <property name="border_width">6</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkScrolledWindow" id="scrolledwindow24"> <object class="GtkScrolledWindow" id="scrolledwindow24">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">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> <property name="shadow_type">in</property>
<child> <child>
<object class="GtkTextView" id="message_textview"> <object class="GtkTextView" id="message_textview">
@ -45,33 +94,41 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkHButtonBox" id="hbuttonbox33"> <object class="GtkHButtonBox" id="hbuttonbox33">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
<object class="GtkButton" id="save_as_preset_button"> <object class="GtkButton" id="save_as_preset_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</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> <child>
<object class="GtkAlignment" id="alignment106"> <object class="GtkAlignment" id="alignment106">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<child> <child>
<object class="GtkHBox" id="hbox3021"> <object class="GtkHBox" id="hbox3021">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property> <property name="spacing">2</property>
<child> <child>
<object class="GtkImage" id="image1369"> <object class="GtkImage" id="image1369">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save-as</property> <property name="stock">gtk-save-as</property>
</object> </object>
<packing> <packing>
@ -83,6 +140,7 @@
<child> <child>
<object class="GtkLabel" id="label380"> <object class="GtkLabel" id="label380">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Save as Preset...</property> <property name="label" translatable="yes">Save as Preset...</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
</object> </object>
@ -106,44 +164,53 @@
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">False</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkTable" id="under_table"> <object class="GtkTable" id="under_table">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">3</property> <property name="n_rows">3</property>
<property name="n_columns">2</property> <property name="n_columns">2</property>
<property name="column_spacing">6</property> <property name="column_spacing">6</property>
<property name="row_spacing">6</property> <property name="row_spacing">6</property>
<child> <child>
<object class="GtkButton" id="mood_button"> <object class="GtkButton" id="mood_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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> <child>
<object class="GtkHBox" id="hbox2"> <object class="GtkHBox" id="hbox2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkImage" id="mood_image"> <object class="GtkImage" id="mood_image">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property> <property name="stock">gtk-missing-image</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="mood_button_label"> <object class="GtkLabel" id="mood_button_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="wrap">True</property> <property name="wrap">True</property>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
@ -155,35 +222,44 @@
<property name="right_attach">2</property> <property name="right_attach">2</property>
<property name="top_attach">2</property> <property name="top_attach">2</property>
<property name="bottom_attach">3</property> <property name="bottom_attach">3</property>
<property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="activity_button"> <object class="GtkButton" id="activity_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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> <child>
<object class="GtkHBox" id="hbox1"> <object class="GtkHBox" id="hbox1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkImage" id="activity_image"> <object class="GtkImage" id="activity_image">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property> <property name="stock">gtk-missing-image</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="activity_button_label"> <object class="GtkLabel" id="activity_button_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="wrap">True</property> <property name="wrap">True</property>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
@ -195,11 +271,13 @@
<property name="right_attach">2</property> <property name="right_attach">2</property>
<property name="top_attach">1</property> <property name="top_attach">1</property>
<property name="bottom_attach">2</property> <property name="bottom_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="mood_label"> <object class="GtkLabel" id="mood_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">Mood:</property> <property name="label" translatable="yes">Mood:</property>
</object> </object>
@ -207,11 +285,13 @@
<property name="top_attach">2</property> <property name="top_attach">2</property>
<property name="bottom_attach">3</property> <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property> <property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="activity_label"> <object class="GtkLabel" id="activity_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">Activity:</property> <property name="label" translatable="yes">Activity:</property>
</object> </object>
@ -219,31 +299,37 @@
<property name="top_attach">1</property> <property name="top_attach">1</property>
<property name="bottom_attach">2</property> <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property> <property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkComboBox" id="message_combobox"> <object class="GtkComboBox" id="message_combobox">
<property name="visible">True</property> <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> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
<property name="right_attach">2</property> <property name="right_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label165"> <object class="GtkLabel" id="label165">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">Preset messages:</property> <property name="label" translatable="yes">Preset messages:</property>
</object> </object>
<packing> <packing>
<property name="x_options">GTK_FILL</property> <property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>
</child> </child>
@ -254,63 +340,19 @@
<child type="label"> <child type="label">
<object class="GtkLabel" id="label383"> <object class="GtkLabel" id="label383">
<property name="visible">True</property> <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="label" translatable="yes">&lt;b&gt;Type your new status message&lt;/b&gt;</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
</object> </object>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>
</child> </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> </object>
</child> </child>
<action-widgets>
<action-widget response="-6">cancel_button</action-widget>
<action-widget response="-5">ok_button</action-widget>
</action-widgets>
</object> </object>
</interface> </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> </packing>
</child> </child>
<child> <child>
<object class="GtkComboBoxEntry" id="server_list_comboboxentry"> <object class="GtkComboBox" id="server_list_comboboxentry">
<property name="visible">True</property> <property name="visible">True</property>
</object> </object>
<packing> <packing>
@ -122,46 +122,13 @@ Select the contacts you want to invite</property>
</child> </child>
<child> <child>
<object class="GtkButton" id="invite_button"> <object class="GtkButton" id="invite_button">
<property name="label" translatable="yes">In_vite</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -179,4 +146,8 @@ Select the contacts you want to invite</property>
</object> </object>
</child> </child>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
</interface> </interface>

View file

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

View file

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

View file

@ -1,93 +1,46 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.16"/> <!-- interface-requires gtk+ 3.0 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="esession_info_window"> <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="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="border_width">5</property>
<property name="window_position">center-on-parent</property> <property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<child internal-child="vbox"> <child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1"> <object class="GtkBox" id="dialog-vbox1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">2</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"> <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="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
<object class="GtkButton" id="verify_now_button"> <object class="GtkButton" id="verify_now_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</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> <child>
<object class="GtkAlignment" id="alignment2"> <object class="GtkAlignment" id="alignment2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<child> <child>
<object class="GtkHBox" id="hbox3"> <object class="GtkHBox" id="hbox3">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property> <property name="spacing">2</property>
<child> <child>
<object class="GtkImage" id="image2"> <object class="GtkImage" id="image2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property> <property name="stock">gtk-apply</property>
</object> </object>
<packing> <packing>
@ -99,6 +52,7 @@
<child> <child>
<object class="GtkLabel" id="button_label"> <object class="GtkLabel" id="button_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Verify</property> <property name="label" translatable="yes">_Verify</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
</object> </object>
@ -122,11 +76,13 @@
<child> <child>
<object class="GtkButton" id="close_button3"> <object class="GtkButton" id="close_button3">
<property name="label">gtk-close</property> <property name="label">gtk-close</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -137,10 +93,74 @@
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property> <property name="pack_type">end</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </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> </object>
</child> </child>
<action-widgets> <action-widgets>

View file

@ -41,11 +41,11 @@
</object> </object>
</child> </child>
<signal name="button_press_event" handler="on_transfers_list_button_press_event"/> <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="button_release_event" handler="on_transfers_list_button_release_event"/>
<signal name="key_press_event" handler="on_transfers_list_key_press_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="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> </object>
</child> </child>
</object> </object>
@ -81,12 +81,15 @@
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
<object class="GtkButton" id="cleanup_button"> <object class="GtkButton" id="cleanup_button">
<property name="label" translatable="yes">Clean _up</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</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="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"> <child internal-child="accessible">
<object class="AtkObject" id="cleanup_button-atkobject"> <object class="AtkObject" id="cleanup_button-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">Remove file transfer from the list.</property> <property name="AtkObject::accessible-name" translatable="yes">Remove file transfer from the list.</property>
@ -94,42 +97,6 @@
</object> </object>
</child> </child>
<signal name="clicked" handler="on_cleanup_button_clicked"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -139,48 +106,15 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="pause_restore_button"> <object class="GtkButton" id="pause_restore_button">
<property name="label" translatable="yes">_Pause</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -252,7 +186,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="continue_menuitem"> <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="no_show_all">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
@ -262,7 +196,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="pause_menuitem"> <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_underline">True</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property> <property name="accel_group">accelgroup1</property>
@ -285,7 +219,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="open_folder_menuitem"> <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_underline">True</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property> <property name="accel_group">accelgroup1</property>
@ -294,4 +228,12 @@
</child> </child>
</object> </object>
<object class="GtkAccelGroup" id="accelgroup1"/> <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> </interface>

View file

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

View file

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

View file

@ -212,48 +212,16 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene
</child> </child>
<child> <child>
<object class="GtkButton" id="search_db_button"> <object class="GtkButton" id="search_db_button">
<property name="label" translatable="yes">_Search Database</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="has_default">True</property> <property name="has_default">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <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-widget response="-5">save_button</action-widget>
</action-widgets> </action-widgets>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-find</property>
</object>
</interface> </interface>

View file

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

View file

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

View file

@ -1,89 +1,32 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.16"/> <!-- interface-requires gtk+ 3.0 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="input_dialog"> <object class="GtkDialog" id="input_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property> <property name="border_width">6</property>
<property name="default_width">400</property> <property name="default_width">400</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<property name="has_separator">False</property> <signal name="destroy" handler="on_input_dialog_destroy" swapped="no"/>
<signal name="destroy" handler="on_input_dialog_destroy"/>
<child internal-child="vbox"> <child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox10"> <object class="GtkBox" id="dialog-vbox10">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">6</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"> <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="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
<object class="GtkButton" id="cancelbutton"> <object class="GtkButton" id="cancelbutton">
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
</object> </object>
<packing> <packing>
@ -95,11 +38,13 @@
<child> <child>
<object class="GtkButton" id="okbutton"> <object class="GtkButton" id="okbutton">
<property name="label">gtk-ok</property> <property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="has_default">True</property> <property name="has_default">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
</object> </object>
<packing> <packing>
@ -111,10 +56,81 @@
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property> <property name="pack_type">end</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </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> </object>
</child> </child>
<action-widgets> <action-widgets>

View file

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

View file

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

View file

@ -55,38 +55,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="configure_button"> <object class="GtkButton" id="configure_button">
<property name="label" translatable="yes">_Configure</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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="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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -120,4 +96,8 @@
</object> </object>
</child> </child>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-preferences</property>
</object>
</interface> </interface>

View file

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

View file

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

View file

@ -1,34 +1,19 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.16"/> <!-- interface-requires gtk+ 3.0 -->
<!-- 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>
<object class="GtkEventBox" id="chat_tab_ebox"> <object class="GtkEventBox" id="chat_tab_ebox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="visible_window">False</property> <property name="visible_window">False</property>
<child> <child>
<object class="GtkHBox" id="tab_hbox"> <object class="GtkHBox" id="tab_hbox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">4</property> <property name="spacing">4</property>
<child> <child>
<object class="GtkImage" id="tab_image"> <object class="GtkImage" id="tab_image">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property> <property name="stock">gtk-missing-image</property>
</object> </object>
<packing> <packing>
@ -39,25 +24,32 @@
</child> </child>
<child> <child>
<object class="GtkLabel" id="tab_label"> <object class="GtkLabel" id="tab_label">
<property name="width_request">70</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
<property name="ellipsize">end</property> <property name="ellipsize">end</property>
<property name="max_width_chars">9</property> <property name="max_width_chars">9</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="tab_close_button"> <object class="GtkButton" id="tab_close_button">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property> <property name="relief">none</property>
<child> <child>
<object class="GtkImage" id="image1329"> <object class="GtkImage" id="image1329">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-close</property> <property name="stock">gtk-close</property>
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
@ -72,4 +64,23 @@
</object> </object>
</child> </child>
</object> </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> </interface>

View file

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

File diff suppressed because it is too large Load diff

View file

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

View file

@ -123,47 +123,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="remove_button"> <object class="GtkButton" id="remove_button">
<property name="label" translatable="yes">_Remove</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -181,4 +148,8 @@
</object> </object>
</child> </child>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-delete</property>
</object>
</interface> </interface>

View file

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

View file

@ -52,50 +52,15 @@
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
<object class="GtkButton" id="add_contact_button"> <object class="GtkButton" id="add_contact_button">
<property name="label" translatable="yes">_Add contact</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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="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="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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -105,50 +70,15 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="information_button"> <object class="GtkButton" id="information_button">
<property name="label" translatable="yes">_Information</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">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="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="no_show_all">True</property>
<property name="image">image3</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_information_button_clicked"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -158,47 +88,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="search_button"> <object class="GtkButton" id="search_button">
<property name="label" translatable="yes">_Search</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -231,4 +128,16 @@
</object> </object>
</child> </child>
</object> </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> </interface>

View file

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

View file

@ -35,47 +35,14 @@
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
<object class="GtkButton" id="cancel_button"> <object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">_Cancel</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -85,48 +52,15 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="ok_button"> <object class="GtkButton" id="ok_button">
<property name="label" translatable="yes">_OK</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="has_default">True</property> <property name="has_default">True</property>
<property name="receives_default">False</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"/> <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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -143,4 +77,12 @@
</object> </object>
</child> </child>
</object> </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> </interface>

View file

@ -15,7 +15,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="chat_with_menuitem"> <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="visible">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="image">image2</property> <property name="image">image2</property>
@ -25,7 +25,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="join_gc_menuitem"> <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="visible">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="image">image3</property> <property name="image">image3</property>
@ -35,7 +35,7 @@
</child> </child>
<child> <child>
<object class="GtkImageMenuItem" id="single_message_menuitem"> <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="visible">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="image">image4</property> <property name="image">image4</property>

View file

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

View file

@ -1,20 +1,26 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.16"/> <!-- interface-requires gtk+ 3.0 -->
<!-- interface-naming-policy toplevel-contextual --> <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"> <object class="GtkWindow" id="xml_console_window">
<property name="can_focus">False</property>
<property name="border_width">12</property> <property name="border_width">12</property>
<property name="default_width">550</property> <property name="default_width">550</property>
<property name="default_height">450</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> <child>
<object class="GtkVBox" id="vbox"> <object class="GtkVBox" id="vbox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkLabel" id="label342"> <object class="GtkLabel" id="label342">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Jabber Traffic&lt;/b&gt;</property> <property name="label" translatable="yes">&lt;b&gt;Jabber Traffic&lt;/b&gt;</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
@ -29,8 +35,6 @@
<object class="GtkScrolledWindow" id="scrolledwindow43"> <object class="GtkScrolledWindow" id="scrolledwindow43">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">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> <property name="shadow_type">in</property>
<child> <child>
<object class="GtkTextView" id="stanzas_log_textview"> <object class="GtkTextView" id="stanzas_log_textview">
@ -42,12 +46,15 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkHBox" id="hbox2988"> <object class="GtkHBox" id="hbox2988">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<child> <child>
<object class="GtkCheckButton" id="enable_checkbutton"> <object class="GtkCheckButton" id="enable_checkbutton">
<property name="label" translatable="yes" comments="XML Console enable checkbutton">_Enable</property> <property name="label" translatable="yes" comments="XML Console enable checkbutton">_Enable</property>
@ -55,23 +62,16 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">True</property>
<property name="fill">False</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="label351">
<property name="visible">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child> <child>
<object class="GtkButton" id="clear_button"> <object class="GtkButton" id="clear_button">
<property name="label">gtk-clear</property> <property name="label">gtk-clear</property>
@ -79,12 +79,12 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_stock">True</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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">False</property> <property name="fill">False</property>
<property name="position">2</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
</object> </object>
@ -102,21 +102,25 @@
<child> <child>
<object class="GtkVBox" id="input_vbox1"> <object class="GtkVBox" id="input_vbox1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkHBox" id="hbox1"> <object class="GtkHBox" id="hbox1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<child> <child>
<object class="GtkCheckButton" id="in_stanza_checkbutton"> <object class="GtkCheckButton" id="in_stanza_checkbutton">
<property name="label" translatable="yes">Hide IN stanzas</property> <property name="label" translatable="yes">Hide IN stanzas</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</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> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
@ -126,10 +130,13 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</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> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
@ -139,10 +146,13 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</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> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>
</child> </child>
@ -152,10 +162,13 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</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> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property> <property name="position">3</property>
</packing> </packing>
</child> </child>
@ -165,21 +178,27 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</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> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property> <property name="position">4</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkHBox" id="hbox2"> <object class="GtkHBox" id="hbox2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<child> <child>
<placeholder/> <placeholder/>
</child> </child>
@ -188,6 +207,8 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
@ -196,6 +217,7 @@
<child type="label"> <child type="label">
<object class="GtkLabel" id="label2"> <object class="GtkLabel" id="label2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Filter&lt;/b&gt;</property> <property name="label" translatable="yes">&lt;b&gt;Filter&lt;/b&gt;</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
@ -204,6 +226,7 @@
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property> <property name="position">3</property>
</packing> </packing>
</child> </child>
@ -212,18 +235,17 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<signal name="activate" handler="on_expander_activate"/> <signal name="activate" handler="on_expander_activate" swapped="no"/>
<child> <child>
<object class="GtkVBox" id="input_vbox"> <object class="GtkVBox" id="input_vbox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkScrolledWindow" id="scrolledwindow42"> <object class="GtkScrolledWindow" id="scrolledwindow42">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property> <property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property> <property name="shadow_type">in</property>
<child> <child>
<object class="GtkTextView" id="input_textview"> <object class="GtkTextView" id="input_textview">
@ -235,12 +257,15 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkHButtonBox" id="hbuttonbox31"> <object class="GtkHButtonBox" id="hbuttonbox31">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child> <child>
@ -251,7 +276,7 @@
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Info/Query</property> <property name="tooltip_text" translatable="yes">Info/Query</property>
<property name="use_underline">True</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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -266,7 +291,7 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_underline">True</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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -281,7 +306,7 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="use_underline">True</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> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -291,47 +316,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="send_button"> <object class="GtkButton" id="send_button">
<property name="label" translatable="yes">_Send</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<signal name="clicked" handler="on_send_button_clicked"/> <property name="image">image1</property>
<child> <property name="use_underline">True</property>
<object class="GtkAlignment" id="alignment80"> <signal name="clicked" handler="on_send_button_clicked" swapped="no"/>
<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>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -351,6 +343,7 @@
<child type="label"> <child type="label">
<object class="GtkLabel" id="label343"> <object class="GtkLabel" id="label343">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;XML Input&lt;/b&gt;</property> <property name="label" translatable="yes">&lt;b&gt;XML Input&lt;/b&gt;</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
@ -359,6 +352,7 @@
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property> <property name="position">4</property>
</packing> </packing>
</child> </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\library.zip"
File "bin\pangocairo.pyd" File "bin\pangocairo.pyd"
File "bin\pango.pyd" File "bin\pango.pyd"
File "bin\pycurl.pyd"
File "bin\pyexpat.pyd" File "bin\pyexpat.pyd"
File "bin\python27.dll" File "bin\python27.dll"
File "bin\pythoncom27.dll"
File "bin\pywintypes27.dll" File "bin\pywintypes27.dll"
File "bin\OpenSSL.rand.pyd" File "bin\OpenSSL.rand.pyd"
File "bin\select.pyd" File "bin\select.pyd"
@ -194,8 +196,10 @@ Section "Gajim" SecGajim
File "bin\win32api.pyd" File "bin\win32api.pyd"
File "bin\win32file.pyd" File "bin\win32file.pyd"
File "bin\win32pipe.pyd" File "bin\win32pipe.pyd"
File "bin\win32ui.pyd"
File "bin\winsound.pyd" File "bin\winsound.pyd"
File "msvcr90.dll" File "msvcr90.dll"
File /r "bin\win32com"
WriteRegStr HKCU "Software\Gajim" "" $INSTDIR WriteRegStr HKCU "Software\Gajim" "" $INSTDIR
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayName" "Gajim" 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\lib"
RMDir /r "$INSTDIR\bin\gtk\share" RMDir /r "$INSTDIR\bin\gtk\share"
RMDir "$INSTDIR\bin\gtk" RMDir "$INSTDIR\bin\gtk"
RMDir "$INSTDIR\bin\win32com"
Delete "$INSTDIR\bin\_bsddb.pyd" Delete "$INSTDIR\bin\_bsddb.pyd"
Delete "$INSTDIR\bin\_ctypes.pyd" Delete "$INSTDIR\bin\_ctypes.pyd"
Delete "$INSTDIR\bin\_hashlib.pyd" Delete "$INSTDIR\bin\_hashlib.pyd"
@ -558,8 +563,10 @@ Section "Uninstall"
Delete "$INSTDIR\bin\OpenSSL.SSL.pyd" Delete "$INSTDIR\bin\OpenSSL.SSL.pyd"
Delete "$INSTDIR\bin\pango.pyd" Delete "$INSTDIR\bin\pango.pyd"
Delete "$INSTDIR\bin\pangocairo.pyd" Delete "$INSTDIR\bin\pangocairo.pyd"
Delete "$INSTDIR\bin\pycurl.pyd"
Delete "$INSTDIR\bin\pyexpat.pyd" Delete "$INSTDIR\bin\pyexpat.pyd"
Delete "$INSTDIR\bin\python27.dll" Delete "$INSTDIR\bin\python27.dll"
Delete "$INSTDIR\bin\pythoncom27.dll"
Delete "$INSTDIR\bin\pywintypes27.dll" Delete "$INSTDIR\bin\pywintypes27.dll"
Delete "$INSTDIR\bin\select.pyd" Delete "$INSTDIR\bin\select.pyd"
Delete "$INSTDIR\bin\sqlite3.dll" Delete "$INSTDIR\bin\sqlite3.dll"
@ -568,6 +575,7 @@ Section "Uninstall"
Delete "$INSTDIR\bin\win32api.pyd" Delete "$INSTDIR\bin\win32api.pyd"
Delete "$INSTDIR\bin\win32file.pyd" Delete "$INSTDIR\bin\win32file.pyd"
Delete "$INSTDIR\bin\win32pipe.pyd" Delete "$INSTDIR\bin\win32pipe.pyd"
Delete "$INSTDIR\bin\win32ui.pyd"
Delete "$INSTDIR\bin\winsound.pyd" Delete "$INSTDIR\bin\winsound.pyd"
Delete "$INSTDIR\bin\msvcr90.dll" Delete "$INSTDIR\bin\msvcr90.dll"
RMDir /r "$INSTDIR\bin" RMDir /r "$INSTDIR\bin"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

View file

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
if [ ! $PYTHON ]; then if [ ! $PYTHON ]; then
PYTHON="python"; PYTHON="python3";
fi fi
cd "$(dirname $0)/src" cd "$(dirname $0)/src"
exec $PYTHON -OOt gajim.py "$@" 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 sys
import gtk from gi.repository import Gtk
import gobject from gi.repository import GObject
from plugins import GajimPlugin from plugins import GajimPlugin
from plugins.helpers import log, log_calls from plugins.helpers import log, log_calls
@ -62,7 +62,7 @@ class AcronymsExpanderPlugin(GajimPlugin):
@log_calls('AcronymsExpanderPlugin') @log_calls('AcronymsExpanderPlugin')
def get_own_acronyms_list(self): 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') data = open(data_file, 'r')
acronyms = eval(data.read()) acronyms = eval(data.read())
data.close() data.close()
@ -76,7 +76,7 @@ class AcronymsExpanderPlugin(GajimPlugin):
#assert isinstance(tb,gtk.TextBuffer) #assert isinstance(tb,gtk.TextBuffer)
ACRONYMS = self.config['ACRONYMS'] ACRONYMS = self.config['ACRONYMS']
INVOKER = self.config['INVOKER'] 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))) #log.debug('%s %d'%(t, len(t)))
if t and t[-1] == INVOKER: if t and t[-1] == INVOKER:
#log.debug('changing msg text') #log.debug('changing msg text')
@ -87,7 +87,7 @@ class AcronymsExpanderPlugin(GajimPlugin):
#log.debug('head: %s'%(head)) #log.debug('head: %s'%(head))
t = ''.join((base, sep, head, INVOKER)) t = ''.join((base, sep, head, INVOKER))
#log.debug("setting text: '%s'"%(t)) #log.debug("setting text: '%s'"%(t))
gobject.idle_add(tb.set_text, t) GObject.idle_add(tb.set_text, t)
@log_calls('AcronymsExpanderPlugin') @log_calls('AcronymsExpanderPlugin')
def connect_with_chat_control_base(self, chat_control): def connect_with_chat_control_base(self, chat_control):

View file

@ -407,7 +407,7 @@ if dbus_support.supported:
return DBUS_DICT_SV() return DBUS_DICT_SV()
jid = self._get_real_jid(jid) 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: if cached_vcard:
return get_dbus_struct(cached_vcard) return get_dbus_struct(cached_vcard)
@ -428,7 +428,7 @@ if dbus_support.supported:
def account_info(self, account): def account_info(self, account):
'''show info on account: resource, jid, nick, prio, message''' '''show info on account: resource, jid, nick, prio, message'''
result = DBUS_DICT_SS() result = DBUS_DICT_SS()
if gajim.connections.has_key(account): if account in gajim.connections:
# account is valid # account is valid
con = gajim.connections[account] con = gajim.connections[account]
index = con.connected index = con.connected
@ -508,7 +508,7 @@ if dbus_support.supported:
def prefs_store(self): def prefs_store(self):
try: try:
gajim.interface.save_config() gajim.interface.save_config()
except Exception, e: except Exception:
return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(False)
return DBUS_BOOLEAN(True) 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 = { options = {
'build_exe': { 'build_exe': {
'includes': ['gtk.keysyms', 'dumbdbm', 'dbhash', 'bsddb', 'new', 'includes': ['Gdk.KEY_, 'dumbdbm', 'dbhash', 'bsddb', 'new',
'goocanvas', 'Crypto.PublicKey.DSA', 'Crypto.Hash.HMAC', 'goocanvas', 'Crypto.PublicKey.DSA', 'Crypto.Hash.HMAC',
'numbers'], 'numbers', 'win32com.client', 'win32com.server'],
'base': 'Win32GUI', 'base': 'Win32GUI',
'bin_excludes': [ 'bin_excludes': [
'iconv.dll', 'intl.dll', 'libatk-1.0-0.dll', '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 # 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 # be entities that often change the list, it may be slow to fetch it every time
import gobject from gi.repository import GLib
import gtk from gi.repository import Gtk
import nbxmpp import nbxmpp
from common import gajim from common import gajim
@ -91,7 +91,7 @@ class CommandWindow:
self.data_form_widget.destroy() self.data_form_widget.destroy()
self.data_form_widget = dataforms_widget.DataFormWidget() self.data_form_widget = dataforms_widget.DataFormWidget()
self.data_form_widget.show() 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: if self.commandnode:
# Execute command # Execute command
@ -159,7 +159,7 @@ class CommandWindow:
return self.stage_adhoc_commands_window_delete_event(self.window) return self.stage_adhoc_commands_window_delete_event(self.window)
def __del__(self): def __del__(self):
print 'Object has been deleted.' print('Object has been deleted.')
# stage 1: waiting for command list # stage 1: waiting for command list
def stage1(self): def stage1(self):
@ -236,13 +236,13 @@ class CommandWindow:
# build the commands list radiobuttons # build the commands list radiobuttons
first_radio = None first_radio = None
for (commandnode, commandname) in self.commandlist: 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, radio.connect("toggled", self.on_command_radiobutton_toggled,
commandnode) commandnode)
if not first_radio: if not first_radio:
first_radio = radio first_radio = radio
self.commandnode = commandnode 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.command_list_vbox.show_all()
self.stage_finish = self.stage2_finish self.stage_finish = self.stage2_finish
@ -255,9 +255,9 @@ class CommandWindow:
""" """
Remove widgets we created. Not needed when the window is destroyed 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.remove(widget)
self.command_list_vbox.foreach(remove_widget) self.command_list_vbox.foreach(remove_widget, None)
def stage2_close_button_clicked(self, widget): def stage2_close_button_clicked(self, widget):
self.stage_finish() self.stage_finish()
@ -281,8 +281,6 @@ class CommandWindow:
# close old stage # close old stage
self.stage_finish() self.stage_finish()
assert isinstance(self.commandnode, unicode)
self.form_status = None self.form_status = None
self.stages_notebook.set_current_page( self.stages_notebook.set_current_page(
@ -321,8 +319,8 @@ class CommandWindow:
dialog.destroy() dialog.destroy()
cb() cb()
dialog = dialogs.HigDialog(self.window, gtk.MESSAGE_WARNING, dialog = dialogs.HigDialog(self.window, Gtk.MessageType.WARNING,
gtk.BUTTONS_YES_NO, _('Cancel confirmation'), Gtk.ButtonsType.YES_NO, _('Cancel confirmation'),
_('You are in process of executing command. Do you really want to ' _('You are in process of executing command. Do you really want to '
'cancel it?'), on_response_yes=on_yes) 'cancel it?'), on_response_yes=on_yes)
dialog.popup() dialog.popup()
@ -452,7 +450,7 @@ class CommandWindow:
note = command.getTag('note') note = command.getTag('note')
if 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.set_no_show_all(False)
self.notes_label.show() self.notes_label.show()
else: else:
@ -510,7 +508,7 @@ class CommandWindow:
try: try:
errorname = nbxmpp.NS_STANZAS + ' ' + str(errorid) errorname = nbxmpp.NS_STANZAS + ' ' + str(errorid)
errordesc = nbxmpp.ERRORS[errorname][2] errordesc = nbxmpp.ERRORS[errorname][2]
error = errordesc.decode('utf-8') error = errordesc
del errorname, errordesc del errorname, errordesc
except KeyError: # when stanza doesn't have error description except KeyError: # when stanza doesn't have error description
error = _('Service returned an error.') error = _('Service returned an error.')
@ -550,21 +548,21 @@ class CommandWindow:
progressbar.pulse() method progressbar.pulse() method
""" """
assert not self.pulse_id assert not self.pulse_id
assert isinstance(progressbar, gtk.ProgressBar) assert isinstance(progressbar, Gtk.ProgressBar)
def callback(): def callback():
progressbar.pulse() progressbar.pulse()
return True # important to keep callback be called back! return True # important to keep callback be called back!
# 12 times per second (80 miliseconds) # 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): def remove_pulsing(self):
""" """
Stop pulsing, useful when especially when removing widget Stop pulsing, useful when especially when removing widget
""" """
if self.pulse_id: if self.pulse_id:
gobject.source_remove(self.pulse_id) GLib.source_remove(self.pulse_id)
self.pulse_id = None self.pulse_id = None
# handling xml stanzas # handling xml stanzas
@ -608,7 +606,6 @@ class CommandWindow:
Send the command with data form. Wait for reply Send the command with data form. Wait for reply
""" """
# create the stanza # create the stanza
assert isinstance(self.commandnode, unicode)
assert action in ('execute', 'prev', 'next', 'complete') assert action in ('execute', 'prev', 'next', 'complete')
stanza = nbxmpp.Iq(typ='set', to=self.jid) 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/>. ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
## ##
import gtk from gi.repository import Gtk
import gtkgui_helpers import gtkgui_helpers
import gobject from gi.repository import GLib
from common import gajim from common import gajim
from common import helpers
( (
OPT_TYPE, OPT_TYPE,
@ -50,12 +51,12 @@ def rate_limit(rate):
timeout = [None] timeout = [None]
def f(*args, **kwargs): def f(*args, **kwargs):
if timeout[0] is not None: if timeout[0] is not None:
gobject.source_remove(timeout[0]) GLib.source_remove(timeout[0])
timeout[0] = None timeout[0] = None
def timeout_func(): def timeout_func():
func(*args, **kwargs) func(*args, **kwargs)
timeout[0] = None 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 f
return decorator return decorator
@ -98,32 +99,32 @@ class AdvancedConfigurationWindow(object):
treeview = self.xml.get_object('advanced_treeview') treeview = self.xml.get_object('advanced_treeview')
self.treeview = treeview self.treeview = treeview
self.model = gtk.TreeStore(str, str, str) self.model = Gtk.TreeStore(str, str, str)
self.fill_model() 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 = self.model.filter_new()
self.modelfilter.set_visible_func(self.visible_func) self.modelfilter.set_visible_func(self.visible_func)
renderer_text = gtk.CellRendererText() renderer_text = Gtk.CellRendererText()
col = treeview.insert_column_with_attributes(-1, _('Preference Name'), col = Gtk.TreeViewColumn(_('Preference Name'), renderer_text, text = 0)
renderer_text, text = 0) treeview.insert_column(col, -1)
col.set_resizable(True) col.set_resizable(True)
renderer_text = gtk.CellRendererText() renderer_text = Gtk.CellRendererText()
renderer_text.connect('edited', self.on_config_edited) renderer_text.connect('edited', self.on_config_edited)
col = treeview.insert_column_with_attributes(-1, _('Value'), col = Gtk.TreeViewColumn(_('Value'),renderer_text, text = 1)
renderer_text, text = 1) treeview.insert_column(col, -1)
col.set_cell_data_func(renderer_text, self.cb_value_column_data) col.set_cell_data_func(renderer_text, self.cb_value_column_data)
col.props.resizable = True col.props.resizable = True
col.set_property('expand',True) col.props.expand = True
col.set_property('sizing',gtk.TREE_VIEW_COLUMN_FIXED) col.props.sizing = Gtk.TreeViewColumnSizing.FIXED
renderer_text = gtk.CellRendererText() renderer_text = Gtk.CellRendererText()
col = treeview.insert_column_with_attributes(-1, _('Type'), col = Gtk.TreeViewColumn(_('Type'), renderer_text, text = 2)
renderer_text, text = 2) treeview.insert_column(col, -1)
col.set_property('expand',True) col.props.expand = True
col.set_property('sizing',gtk.TREE_VIEW_COLUMN_FIXED) col.props.sizing = Gtk.TreeViewColumnSizing.FIXED
treeview.set_model(self.modelfilter) treeview.set_model(self.modelfilter)
@ -136,7 +137,7 @@ class AdvancedConfigurationWindow(object):
self.restart_label.hide() self.restart_label.hide()
gajim.interface.instances['advanced_config'] = self 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 Check if it's boolen or holds password stuff and if yes make the
cellrenderertext not editable, else - it's editable cellrenderertext not editable, else - it's editable
@ -154,10 +155,10 @@ class AdvancedConfigurationWindow(object):
# path[1] is the key name # path[1] is the key name
# path[2] is the root of tree # path[2] is the root of tree
# last two is optional # last two is optional
path = [model[iter_][0].decode('utf-8')] path = [model[iter_][0]]
parent = model.iter_parent(iter_) parent = model.iter_parent(iter_)
while parent: while parent:
path.append(model[parent][0].decode('utf-8')) path.append(model[parent][0])
parent = model.iter_parent(parent) parent = model.iter_parent(parent)
return path return path
@ -195,17 +196,18 @@ class AdvancedConfigurationWindow(object):
def on_advanced_treeview_row_activated(self, treeview, path, column): def on_advanced_treeview_row_activated(self, treeview, path, column):
modelpath = self.modelfilter.convert_path_to_child_path(path) modelpath = self.modelfilter.convert_path_to_child_path(path)
modelrow = self.model[modelpath] modelrow = self.model[modelpath]
option = modelrow[0].decode('utf-8') option = modelrow[0]
if modelrow[2] == self.types['boolean']: if modelrow[2] == self.types['boolean']:
for key in self.right_true_dict.keys(): for key in self.right_true_dict.keys():
if self.right_true_dict[key] == modelrow[1]: if self.right_true_dict[key] == modelrow[1]:
modelrow[1] = key modelrow[1] = str(key)
newval = {'False': True, 'True': False}[modelrow[1]] newval = {'False': True, 'True': False}[modelrow[1]]
if len(modelpath) > 1: if len(modelpath.get_indices()) > 1:
optnamerow = self.model[modelpath[0]] optnamerow = self.model[modelpath.get_indices()[0]]
optname = optnamerow[0].decode('utf-8') optname = optnamerow[0]
keyrow = self.model[modelpath[:2]] modelpath.up()
key = keyrow[0].decode('utf-8') keyrow = self.model[modelpath]
key = keyrow[0]
self.remember_option(option + '\n' + key + '\n' + optname, self.remember_option(option + '\n' + key + '\n' + optname,
modelrow[1], newval) modelrow[1], newval)
gajim.config.set_per(optname, key, option, newval) gajim.config.set_per(optname, key, option, newval)
@ -231,15 +233,17 @@ class AdvancedConfigurationWindow(object):
def on_config_edited(self, cell, path, text): def on_config_edited(self, cell, path, text):
# convert modelfilter path to model path # convert modelfilter path to model path
path=Gtk.TreePath.new_from_string(path)
modelpath = self.modelfilter.convert_path_to_child_path(path) modelpath = self.modelfilter.convert_path_to_child_path(path)
modelrow = self.model[modelpath] modelrow = self.model[modelpath]
option = modelrow[0].decode('utf-8') option = modelrow[0]
text = text.decode('utf-8') if modelpath.get_depth() > 2:
if len(modelpath) > 1: modelpath.up() # Get parent
optnamerow = self.model[modelpath[0]] keyrow = self.model[modelpath]
optname = optnamerow[0].decode('utf-8') key = keyrow[0]
keyrow = self.model[modelpath[:2]] modelpath.up() # Get parent
key = keyrow[0].decode('utf-8') optnamerow = self.model[modelpath]
optname = optnamerow[0]
self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1],
text) text)
gajim.config.set_per(optname, key, option, text) gajim.config.set_per(optname, key, option, text)
@ -268,12 +272,12 @@ class AdvancedConfigurationWindow(object):
return return
modelpath = self.modelfilter.convert_path_to_child_path(path) modelpath = self.modelfilter.convert_path_to_child_path(path)
modelrow = self.model[modelpath] modelrow = self.model[modelpath]
option = modelrow[0].decode('utf-8') option = modelrow[0]
if len(modelpath) > 1: if len(modelpath) > 1:
optnamerow = self.model[modelpath[0]] optnamerow = self.model[modelpath[0]]
optname = optnamerow[0].decode('utf-8') optname = optnamerow[0]
keyrow = self.model[modelpath[:2]] keyrow = self.model[modelpath[:2]]
key = keyrow[0].decode('utf-8') key = keyrow[0]
self.remember_option(option + '\n' + key + '\n' + optname, self.remember_option(option + '\n' + key + '\n' + optname,
modelrow[C_VALUE], default) modelrow[C_VALUE], default)
gajim.config.set_per(optname, key, option, default) gajim.config.set_per(optname, key, option, default)
@ -285,7 +289,7 @@ class AdvancedConfigurationWindow(object):
else: else:
if str(default) == model[iter_][C_VALUE]: if str(default) == model[iter_][C_VALUE]:
return 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): def on_advanced_close_button_clicked(self, widget):
self.window.destroy() self.window.destroy()
@ -308,11 +312,14 @@ class AdvancedConfigurationWindow(object):
if type_ == self.types['boolean']: if type_ == self.types['boolean']:
value = self.right_true_dict[option] value = self.right_true_dict[option]
else: else:
value = option try:
value = str(option)
except:
value = option
self.model.append(parent, [name, value, type_]) self.model.append(parent, [name, value, type_])
def visible_func(self, model, treeiter): def visible_func(self, model, treeiter, data):
search_string = self.entry.get_text().decode('utf-8').lower() search_string = self.entry.get_text().lower()
for it in tree_model_pre_order(model, treeiter): for it in tree_model_pre_order(model, treeiter):
if model[it][C_TYPE] != '': if model[it][C_TYPE] != '':
opt_path = self.get_option_path(model, it) opt_path = self.get_option_path(model, it)

View file

@ -22,8 +22,8 @@
## ##
import gtk from gi.repository import Gtk
import gobject from gi.repository import GLib
import gtkgui_helpers import gtkgui_helpers
from common import helpers from common import helpers
@ -70,8 +70,8 @@ class AtomWindow:
self.xml.connect_signals(self) self.xml.connect_signals(self)
self.window.show_all() self.window.show_all()
self.entry_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(gtk.gdk.BUTTON_PRESS_MASK) self.feed_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
def displayNextEntry(self): def displayNextEntry(self):
""" """
@ -84,24 +84,24 @@ class AtomWindow:
# fill the fields # fill the fields
if newentry.feed_link is not None: if newentry.feed_link is not None:
self.feed_title_label.set_markup( self.feed_title_label.set_markup(
u'<span foreground="blue" underline="single">%s</span>' % \ '<span foreground="blue" underline="single">%s</span>' % \
gobject.markup_escape_text(newentry.feed_title)) GLib.markup_escape_text(newentry.feed_title))
else: else:
self.feed_title_label.set_markup( self.feed_title_label.set_markup(GLib.markup_escape_text(
gobject.markup_escape_text(newentry.feed_title)) newentry.feed_title))
self.feed_tagline_label.set_markup( self.feed_tagline_label.set_markup(
u'<small>%s</small>' % \ '<small>%s</small>' % GLib.markup_escape_text(
gobject.markup_escape_text(newentry.feed_tagline)) newentry.feed_tagline))
if newentry.title: if newentry.title:
if newentry.uri is not None: if newentry.uri is not None:
self.entry_title_label.set_markup( self.entry_title_label.set_markup(
u'<span foreground="blue" underline="single">%s</span>' % \ '<span foreground="blue" underline="single">%s</span>' % \
gobject.markup_escape_text(newentry.title)) GLib.markup_escape_text(newentry.title))
else: else:
self.entry_title_label.set_markup( self.entry_title_label.set_markup(GLib.markup_escape_text(
gobject.markup_escape_text(newentry.title)) newentry.title))
else: else:
self.entry_title_label.set_markup('') self.entry_title_label.set_markup('')

View file

@ -21,19 +21,20 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## 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 class CellRendererImage(Gtk.CellRendererPixbuf):
import gobject
class CellRendererImage(gtk.GenericCellRenderer):
__gproperties__ = { __gproperties__ = {
'image': (gobject.TYPE_OBJECT, 'Image', 'image': (GObject.TYPE_OBJECT, 'Image',
'Image', gobject.PARAM_READWRITE), 'Image', GObject.PARAM_READWRITE),
} }
def __init__(self, col_index, tv_index): def __init__(self, col_index, tv_index):
self.__gobject_init__() super(CellRendererImage, self).__init__()
self.image = None self.image = None
self.col_index = col_index self.col_index = col_index
self.tv_index = tv_index self.tv_index = tv_index
@ -45,6 +46,14 @@ class CellRendererImage(gtk.GenericCellRenderer):
def do_get_property(self, pspec): def do_get_property(self, pspec):
return getattr(self, pspec.name) 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): def func(self, model, path, iter_, image_tree):
image, tree = image_tree image, tree = image_tree
if model.get_value(iter_, self.tv_index) != image: if model.get_value(iter_, self.tv_index) != image:
@ -53,71 +62,67 @@ class CellRendererImage(gtk.GenericCellRenderer):
col = tree.get_column(self.col_index) col = tree.get_column(self.col_index)
cell_area = tree.get_cell_area(path, col) cell_area = tree.get_cell_area(path, col)
tree.queue_draw_area(cell_area.x, cell_area.y, tree.queue_draw_area(cell_area.x, cell_area.y, cell_area.width,
cell_area.width, cell_area.height) cell_area.height)
def animation_timeout(self, tree, image): def animation_timeout(self, tree, image):
if image.get_storage_type() != gtk.IMAGE_ANIMATION: if image.get_storage_type() != Gtk.ImageType.ANIMATION:
return return
self.redraw = 0 self.redraw = 0
iter_ = self.iters[image] iter_ = self.iters[image]
iter_.advance() timeval = GLib.TimeVal()
timeval.tv_sec = GLib.get_monotonic_time() / 1000000
iter_.advance(timeval)
model = tree.get_model() model = tree.get_model()
if model: if model:
model.foreach(self.func, (image, tree)) model.foreach(self.func, (image, tree))
if self.redraw: if self.redraw:
gobject.timeout_add(iter_.get_delay_time(), GLib.timeout_add(iter_.get_delay_time(),
self.animation_timeout, tree, image) self.animation_timeout, tree, image)
elif image in self.iters: elif image in self.iters:
del self.iters[image] del self.iters[image]
def on_render(self, window, widget, background_area, cell_area, def do_render(self, ctx, widget, background_area, cell_area, flags):
expose_area, flags):
if not self.image: if not self.image:
return 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 if self.image.get_storage_type() == Gtk.ImageType.ANIMATION:
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 not in self.iters: if self.image not in self.iters:
if not isinstance(widget, gtk.TreeView): if not isinstance(widget, Gtk.TreeView):
return return
animation = self.image.get_animation() 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_ self.iters[self.image] = iter_
gobject.timeout_add(iter_.get_delay_time(), GLib.timeout_add(iter_.get_delay_time(), self.animation_timeout,
self.animation_timeout, widget, self.image) widget, self.image)
pix = self.iters[self.image].get_pixbuf() 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() pix = self.image.get_pixbuf()
else: else:
return 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: if not self.image:
return 0, 0, 0, 0 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() animation = self.image.get_animation()
pix = animation.get_iter().get_pixbuf() timeval = GLib.TimeVal()
elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF: 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() pix = self.image.get_pixbuf()
else: else:
return 0, 0, 0, 0 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. over the process.
""" """
from types import NoneType from .tools import remove
from tools import remove
COMMANDS = {} COMMANDS = {}
CONTAINERS = {} CONTAINERS = {}
@ -67,11 +66,13 @@ def traverse_commands(container):
yield attribute yield attribute
def is_command(attribute): def is_command(attribute):
from framework import Command from .framework import Command
return isinstance(attribute, Command) return isinstance(attribute, Command)
def is_root(namespace): def is_root(namespace):
metaclass = namespace.get("__metaclass__", NoneType) metaclass = namespace.get("__metaclass__", None)
if not metaclass:
return False
return issubclass(metaclass, Dispatchable) return issubclass(metaclass, Dispatchable)
def get_command(host, name): def get_command(host, name):
@ -83,7 +84,7 @@ def get_command(host, name):
def list_commands(host): def list_commands(host):
for container in CONTAINERS[host]: for container in CONTAINERS[host]:
commands = COMMANDS[container] commands = COMMANDS[container]
for name, command in commands.iteritems(): for name, command in commands.items():
yield name, command yield name, command
class Dispatchable(type): class Dispatchable(type):

View file

@ -23,12 +23,12 @@ import re
from types import FunctionType from types import FunctionType
from inspect import getargspec, getdoc from inspect import getargspec, getdoc
from dispatcher import Host, Container from .dispatcher import Host, Container
from dispatcher import get_command, list_commands from .dispatcher import get_command, list_commands
from mapping import parse_arguments, adapt_arguments from .mapping import parse_arguments, adapt_arguments
from errors import DefinitionError, CommandError, NoCommandError from .errors import DefinitionError, CommandError, NoCommandError
class CommandHost(object): class CommandHost(metaclass=Host):
""" """
Command host is a hub between numerous command processors and Command host is a hub between numerous command processors and
command containers. Aimed to participate in a dispatching process in command containers. Aimed to participate in a dispatching process in
@ -40,7 +40,7 @@ class CommandHost(object):
""" """
__metaclass__ = Host __metaclass__ = Host
class CommandContainer(object): class CommandContainer(metaclass=Container):
""" """
Command container is an entity which holds defined commands, Command container is an entity which holds defined commands,
allowing them to be dispatched and proccessed correctly. Each allowing them to be dispatched and proccessed correctly. Each
@ -143,7 +143,7 @@ class CommandProcessor(object):
def list_commands(self): def list_commands(self):
commands = list_commands(self.COMMAND_HOST) commands = list_commands(self.COMMAND_HOST)
commands = dict(commands) commands = dict(commands)
return sorted(set(commands.itervalues())) return sorted(list(commands.values()), key=lambda k: k.__repr__())
class Command(object): class Command(object):
@ -153,7 +153,7 @@ class Command(object):
# Automatically set all the properties passed to a constructor # Automatically set all the properties passed to a constructor
# by the command decorator. # by the command decorator.
for key, value in properties.iteritems(): for key, value in properties.items():
setattr(self, key, value) setattr(self, key, value)
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
@ -165,7 +165,7 @@ class Command(object):
# command or name attributes set. They will be set to a # command or name attributes set. They will be set to a
# corresponding values right here in case if they was not set by # corresponding values right here in case if they was not set by
# the one who raised an exception. # the one who raised an exception.
except CommandError, error: except CommandError as error:
if not error.command and not error.name: if not error.command and not error.name:
raise CommandError(error.message, self) raise CommandError(error.message, self)
raise raise
@ -181,7 +181,11 @@ class Command(object):
return "<Command %s>" % ', '.join(self.names) return "<Command %s>" % ', '.join(self.names)
def __cmp__(self, other): 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 @property
def first_name(self): def first_name(self):

View file

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

View file

@ -35,10 +35,10 @@ commands as a frontend.
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
from os.path import expanduser from os.path import expanduser
from glib import timeout_add from gi.repository import GLib
from ..framework import CommandContainer, command, doc from ..framework import CommandContainer, command, doc
from hosts import * from .hosts import *
class Execute(CommandContainer): class Execute(CommandContainer):
AUTOMATIC = True AUTOMATIC = True
@ -64,11 +64,11 @@ class Execute(CommandContainer):
@classmethod @classmethod
def monitor(cls, processor, popen): def monitor(cls, processor, popen):
poller = cls.poller(processor, popen) poller = cls.poller(processor, popen)
timeout_add(cls.POLL_INTERVAL, poller.next) GLib.timeout_add(cls.POLL_INTERVAL, next, poller)
@classmethod @classmethod
def poller(cls, processor, popen): 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) yield cls.brush(processor, popen)
cls.overdue(processor, popen) cls.overdue(processor, popen)
yield False yield False
@ -101,7 +101,7 @@ class Execute(CommandContainer):
@staticmethod @staticmethod
def clean(text): def clean(text):
strip = chr(10) + chr(32) strip = chr(10) + chr(32)
return text.strip(strip) return text.decode().strip(strip)
class Show(Execute): class Show(Execute):
@ -115,6 +115,6 @@ class Show(Execute):
stdout, stderr = cls.fetch(popen) stdout, stderr = cls.fetch(popen)
success = popen.returncode == 0 success = popen.returncode == 0
if success and stdout: if success and stdout:
processor.send(stdout.decode('utf8')) processor.send(stdout)
elif not success and stderr: elif not success and stderr:
processor.echo_error(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. don't need to dig up the code itself to write basic commands.
""" """
from types import StringTypes
from traceback import print_exc from traceback import print_exc
from pango import FontDescription from gi.repository import Pango
from common import gajim from common import gajim
from ..framework import CommandProcessor from ..framework import CommandProcessor
@ -62,13 +61,13 @@ class ChatCommandProcessor(CommandProcessor):
try: try:
parents = super(ChatCommandProcessor, self) parents = super(ChatCommandProcessor, self)
parents.execute_command(name, arguments) parents.execute_command(name, arguments)
except NoCommandError, error: except NoCommandError as error:
details = dict(name=error.name, message=error.message) details = dict(name=error.name, message=error.message)
message = "%(name)s: %(message)s\n" % details message = "%(name)s: %(message)s\n" % details
message += "Try using the //%(name)s or /say /%(name)s " % details message += "Try using the //%(name)s or /say /%(name)s " % details
message += "construct if you intended to send it as a text." message += "construct if you intended to send it as a text."
self.echo_error(message) self.echo_error(message)
except CommandError, error: except CommandError as error:
self.echo_error("%s: %s" % (error.name, error.message)) self.echo_error("%s: %s" % (error.name, error.message))
except Exception: except Exception:
self.echo_error(_("Error during command execution!")) self.echo_error(_("Error during command execution!"))
@ -98,7 +97,7 @@ class ChatCommandProcessor(CommandProcessor):
def command_postprocessor(self, command, name, arguments, args, kwargs, value): def command_postprocessor(self, command, name, arguments, args, kwargs, value):
# If command returns a string - print it to a user. A convenient # If command returns a string - print it to a user. A convenient
# and sufficient in most simple cases shortcut to a using echo. # 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) self.echo(value)
class CommandTools: class CommandTools:
@ -117,7 +116,7 @@ class CommandTools:
name = gconf("/desktop/gnome/interface/monospace_font_name") name = gconf("/desktop/gnome/interface/monospace_font_name")
name = name if name else "Monospace" name = name if name else "Monospace"
font = FontDescription(name) font = Pango.FontDescription(name)
command_ok_tag = buffer.create_tag("command_ok") command_ok_tag = buffer.create_tag("command_ok")
command_ok_tag.set_property("font-desc", font) 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 ..framework import CommandContainer, command, doc
from ..mapping import generate_usage from ..mapping import generate_usage
from hosts import * from .hosts import *
import execute from . import execute
# This holds constants fron the logger, which we'll be using in some of our # This holds constants fron the logger, which we'll be using in some of our
# commands. # commands.
@ -136,7 +136,7 @@ class StandardCommonCommands(CommandContainer):
def status(self, status, message): def status(self, status, message):
if status not in ('online', 'away', 'chat', 'xa', 'dnd'): if status not in ('online', 'away', 'chat', 'xa', 'dnd'):
raise CommandError("Invalid status given") 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, if not gajim.config.get_per('accounts', connection.name,
'sync_with_global_status'): 'sync_with_global_status'):
continue continue
@ -150,7 +150,7 @@ class StandardCommonCommands(CommandContainer):
if not message: if not message:
message = _("Away") message = _("Away")
for connection in gajim.connections.itervalues(): for connection in gajim.connections.values():
if not gajim.config.get_per('accounts', connection.name, if not gajim.config.get_per('accounts', connection.name,
'sync_with_global_status'): 'sync_with_global_status'):
continue continue
@ -164,7 +164,7 @@ class StandardCommonCommands(CommandContainer):
if not message: if not message:
message = _("Available") message = _("Available")
for connection in gajim.connections.itervalues(): for connection in gajim.connections.values():
if not gajim.config.get_per('accounts', connection.name, if not gajim.config.get_per('accounts', connection.name,
'sync_with_global_status'): 'sync_with_global_status'):
continue continue

View file

@ -23,10 +23,9 @@ according to the command properties.
""" """
import re import re
from types import BooleanType, UnicodeType
from operator import itemgetter 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 # Quite complex piece of regular expression logic to parse options and
# arguments. Might need some tweaking along the way. # arguments. Might need some tweaking along the way.
@ -62,7 +61,7 @@ def parse_arguments(arguments):
""" """
args, opts = [], [] 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. Check if given span intersects with any of options.
""" """
@ -71,7 +70,7 @@ def parse_arguments(arguments):
return True return True
return False 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. 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 # conflicted sectors. Remove any arguments that intersect with
# options. # options.
for arg, position in args[:]: for arg, position in args[:]:
if intersects_opts(position): if intersects_opts(*position):
args.remove((arg, position)) args.remove((arg, position))
# Primitive but sufficiently effective way of disposing of # Primitive but sufficiently effective way of disposing of
# conflicted sectors. Remove any options that intersect with # conflicted sectors. Remove any options that intersect with
# arguments. # arguments.
for key, value, position in opts[:]: for key, value, position in opts[:]:
if intersects_args(position): if intersects_args(*position):
opts.remove((key, value, position)) opts.remove((key, value, position))
return args, opts return args, opts
@ -207,7 +206,7 @@ def adapt_arguments(command, arguments, args, opts):
# corresponding optin has been given. # corresponding optin has been given.
if command.expand: if command.expand:
expanded = [] 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 letter = spec_key[0] if len(spec_key) > 1 else None
if letter and letter not in expanded: if letter and letter not in expanded:
for index, (key, value, position) in enumerate(opts): 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 # Detect switches and set their values accordingly. If any of them
# carries a value - append it to args. # carries a value - append it to args.
for index, (key, value, position) in enumerate(opts): 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) opts[index] = (key, True, position)
if value: if value:
args.append((value, position)) args.append((value, position))
@ -231,8 +230,8 @@ def adapt_arguments(command, arguments, args, opts):
# Stripping down position information supplied with arguments and # Stripping down position information supplied with arguments and
# options as it won't be needed again. # options as it won't be needed again.
args = map(lambda (arg, position): arg, args) args = list(map(lambda t: t[0], args))
opts = map(lambda (key, value, position): (key, value), opts) opts = list(map(lambda t: (t[0], t[1]), opts))
# If command has extra option enabled - collect all extra arguments # If command has extra option enabled - collect all extra arguments
# and pass them to a last positional argument command defines as a # 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. # Normally this does not happen unless overlapping is enabled.
for key, value in opts: for key, value in opts:
initial = norm_kwargs.get(key) initial = norm_kwargs.get(key)
if isinstance(initial, BooleanType): if isinstance(initial, bool):
if not isinstance(value, BooleanType): if not isinstance(value, bool):
raise CommandError("%s: Switch can not take an argument" % key, command) 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 # Inject the source arguments as a string as a first argument, if
# command has enabled the corresponding option. # command has enabled the corresponding option.
if command.source: if command.source:
@ -305,7 +298,7 @@ def generate_usage(command, complete=True):
letter = key[0] letter = key[0]
key = key.replace('_', '-') key = key.replace('_', '-')
if isinstance(value, BooleanType): if isinstance(value, bool):
value = str() value = str()
else: else:
value = '=%s' % value value = '=%s' % value

View file

@ -25,20 +25,19 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from types import * from types import *
from glib import GError
def remove(sequence, target): def remove(sequence, target):
if isinstance(sequence, ListType): if isinstance(sequence, list):
if target in sequence: if target in sequence:
sequence.remove(target) sequence.remove(target)
elif isinstance(sequence, DictType): elif isinstance(sequence, dict):
if target in sequence: if target in sequence:
del sequence[target] del sequence[target]
def gconf(path): def gconf(path):
try: try:
from gconf import client_get_default from gi.repository import GConf
client = client_get_default() client = GConf.Client.get_default()
return client.get_string(path) return client.get_string(path)
except ImportError, GError: except ImportError:
pass pass

View file

@ -100,13 +100,13 @@ class OldEntry(nbxmpp.Node, object):
if main_feed is not None and source_feed is not None: 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: elif main_feed is not None:
return main_feed return main_feed
elif source_feed is not None: elif source_feed is not None:
return source_feed return source_feed
else: else:
return u'' return ''
feed_title = property(get_feed_title, None, None, feed_title = property(get_feed_title, None, None,
''' Title of feed. It is built from entry''s original feed title and title of feed ''' 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, updated = property(get_updated, None, None,
''' Last significant modification time. ''') ''' 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 return 1
S = '' 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: for i in identities:
c = i['category'] c = i['category']
type_ = i.get('type', '') type_ = i.get('type', '')
@ -140,7 +141,7 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'):
features.sort() features.sort()
for f in features: for f in features:
S += '%s<' % f S += '%s<' % f
dataforms.sort(cmp=sort_dataforms_func) dataforms.sort(key=cmp_to_key(sort_dataforms_func))
for dataform in dataforms: for dataform in dataforms:
# fields indexed by var # fields indexed by var
fields = {} fields = {}
@ -157,12 +158,12 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'):
S += '%s<' % value S += '%s<' % value
if hash_method == 'sha-1': if hash_method == 'sha-1':
hash_ = hashlib.sha1(S) hash_ = hashlib.sha1(S.encode('utf-8'))
elif hash_method == 'md5': elif hash_method == 'md5':
hash_ = hashlib.md5(S) hash_ = hashlib.md5(S.encode('utf-8'))
else: else:
return '' return ''
return base64.b64encode(hash_.digest()) return base64.b64encode(hash_.digest()).decode('utf-8')
################################################################################ ################################################################################

View file

@ -173,7 +173,7 @@ try:
return True return True
return False return False
except ImportError: 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') 'SSL certificate')
def check_certificate(cert, domain): def check_certificate(cert, domain):

View file

@ -29,16 +29,16 @@ import sys
import stat import stat
from common import gajim from common import gajim
import logger from common import logger
from common import jingle_xtls from common import jingle_xtls
# DO NOT MOVE ABOVE OF import gajim # DO NOT MOVE ABOVE OF import gajim
import sqlite3 as sqlite import sqlite3 as sqlite
def create_log_db(): def create_log_db():
print _('creating logs database') print(_('creating logs database'))
con = sqlite.connect(logger.LOG_DB_PATH) 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() cur = con.cursor()
# create the tables # create the tables
# kind can be # kind can be
@ -84,9 +84,9 @@ def create_log_db():
con.close() con.close()
def create_cache_db(): def create_cache_db():
print _('creating cache database') print(_('creating cache database'))
con = sqlite.connect(logger.CACHE_DB_PATH) 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 = con.cursor()
cur.executescript( cur.executescript(
''' '''
@ -128,16 +128,16 @@ def create_cache_db():
con.close() con.close()
def split_db(): def split_db():
print 'spliting database' print('spliting database')
if os.name == 'nt': if os.name == 'nt':
try: try:
import configpaths import configpaths
OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse(
os.environ[u'appdata']), u'Gajim') os.environ['appdata']), 'Gajim')
except KeyError: except KeyError:
OLD_LOG_DB_FOLDER = u'.' OLD_LOG_DB_FOLDER = '.'
else: else:
OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim')
tmp = logger.CACHE_DB_PATH tmp = logger.CACHE_DB_PATH
logger.CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') logger.CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db')
@ -148,7 +148,7 @@ def split_db():
os.chdir(back) os.chdir(back)
cur = con.cursor() cur = con.cursor()
cur.execute('''SELECT name FROM sqlite_master WHERE type = 'table';''') 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] tables = [t[0] for t in tables]
cur.execute("ATTACH DATABASE '%s' AS cache" % logger.CACHE_DB_PATH) cur.execute("ATTACH DATABASE '%s' AS cache" % logger.CACHE_DB_PATH)
for table in ('caps_cache', 'rooms_last_message_time', 'roster_entry', for table in ('caps_cache', 'rooms_last_message_time', 'roster_entry',
@ -161,9 +161,9 @@ def split_db():
con.commit() con.commit()
cur.executescript('DROP TABLE %s;' % table) cur.executescript('DROP TABLE %s;' % table)
con.commit() con.commit()
except sqlite.OperationalError, e: except sqlite.OperationalError as e:
print >> sys.stderr, 'error moving table %s to cache.db: %s' % \ print('error moving table %s to cache.db: %s' % (table, str(e)),
(table, str(e)) file=sys.stderr)
con.close() con.close()
logger.CACHE_DB_PATH = tmp 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_ICONSETS_PATH'] = gajim.MY_ICONSETS_PATH
vars['MY_MOOD_ICONSETS_PATH'] = gajim.MY_MOOD_ICONSETS_PATH vars['MY_MOOD_ICONSETS_PATH'] = gajim.MY_MOOD_ICONSETS_PATH
vars['MY_ACTIVITY_ICONSETS_PATH'] = gajim.MY_ACTIVITY_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_DATA = configpaths.gajimpaths['MY_DATA']
MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG']
MY_CACHE = configpaths.gajimpaths['MY_CACHE'] MY_CACHE = configpaths.gajimpaths['MY_CACHE']
@ -189,22 +189,22 @@ def check_and_possibly_move_config():
if os.name == 'nt': if os.name == 'nt':
try: try:
OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse(
os.environ[u'appdata']), u'Gajim') os.environ['appdata']), 'Gajim')
except KeyError: except KeyError:
OLD_LOG_DB_FOLDER = u'.' OLD_LOG_DB_FOLDER = '.'
else: 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): if not os.path.exists(OLD_LOG_DB_FOLDER):
return return
OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'logs.db') OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'logs.db')
OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'cache.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, u'vcards') vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'vcards')
vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'avatars') vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'avatars')
vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'emoticons') 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, u'iconsets') 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, u'moods') 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, vars['OLD_MY_ACTIVITY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER,
u'activities') 'activities')
OLD_CONFIG_FILES = [] OLD_CONFIG_FILES = []
OLD_DATA_FILES = [] OLD_DATA_FILES = []
for f in os.listdir(OLD_LOG_DB_FOLDER): for f in os.listdir(OLD_LOG_DB_FOLDER):
@ -249,7 +249,7 @@ def check_and_possibly_move_config():
continue continue
if not os.path.exists(src): if not os.path.exists(src):
continue continue
print 'moving %s to %s' % (src, dst) print(_('moving %s to %s') % (src, dst))
shutil.move(src, dst) shutil.move(src, dst)
gajim.logger.init_vars() gajim.logger.init_vars()
gajim.logger.attach_cache_database() gajim.logger.attach_cache_database()
@ -263,7 +263,7 @@ def check_and_possibly_create_paths():
VCARD_PATH = gajim.VCARD_PATH VCARD_PATH = gajim.VCARD_PATH
AVATAR_PATH = gajim.AVATAR_PATH AVATAR_PATH = gajim.AVATAR_PATH
import configpaths from common import configpaths
MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_DATA = configpaths.gajimpaths['MY_DATA']
MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG']
MY_CACHE = configpaths.gajimpaths['MY_CACHE'] MY_CACHE = configpaths.gajimpaths['MY_CACHE']
@ -275,57 +275,57 @@ def check_and_possibly_create_paths():
if not os.path.exists(MY_DATA): if not os.path.exists(MY_DATA):
create_path(MY_DATA) create_path(MY_DATA)
elif os.path.isfile(MY_DATA): elif os.path.isfile(MY_DATA):
print _('%s is a file but it should be a directory') % MY_DATA print(_('%s is a file but it should be a directory') % MY_DATA)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(MY_CONFIG): if not os.path.exists(MY_CONFIG):
create_path(MY_CONFIG) create_path(MY_CONFIG)
elif os.path.isfile(MY_CONFIG): elif os.path.isfile(MY_CONFIG):
print _('%s is a file but it should be a directory') % MY_CONFIG print(_('%s is a file but it should be a directory') % MY_CONFIG)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(MY_CACHE): if not os.path.exists(MY_CACHE):
create_path(MY_CACHE) create_path(MY_CACHE)
elif os.path.isfile(MY_CACHE): elif os.path.isfile(MY_CACHE):
print _('%s is a file but it should be a directory') % MY_CACHE print(_('%s is a file but it should be a directory') % MY_CACHE)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(VCARD_PATH): if not os.path.exists(VCARD_PATH):
create_path(VCARD_PATH) create_path(VCARD_PATH)
elif os.path.isfile(VCARD_PATH): elif os.path.isfile(VCARD_PATH):
print _('%s is a file but it should be a directory') % VCARD_PATH print(_('%s is a file but it should be a directory') % VCARD_PATH)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(AVATAR_PATH): if not os.path.exists(AVATAR_PATH):
create_path(AVATAR_PATH) create_path(AVATAR_PATH)
elif os.path.isfile(AVATAR_PATH): elif os.path.isfile(AVATAR_PATH):
print _('%s is a file but it should be a directory') % AVATAR_PATH print(_('%s is a file but it should be a directory') % AVATAR_PATH)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(LOG_DB_FOLDER): if not os.path.exists(LOG_DB_FOLDER):
create_path(LOG_DB_FOLDER) create_path(LOG_DB_FOLDER)
elif os.path.isfile(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(_('%s is a file but it should be a directory') % LOG_DB_FOLDER)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(PLUGINS_CONFIG_PATH): if not os.path.exists(PLUGINS_CONFIG_PATH):
create_path(PLUGINS_CONFIG_PATH) create_path(PLUGINS_CONFIG_PATH)
elif os.path.isfile(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(_('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(CACHE_DB_FOLDER): if not os.path.exists(CACHE_DB_FOLDER):
create_path(CACHE_DB_FOLDER) create_path(CACHE_DB_FOLDER)
elif os.path.isfile(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(_('%s is a file but it should be a directory') % CACHE_DB_FOLDER)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
check_and_possibly_move_config() check_and_possibly_move_config()
@ -334,18 +334,18 @@ def check_and_possibly_create_paths():
create_log_db() create_log_db()
gajim.logger.init_vars() gajim.logger.init_vars()
elif os.path.isdir(LOG_DB_PATH): elif os.path.isdir(LOG_DB_PATH):
print _('%s is a directory but should be a file') % LOG_DB_PATH print(_('%s is a directory but should be a file') % LOG_DB_PATH)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(CACHE_DB_PATH): if not os.path.exists(CACHE_DB_PATH):
create_cache_db() create_cache_db()
gajim.logger.attach_cache_database() gajim.logger.attach_cache_database()
elif os.path.isdir(CACHE_DB_PATH): elif os.path.isdir(CACHE_DB_PATH):
print _('%s is a directory but should be a file') % CACHE_DB_PATH print(_('%s is a directory but should be a file') % CACHE_DB_PATH)
print _('Gajim will now exit') print(_('Gajim will now exit'))
sys.exit() sys.exit()
if not os.path.exists(XTLS_CERTS): if not os.path.exists(XTLS_CERTS):
create_path(XTLS_CERTS) create_path(XTLS_CERTS)
if not os.path.exists(LOCAL_XTLS_CERTS): if not os.path.exists(LOCAL_XTLS_CERTS):
@ -363,5 +363,5 @@ def create_path(directory):
create_path(head) create_path(head)
if os.path.exists(directory): if os.path.exists(directory):
return return
print _('creating %s directory') % directory print(('creating %s directory') % directory)
os.mkdir(directory, 0700) os.mkdir(directory, 0o700)

View file

@ -23,9 +23,9 @@
## ##
import nbxmpp import nbxmpp
import helpers from common import helpers
import dataforms from common import dataforms
import gajim from common import gajim
from common.connection_handlers_events import MessageOutgoingEvent from common.connection_handlers_events import MessageOutgoingEvent
import logging import logging
@ -105,12 +105,12 @@ class ChangeStatusCommand(AdHocCommand):
var = 'presence-type', var = 'presence-type',
label = 'Type of presence:', label = 'Type of presence:',
options = [ options = [
(u'chat', _('Free for chat')), ('chat', _('Free for chat')),
(u'online', _('Online')), ('online', _('Online')),
(u'away', _('Away')), ('away', _('Away')),
(u'xa', _('Extended away')), ('xa', _('Extended away')),
(u'dnd', _('Do not disturb')), ('dnd', _('Do not disturb')),
(u'offline', _('Offline - disconnect'))], ('offline', _('Offline - disconnect'))],
value = 'online', value = 'online',
required = True), required = True),
dataforms.Field('text-multi', dataforms.Field('text-multi',
@ -147,7 +147,7 @@ class ChangeStatusCommand(AdHocCommand):
try: try:
presencedesc = form['presence-desc'].value presencedesc = form['presence-desc'].value
except Exception: # same exceptions as in last comment except Exception: # same exceptions as in last comment
presencedesc = u'' presencedesc = ''
response, cmd = self.buildResponse(request, status = 'completed') response, cmd = self.buildResponse(request, status = 'completed')
cmd.addChild('note', {}, _('The status has been changed.')) cmd.addChild('note', {}, _('The status has been changed.'))
@ -198,7 +198,7 @@ class LeaveGroupchatsCommand(AdHocCommand):
options = [] options = []
account = self.connection.name account = self.connection.name
for gc in find_current_groupchats(account): 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]})) {'nickname': gc[1], 'room_jid': gc[0]}))
if not len(options): if not len(options):
response, cmd = self.buildResponse(request, status = 'completed') response, cmd = self.buildResponse(request, status = 'completed')
@ -369,11 +369,11 @@ class ConnectionCommands:
# buildReply don't copy the node attribute. Re-add it # buildReply don't copy the node attribute. Re-add it
q.setAttr('node', nbxmpp.NS_COMMANDS) 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)): if cmd.isVisibleFor(self.isSameJID(jid)):
q.addChild('item', { q.addChild('item', {
# TODO: find the jid # TODO: find the jid
'jid': self.getOurBareJID() + u'/' + self.server_resource, 'jid': self.getOurBareJID() + '/' + self.server_resource,
'node': node, 'node': node,
'name': cmd.commandname}) 'name': cmd.commandname})
@ -387,7 +387,7 @@ class ConnectionCommands:
try: try:
jid = helpers.get_full_jid_from_iq(iq_obj) jid = helpers.get_full_jid_from_iq(iq_obj)
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % iq_obj.getFrom()) log.warning('Invalid JID: %s, ignoring it' % iq_obj.getFrom())
return return
node = iq_obj.getTagAttr('query', 'node') node = iq_obj.getTagAttr('query', 'node')

View file

@ -35,8 +35,8 @@
import sys import sys
import re import re
import copy import copy
import defs from common import defs
import gobject from gi.repository import GLib
( (
OPT_TYPE, 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.")], '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_wikipedia': [opt_bool, False],
'always_english_wiktionary': [opt_bool, True], '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], '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.')], '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.')], '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_always_visible': [opt_bool, False, _('Show tab when only one conversation?')],
'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')], 'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')],
'tabs_close_button': [opt_bool, True, _('Show close button in tab?')], '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_width': [opt_int, 52],
'chat_avatar_height': [opt_int, 52], 'chat_avatar_height': [opt_int, 52],
'roster_avatar_width': [opt_int, 32], 'roster_avatar_width': [opt_int, 32],
@ -349,7 +349,6 @@ class Config:
'enable_esessions': [opt_bool, True, _('Enable ESessions encryption for this account.')], '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?')], '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')], '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', '' ], '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\'') ], '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.') ], '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 Tree-like interface
""" """
if node is None: if node is None:
for child, option in self.__options[1].iteritems(): for child, option in self.__options[1].items():
yield (child, ), option yield (child, ), option
for grandparent in self.__options_per_key: for grandparent in self.__options_per_key:
yield (grandparent, ), None yield (grandparent, ), None
@ -584,7 +583,7 @@ class Config:
elif len(node) == 2: elif len(node) == 2:
grandparent, parent = node grandparent, parent = node
children = self.__options_per_key[grandparent][1][parent] 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 yield (grandparent, parent, child), option
else: else:
raise ValueError('Invalid node') raise ValueError('Invalid node')
@ -630,11 +629,9 @@ class Config:
def set(self, optname, value): def set(self, optname, value):
if optname not in self.__options[1]: if optname not in self.__options[1]:
# raise RuntimeError, 'option %s does not exist' % optname
return return
value = self.is_valid(self.__options[0][optname][OPT_TYPE], value) value = self.is_valid(self.__options[0][optname][OPT_TYPE], value)
if value is None: if value is None:
# raise RuntimeError, 'value of %s cannot be None' % optname
return return
self.__options[1][optname] = value self.__options[1][optname] = value
@ -642,7 +639,7 @@ class Config:
def get(self, optname=None): def get(self, optname=None):
if not optname: if not optname:
return self.__options[1].keys() return list(self.__options[1].keys())
if optname not in self.__options[1]: if optname not in self.__options[1]:
return None return None
return self.__options[1][optname] return self.__options[1][optname]
@ -671,7 +668,6 @@ class Config:
def add_per(self, typename, name): # per_group_of_option def add_per(self, typename, name): # per_group_of_option
if typename not in self.__options_per_key: if typename not in self.__options_per_key:
# raise RuntimeError, 'option %s does not exist' % typename
return return
opt = self.__options_per_key[typename] opt = self.__options_per_key[typename]
@ -685,7 +681,6 @@ class Config:
def del_per(self, typename, name, subname = None): # per_group_of_option def del_per(self, typename, name, subname = None): # per_group_of_option
if typename not in self.__options_per_key: if typename not in self.__options_per_key:
# raise RuntimeError, 'option %s does not exist' % typename
return return
opt = self.__options_per_key[typename] opt = self.__options_per_key[typename]
@ -698,22 +693,18 @@ class Config:
def set_per(self, optname, key, subname, value): # per_group_of_option def set_per(self, optname, key, subname, value): # per_group_of_option
if optname not in self.__options_per_key: if optname not in self.__options_per_key:
# raise RuntimeError, 'option %s does not exist' % optname
return return
if not key: if not key:
return return
dict_ = self.__options_per_key[optname][1] dict_ = self.__options_per_key[optname][1]
if key not in dict_: if key not in dict_:
# raise RuntimeError, '%s is not a key of %s' % (key, dict_)
self.add_per(optname, key) self.add_per(optname, key)
obj = dict_[key] obj = dict_[key]
if subname not in obj: if subname not in obj:
# raise RuntimeError, '%s is not a key of %s' % (subname, obj)
return return
typ = self.__options_per_key[optname][0][subname][OPT_TYPE] typ = self.__options_per_key[optname][0][subname][OPT_TYPE]
value = self.is_valid(typ, value) value = self.is_valid(typ, value)
if value is None: if value is None:
# raise RuntimeError, '%s of %s cannot be None' % optname
return return
obj[subname] = value obj[subname] = value
self._timeout_save() self._timeout_save()
@ -723,7 +714,7 @@ class Config:
return None return None
dict_ = self.__options_per_key[optname][1] dict_ = self.__options_per_key[optname][1]
if not key: if not key:
return dict_.keys() return list(dict_.keys())
if key not in dict_: if key not in dict_:
if subname in self.__options_per_key[optname][0]: if subname in self.__options_per_key[optname][0]:
return self.__options_per_key[optname][0][subname][1] return self.__options_per_key[optname][0][subname][1]
@ -812,7 +803,7 @@ class Config:
def _timeout_save(self): def _timeout_save(self):
if self.save_timeout_id: if self.save_timeout_id:
return 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): def __init__(self):
#init default values #init default values

View file

@ -25,7 +25,7 @@
import os import os
import sys import sys
import tempfile import tempfile
import defs from common import defs
HAVE_XDG = True HAVE_XDG = True
try: try:
__import__(xdg) __import__(xdg)
@ -61,7 +61,7 @@ def fse(s):
""" """
Convert from filesystem encoding if not already Unicode Convert from filesystem encoding if not already Unicode
""" """
return unicode(s, sys.getfilesystemencoding()) return s
def windowsify(s): def windowsify(s):
if os.name == 'nt': if os.name == 'nt':
@ -82,10 +82,10 @@ class ConfigPaths:
# variable 'appdata' is in? Assuming it to be in filesystem # variable 'appdata' is in? Assuming it to be in filesystem
# encoding. # encoding.
self.config_root = self.cache_root = self.data_root = \ 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: except KeyError:
# win9x, in cwd # win9x, in cwd
self.config_root = self.cache_root = self.data_root = u'.' self.config_root = self.cache_root = self.data_root = '.'
else: # Unices else: # Unices
# Pass in an Unicode string, and hopefully get one back. # Pass in an Unicode string, and hopefully get one back.
if HAVE_XDG: if HAVE_XDG:
@ -93,23 +93,23 @@ class ConfigPaths:
if not self.config_root: if not self.config_root:
# Folder doesn't exist yet. # Folder doesn't exist yet.
self.config_root = os.path.join(xdg.BaseDirectory.\ 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, self.cache_root = os.path.join(xdg.BaseDirectory.xdg_cache_home,
u'gajim') 'gajim')
self.data_root = xdg.BaseDirectory.save_data_path('gajim') self.data_root = xdg.BaseDirectory.save_data_path('gajim')
if not self.data_root: if not self.data_root:
self.data_root = os.path.join(xdg.BaseDirectory.\ self.data_root = os.path.join(xdg.BaseDirectory.\
xdg_data_dirs[0], u'gajim') xdg_data_dirs[0], 'gajim')
else: else:
expand = os.path.expanduser expand = os.path.expanduser
base = os.getenv('XDG_CONFIG_HOME') or expand(u'~/.config') base = os.getenv('XDG_CONFIG_HOME') or expand('~/.config')
self.config_root = os.path.join(base, u'gajim') self.config_root = os.path.join(base, 'gajim')
base = os.getenv('XDG_CACHE_HOME') or expand(u'~/.cache') base = os.getenv('XDG_CACHE_HOME') or expand('~/.cache')
self.cache_root = os.path.join(base, u'gajim') self.cache_root = os.path.join(base, 'gajim')
base = os.getenv('XDG_DATA_HOME') or expand(u'~/.local/share') base = os.getenv('XDG_DATA_HOME') or expand('~/.local/share')
self.data_root = os.path.join(base, u'gajim') self.data_root = os.path.join(base, 'gajim')
def add(self, name, type_, path): def add(self, name, type_, path):
self.paths[name] = (type_, path) self.paths[name] = (type_, path)
@ -130,40 +130,41 @@ class ConfigPaths:
except KeyError: except KeyError:
return default return default
def iteritems(self): def items(self):
for key in self.paths.iterkeys(): for key in self.paths.keys():
yield (key, self[key]) yield (key, self[key])
def init(self, root=None): def init(self, root=None):
if root is not None: if root is not None:
self.config_root = self.cache_root = self.data_root = root self.config_root = self.cache_root = self.data_root = root
d = {'MY_DATA': '', 'LOG_DB': u'logs.db', 'MY_CACERTS': u'cacerts.pem', d = {'MY_DATA': '', 'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem',
'MY_EMOTS': u'emoticons', 'MY_ICONSETS': u'iconsets', 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets',
'MY_MOOD_ICONSETS': u'moods', 'MY_ACTIVITY_ICONSETS': u'activities', 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities',
'PLUGINS_USER': u'plugins', 'MY_PEER_CERTS': u'certs'} 'PLUGINS_USER': 'plugins', 'MY_PEER_CERTS': 'certs',
'RNG_SEED': 'rng_seed'}
for name in d: for name in d:
self.add(name, TYPE_DATA, windowsify(d[name])) self.add(name, TYPE_DATA, windowsify(d[name]))
d = {'MY_CACHE': '', 'CACHE_DB': u'cache.db', 'VCARD': u'vcards', d = {'MY_CACHE': '', 'CACHE_DB': 'cache.db', 'VCARD': 'vcards',
'AVATAR': u'avatars'} 'AVATAR': 'avatars'}
for name in d: for name in d:
self.add(name, TYPE_CACHE, windowsify(d[name])) self.add(name, TYPE_CACHE, windowsify(d[name]))
self.add('MY_CONFIG', TYPE_CONFIG, '') self.add('MY_CONFIG', TYPE_CONFIG, '')
self.add('MY_CERT', TYPE_CONFIG, '') self.add('MY_CERT', TYPE_CONFIG, '')
basedir = fse(os.environ.get(u'GAJIM_BASEDIR', defs.basedir)) basedir = fse(os.environ.get('GAJIM_BASEDIR', defs.basedir))
self.add('DATA', None, os.path.join(basedir, windowsify(u'data'))) self.add('DATA', None, os.path.join(basedir, windowsify('data')))
self.add('ICONS', None, os.path.join(basedir, windowsify(u'icons'))) self.add('ICONS', None, os.path.join(basedir, windowsify('icons')))
self.add('HOME', None, fse(os.path.expanduser('~'))) self.add('HOME', None, fse(os.path.expanduser('~')))
self.add('PLUGINS_BASE', None, os.path.join(basedir, self.add('PLUGINS_BASE', None, os.path.join(basedir,
windowsify(u'plugins'))) windowsify('plugins')))
try: try:
self.add('TMP', None, fse(tempfile.gettempdir())) self.add('TMP', None, fse(tempfile.gettempdir()))
except IOError, e: except IOError as e:
print >> sys.stderr, 'Error opening tmp folder: %s\nUsing %s' % ( print('Error opening tmp folder: %s\nUsing %s' % (str(e),
str(e), os.path.expanduser('~')) os.path.expanduser('~')), file=sys.stderr)
self.add('TMP', None, fse(os.path.expanduser('~'))) self.add('TMP', None, fse(os.path.expanduser('~')))
try: try:
@ -173,17 +174,17 @@ class ConfigPaths:
pass pass
def init_profile(self, profile=''): def init_profile(self, profile=''):
conffile = windowsify(u'config') conffile = windowsify('config')
pidfile = windowsify(u'gajim') pidfile = windowsify('gajim')
secretsfile = windowsify(u'secrets') secretsfile = windowsify('secrets')
pluginsconfdir = windowsify(u'pluginsconfig') pluginsconfdir = windowsify('pluginsconfig')
if len(profile) > 0: if len(profile) > 0:
conffile += u'.' + profile conffile += '.' + profile
pidfile += u'.' + profile pidfile += '.' + profile
secretsfile += u'.' + profile secretsfile += '.' + profile
pluginsconfdir += u'.' + profile pluginsconfdir += '.' + profile
pidfile += u'.pid' pidfile += '.pid'
self.add('CONFIG_FILE', TYPE_CONFIG, conffile) self.add('CONFIG_FILE', TYPE_CONFIG, conffile)
self.add('PID_FILE', TYPE_CACHE, pidfile) self.add('PID_FILE', TYPE_CACHE, pidfile)
self.add('SECRETS_FILE', TYPE_DATA, secretsfile) self.add('SECRETS_FILE', TYPE_DATA, secretsfile)

View file

@ -59,7 +59,7 @@ from common import gpg
from common import passwords from common import passwords
from common import exceptions from common import exceptions
from common import check_X509 from common import check_X509
from connection_handlers import * from common.connection_handlers import *
if gajim.HAVE_PYOPENSSL: if gajim.HAVE_PYOPENSSL:
import OpenSSL.crypto import OpenSSL.crypto
@ -312,8 +312,7 @@ class CommonConnection:
else: else:
def encrypt_thread(msg, keyID, always_trust=False): def encrypt_thread(msg, keyID, always_trust=False):
# encrypt message. This function returns (msgenc, error) # encrypt message. This function returns (msgenc, error)
return self.gpg.encrypt(msg.encode('utf-8'), [keyID], return self.gpg.encrypt(msg, [keyID], always_trust)
always_trust)
def _on_encrypted(output): def _on_encrypted(output):
msgenc, error = output msgenc, error = output
if error == 'NOT_TRUSTED': if error == 'NOT_TRUSTED':
@ -329,7 +328,7 @@ class CommonConnection:
form_node, user_nick, keyID, attention, form_node, user_nick, keyID, attention,
correction_msg, callback) correction_msg, callback)
gajim.nec.push_incoming_event(GPGTrustKeyEvent(None, gajim.nec.push_incoming_event(GPGTrustKeyEvent(None,
conn=self, callback=_on_always_trust)) conn=self, keyID=keyID, callback=_on_always_trust))
else: else:
self._message_encrypted_cb(output, type_, msg, msgtxt, self._message_encrypted_cb(output, type_, msg, msgtxt,
original_message, fjid, resource, jid, xhtml, original_message, fjid, resource, jid, xhtml,
@ -519,7 +518,7 @@ class CommonConnection:
log_msg = '<body xmlns="%s">%s</body>' % ( log_msg = '<body xmlns="%s">%s</body>' % (
nbxmpp.NS_XHTML, xhtml) nbxmpp.NS_XHTML, xhtml)
gajim.logger.write(kind, jid, log_msg) gajim.logger.write(kind, jid, log_msg)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
self.dispatch('DB_ERROR', (_('Disk Write Error'), self.dispatch('DB_ERROR', (_('Disk Write Error'),
str(e))) str(e)))
except exceptions.DatabaseMalformed: except exceptions.DatabaseMalformed:
@ -680,10 +679,10 @@ class CommonConnection:
if realm == '': if realm == '':
if event == nbxmpp.transports_nb.DATA_RECEIVED: if event == nbxmpp.transports_nb.DATA_RECEIVED:
gajim.nec.push_incoming_event(StanzaReceivedEvent(None, 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: elif event == nbxmpp.transports_nb.DATA_SENT:
gajim.nec.push_incoming_event(StanzaSentEvent(None, conn=self, gajim.nec.push_incoming_event(StanzaSentEvent(None, conn=self,
stanza_str=unicode(data))) stanza_str=data))
def change_status(self, show, msg, auto=False): def change_status(self, show, msg, auto=False):
if not msg: if not msg:
@ -779,7 +778,7 @@ class Connection(CommonConnection, ConnectionHandlers):
self.private_storage_supported = True self.private_storage_supported = True
self.privacy_rules_requested = False self.privacy_rules_requested = False
self.streamError = '' 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 self.sm = Smacks(self) # Stream Management
@ -981,8 +980,8 @@ class Connection(CommonConnection, ConnectionHandlers):
self.connection.SendAndCallForResponse(iq, self.connection.SendAndCallForResponse(iq,
_on_register_result) _on_register_result)
else: else:
if self.new_account_form.keys().sort() != \ if list(self.new_account_form.keys()).sort() != \
conf.keys().sort(): list(conf.keys()).sort():
# requested config has changed since first connection # requested config has changed since first connection
reason = _('Server %s provided a different ' reason = _('Server %s provided a different '
'registration form') % data[0] 'registration form') % data[0]
@ -1239,11 +1238,9 @@ class Connection(CommonConnection, ConnectionHandlers):
if not os.path.exists(cacerts): if not os.path.exists(cacerts):
cacerts = '' cacerts = ''
mycerts = common.gajim.MY_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 = gajim.config.get_per('accounts', self.name,
'cipher_list') '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( con = nbxmpp.NonBlockingClient(
domain=self._hostname, domain=self._hostname,
@ -1391,41 +1388,40 @@ class Connection(CommonConnection, ConnectionHandlers):
cert = con.Connection.ssl_certificate cert = con.Connection.ssl_certificate
if errnum > 0 and str(errnum) not in gajim.config.get_per('accounts', if errnum > 0 and str(errnum) not in gajim.config.get_per('accounts',
self.name, 'ignore_ssl_errors').split(): self.name, 'ignore_ssl_errors').split():
text = _('The authenticity of the %s certificate could be invlid') \ text = _('The authenticity of the %s certificate could be invalid'
% hostname ) % hostname
if errnum in ssl_error: if errnum in ssl_error:
text += _('\nSSL Error: <b>%s</b>') % ssl_error[errnum] text += _('\nSSL Error: <b>%s</b>') % ssl_error[errnum]
else: else:
text += _('\nUnknown SSL error: %d') % errnum 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, pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM,
cert) cert).decode('utf-8')
gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self,
error_text=text, error_num=errnum, cert=pem, error_text=text, error_num=errnum, cert=pem,
fingerprint=fingerprint, certificate=cert)) fingerprint=fingerprint, certificate=cert))
return True return True
if cert: if cert:
fingerprint = cert.digest('sha1') fingerprint = cert.digest('sha1').decode('utf-8')
saved_fingerprint = gajim.config.get_per('accounts', self.name, saved_fingerprint = gajim.config.get_per('accounts', self.name,
'ssl_fingerprint_sha1') 'ssl_fingerprint_sha1')
if saved_fingerprint: if saved_fingerprint:
# Check sha1 fingerprint # Check sha1 fingerprint
if fingerprint != saved_fingerprint: if fingerprint != saved_fingerprint:
gajim.nec.push_incoming_event(FingerprintErrorEvent(None, gajim.nec.push_incoming_event(FingerprintErrorEvent(None,
conn=self, certificate=con.Connection.ssl_certificate, conn=self, certificate=cert,
new_fingerprint=fingerprint)) new_fingerprint=fingerprint))
return True return True
else: else:
gajim.config.set_per('accounts', self.name, gajim.config.set_per('accounts', self.name,
'ssl_fingerprint_sha1', fingerprint) 'ssl_fingerprint_sha1', fingerprint)
if not check_X509.check_certificate(con.Connection.ssl_certificate, if not check_X509.check_certificate(cert, hostname) and \
hostname) and '100' not in gajim.config.get_per('accounts', '100' not in gajim.config.get_per('accounts', self.name,
self.name, 'ignore_ssl_errors').split(): 'ignore_ssl_errors').split():
fingerprint = cert.digest('sha1')
pem = OpenSSL.crypto.dump_certificate( 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 ' 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 hostname
gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self,
error_text=txt, error_num=100, cert=pem, error_text=txt, error_num=100, cert=pem,
@ -1523,7 +1519,7 @@ class Connection(CommonConnection, ConnectionHandlers):
self.connection.send(' ') self.connection.send(' ')
def _on_xmpp_ping_answer(self, iq_obj): 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 assert id_ == self.awaiting_xmpp_ping_id
self.awaiting_xmpp_ping_id = None self.awaiting_xmpp_ping_id = None
@ -1772,9 +1768,9 @@ class Connection(CommonConnection, ConnectionHandlers):
gajim.nec.push_incoming_event(OurShowEvent(None, conn=self, gajim.nec.push_incoming_event(OurShowEvent(None, conn=self,
show=gajim.SHOW_LIST[self.connected])) show=gajim.SHOW_LIST[self.connected]))
gajim.nec.push_incoming_event(InformationEvent(None, conn=self, 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.') % \ sec_txt=_('Account %s doesn\'t support invisibility.') % \
self.name))) self.name))
return return
# If we are already connected, and privacy rules are supported, send # If we are already connected, and privacy rules are supported, send
# offline presence first as it's required by XEP-0126 # offline presence first as it's required by XEP-0126
@ -1800,7 +1796,7 @@ class Connection(CommonConnection, ConnectionHandlers):
self.activate_privacy_rule('invisible') self.activate_privacy_rule('invisible')
self.connected = gajim.SHOW_LIST.index('invisible') self.connected = gajim.SHOW_LIST.index('invisible')
self.status = msg self.status = msg
priority = unicode(gajim.get_priority(self.name, 'invisible')) priority = gajim.get_priority(self.name, 'invisible')
p = nbxmpp.Presence(priority=priority) p = nbxmpp.Presence(priority=priority)
p = self.add_sha(p, True) p = self.add_sha(p, True)
if msg: if msg:
@ -1981,7 +1977,7 @@ class Connection(CommonConnection, ConnectionHandlers):
p.setStatus(msg) p.setStatus(msg)
else: else:
signed = self.get_signed_presence(msg) 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 = nbxmpp.Presence(typ=None, priority=priority, show=sshow, to=jid)
p = self.add_sha(p) p = self.add_sha(p)
if msg: if msg:
@ -2005,7 +2001,7 @@ class Connection(CommonConnection, ConnectionHandlers):
def _update_status(self, show, msg): def _update_status(self, show, msg):
xmpp_show = helpers.get_xmpp_show(show) 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 = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show)
p = self.add_sha(p) p = self.add_sha(p)
if msg: if msg:
@ -2047,6 +2043,8 @@ class Connection(CommonConnection, ConnectionHandlers):
return return
if isinstance(jid, list): if isinstance(jid, list):
for j in jid: for j in jid:
if session is None:
session = self.get_or_create_session(j, '')
self.log_message(j, msg, forward_from, session, self.log_message(j, msg, forward_from, session,
original_message, subject, type_, xhtml) original_message, subject, type_, xhtml)
else: else:
@ -2562,7 +2560,7 @@ class Connection(CommonConnection, ConnectionHandlers):
p = nbxmpp.Presence(to='%s/%s' % (room_jid, nick), p = nbxmpp.Presence(to='%s/%s' % (room_jid, nick),
show=show, status=self.status) 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_ = self.connection.getAnID()
id_ = 'gajim_muc_' + id_ + '_' + h id_ = 'gajim_muc_' + id_ + '_' + h
p.setID(id_) p.setID(id_)
@ -2670,7 +2668,7 @@ class Connection(CommonConnection, ConnectionHandlers):
xmpp_show = helpers.get_xmpp_show(show) xmpp_show = helpers.get_xmpp_show(show)
p = nbxmpp.Presence(to='%s/%s' % (jid, nick), typ=ptype, p = nbxmpp.Presence(to='%s/%s' % (jid, nick), typ=ptype,
show=xmpp_show, status=status) 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_ = self.connection.getAnID()
id_ = 'gajim_muc_' + id_ + '_' + h id_ = 'gajim_muc_' + id_ + '_' + h
p.setID(id_) p.setID(id_)
@ -2847,6 +2845,19 @@ class Connection(CommonConnection, ConnectionHandlers):
""" """
Send invitation 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) message=nbxmpp.Message(to=room)
c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER) c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER)
c = c.addChild(name='invite', attrs={'to': to}) c = c.addChild(name='invite', attrs={'to': to})
@ -2889,7 +2900,7 @@ class Connection(CommonConnection, ConnectionHandlers):
return return
if self.awaiting_xmpp_ping_id: if self.awaiting_xmpp_ping_id:
# We haven't got the pong in time, disco and reconnect # 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() self._disconnectedReconnCB()
def _reconnect_alarm(self): def _reconnect_alarm(self):

View file

@ -33,17 +33,16 @@ import base64
import sys import sys
import operator import operator
import hashlib import hashlib
import gobject from gi.repository import GLib
import locale
from time import (altzone, daylight, gmtime, localtime, mktime, strftime, from time import (altzone, daylight, gmtime, localtime, mktime, strftime,
time as time_time, timezone, tzname) time as time_time, timezone, tzname)
from calendar import timegm from calendar import timegm
import nbxmpp 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 helpers
from common import gajim from common import gajim
from common import exceptions from common import exceptions
@ -188,8 +187,8 @@ class ConnectionDisco:
if not self.connection or self.connected < 2: if not self.connection or self.connected < 2:
return return
frm = helpers.get_full_jid_from_iq(iq_obj) frm = helpers.get_full_jid_from_iq(iq_obj)
to = unicode(iq_obj.getAttr('to')) to = iq_obj.getAttr('to')
id_ = unicode(iq_obj.getAttr('id')) id_ = iq_obj.getAttr('id')
iq = nbxmpp.Iq(to=frm, typ='result', queryNS=nbxmpp.NS_DISCO, frm=to) iq = nbxmpp.Iq(to=frm, typ='result', queryNS=nbxmpp.NS_DISCO, frm=to)
iq.setAttr('id', id_) iq.setAttr('id', id_)
query = iq.setTag('query') query = iq.setTag('query')
@ -242,7 +241,7 @@ class ConnectionDisco:
if self.commandInfoQuery(con, iq_obj): if self.commandInfoQuery(con, iq_obj):
raise nbxmpp.NodeProcessed raise nbxmpp.NodeProcessed
id_ = unicode(iq_obj.getAttr('id')) id_ = iq_obj.getAttr('id')
if id_[:6] == 'Gajim_': if id_[:6] == 'Gajim_':
# We get this request from echo.server # We get this request from echo.server
raise nbxmpp.NodeProcessed raise nbxmpp.NodeProcessed
@ -329,7 +328,7 @@ class ConnectionVcard:
os.remove(path) os.remove(path)
# create folder if needed # create folder if needed
if not os.path.isdir(path): if not os.path.isdir(path):
os.mkdir(path, 0700) os.mkdir(path, 0o700)
puny_nick = helpers.sanitize_filename(nick) puny_nick = helpers.sanitize_filename(nick)
path_to_file = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) path_to_file = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick)
else: else:
@ -338,7 +337,7 @@ class ConnectionVcard:
fil = open(path_to_file, 'w') fil = open(path_to_file, 'w')
fil.write(str(card)) fil.write(str(card))
fil.close() fil.close()
except IOError, e: except IOError as e:
gajim.nec.push_incoming_event(InformationEvent(None, conn=self, gajim.nec.push_incoming_event(InformationEvent(None, conn=self,
level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) 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 \ if 'PHOTO' in vcard and isinstance(vcard['PHOTO'], dict) and \
'BINVAL' in vcard['PHOTO']: 'BINVAL' in vcard['PHOTO']:
photo = vcard['PHOTO']['BINVAL'] 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) gajim.interface.save_avatar_files(our_jid, photo_decoded)
avatar_sha = hashlib.sha1(photo_decoded).hexdigest() avatar_sha = hashlib.sha1(photo_decoded).hexdigest()
iq2.getTag('PHOTO').setTagData('SHA', avatar_sha) iq2.getTag('PHOTO').setTagData('SHA', avatar_sha)
@ -565,7 +564,7 @@ class ConnectionVcard:
self.discover_ft_proxies() self.discover_ft_proxies()
gajim.nec.push_incoming_event(RosterReceivedEvent(None, gajim.nec.push_incoming_event(RosterReceivedEvent(None,
conn=self)) 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: elif self.awaiting_answers[id_][0] == PRIVACY_ARRIVED:
if iq_obj.getType() != 'error': if iq_obj.getType() != 'error':
self.privacy_rules_supported = True self.privacy_rules_supported = True
@ -619,7 +618,7 @@ class ConnectionVcard:
elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTIONS_ARRIVED: elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTIONS_ARRIVED:
# TODO # TODO
print 'ARCHIVING_COLLECTIONS_ARRIVED' print('ARCHIVING_COLLECTIONS_ARRIVED')
elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTION_ARRIVED: elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTION_ARRIVED:
def save_if_not_exists(with_, nick, direction, tim, payload): 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, gajim.logger.save_if_not_exists(with_, direction, tim,
msg=payload[0].getData(), nick=nick) msg=payload[0].getData(), nick=nick)
elif payload[0].getName() == 'message': elif payload[0].getName() == 'message':
print 'Not implemented' print('Not implemented')
chat = iq_obj.getTag('chat') chat = iq_obj.getTag('chat')
if chat: if chat:
with_ = chat.getAttr('with') with_ = chat.getAttr('with')
@ -710,7 +709,7 @@ class ConnectionVcard:
'BINVAL' in vcard['PHOTO']: 'BINVAL' in vcard['PHOTO']:
photo = vcard['PHOTO']['BINVAL'] photo = vcard['PHOTO']['BINVAL']
try: try:
photo_decoded = base64.decodestring(photo) photo_decoded = base64.b64decode(photo.encode('utf-8'))
avatar_sha = hashlib.sha1(photo_decoded).hexdigest() avatar_sha = hashlib.sha1(photo_decoded).hexdigest()
except Exception: except Exception:
avatar_sha = '' avatar_sha = ''
@ -732,7 +731,7 @@ class ConnectionVcard:
puny_nick = helpers.sanitize_filename(resource) puny_nick = helpers.sanitize_filename(resource)
# create folder if needed # create folder if needed
if not os.path.isdir(begin_path): 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) begin_path = os.path.join(begin_path, puny_nick)
frm_jid += '/' + resource frm_jid += '/' + resource
if photo_decoded: if photo_decoded:
@ -1139,7 +1138,7 @@ class ConnectionHandlersBase:
gajim.config.should_log(self.name, obj.jid): gajim.config.should_log(self.name, obj.jid):
try: try:
gajim.logger.write('status', obj.jid, obj.status, obj.show) 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))) self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e)))
except exceptions.DatabaseMalformed: except exceptions.DatabaseMalformed:
pritext = _('Database Error') pritext = _('Database Error')
@ -1162,8 +1161,7 @@ class ConnectionHandlersBase:
decmsg = self.gpg.decrypt(encmsg, keyID) decmsg = self.gpg.decrypt(encmsg, keyID)
decmsg = self.connection.Dispatcher.replace_non_character(decmsg) decmsg = self.connection.Dispatcher.replace_non_character(decmsg)
# \x00 chars are not allowed in C (so in GTK) # \x00 chars are not allowed in C (so in GTK)
obj.msgtxt = decmsg.replace('\x00', '').encode( obj.msgtxt = decmsg.replace('\x00', '')
locale.getpreferredencoding()).decode('utf-8')
obj.encrypted = 'xep27' obj.encrypted = 'xep27'
self.gpg_messages_to_decrypt.remove([encmsg, keyID, obj]) 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) gc_contact = gajim.contacts.get_gc_contact(self.name, obj.jid, nick)
if obj.receipt_request_tag and gajim.config.get_per('accounts', if obj.receipt_request_tag and gajim.config.get_per('accounts',
self.name, 'answer_receipts') and ((contact and contact.sub \ 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: not obj.forwarded:
receipt = nbxmpp.Message(to=obj.fjid, typ='chat') receipt = nbxmpp.Message(to=obj.fjid, typ='chat')
receipt.setID(obj.id_) receipt.setID(obj.id_)
@ -1264,7 +1262,7 @@ class ConnectionHandlersBase:
try: try:
gajim.logger.write('error', frm, error_msg, tim=tim, gajim.logger.write('error', frm, error_msg, tim=tim,
subject=subject) subject=subject)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e)))
except exceptions.DatabaseMalformed: except exceptions.DatabaseMalformed:
pritext = _('Database Error') pritext = _('Database Error')
@ -1290,7 +1288,7 @@ class ConnectionHandlersBase:
jid = gajim.get_jid_without_resource(jid) jid = gajim.get_jid_without_resource(jid)
try: try:
return self.sessions[jid].values() return list(self.sessions[jid].values())
except KeyError: except KeyError:
return [] return []
@ -1352,7 +1350,7 @@ class ConnectionHandlersBase:
received a thread_id yet and returns the session that we last sent a received a thread_id yet and returns the session that we last sent a
message to message to
""" """
sessions = self.sessions[jid].values() sessions = list(self.sessions[jid].values())
# sessions that we haven't received a thread ID in # sessions that we haven't received a thread ID in
idless = [s for s in sessions if not s.received_thread_id] 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 Find an active session that doesn't have a control attached
""" """
try: try:
sessions = self.sessions[jid].values() sessions = list(self.sessions[jid].values())
# filter out everything except the default session type # filter out everything except the default session type
chat_sessions = [s for s in sessions if isinstance(s, chat_sessions = [s for s in sessions if isinstance(s,
@ -1767,9 +1765,8 @@ ConnectionJingle, ConnectionIBBytestream):
iq_obj = obj.stanza.buildReply('result') iq_obj = obj.stanza.buildReply('result')
qp = iq_obj.setQuery() qp = iq_obj.setQuery()
qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime())) qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime()))
qp.setTagData('tz', helpers.decode_string(tzname[daylight])) qp.setTagData('tz', tzname[daylight])
qp.setTagData('display', helpers.decode_string(strftime('%c', qp.setTagData('display', strftime('%c', localtime()))
localtime())))
else: else:
iq_obj = obj.stanza.buildReply('error') iq_obj = obj.stanza.buildReply('error')
err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ 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.jingle_transport import JingleTransportSocks5
from common.file_props import FilesProp from common.file_props import FilesProp
import gtkgui_helpers if gajim.HAVE_PYOPENSSL:
import OpenSSL.crypto
import logging import logging
log = logging.getLogger('gajim.c.connection_handlers_events') log = logging.getLogger('gajim.c.connection_handlers_events')
@ -221,11 +222,11 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try: try:
t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ') t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ')
except ValueError, e: except ValueError:
try: try:
t = datetime.datetime.strptime(utc_time, t = datetime.datetime.strptime(utc_time,
'%Y-%m-%dT%H:%M:%S.%fZ') '%Y-%m-%dT%H:%M:%S.%fZ')
except ValueError, e: except ValueError as e:
log.info('Wrong time format: %s' % str(e)) log.info('Wrong time format: %s' % str(e))
return return
@ -309,7 +310,7 @@ class RosterItemExchangeEvent(nec.NetworkIncomingEvent, HelperEvent):
try: try:
jid = helpers.parse_jid(item.getAttr('jid')) jid = helpers.parse_jid(item.getAttr('jid'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid')) log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid'))
continue continue
name = item.getAttr('name') name = item.getAttr('name')
contact = gajim.contacts.get_contact(self.conn.name, jid) contact = gajim.contacts.get_contact(self.conn.name, jid)
@ -367,10 +368,10 @@ class RosterReceivedEvent(nec.NetworkIncomingEvent):
try: try:
j = helpers.parse_jid(jid) j = helpers.parse_jid(jid)
except Exception: except Exception:
print >> sys.stderr, _('JID %s is not RFC compliant. It ' print(_('JID %s is not RFC compliant. It will not be added '
'will not be added to your roster. Use roster ' 'to your roster. Use roster management tools such as '
'management tools such as ' 'http://jru.jabberstudio.org/ to remove it') % jid,
'http://jru.jabberstudio.org/ to remove it') % jid file=sys.stderr)
else: else:
infos = raw_roster[jid] infos = raw_roster[jid]
if jid != our_jid and (not infos['subscription'] or \ if jid != our_jid and (not infos['subscription'] or \
@ -402,7 +403,7 @@ class RosterSetReceivedEvent(nec.NetworkIncomingEvent):
try: try:
jid = helpers.parse_jid(item.getAttr('jid')) jid = helpers.parse_jid(item.getAttr('jid'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid')) log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid'))
continue continue
name = item.getAttr('name') name = item.getAttr('name')
sub = item.getAttr('subscription') sub = item.getAttr('subscription')
@ -450,7 +451,7 @@ class MucAdminReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try: try:
jid = helpers.parse_jid(item.getAttr('jid')) jid = helpers.parse_jid(item.getAttr('jid'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % \ log.warning('Invalid JID: %s, ignoring it' % \
item.getAttr('jid')) item.getAttr('jid'))
continue continue
affiliation = item.getAttr('affiliation') affiliation = item.getAttr('affiliation')
@ -492,7 +493,7 @@ class BookmarksHelper:
try: try:
jid = helpers.parse_jid(conf.getAttr('jid')) jid = helpers.parse_jid(conf.getAttr('jid'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % conf.getAttr('jid')) log.warning('Invalid JID: %s, ignoring it' % conf.getAttr('jid'))
continue continue
bm = {'name': conf.getAttr('name'), bm = {'name': conf.getAttr('name'),
'jid': jid, 'jid': jid,
@ -544,7 +545,7 @@ class PrivateStorageRosternotesReceivedEvent(nec.NetworkIncomingEvent):
try: try:
jid = helpers.parse_jid(note.getAttr('jid')) jid = helpers.parse_jid(note.getAttr('jid'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % note.getAttr('jid')) log.warning('Invalid JID: %s, ignoring it' % note.getAttr('jid'))
continue continue
annotation = note.getData() annotation = note.getData()
self.annotations[jid] = annotation self.annotations[jid] = annotation
@ -758,7 +759,7 @@ PresenceHelperEvent):
try: try:
self.get_jid_resource() self.get_jid_resource()
except Exception: except Exception:
log.warn('Invalid JID: %s, ignoring it' % self.stanza.getFrom()) log.warning('Invalid JID: %s, ignoring it' % self.stanza.getFrom())
return return
jid_list = gajim.contacts.get_jid_list(self.conn.name) jid_list = gajim.contacts.get_jid_list(self.conn.name)
self.timestamp = None self.timestamp = None
@ -798,7 +799,8 @@ PresenceHelperEvent):
and self.ptype == 'error': and self.ptype == 'error':
# Error presences may not include sent stanza, so we don't detect # Error presences may not include sent stanza, so we don't detect
# it's a muc presence. So detect it by ID # 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: if self.id_.split('_')[-1] == h:
self.is_gc = True self.is_gc = True
self.status = self.stanza.getStatus() or '' self.status = self.stanza.getStatus() or ''
@ -906,7 +908,7 @@ class GcPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try: try:
gajim.logger.write('gcstatus', self.fjid, st, gajim.logger.write('gcstatus', self.fjid, st,
self.show) self.show)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
self.conn.dispatch('DB_ERROR', (_('Disk Write Error'), self.conn.dispatch('DB_ERROR', (_('Disk Write Error'),
str(e))) str(e)))
except exceptions.DatabaseMalformed: except exceptions.DatabaseMalformed:
@ -1038,7 +1040,7 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
try: try:
self.fjid = helpers.parse_jid(address.getAttr('jid')) self.fjid = helpers.parse_jid(address.getAttr('jid'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % address.getAttr( log.warning('Invalid JID: %s, ignoring it' % address.getAttr(
'jid')) 'jid'))
return return
self.jid = gajim.get_jid_without_resource(self.fjid) self.jid = gajim.get_jid_without_resource(self.fjid)
@ -1078,10 +1080,15 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
self.invite_tag = None self.invite_tag = None
self.decline_tag = None self.decline_tag = None
if not self.enc_tag: if not self.enc_tag:
# Direct invitation?
self.invite_tag = self.stanza.getTag('x', self.invite_tag = self.stanza.getTag('x',
namespace=nbxmpp.NS_MUC_USER) namespace=nbxmpp.NS_CONFERENCE)
if self.invite_tag and not self.invite_tag.getTag('invite'): # Mediated invitation?
self.invite_tag = None 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', self.decline_tag = self.stanza.getTag('x',
namespace=nbxmpp.NS_MUC_USER) namespace=nbxmpp.NS_MUC_USER)
@ -1182,7 +1189,6 @@ class ZeroconfMessageReceivedEvent(MessageReceivedEvent):
self.fjid = key self.fjid = key
break break
self.fjid = unicode(self.fjid)
self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid) self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid)
def generate(self): def generate(self):
@ -1195,25 +1201,47 @@ class GcInvitationReceivedEvent(nec.NetworkIncomingEvent):
base_network_events = [] base_network_events = []
def generate(self): 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') self.reason = item.getTagData('reason')
try: self.password = invite_tag.getTagData('password')
self.jid_from = helpers.parse_jid(item.getAttr('from'))
except helpers.InvalidFormat: self.is_continued = False
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('from')) 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 return
jid = gajim.get_jid_without_resource(self.jid_from) jid = gajim.get_jid_without_resource(self.jid_from)
if gajim.config.get_per('accounts', self.conn.name, if gajim.config.get_per('accounts', self.conn.name,
'ignore_unknown_contacts') and not gajim.contacts.get_contacts( 'ignore_unknown_contacts') and not gajim.contacts.get_contacts(
self.conn.name, jid): self.conn.name, jid):
return 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 return True
@ -1228,7 +1256,7 @@ class GcDeclineReceivedEvent(nec.NetworkIncomingEvent):
try: try:
self.jid_from = helpers.parse_jid(item.getAttr('from')) self.jid_from = helpers.parse_jid(item.getAttr('from'))
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % item.getAttr('from')) log.warning('Invalid JID: %s, ignoring it' % item.getAttr('from'))
return return
jid = gajim.get_jid_without_resource(self.jid_from) jid = gajim.get_jid_without_resource(self.jid_from)
if gajim.config.get_per('accounts', self.conn.name, 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.ssl_msg = ssl_error.get(er, _('Unknown SSL error: %d') % \
self.errnum) self.errnum)
self.ssl_cert = '' 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 = '' self.ssl_fingerprint = ''
if self.conn.connection.Connection.ssl_certificate: if self.conn.connection.Connection.ssl_certificate:
self.ssl_fingerprint = \ cert = self.conn.connection.Connection.ssl_certificate
self.conn.connection.Connection.ssl_certificate.digest('sha1') 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 return True
class NewAccountNotConnectedEvent(nec.NetworkIncomingEvent): class NewAccountNotConnectedEvent(nec.NetworkIncomingEvent):
@ -1852,6 +1880,8 @@ class MetacontactsReceivedEvent(nec.NetworkIncomingEvent):
# Metacontact tags # Metacontact tags
# http://www.xmpp.org/extensions/xep-0209.html # http://www.xmpp.org/extensions/xep-0209.html
self.meta_list = {} self.meta_list = {}
# FIXME: disable metacontacts until they work correctly
return True
query = self.stanza.getTag('query') query = self.stanza.getTag('query')
storage = query.getTag('storage') storage = query.getTag('storage')
metas = storage.getTags('meta') metas = storage.getTags('meta')
@ -1965,7 +1995,7 @@ class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
if self.id_ in self.conn.disco_info_ids: if self.id_ in self.conn.disco_info_ids:
self.conn.disco_info_ids.remove(self.id_) self.conn.disco_info_ids.remove(self.id_)
if self.id_ is None: 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) self.stanza)
return return
# According to XEP-0030: # According to XEP-0030:
@ -2025,15 +2055,18 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
self.fjid = self.conn._ft_get_from(self.stanza) self.fjid = self.conn._ft_get_from(self.stanza)
self.jid = gajim.get_jid_without_resource(self.fjid) self.jid = gajim.get_jid_without_resource(self.fjid)
if self.jingle_content: if self.jingle_content:
self.FT_content.use_security = bool(self.jingle_content.getTag( secu = self.jingle_content.getTag('security')
'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: if not self.FT_content.transport:
self.FT_content.transport = JingleTransportSocks5() self.FT_content.transport = JingleTransportSocks5()
self.FT_content.transport.set_our_jid( self.FT_content.transport.set_our_jid(
self.FT_content.session.ourjid) self.FT_content.session.ourjid)
self.FT_content.transport.set_connection( self.FT_content.transport.set_connection(
self.FT_content.session.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 = FilesProp.getNewFileProp(self.conn.name, sid)
self.file_props.transport_sid = self.FT_content.transport.sid self.file_props.transport_sid = self.FT_content.transport.sid
self.FT_content.file_props = self.file_props self.FT_content.file_props = self.file_props
@ -2071,7 +2104,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
if name == 'name': if name == 'name':
self.file_props.name = val self.file_props.name = val
if name == 'size': if name == 'size':
self.file_props.size = val self.file_props.size = int(val)
if name == 'hash': if name == 'hash':
self.file_props.algo = child.getAttr('algo') self.file_props.algo = child.getAttr('algo')
self.file_props.hash_ = val self.file_props.hash_ = val
@ -2080,8 +2113,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
else: else:
si = self.stanza.getTag('si') si = self.stanza.getTag('si')
self.file_props = FilesProp.getNewFileProp(self.conn.name, self.file_props = FilesProp.getNewFileProp(self.conn.name,
unicode(si.getAttr('id')) si.getAttr('id'))
)
profile = si.getAttr('profile') profile = si.getAttr('profile')
if profile != nbxmpp.NS_FILE: if profile != nbxmpp.NS_FILE:
self.conn.send_file_rejection(self.file_props, code='400', self.conn.send_file_rejection(self.file_props, code='400',
@ -2112,7 +2144,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
if name == 'name': if name == 'name':
self.file_props.name = val self.file_props.name = val
if name == 'size': if name == 'size':
self.file_props.size = val self.file_props.size = int(val)
mime_type = si.getAttr('mime-type') mime_type = si.getAttr('mime-type')
if mime_type is not None: if mime_type is not None:
self.file_props.mime_type = mime_type self.file_props.mime_type = mime_type
@ -2230,8 +2262,6 @@ class NotificationEvent(nec.NetworkIncomingEvent):
self.popup_title = _('New Message from %(nickname)s') % \ self.popup_title = _('New Message from %(nickname)s') % \
{'nickname': nick} {'nickname': nick}
self.popup_image = gtkgui_helpers.get_icon_path(self.popup_image, 48)
if not gajim.config.get('notify_on_new_message') or \ if not gajim.config.get('notify_on_new_message') or \
not self.first_unread: not self.first_unread:
self.do_popup = False self.do_popup = False
@ -2286,6 +2316,28 @@ class NotificationEvent(nec.NetworkIncomingEvent):
self.do_popup = False 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): def handle_incoming_pres_event(self, pres_obj):
if gajim.jid_is_transport(pres_obj.jid): if gajim.jid_is_transport(pres_obj.jid):
return True return True
@ -2364,8 +2416,8 @@ class NotificationEvent(nec.NetworkIncomingEvent):
iconset = gajim.config.get('iconset') iconset = gajim.config.get('iconset')
img_path = os.path.join(helpers.get_iconset_path(iconset), img_path = os.path.join(helpers.get_iconset_path(iconset),
'48x48', show_image) '48x48', show_image)
self.popup_image = gtkgui_helpers.get_path_to_generic_or_avatar( self.popup_image_path = self.get_path_to_generic_or_avatar(img_path,
img_path, jid=self.jid, suffix=suffix) jid=self.jid, suffix=suffix)
self.popup_timeout = gajim.config.get('notification_timeout') self.popup_timeout = gajim.config.get('notification_timeout')
@ -2411,6 +2463,7 @@ class NotificationEvent(nec.NetworkIncomingEvent):
self.popup_event_type = '' self.popup_event_type = ''
self.popup_msg_type = '' self.popup_msg_type = ''
self.popup_image = '' self.popup_image = ''
self.popup_image_path = ''
self.popup_timeout = -1 self.popup_timeout = -1
self.do_command = False self.do_command = False
@ -2447,7 +2500,7 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent):
self.session = None self.session = None
self.forward_from = None self.forward_from = None
self.form_node = None self.form_node = None
self.original_message = '' self.original_message = None
self.delayed = None self.delayed = None
self.callback = None self.callback = None
self.callback_args = [] self.callback_args = []

View file

@ -28,13 +28,15 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
## ##
from functools import cmp_to_key
try: try:
from common import caps_cache from common import caps_cache
from common.account import Account from common.account import Account
import common.gajim import common.gajim
except ImportError, e: except ImportError as e:
if __name__ != "__main__": if __name__ != "__main__":
raise ImportError(e) raise ImportError(str(e))
class XMPPEntity(object): class XMPPEntity(object):
""" """
@ -94,6 +96,8 @@ class Contact(CommonContact):
sub='', ask='', resource='', priority=0, keyID='', client_caps=None, sub='', ask='', resource='', priority=0, keyID='', client_caps=None,
our_chatstate=None, chatstate=None, last_status_time=None, msg_id=None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id=None,
last_activity_time=None): last_activity_time=None):
if not isinstance(jid, str):
print('no str')
CommonContact.__init__(self, jid, account, resource, show, status, name, CommonContact.__init__(self, jid, account, resource, show, status, name,
our_chatstate, chatstate, client_caps=client_caps) our_chatstate, chatstate, client_caps=client_caps)
@ -484,17 +488,18 @@ class Contacts():
for c in self._contacts[jid]: for c in self._contacts[jid]:
if c.resource == resource: if c.resource == resource:
return c return c
return self._contacts[jid][0]
def iter_contacts(self): def iter_contacts(self):
for jid in self._contacts.keys(): for jid in list(self._contacts.keys()):
for contact in self._contacts[jid][:]: for contact in self._contacts[jid][:]:
yield contact yield contact
def get_jid_list(self): def get_jid_list(self):
return self._contacts.keys() return list(self._contacts.keys())
def get_contacts_jid_list(self): 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()] contact[0].is_groupchat()]
def get_contact_from_full_jid(self, fjid): def get_contact_from_full_jid(self, fjid):
@ -562,7 +567,7 @@ class GC_Contacts():
gc_list = self.get_gc_list() gc_list = self.get_gc_list()
if not room_jid in gc_list: if not room_jid in gc_list:
return [] return []
return self._rooms[room_jid].keys() return list(self._rooms[room_jid].keys())
def get_gc_contact(self, room_jid, nick): def get_gc_contact(self, room_jid, nick):
nick_list = self.get_nick_list(room_jid) 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 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] return family[-1]

View file

@ -19,6 +19,7 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
## ##
import sys
import os import os
import math import math
@ -75,8 +76,54 @@ def base28(n):
else: else:
return base28_chr[n] 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_): 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(): def generate_nonce():
return random_bytes(8) return random_bytes(8)

View file

@ -27,7 +27,7 @@ information how to use them, read documentation
""" """
import nbxmpp import nbxmpp
import helpers from common import helpers
# exceptions used in this module # exceptions used in this module
# base class # base class
@ -195,7 +195,7 @@ class DataField(ExtendedNode):
Human-readable description of field meaning Human-readable description of field meaning
""" """
def fget(self): def fget(self):
return self.getTagData('desc') or u'' return self.getTagData('desc') or ''
def fset(self, value): def fset(self, value):
assert isinstance(value, basestring) assert isinstance(value, basestring)
@ -345,10 +345,10 @@ class StringField(DataField):
@nested_property @nested_property
def value(): def value():
""" """
Value of field. May be any unicode string Value of field. May be any string
""" """
def fget(self): def fget(self):
return self.getTagData('value') or u'' return self.getTagData('value') or ''
def fset(self, value): def fset(self, value):
assert isinstance(value, basestring) assert isinstance(value, basestring)
@ -494,7 +494,7 @@ class TextMultiField(DataField):
Value held in field Value held in field
""" """
def fget(self): def fget(self):
value = u'' value = ''
for element in self.iterTags('value'): for element in self.iterTags('value'):
value += '\n' + element.getData() value += '\n' + element.getData()
return value[1:] return value[1:]
@ -643,7 +643,7 @@ class DataForm(ExtendedNode):
""" """
# TODO: the same code is in TextMultiField. join them # TODO: the same code is in TextMultiField. join them
def fget(self): def fget(self):
value = u'' value = ''
for valuenode in self.getTags('instructions'): for valuenode in self.getTags('instructions'):
value += '\n' + valuenode.getData() value += '\n' + valuenode.getData()
return value[1:] return value[1:]

View file

@ -38,8 +38,8 @@ try:
except ImportError: except ImportError:
supported = False supported = False
if not os.name == 'nt': # only say that to non Windows users 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 python bindings are missing in this computer'))
print _('D-Bus capabilities of Gajim cannot be used') print(_('D-Bus capabilities of Gajim cannot be used'))
else: else:
try: try:
# test if dbus-x11 is installed # test if dbus-x11 is installed
@ -49,14 +49,14 @@ else:
except dbus.DBusException: except dbus.DBusException:
supported = False supported = False
if not os.name == 'nt': # only say that to non Windows users 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 does not run correctly on this machine'))
print _('D-Bus capabilities of Gajim cannot be used') print(_('D-Bus capabilities of Gajim cannot be used'))
except exceptions.SystemBusNotPresent: except exceptions.SystemBusNotPresent:
print _('D-Bus does not run correctly on this machine: system bus not ' print(_('D-Bus does not run correctly on this machine: system bus not '
'present') 'present'))
except exceptions.SessionBusNotPresent: except exceptions.SessionBusNotPresent:
print _('D-Bus does not run correctly on this machine: session bus not ' print(_('D-Bus does not run correctly on this machine: session bus not '
'present') 'present'))
class SystemBus: class SystemBus:
""" """
@ -154,7 +154,7 @@ def get_interface(interface, path, start_service=True):
return None return None
obj = bus.get_object(interface, path) obj = bus.get_object(interface, path)
return dbus.Interface(obj, interface) return dbus.Interface(obj, interface)
except Exception, e: except Exception as e:
gajim.log.debug(str(e)) gajim.log.debug(str(e))
return None return None

View file

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

View file

@ -143,3 +143,15 @@ class PluginsystemError(Exception):
def __str__(self): def __str__(self):
return self.text 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 @classmethod
def getAllFileProp(cls): def getAllFileProp(cls):
return cls._files_props.values() return list(cls._files_props.values())
@classmethod @classmethod
def setFileProp(cls, fp, account, sid): def setFileProp(cls, fp, account, sid):

View file

@ -31,10 +31,10 @@ import sys
import logging import logging
import locale import locale
import config from common import config
import nbxmpp import nbxmpp
import defs from common import defs
import common.ged from common import ged as ged_module
interface = None # The actual interface (the gtk one for the moment) interface = None # The actual interface (the gtk one for the moment)
thread_interface = None # Interface to run a thread and then a callback 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' connections = {} # 'account name': 'account (connection.Connection) instance'
ipython_window = None ipython_window = None
ged = common.ged.GlobalEventsDispatcher() # Global Events Dispatcher ged = ged_module.GlobalEventsDispatcher() # Global Events Dispatcher
nec = None # Network Events Controller nec = None # Network Events Controller
plugin_manager = None # Plugins Manager plugin_manager = None # Plugins Manager
log = logging.getLogger('gajim') log = logging.getLogger('gajim')
import logger logger = None
logger = logger.Logger() # init the logger
import configpaths from common import configpaths
gajimpaths = configpaths.gajimpaths gajimpaths = configpaths.gajimpaths
VCARD_PATH = gajimpaths['VCARD'] VCARD_PATH = gajimpaths['VCARD']
@ -84,8 +83,8 @@ else:
os_info = None # used to cache os information os_info = None # used to cache os information
from contacts import LegacyContactsAPI from common.contacts import LegacyContactsAPI
from events import Events from common.events import Events
gmail_domains = ['gmail.com', 'googlemail.com'] gmail_domains = ['gmail.com', 'googlemail.com']
@ -159,7 +158,7 @@ except ImportError:
HAVE_GPG = True HAVE_GPG = True
try: try:
__import__('gnupg', globals(), locals(), [], -1) __import__('gnupg', globals(), locals(), [], 0)
except ImportError: except ImportError:
HAVE_GPG = False HAVE_GPG = False
else: else:
@ -185,6 +184,7 @@ except Exception:
HAVE_FARSTREAM = True HAVE_FARSTREAM = True
try: try:
raise ImportError
farstream = __import__('farstream') farstream = __import__('farstream')
import gst import gst
import glib import glib
@ -201,8 +201,8 @@ except ImportError:
HAVE_UPNP_IGD = True HAVE_UPNP_IGD = True
try: try:
import gupnp.igd from gi.repository import GUPnPIgd
gupnp_igd = gupnp.igd.Simple() gupnp_igd = GUPnPIgd.SimpleIgd()
except ImportError: except ImportError:
HAVE_UPNP_IGD = False 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_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK,
nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES, nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES,
nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256, 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 # Optional features gajim supports per account
gajim_optional_features = {} gajim_optional_features = {}
@ -231,9 +231,6 @@ gajim_optional_features = {}
# Capabilities hash per account # Capabilities hash per account
caps_hash = {} caps_hash = {}
import caps_cache
caps_cache.initialize(logger)
global_id = 0 global_id = 0
def get_an_id(): def get_an_id():
global global_id global global_id
@ -290,13 +287,8 @@ def get_jid_without_resource(jid):
return jid.split('/')[0] return jid.split('/')[0]
def construct_fjid(room_jid, nick): 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 # fake jid is the jid for a contact in a room
# gaim@conference.jabber.org/nick # gaim@conference.jabber.org/nick
if isinstance(nick, str):
nick = unicode(nick, 'utf-8')
return room_jid + '/' + nick return room_jid + '/' + nick
def get_resource_from_jid(jid): def get_resource_from_jid(jid):

View file

@ -79,8 +79,8 @@ class GlobalEventsDispatcher(object):
if event_name in self.handlers: if event_name in self.handlers:
try: try:
self.handlers[event_name].remove((priority, handler)) self.handlers[event_name].remove((priority, handler))
except ValueError, error: except ValueError:
log.warn('''Function (%s) with priority "%s" never registered log.warning('''Function (%s) with priority "%s" never registered
as handler of event "%s". Couldn\'t remove. Error: %s''' as handler of event "%s". Couldn\'t remove. Error: %s'''
%(handler, priority, event_name, error)) %(handler, priority, event_name, error))
@ -94,7 +94,7 @@ class GlobalEventsDispatcher(object):
return True return True
except NodeProcessed: except NodeProcessed:
node_processed = True node_processed = True
except Exception, e: except Exception:
log.error('Error while running an even handler: %s' % \ log.error('Error while running an even handler: %s' % \
handler) handler)
traceback.print_exc() traceback.print_exc()

View file

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

View file

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

View file

@ -35,22 +35,23 @@ import locale
import os import os
import subprocess import subprocess
import urllib import urllib
import urllib2 import urllib
import webbrowser import webbrowser
import errno import errno
import select import select
import base64 import base64
import hashlib import hashlib
import shlex import shlex
import caps_cache from common import caps_cache
import socket import socket
import time import time
from gi.repository import GObject
from encodings.punycode import punycode_encode from encodings.punycode import punycode_encode
from string import Template from string import Template
from i18n import Q_ from common.i18n import Q_
from i18n import ngettext from common.i18n import ngettext
try: try:
import winsound # windows-only built-in module for playing wav import winsound # windows-only built-in module for playing wav
@ -121,7 +122,7 @@ def idn_to_ascii(host):
labels = idna.dots.split(host) labels = idna.dots.split(host)
converted_labels = [] converted_labels = []
for label in labels: for label in labels:
converted_labels.append(idna.ToASCII(label)) converted_labels.append(idna.ToASCII(label).decode('utf-8'))
return ".".join(converted_labels) return ".".join(converted_labels)
def ascii_to_idn(host): def ascii_to_idn(host):
@ -143,9 +144,9 @@ def parse_resource(resource):
if resource: if resource:
try: try:
from nbxmpp.stringprepare import resourceprep from nbxmpp.stringprepare import resourceprep
return resourceprep.prepare(unicode(resource)) return resourceprep.prepare(resource)
except UnicodeError: except UnicodeError:
raise InvalidFormat, 'Invalid character in resource.' raise InvalidFormat('Invalid character in resource.')
def prep(user, server, 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 #http://svn.twistedmatrix.com/cvs/trunk/twisted/words/protocols/jabber/jid.py
if user is not None: if user is not None:
if len(user) < 1 or len(user) > 1023: 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: try:
from nbxmpp.stringprepare import nodeprep from nbxmpp.stringprepare import nodeprep
user = nodeprep.prepare(unicode(user)) user = nodeprep.prepare(user)
except UnicodeError: except UnicodeError:
raise InvalidFormat, _('Invalid character in username.') raise InvalidFormat(_('Invalid character in username.'))
else: else:
user = None user = None
if server is not None: if server is not None:
if len(server) < 1 or len(server) > 1023: 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: try:
from nbxmpp.stringprepare import nameprep from nbxmpp.stringprepare import nameprep
server = nameprep.prepare(unicode(server)) server = nameprep.prepare(server)
except UnicodeError: except UnicodeError:
raise InvalidFormat, _('Invalid character in hostname.') raise InvalidFormat(_('Invalid character in hostname.'))
else: else:
raise InvalidFormat, _('Server address required.') raise InvalidFormat(_('Server address required.'))
if resource is not None: if resource is not None:
if len(resource) < 1 or len(resource) > 1023: 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: try:
from nbxmpp.stringprepare import resourceprep from nbxmpp.stringprepare import resourceprep
resource = resourceprep.prepare(unicode(resource)) resource = resourceprep.prepare(resource)
except UnicodeError: except UnicodeError:
raise InvalidFormat, _('Invalid character in resource.') raise InvalidFormat(_('Invalid character in resource.'))
else: else:
resource = None resource = None
@ -206,7 +207,7 @@ def temp_failure_retry(func, *args, **kwargs):
while True: while True:
try: try:
return func(*args, **kwargs) return func(*args, **kwargs)
except (os.error, IOError, select.error), ex: except (os.error, IOError, select.error) as ex:
if ex.errno == errno.EINTR: if ex.errno == errno.EINTR:
continue continue
else: else:
@ -263,7 +264,7 @@ def get_uf_show(show, use_mnemonic = False):
uf_show = Q_('?contact has status:Unknown') uf_show = Q_('?contact has status:Unknown')
else: else:
uf_show = Q_('?contact has status:Has errors') uf_show = Q_('?contact has status:Has errors')
return unicode(uf_show) return uf_show
def get_uf_sub(sub): def get_uf_sub(sub):
if sub == 'none': if sub == 'none':
@ -277,7 +278,7 @@ def get_uf_sub(sub):
else: else:
uf_sub = sub uf_sub = sub
return unicode(uf_sub) return uf_sub
def get_uf_ask(ask): def get_uf_ask(ask):
if ask is None: if ask is None:
@ -287,7 +288,7 @@ def get_uf_ask(ask):
else: else:
uf_ask = ask uf_ask = ask
return unicode(uf_ask) return uf_ask
def get_uf_role(role, plural = False): def get_uf_role(role, plural = False):
''' plural determines if you get Moderators or Moderator''' ''' plural determines if you get Moderators or Moderator'''
@ -397,7 +398,7 @@ def exec_command(command, use_shell=False):
if use_shell: if use_shell:
subprocess.Popen('%s &' % command, shell=True).wait() subprocess.Popen('%s &' % command, shell=True).wait()
else: else:
args = shlex.split(command.encode('utf-8')) args = shlex.split(command)
p = subprocess.Popen(args) p = subprocess.Popen(args)
gajim.thread_interface(p.wait) gajim.thread_interface(p.wait)
@ -409,7 +410,7 @@ def build_command(executable, parameter):
return command return command
def get_file_path_from_dnd_dropped_uri(uri): 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 path = path.strip('\r\n\x00') # remove \r\n and NULL
# get the path to file # get the path to file
if re.match('^file:///[a-zA-Z]:/', path): # windows if re.match('^file:///[a-zA-Z]:/', path): # windows
@ -447,33 +448,6 @@ def get_output_of_command(command):
return output 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=''): def get_windows_reg_env(varname, default=''):
""" """
Ask for paths commonly used but not exposed as ENVs in english Windows 2003 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) 'AppData' = %USERPROFILE%\Application Data (also an ENV)
'Desktop' = %USERPROFILE%\Desktop 'Desktop' = %USERPROFILE%\Desktop
'Favorites' = %USERPROFILE%\Favorites 'Favorites' = %USERPROFILE%\Favorites
'NetHood' = %USERPROFILE%\NetHood 'NetHood' = %USERPROFILE%\ NetHood
'Personal' = D:\My Documents (PATH TO MY DOCUMENTS) 'Personal' = D:\My Documents (PATH TO MY DOCUMENTS)
'PrintHood' = %USERPROFILE%\PrintHood 'PrintHood' = %USERPROFILE%\PrintHood
'Programs' = %USERPROFILE%\Start Menu\Programs 'Programs' = %USERPROFILE%\Start Menu\Programs
@ -540,10 +514,11 @@ def sanitize_filename(filename):
""" """
# 48 is the limit # 48 is the limit
if len(filename) > 48: if len(filename) > 48:
hash = hashlib.md5(filename) hash = hashlib.md5(filename.encode('utf-8'))
filename = base64.b64encode(hash.digest()) 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('/', '_') filename = filename.replace('/', '_')
if os.name == 'nt': if os.name == 'nt':
filename = filename.replace('?', '_').replace(':', '_')\ filename = filename.replace('?', '_').replace(':', '_')\
@ -565,9 +540,6 @@ def reduce_chars_newlines(text, max_chars = 0, max_lines = 0):
string = string[:max_chars - 3] + '...' string = string[:max_chars - 3] + '...'
return string return string
if isinstance(text, str):
text = text.decode('utf-8')
if max_lines == 0: if max_lines == 0:
lines = text.split('\n') lines = text.split('\n')
else: else:
@ -623,12 +595,10 @@ def datetime_tuple(timestamp):
from time import strptime from time import strptime
return strptime(timestamp, '%Y%m%dT%H:%M:%S') return strptime(timestamp, '%Y%m%dT%H:%M:%S')
# import gajim only when needed (after decode_string is defined) see #4764 from common import gajim
import gajim
if gajim.HAVE_PYCURL: if gajim.HAVE_PYCURL:
import pycurl import pycurl
from cStringIO import StringIO from io import StringIO
def convert_bytes(string): def convert_bytes(string):
suffix = '' suffix = ''
@ -636,13 +606,13 @@ def convert_bytes(string):
# but do we use the standard? # but do we use the standard?
use_kib_mib = gajim.config.get('use_kib_mib') use_kib_mib = gajim.config.get('use_kib_mib')
align = 1024. align = 1024.
bytes = float(string) bytes_ = float(string)
if bytes >= align: if bytes_ >= align:
bytes = round(bytes/align, 1) bytes_ = round(bytes_/align, 1)
if bytes >= align: if bytes_ >= align:
bytes = round(bytes/align, 1) bytes_ = round(bytes_/align, 1)
if bytes >= align: if bytes_ >= align:
bytes = round(bytes/align, 1) bytes_ = round(bytes_/align, 1)
if use_kib_mib: if use_kib_mib:
#GiB means gibibyte #GiB means gibibyte
suffix = _('%s GiB') suffix = _('%s GiB')
@ -666,7 +636,7 @@ def convert_bytes(string):
else: else:
#B means bytes #B means bytes
suffix = _('%s B') suffix = _('%s B')
return suffix % unicode(bytes) return suffix % str(bytes_)
def get_contact_dict_for_account(account): 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): def get_full_jid_from_iq(iq_obj):
""" """
Return the full jid (with resource) from an iq as unicode Return the full jid (with resource) from an iq
""" """
return parse_jid(str(iq_obj.getFrom())) return parse_jid(str(iq_obj.getFrom()))
def get_jid_from_iq(iq_obj): 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) jid = get_full_jid_from_iq(iq_obj)
return gajim.get_jid_without_resource(jid) 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 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): def remove_invalid_xml_chars(string):
if string: if string:
@ -943,7 +914,7 @@ def get_random_string_16():
""" """
Create random string of length 16 Create random string of length 16
""" """
rng = range(65, 90) rng = list(range(65, 90))
rng.extend(range(48, 57)) rng.extend(range(48, 57))
char_sequence = [chr(e) for e in rng] char_sequence = [chr(e) for e in rng]
from random import sample from random import sample
@ -984,8 +955,10 @@ def get_os_info():
p.wait() p.wait()
output = temp_failure_retry(p.stdout.readline).strip() output = temp_failure_retry(p.stdout.readline).strip()
# some distros put n/a in places, so remove those # 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 gajim.os_info = output
p.stdout.close()
p.stdin.close()
return output return output
# lsb_release executable not available, so parse files # lsb_release executable not available, so parse files
@ -1419,7 +1392,7 @@ def get_proxy_info(account):
login = ['', ''] login = ['', '']
addr = env_http_proxy[0].split(':') 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: if len(addr) == 2:
proxy['port'] = addr[1] proxy['port'] = addr[1]
@ -1430,7 +1403,7 @@ def get_proxy_info(account):
proxy['pass'] = login[1] proxy['pass'] = login[1]
proxy['useauth'] = True proxy['useauth'] = True
else: else:
proxy['pass'] = u'' proxy['pass'] = ''
return proxy return proxy
except Exception: except Exception:
@ -1449,14 +1422,15 @@ def _get_img_direct(attrs):
""" """
Download an image. This function should be launched in a separated thread. Download an image. This function should be launched in a separated thread.
""" """
mem, alt = '', '' mem = b''
alt = ''
# Wait maximum 5s for connection # Wait maximum 5s for connection
socket.setdefaulttimeout(5) socket.setdefaulttimeout(5)
try: try:
req = urllib2.Request(attrs['src']) req = urllib.request.Request(attrs['src'])
req.add_header('User-Agent', 'Gajim ' + gajim.version) req.add_header('User-Agent', 'Gajim ' + gajim.version)
f = urllib2.urlopen(req) f = urllib.request.urlopen(req)
except Exception, ex: except Exception as ex:
log.debug('Error loading image %s ' % attrs['src'] + str(ex)) log.debug('Error loading image %s ' % attrs['src'] + str(ex))
pixbuf = None pixbuf = None
alt = attrs.get('alt', 'Broken image') alt = attrs.get('alt', 'Broken image')
@ -1479,7 +1453,7 @@ def _get_img_direct(attrs):
break break
try: try:
temp = f.read(100) temp = f.read(100)
except socket.timeout, ex: except socket.timeout as ex:
log.debug('Timeout loading image %s ' % attrs['src'] + str(ex)) log.debug('Timeout loading image %s ' % attrs['src'] + str(ex))
alt = attrs.get('alt', '') alt = attrs.get('alt', '')
if alt: if alt:
@ -1496,6 +1470,7 @@ def _get_img_direct(attrs):
alt += '\n' alt += '\n'
alt += _('Image is too big') alt += _('Image is too big')
break break
f.close()
return (mem, alt) return (mem, alt)
def _get_img_proxy(attrs, proxy): def _get_img_proxy(attrs, proxy):
@ -1531,17 +1506,17 @@ def _get_img_proxy(attrs, proxy):
c.close() c.close()
t = b.getvalue() t = b.getvalue()
return (t, attrs.get('alt', '')) return (t, attrs.get('alt', ''))
except pycurl.error, ex: except pycurl.error as ex:
alt = attrs.get('alt', '') alt = attrs.get('alt', '')
if alt: if alt:
alt += '\n' alt += '\n'
if ex[0] == pycurl.E_FILESIZE_EXCEEDED: if ex.errno == pycurl.E_FILESIZE_EXCEEDED:
alt += _('Image is too big') alt += _('Image is too big')
elif ex[0] == pycurl.E_OPERATION_TIMEOUTED: elif ex.errno == pycurl.E_OPERATION_TIMEOUTED:
alt += _('Timeout loading image') alt += _('Timeout loading image')
else: else:
alt += _('Error loading image') alt += _('Error loading image')
except Exception, ex: except Exception as ex:
log.debug('Error loading image %s ' % attrs['src'] + str(ex)) log.debug('Error loading image %s ' % attrs['src'] + str(ex))
pixbuf = None pixbuf = None
alt = attrs.get('alt', 'Broken image') alt = attrs.get('alt', 'Broken image')

View file

@ -24,11 +24,11 @@
import locale import locale
import gettext import gettext
import os import os
import defs from common import defs
import unicodedata import unicodedata
# May be changed after GTK is imported # May be changed after GTK is imported
direction_mark = u'\u200E' direction_mark = '\u200E'
def paragraph_direction_mark(text): def paragraph_direction_mark(text):
""" """
@ -40,11 +40,11 @@ def paragraph_direction_mark(text):
for char in text: for char in text:
bidi = unicodedata.bidirectional(char) bidi = unicodedata.bidirectional(char)
if bidi == 'L': if bidi == 'L':
return u'\u200E' return '\u200E'
elif bidi == 'AL' or bidi == 'R': elif bidi == 'AL' or bidi == 'R':
return u'\u200F' return '\u200F'
return u'\u200E' return '\u200E'
APP = 'gajim' APP = 'gajim'
DIR = defs.localedir DIR = defs.localedir
@ -64,9 +64,9 @@ if os.name == 'nt':
if lang: if lang:
os.environ['LANG'] = lang os.environ['LANG'] = lang
gettext.install(APP, DIR, unicode = True) gettext.install(APP, DIR)
if gettext._translations: if gettext._translations:
_translation = gettext._translations.values()[0] _translation = list(gettext._translations.values())[0]
else: else:
_translation = gettext.NullTranslations() _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.. 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: if n == 1 and replace_sing is not None:
text = text % replace_sing text = text % replace_sing
elif n > 1 and replace_plural is not None: elif n > 1 and replace_plural is not None:

View file

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

View file

@ -29,14 +29,14 @@ Handles the jingle signalling protocol
# - codecs # - codecs
import nbxmpp import nbxmpp
import helpers from common import helpers
import gajim from common import gajim
from jingle_session import JingleSession, JingleStates from common.jingle_session import JingleSession, JingleStates
if gajim.HAVE_FARSTREAM: if gajim.HAVE_FARSTREAM:
from jingle_rtp import JingleAudio, JingleVideo from common.jingle_rtp import JingleAudio, JingleVideo
from jingle_ft import JingleFileTransfer from common.jingle_ft import JingleFileTransfer
from jingle_transport import JingleTransportSocks5, JingleTransportIBB from common.jingle_transport import JingleTransportSocks5, JingleTransportIBB
import logging import logging
logger = logging.getLogger('gajim.c.jingle') logger = logging.getLogger('gajim.c.jingle')
@ -80,7 +80,7 @@ class ConnectionJingle(object):
try: try:
jid = helpers.get_full_jid_from_iq(stanza) jid = helpers.get_full_jid_from_iq(stanza)
except helpers.InvalidFormat: except helpers.InvalidFormat:
log.warn('Invalid JID: %s, ignoring it' % stanza.getFrom()) logger.warn('Invalid JID: %s, ignoring it' % stanza.getFrom())
return return
id_ = stanza.getID() id_ = stanza.getID()
if (jid, id_) in self.__iq_responses.keys(): if (jid, id_) in self.__iq_responses.keys():
@ -170,14 +170,14 @@ class ConnectionJingle(object):
def __hash_support(self, contact): def __hash_support(self, contact):
if contact.supports(nbxmpp.NS_HASHES): if contact.supports(nbxmpp.NS_HASHES):
if contact.supports(nbxmpp.NS_HASHES_MD5): if contact.supports(nbxmpp.NS_HASHES_SHA512):
return 'md5' return 'sha-512'
elif contact.supports(nbxmpp.NS_HASHES_SHA1):
return 'sha-1'
elif contact.supports(nbxmpp.NS_HASHES_SHA256): elif contact.supports(nbxmpp.NS_HASHES_SHA256):
return 'sha-256' return 'sha-256'
elif contact.supports(nbxmpp.NS_HASHES_SHA512): elif contact.supports(nbxmpp.NS_HASHES_SHA1):
return 'sha-512' return 'sha-1'
elif contact.supports(nbxmpp.NS_HASHES_MD5):
return 'md5'
return None return None
def iter_jingle_sessions(self, jid, sid=None, media=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): if session.peerjid == jid and session.get_content(media):
return session return session
return None return None

View file

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

View file

@ -20,16 +20,17 @@ Handles Jingle File Transfer (XEP 0234)
""" """
import hashlib import hashlib
import gajim from common import gajim
import nbxmpp import nbxmpp
from jingle_content import contents, JingleContent from . import jingle_xtls
from jingle_transport import * from common.jingle_content import contents, JingleContent
from common.jingle_transport import *
from common import helpers from common import helpers
from common.socks5 import Socks5ReceiverClient, Socks5SenderClient from common.socks5 import Socks5ReceiverClient, Socks5SenderClient
from common.connection_handlers_events import FileRequestReceivedEvent from common.connection_handlers_events import FileRequestReceivedEvent
import threading import threading
import logging import logging
from jingle_ftstates import * from common.jingle_ftstates import *
log = logging.getLogger('gajim.c.jingle_ft') log = logging.getLogger('gajim.c.jingle_ft')
STATE_NOT_STARTED = 0 STATE_NOT_STARTED = 0
@ -68,6 +69,7 @@ class JingleFileTransfer(JingleContent):
self.callbacks['transport-info'] += [self.__on_transport_info] self.callbacks['transport-info'] += [self.__on_transport_info]
self.callbacks['iq-result'] += [self.__on_iq_result] self.callbacks['iq-result'] += [self.__on_iq_result]
self.use_security = use_security self.use_security = use_security
self.x509_fingerprint = None
self.file_props = file_props self.file_props = file_props
self.weinitiate = self.session.weinitiate self.weinitiate = self.session.weinitiate
self.werequest = self.session.werequest self.werequest = self.session.werequest
@ -95,8 +97,8 @@ class JingleFileTransfer(JingleContent):
if gajim.contacts.is_gc_contact(session.connection.name, if gajim.contacts.is_gc_contact(session.connection.name,
session.peerjid): session.peerjid):
roomjid = session.peerjid.split('/')[0] roomjid = session.peerjid.split('/')[0]
dstaddr = hashlib.sha1('%s%s%s' % (self.file_props.sid, dstaddr = hashlib.sha1(('%s%s%s' % (self.file_props.sid,
session.ourjid, roomjid)).hexdigest() session.ourjid, roomjid)).encode('utf-8')).hexdigest()
self.file_props.dstaddr = dstaddr self.file_props.dstaddr = dstaddr
self.state = STATE_NOT_STARTED self.state = STATE_NOT_STARTED
self.states = {STATE_INITIALIZED : StateInitialized(self), self.states = {STATE_INITIALIZED : StateInitialized(self),
@ -149,12 +151,13 @@ class JingleFileTransfer(JingleContent):
if self.file_props.algo == None: if self.file_props.algo == None:
return return
try: try:
file_ = open(self.file_props.file_name, 'r') file_ = open(self.file_props.file_name, 'rb')
except: except:
# can't open file # can't open file
return return
h = nbxmpp.Hashes() h = nbxmpp.Hashes()
hash_ = h.calculateHash(self.file_props.algo, file_) hash_ = h.calculateHash(self.file_props.algo, file_)
file_.close()
# DEBUG # DEBUG
#hash_ = '1294809248109223' #hash_ = '1294809248109223'
if not hash_: if not hash_:
@ -164,17 +167,37 @@ class JingleFileTransfer(JingleContent):
h.addHash(hash_, self.file_props.algo) h.addHash(hash_, self.file_props.algo)
return h 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): def __on_session_accept(self, stanza, content, error, action):
log.info("__on_session_accept") log.info("__on_session_accept")
con = self.session.connection 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') security = content.getTag('security')
if not security: # responder can not verify our fingerprint if not security: # responder can not verify our fingerprint
self.use_security = False 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: 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 we are requesting we don't have the file
if self.session.werequest: if self.session.werequest:
raise nbxmpp.NodeProcessed raise nbxmpp.NodeProcessed
@ -185,16 +208,13 @@ class JingleFileTransfer(JingleContent):
# Calculate file hash in a new thread # Calculate file hash in a new thread
# if we haven't sent the hash already. # if we haven't sent the hash already.
if self.file_props.hash_ is None and self.file_props.algo and \ 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 = threading.Thread(target=self.__send_hash)
self.hashThread.start() self.hashThread.start()
for host in self.file_props.streamhosts: for host in self.file_props.streamhosts:
host['initiator'] = self.session.initiator host['initiator'] = self.session.initiator
host['target'] = self.session.responder host['target'] = self.session.responder
host['sid'] = self.file_props.sid host['sid'] = self.file_props.sid
response = stanza.buildReply('result')
response.delChild(response.getQuery())
con.connection.send(response)
fingerprint = None fingerprint = None
if self.use_security: if self.use_security:
fingerprint = 'client' fingerprint = 'client'
@ -203,7 +223,7 @@ class JingleFileTransfer(JingleContent):
self.file_props.sid, self.on_connect, self.file_props.sid, self.on_connect,
self._on_connect_error, fingerprint=fingerprint, self._on_connect_error, fingerprint=fingerprint,
receiving=False) receiving=False)
return raise nbxmpp.NodeProcessed
self.__state_changed(STATE_TRANSFERING) self.__state_changed(STATE_TRANSFERING)
raise nbxmpp.NodeProcessed raise nbxmpp.NodeProcessed

View file

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

View file

@ -19,19 +19,19 @@ Handles Jingle RTP sessions (XEP 0167)
from collections import deque from collections import deque
import gobject from gi.repository import GLib
import socket import socket
import nbxmpp import nbxmpp
import farstream, gst import farstream
import gst.interfaces import gst
from glib import GError from glib import GError
import gajim from common import gajim
from jingle_transport import JingleTransportICEUDP from common.jingle_transport import JingleTransportICEUDP
from jingle_content import contents, JingleContent, JingleContentSetupException from common.jingle_content import contents, JingleContent, JingleContentSetupException
from connection_handlers_events import InformationEvent from common.connection_handlers_events import InformationEvent
import logging import logging
@ -66,7 +66,6 @@ class JingleRTPContent(JingleContent):
# pipeline and bus # pipeline and bus
self.pipeline = gst.Pipeline() self.pipeline = gst.Pipeline()
bus = self.pipeline.get_bus() bus = self.pipeline.get_bus()
bus.enable_sync_message_emission()
bus.add_signal_watch() bus.add_signal_watch()
bus.connect('message', self._on_gst_message) bus.connect('message', self._on_gst_message)
@ -90,8 +89,8 @@ class JingleRTPContent(JingleContent):
try: try:
ip = socket.getaddrinfo(stun_server, 0, socket.AF_UNSPEC, ip = socket.getaddrinfo(stun_server, 0, socket.AF_UNSPEC,
socket.SOCK_STREAM)[0][4][0] socket.SOCK_STREAM)[0][4][0]
except socket.gaierror, (errnum, errstr): except socket.gaierror as e:
log.warn('Lookup of stun ip failed: %s' % errstr) log.warning('Lookup of stun ip failed: %s' % str(e))
else: else:
params['stun-ip'] = ip params['stun-ip'] = ip
@ -108,13 +107,13 @@ class JingleRTPContent(JingleContent):
try: try:
bin = gst.parse_bin_from_description(pipeline, True) bin = gst.parse_bin_from_description(pipeline, True)
return bin return bin
except GError, error_str: except GError as e:
gajim.nec.push_incoming_event(InformationEvent(None, gajim.nec.push_incoming_event(InformationEvent(None,
conn=self.session.connection, level='error', conn=self.session.connection, level='error',
pri_txt=_('%s configuration error') % text.capitalize(), pri_txt=_('%s configuration error') % text.capitalize(),
sec_txt=_("Couldn't setup %s. Check your configuration.\n\n" sec_txt=_("Couldn't setup %s. Check your configuration.\n\n"
"Pipeline was:\n%s\n\nError was:\n%s") % (text, pipeline, "Pipeline was:\n%s\n\nError was:\n%s") % (text, pipeline,
error_str))) str(e))))
raise JingleContentSetupException raise JingleContentSetupException
def add_remote_candidates(self, candidates): def add_remote_candidates(self, candidates):
@ -133,13 +132,13 @@ class JingleRTPContent(JingleContent):
events = deque(events) events = deque(events)
self._dtmf_running = True self._dtmf_running = True
self._start_dtmf(events.popleft()) 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): def _next_dtmf(self, events):
self._stop_dtmf() self._stop_dtmf()
if events: if events:
self._start_dtmf(events.popleft()) self._start_dtmf(events.popleft())
gobject.timeout_add(500, self._next_dtmf, events) GLib.timeout_add(500, self._next_dtmf, events)
else: else:
self._dtmf_running = False self._dtmf_running = False
@ -370,11 +369,8 @@ class JingleAudio(JingleRTPContent):
class JingleVideo(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) JingleRTPContent.__init__(self, session, 'video', transport)
self.in_xid = in_xid
self.out_xid = out_xid
self.out_xid_set = False
self.setup_stream() self.setup_stream()
def setup_stream(self): def setup_stream(self):
@ -382,8 +378,6 @@ class JingleVideo(JingleRTPContent):
# sometimes, one window won't show up, # sometimes, one window won't show up,
# sometimes it'll freeze... # sometimes it'll freeze...
JingleRTPContent.setup_stream(self, self._on_src_pad_added) 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 # the local parts
if gajim.config.get('video_framerate'): 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) video_size = 'video/x-raw-yuv,width=%s,height=%s ! ' % (w, h)
else: else:
video_size = '' 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', self.src_bin = self.make_bin_from_config('video_input_device',
'%%s %s! %svideoscale ! %sffmpegcolorspace' % (tee, framerate, '%%s ! %svideoscale ! %sffmpegcolorspace' % (framerate, video_size),
video_size), _("video input")) _("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.add(self.src_bin)#, caps)
self.pipeline.set_state(gst.STATE_PLAYING)
#src_bin.link(caps) #src_bin.link(caps)
self.sink = self.make_bin_from_config('video_output_device', self.sink = self.make_bin_from_config('video_output_device',
'videoscale ! ffmpegcolorspace ! %s', 'videoscale ! ffmpegcolorspace ! %s force-aspect-ratio=True',
_("video output")) _("video output"))
self.pipeline.add(self.sink) self.pipeline.add(self.sink)
@ -427,27 +413,11 @@ class JingleVideo(JingleRTPContent):
# The following is needed for farstream to process ICE requests: # The following is needed for farstream to process ICE requests:
self.pipeline.set_state(gst.STATE_PLAYING) 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): def get_fallback_src(self):
# TODO: Use avatar? # TODO: Use avatar?
pipeline = 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1 ! ffmpegcolorspace' pipeline = 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1 ! ffmpegcolorspace'
return gst.parse_bin_from_description(pipeline, True) 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): def get_content(desc):
if desc['media'] == 'audio': if desc['media'] == 'audio':
return JingleAudio return JingleAudio

View file

@ -28,12 +28,12 @@ Handles Jingle sessions (XEP 0166)
# - Tie-breaking # - Tie-breaking
# * timeout # * timeout
import gajim #Get rid of that? from common import gajim
import nbxmpp import nbxmpp
from jingle_transport import get_jingle_transport, JingleTransportIBB from common.jingle_transport import get_jingle_transport, JingleTransportIBB
from jingle_content import get_jingle_content, JingleContentSetupException from common.jingle_content import get_jingle_content, JingleContentSetupException
from jingle_content import JingleContent from common.jingle_content import JingleContent
from jingle_ft import STATE_TRANSPORT_REPLACE from common.jingle_ft import STATE_TRANSPORT_REPLACE
from common.connection_handlers_events import * from common.connection_handlers_events import *
import logging import logging
log = logging.getLogger("gajim.c.jingle_session") log = logging.getLogger("gajim.c.jingle_session")
@ -75,7 +75,6 @@ class JingleSession(object):
self.contents = {} # negotiated contents self.contents = {} # negotiated contents
self.connection = con # connection to use self.connection = con # connection to use
# our full jid # our full jid
#FIXME: Get rid of gajim here?
self.ourjid = gajim.get_jid_from_account(self.connection.name) self.ourjid = gajim.get_jid_from_account(self.connection.name)
if con.server_resource: if con.server_resource:
self.ourjid = self.ourjid + '/' + 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 True when all codecs and candidates are ready (for all contents)
""" """
return (any((content.is_ready() for content in self.contents.itervalues())) return (any((content.is_ready() for content in self.contents.values()))
and self.accepted) and self.accepted)
def accept_session(self): def accept_session(self):
""" """
@ -592,7 +591,7 @@ class JingleSession(object):
""" """
Broadcast the stanza to all content handlers 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) content.on_stanza(stanza, None, error, action)
def __parse_contents(self, jingle): def __parse_contents(self, jingle):

View file

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

View file

@ -20,21 +20,22 @@ import os
import nbxmpp import nbxmpp
import logging import logging
import common
from common import gajim from common import gajim
log = logging.getLogger('gajim.c.jingle_xtls') log = logging.getLogger('gajim.c.jingle_xtls')
PYOPENSSL_PRESENT = False 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): def key_exchange_pend(id_, cb, args):
pending_contents[id_] = content # args is a list
pending_contents[id_] = [cb, args]
def approve_pending_content(id_): def approve_pending_content(id_):
content = pending_contents[id_] cb = pending_contents[id_][0]
content.session.approve_session() args = pending_contents[id_][1]
content.session.approve_content('file', name=content.name) cb(*args)
try: try:
import OpenSSL.SSL import OpenSSL.SSL
@ -50,23 +51,25 @@ if PYOPENSSL_PRESENT:
TYPE_DSA = crypto.TYPE_DSA TYPE_DSA = crypto.TYPE_DSA
SELF_SIGNED_CERTIFICATE = 'localcert' SELF_SIGNED_CERTIFICATE = 'localcert'
DH_PARAMS = 'dh_params.pem'
DEFAULT_DH_PARAMS = 'dh4096.pem'
def default_callback(connection, certificate, error_num, depth, return_code): def default_callback(connection, certificate, error_num, depth, return_code):
log.info("certificate: %s" % certificate) log.info("certificate: %s" % certificate)
return return_code 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 This is almost identical to the one in nbxmpp.tls_nb
""" """
if not os.path.isfile(cert_path): if not os.path.isfile(cert_path):
return return None
try: try:
f = open(cert_path) f = open(cert_path)
except IOError, e: except IOError as e:
log.warning('Unable to open certificate file %s: %s' % (cert_path, log.warning('Unable to open certificate file %s: %s' % (cert_path,
str(e))) str(e)))
return return None
lines = f.readlines() lines = f.readlines()
i = 0 i = 0
begin = -1 begin = -1
@ -78,8 +81,10 @@ def load_cert_file(cert_path, cert_store):
try: try:
x509cert = OpenSSL.crypto.load_certificate( x509cert = OpenSSL.crypto.load_certificate(
OpenSSL.crypto.FILETYPE_PEM, cert) OpenSSL.crypto.FILETYPE_PEM, cert)
cert_store.add_cert(x509cert) if cert_store:
except OpenSSL.crypto.Error, exception_obj: 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' %\ log.warning('Unable to load a certificate from file %s: %s' %\
(cert_path, exception_obj.args[0][0][2])) (cert_path, exception_obj.args[0][0][2]))
except: except:
@ -87,13 +92,15 @@ def load_cert_file(cert_path, cert_store):
'%s' % cert_path) '%s' % cert_path)
begin = -1 begin = -1
i += 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 constructs and returns the context objects
""" """
ctx = SSL.Context(SSL.SSLv23_METHOD) 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_options(flags)
ctx.set_cipher_list('HIGH:!aNULL:!3DES') 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) cert_name = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE)
ctx.use_privatekey_file (cert_name + '.pkey') ctx.use_privatekey_file (cert_name + '.pkey')
ctx.use_certificate_file(cert_name + '.cert') 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)): # Try to load Diffie-Hellman parameters.
load_cert_file(os.path.join(os.path.expanduser( # First try user DH parameters, if this fails load the default DH parameters
gajim.MY_PEER_CERTS_PATH), f), store) dh_params_name = os.path.join(gajim.MY_CERT_DIR, DH_PARAMS)
log.debug('certificate file ' + f + ' loaded fingerprint ' + \ try:
fingerprint) 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 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): def send_cert(con, jid_from, sid):
certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \ certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \
'.cert' '.cert'
certfile = open(certpath, 'r') certificate = read_cert(certpath)
certificate = ''
for line in certfile.readlines():
if not line.startswith('-'):
certificate += line
iq = nbxmpp.Iq('result', to=jid_from); iq = nbxmpp.Iq('result', to=jid_from);
iq.setAttr('id', sid) iq.setAttr('id', sid)
@ -151,9 +182,21 @@ def handle_new_cert(con, obj, jid_from):
f.write('-----BEGIN CERTIFICATE-----\n') f.write('-----BEGIN CERTIFICATE-----\n')
f.write(cert) f.write(cert)
f.write('-----END CERTIFICATE-----\n') f.write('-----END CERTIFICATE-----\n')
f.close()
approve_pending_content(id_) 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): def send_cert_request(con, to_jid):
iq = nbxmpp.Iq('get', to=to_jid) iq = nbxmpp.Iq('get', to=to_jid)
id_ = con.connection.getAnID() id_ = con.connection.getAnID()
@ -161,7 +204,7 @@ def send_cert_request(con, to_jid):
pubkey = iq.setTag('pubkeys') pubkey = iq.setTag('pubkeys')
pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY) pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY)
con.connection.send(iq) con.connection.send(iq)
return unicode(id_) return str(id_)
# the following code is partly due to pyopenssl examples # the following code is partly due to pyopenssl examples
@ -177,12 +220,12 @@ def createKeyPair(type, bits):
pkey.generate_key(type, bits) pkey.generate_key(type, bits)
return pkey return pkey
def createCertRequest(pkey, digest="sha1", **name): def createCertRequest(pkey, digest="sha256", **name):
""" """
Create a certificate request. Create a certificate request.
Arguments: pkey - The key to associate with the 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 **name - The name of the subject of the request, possible
arguments are: arguments are:
C - Country name C - Country name
@ -204,7 +247,7 @@ def createCertRequest(pkey, digest="sha1", **name):
req.sign(pkey, digest) req.sign(pkey, digest)
return req 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. Generate a certificate given a certificate request.
@ -216,7 +259,7 @@ def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter
starts being valid starts being valid
notAfter - Timestamp (relative to now) when the certificate notAfter - Timestamp (relative to now) when the certificate
stops being valid 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 Returns: The signed certificate in an X509 object
""" """
cert = crypto.X509() cert = crypto.X509()
@ -238,13 +281,13 @@ def make_certs(filepath, CN):
""" """
key = createKeyPair(TYPE_RSA, 4096) key = createKeyPair(TYPE_RSA, 4096)
req = createCertRequest(key, CN=CN) req = createCertRequest(key, CN=CN)
cert = createCertificate(req, (req, key), 0, (0, 60*60*24*365*5)) # five years cert = createCertificate(req, req, key, 0, 0, 60*60*24*365*5) # five years
private_key_file = open(filepath + '.pkey', 'w') with open(filepath + '.pkey', 'wb') as f:
os.chmod(filepath + '.pkey', 0600) os.chmod(filepath + '.pkey', 0o600)
private_key_file.write(crypto.dump_privatekey( f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))
crypto.FILETYPE_PEM, key)) with open(filepath + '.cert', 'wb') as f:
open(filepath + '.cert', 'w').write(crypto.dump_certificate( f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode(
crypto.FILETYPE_PEM, cert)) 'utf-8'))
if __name__ == '__main__': 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) folder: The top-level category to use (normally the programme name)
entry: The key of the entry to retrieve 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. or None if an error occured.
""" """
p = subprocess.Popen(["kwalletcli", "-q", "-f", folder.encode('utf-8'), p = subprocess.Popen(["kwalletcli", "-q", "-f", folder.encode('utf-8'),
"-e", entry.encode('utf-8')], stdout=subprocess.PIPE) "-e", entry.encode('utf-8')], stdout=subprocess.PIPE)
pw = p.communicate()[0] pw = p.communicate()[0]
if p.returncode == 0: if p.returncode == 0:
return unicode(pw.decode('utf-8')) return pw
if p.returncode == 1 or p.returncode == 4: if p.returncode == 1 or p.returncode == 4:
# ENOENT # ENOENT
return False return False

View file

@ -33,16 +33,16 @@ import sys
import time import time
import datetime import datetime
from gzip import GzipFile from gzip import GzipFile
from cStringIO import StringIO from io import BytesIO
import gobject from gi.repository import GLib
import exceptions from common import exceptions
import gajim from common import gajim
import ged from common import ged
import sqlite3 as sqlite import sqlite3 as sqlite
import configpaths from common import configpaths
LOG_DB_PATH = configpaths.gajimpaths['LOG_DB'] LOG_DB_PATH = configpaths.gajimpaths['LOG_DB']
LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH) LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH)
CACHE_DB_PATH = configpaths.gajimpaths['CACHE_DB'] CACHE_DB_PATH = configpaths.gajimpaths['CACHE_DB']
@ -151,7 +151,7 @@ class Logger:
try: try:
self.cur.execute("ATTACH DATABASE '%s' AS cache" % \ self.cur.execute("ATTACH DATABASE '%s' AS cache" % \
CACHE_DB_PATH.replace("'", "''")) CACHE_DB_PATH.replace("'", "''"))
except sqlite.Error, e: except sqlite.Error as e:
log.debug("Failed to attach cache database: %s" % str(e)) log.debug("Failed to attach cache database: %s" % str(e))
def set_synchronous(self, sync): def set_synchronous(self, sync):
@ -160,7 +160,7 @@ class Logger:
self.cur.execute("PRAGMA synchronous = NORMAL") self.cur.execute("PRAGMA synchronous = NORMAL")
else: else:
self.cur.execute("PRAGMA synchronous = OFF") 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))) log.debug("Failed to set_synchronous(%s): %s" % (sync, str(e)))
def init_vars(self): def init_vars(self):
@ -170,15 +170,15 @@ class Logger:
def _really_commit(self): def _really_commit(self):
try: try:
self.con.commit() self.con.commit()
except sqlite.OperationalError, e: except sqlite.OperationalError as e:
print >> sys.stderr, str(e) print(str(e), file=sys.stderr)
self.commit_timout_id = None self.commit_timout_id = None
return False return False
def _timeout_commit(self): def _timeout_commit(self):
if self.commit_timout_id: if self.commit_timout_id:
return 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): def simple_commit(self, sql_to_commit):
""" """
@ -190,7 +190,7 @@ class Logger:
def get_jids_already_in_db(self): def get_jids_already_in_db(self):
try: try:
self.cur.execute('SELECT jid FROM jids') 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() rows = self.cur.fetchall()
except sqlite.DatabaseError: except sqlite.DatabaseError:
raise exceptions.DatabaseMalformed raise exceptions.DatabaseMalformed
@ -258,11 +258,11 @@ class Logger:
self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid,
typ)) typ))
self.con.commit() self.con.commit()
except sqlite.IntegrityError, e: except sqlite.IntegrityError:
# Jid already in DB, maybe added by another instance. re-read DB # Jid already in DB, maybe added by another instance. re-read DB
self.get_jids_already_in_db() self.get_jids_already_in_db()
return self.get_jid_id(jid, typestr) return self.get_jid_id(jid, typestr)
except sqlite.OperationalError, e: except sqlite.OperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
jid_id = self.cur.lastrowid jid_id = self.cur.lastrowid
self.jids_already_in.append(jid) self.jids_already_in.append(jid)
@ -413,15 +413,15 @@ class Logger:
self.cur.execute(sql, values) self.cur.execute(sql, values)
except sqlite.DatabaseError: except sqlite.DatabaseError:
raise exceptions.DatabaseMalformed raise exceptions.DatabaseMalformed
except sqlite.OperationalError, e: except sqlite.OperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
message_id = None message_id = None
if write_unread: if write_unread:
try: try:
self.con.commit() self.con.commit()
message_id = self.cur.lastrowid message_id = self.cur.lastrowid
except sqlite.OperationalError, e: except sqlite.OperationalError as e:
print >> sys.stderr, str(e) print(str(e), file=sys.stderr)
else: else:
self._timeout_commit() self._timeout_commit()
if message_id: if message_id:
@ -528,7 +528,7 @@ class Logger:
# status for roster items # status for roster items
try: try:
jid_id = self.get_jid_id(jid) jid_id = self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
if show is None: # show is None (xmpp), but we say that 'online' if show is None: # show is None (xmpp), but we say that 'online'
show_col = constants.SHOW_ONLINE show_col = constants.SHOW_ONLINE
@ -541,7 +541,7 @@ class Logger:
try: try:
# re-get jid_id for the new jid # re-get jid_id for the new jid
jid_id = self.get_jid_id(jid, 'ROOM') jid_id = self.get_jid_id(jid, 'ROOM')
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
contact_name_col = nick contact_name_col = nick
@ -555,13 +555,13 @@ class Logger:
try: try:
# re-get jid_id for the new jid # re-get jid_id for the new jid
jid_id = self.get_jid_id(jid, 'ROOM') jid_id = self.get_jid_id(jid, 'ROOM')
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
contact_name_col = nick contact_name_col = nick
else: else:
try: try:
jid_id = self.get_jid_id(jid) jid_id = self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
if kind == 'chat_msg_recv': if kind == 'chat_msg_recv':
if not self.jid_is_from_pm(jid): if not self.jid_is_from_pm(jid):
@ -586,7 +586,7 @@ class Logger:
""" """
try: try:
self.get_jid_id(jid) 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 # Error trying to create a new jid_id. This means there is no log
return [] return []
where_sql, jid_tuple = self._build_contact_where(account, jid) where_sql, jid_tuple = self._build_contact_where(account, jid)
@ -630,7 +630,7 @@ class Logger:
""" """
try: try:
self.get_jid_id(jid) 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 # Error trying to create a new jid_id. This means there is no log
return [] return []
where_sql, jid_tuple = self._build_contact_where(account, jid) where_sql, jid_tuple = self._build_contact_where(account, jid)
@ -659,14 +659,14 @@ class Logger:
""" """
try: try:
self.get_jid_id(jid) 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 # Error trying to create a new jid_id. This means there is no log
return [] return []
if False: # query.startswith('SELECT '): # it's SQL query (FIXME) if False: # query.startswith('SELECT '): # it's SQL query (FIXME)
try: try:
self.cur.execute(query) self.cur.execute(query)
except sqlite.OperationalError, e: except sqlite.OperationalError as e:
results = [('', '', '', '', str(e))] results = [('', '', '', '', str(e))]
return results return results
@ -700,7 +700,7 @@ class Logger:
""" """
try: try:
self.get_jid_id(jid) 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 # Error trying to create a new jid_id. This means there is no log
return [] return []
days_with_logs = [] days_with_logs = []
@ -742,7 +742,7 @@ class Logger:
else: else:
try: try:
jid_id = self.get_jid_id(jid, 'ROOM') 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 # Error trying to create a new jid_id. This means there is no log
return None return None
where_sql = 'jid_id = ?' where_sql = 'jid_id = ?'
@ -768,7 +768,7 @@ class Logger:
""" """
try: try:
jid_id = self.get_jid_id(jid, 'ROOM') 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 # Error trying to create a new jid_id. This means there is no log
return None return None
where_sql = 'jid_id = %s' % jid_id where_sql = 'jid_id = %s' % jid_id
@ -808,7 +808,7 @@ class Logger:
for user in family: for user in family:
try: try:
jid_id = self.get_jid_id(user['jid']) jid_id = self.get_jid_id(user['jid'])
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError:
continue continue
where_sql += 'jid_id = ?' where_sql += 'jid_id = ?'
jid_tuple += (jid_id,) jid_tuple += (jid_id,)
@ -890,8 +890,7 @@ class Logger:
# ..., 'FEAT', feature1, feature2, ...).join(' ')) # ..., 'FEAT', feature1, feature2, ...).join(' '))
# NOTE: if there's a need to do more gzip, put that to a function # NOTE: if there's a need to do more gzip, put that to a function
try: try:
data = GzipFile(fileobj=StringIO(str(data))).read().decode( data = GzipFile(fileobj=BytesIO(data)).read().decode('utf-8').split('\0')
'utf-8').split('\0')
except IOError: except IOError:
# This data is corrupted. It probably contains non-ascii chars # This data is corrupted. It probably contains non-ascii chars
to_be_removed.append((hash_method, hash_)) to_be_removed.append((hash_method, hash_))
@ -931,16 +930,15 @@ class Logger:
data.extend(features) data.extend(features)
data = '\0'.join(data) data = '\0'.join(data)
# if there's a need to do more gzip, put that to a function # if there's a need to do more gzip, put that to a function
string = StringIO() string = BytesIO()
gzip = GzipFile(fileobj=string, mode='w') gzip = GzipFile(fileobj=string, mode='w')
data = data.encode('utf-8') # the gzip module can't handle unicode objects gzip.write(data.encode('utf-8'))
gzip.write(data)
gzip.close() gzip.close()
data = string.getvalue() data = string.getvalue()
self.cur.execute(''' self.cur.execute('''
INSERT INTO caps_cache ( hash_method, hash, data, last_seen ) INSERT INTO caps_cache ( hash_method, hash, data, last_seen )
VALUES (?, ?, ?, ?); VALUES (?, ?, ?, ?);
''', (hash_method, hash_, buffer(data), int(time.time()))) ''', (hash_method, hash_, memoryview(data), int(time.time())))
# (1) -- note above # (1) -- note above
self._timeout_commit() self._timeout_commit()
@ -996,7 +994,7 @@ class Logger:
try: try:
account_jid_id = self.get_jid_id(account_jid) account_jid_id = self.get_jid_id(account_jid)
jid_id = self.get_jid_id(jid) jid_id = self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
self.cur.execute( self.cur.execute(
'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?', 'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?',
@ -1018,7 +1016,7 @@ class Logger:
try: try:
account_jid_id = self.get_jid_id(account_jid) account_jid_id = self.get_jid_id(account_jid)
jid_id = self.get_jid_id(jid) jid_id = self.get_jid_id(jid)
except exceptions.PysqliteOperationalError, e: except exceptions.PysqliteOperationalError as e:
raise exceptions.PysqliteOperationalError(str(e)) raise exceptions.PysqliteOperationalError(str(e))
# Update groups information # Update groups information
@ -1054,6 +1052,8 @@ class Logger:
FROM roster_entry re, jids j FROM roster_entry re, jids j
WHERE re.account_jid_id=? AND j.jid_id=re.jid_id''', (account_jid_id,)) 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: for jid, jid_id, name, subscription, ask in self.cur:
jid = jid
name = name
data[jid] = {} data[jid] = {}
if name: if name:
data[jid]['name'] = name data[jid]['name'] = name
@ -1077,6 +1077,7 @@ class Logger:
WHERE account_jid_id=? AND jid_id=?''', WHERE account_jid_id=? AND jid_id=?''',
(account_jid_id, data[jid]['id'])) (account_jid_id, data[jid]['id']))
for (group_name,) in self.cur: for (group_name,) in self.cur:
group_name = group_name
data[jid]['groups'].append(group_name) data[jid]['groups'].append(group_name)
del data[jid]['id'] del data[jid]['id']
@ -1155,7 +1156,7 @@ class Logger:
# when we quit this muc # when we quit this muc
obj.conn.last_history_time[obj.jid] = tim_f 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))) obj.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e)))
except exceptions.DatabaseMalformed: except exceptions.DatabaseMalformed:
pritext = _('Database Error') pritext = _('Database Error')

View file

@ -19,7 +19,7 @@
## ##
import logging import logging
import i18n from common import i18n
def parseLogLevel(arg): def parseLogLevel(arg):
""" """
@ -30,7 +30,7 @@ def parseLogLevel(arg):
elif arg.isupper() and hasattr(logging, arg): elif arg.isupper() and hasattr(logging, arg):
return getattr(logging, arg) return getattr(logging, arg)
else: else:
print _('%s is not a valid loglevel') % repr(arg) print(_('%s is not a valid loglevel') % repr(arg))
return 0 return 0
def parseLogTarget(arg): def parseLogTarget(arg):
@ -72,7 +72,7 @@ def parseAndSetLogLevels(arg):
target = parseLogTarget(target.strip()) target = parseLogTarget(target.strip())
if target: if target:
logging.getLogger(target).setLevel(level) 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: class colors:
@ -141,7 +141,7 @@ def init(use_color=False):
consoleloghandler.setFormatter( consoleloghandler.setFormatter(
FancyFormatter( FancyFormatter(
'%(asctime)s %(levelname)s %(name)s %(message)s', '%(asctime)s %(levelname)s %(name)s %(message)s',
'%H:%M:%S', '%x %H:%M:%S',
use_color use_color
) )
) )
@ -179,13 +179,13 @@ if __name__ == '__main__':
log = logging.getLogger('gajim') log = logging.getLogger('gajim')
log.debug('debug') log.debug('debug')
log.info('info') log.info('info')
log.warn('warn') log.warning('warn')
log.error('error') log.error('error')
log.critical('critical') log.critical('critical')
log = logging.getLogger('gajim.c.x.dispatcher') log = logging.getLogger('gajim.c.x.dispatcher')
log.debug('debug') log.debug('debug')
log.info('info') log.info('info')
log.warn('warn') log.warning('warn')
log.error('error') log.error('error')
log.critical('critical') log.critical('critical')

View file

@ -96,7 +96,7 @@ class ConnectionArchive:
def get_item_pref(self, jid): def get_item_pref(self, jid):
jid = nbxmpp.JID(jid) jid = nbxmpp.JID(jid)
if unicode(jid) in self.items: if str(jid) in self.items:
return self.items[jid] return self.items[jid]
if jid.getStripped() in self.items: if jid.getStripped() in self.items:

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