merge from trunk

This commit is contained in:
Yann Leboulanger 2011-06-20 23:03:06 +02:00
commit b47248f09d
231 changed files with 95863 additions and 63467 deletions

View file

@ -1,4 +1,12 @@
Gajim 0.14 (XX)
Gajim 0.14.1 (26 October 2010)
* Fix changing account name
* Fix sending XHTML
* Fix GnomeKayring usage
* Fix some GPG bugs
* Minor bugfixes
Gajim 0.14 (02 September 2010)
* Jingle audio / video chat
* Improve Startup time

View file

@ -16,11 +16,8 @@
<ul>
<li>python2.5 or higher</li>
<li>pygtk2.16 or higher</li>
<li>pysqlite2 (if you have python 2.5, you already have this)</li>
</ul>
<p><strong>Note to packagers</strong> Gajim is a GTK+ app that loves GNOME. You can do 'make' so you don't require gnomepythonextras (aka gnome-python-desktop) which is gnome dep, but you will miss gnomekeyring integration.</p>
<h2>Optional Runtime Requirements</h2>
<ul>
<li><a href="http://pyopenssl.sourceforge.net/">PyOpenSSL</a> (python-pyopenssl package in Debian) (>=0.9) for <em>secure</em> SSL/TLS. Python's default SSL is insecure, so this package is highly recommended!</li>
@ -29,7 +26,8 @@
<li>For zeroconf (bonjour), the "enable link-local messaging" checkbox, you need dbus-glib, python-avahi</li>
<li>dnsutils (or whatever package provides the nslookup binary) for SRV support</li>
<li>gtkspell and aspell-LANG where lang is your locale eg. en, fr etc</li>
<li>gnome-python-desktop (for GnomeKeyring support)</li>
<li>gnome-python-desktop (for GnomeKeyring support as password storage)</li>
<li>kwalletcli (for support of KDE Wallet as password storage)</li>
<li>notification-daemon or notify-python (and D-Bus) to get cooler popups</li>
<li>D-Bus running to have gajim-remote working. Some distributions split dbus-x11, which is needed for dbus to work with Gajim. Version >= 0.80 is required.</li>
<li>python-dbus bindings (>=0.81)</li>
@ -40,8 +38,6 @@
<h2>Compile-time Requirements</h2>
<ul>
<li>python-dev</li>
<li>python-gtk2-dev</li>
<li>intltool (>= 0.40.1)</li>
</ul>
@ -52,15 +48,10 @@
<li>tar jxvf gajim-version.tar.bz2</li>
<li>cd gajim</li>
<li>./configure</li>
<li>make (builds all modules)</li>
<li>make (builds translations)</li>
<li>su -c make install</li>
</ol>
<p>To specify what modules to build do:</p>
<pre>
make help
</pre>
<p>To specify where to install do:</p>
<pre>
./configure --prefix=custom_path
@ -68,7 +59,7 @@
<h2>Running Gajim</h2>
<p>Just do <em>gajim</em> or you can run Gajim from your GNOME/Xfce/KDE/whatever menus.<br/><br/>
or if you didn't 'make install' you can also run from gajim folder with<em>./launch.sh</em></p>
or if you use hg version and you didn't 'make install' you can also run from gajim folder with<em>./launch.sh</em></p>
<hr />
<h3>Note for hg users</h3>
<p>You will need GNU autotools in order to install Gajim from svn. This includes:</p>
@ -120,7 +111,7 @@ Wiki can be found at <a href="http://trac.gajim.org/wiki">http://trac.gajim.org/
<br/>
<br/>
<br/>
(C) 2003-2010<br/>
(C) 2003-2011<br/>
The Gajim Team<br/>
http://gajim.org<br/>
<br/>

View file

@ -1,5 +1,5 @@
#!/usr/bin/env bash
gajimversion="0.13.90.1"
gajimversion="0.14.0.1"
if [ -d ".hg" ]; then
node=$(hg tip --template "{node}")
hgversion="-${node:0:12}"
@ -8,7 +8,7 @@
fi
echo "define([AC_PACKAGE_VERSION], [${gajimversion}${hgversion}])" > m4/hgversion.m4
AM_ARGS="--add-missing --gnu --copy"
AM_ARGS="--add-missing --gnu --copy -Wno-portability"
CONF_ARGS=""
if test x`uname -s 2>/dev/null` = 'xDarwin' -a -f /Library/Frameworks/GTK+.framework/Versions/Current/env; then
. /Library/Frameworks/GTK+.framework/Versions/Current/env
@ -20,7 +20,7 @@
&& for p in `ls data/gui/*.ui`; do echo "[type: gettext/glade]$p" >> \
po/POTFILES.in; done \
&& ls -1 data/gajim.desktop.in.in \
src/*py src/common/*py src/common/zeroconf/*.py | grep -v ipython_view.py >> \
src/*py src/common/*py src/common/zeroconf/*.py src/plugins/*.py| grep -v ipython_view.py >> \
po/POTFILES.in || exit 1
if test -z `which pkg-config 2>/dev/null`;then
echo "***Error: pkg-config not found***"
@ -36,6 +36,6 @@
&& aclocal -I ./m4 \
&& $LIBTOOLIZE --copy --force --automake \
&& autoheader \
&& autoconf \
&& autoconf \
&& automake ${AM_ARGS} \
&& ./configure ${CONF_ARGS} $@

View file

@ -9,9 +9,6 @@ AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.8])
AM_MAINTAINER_MODE
dnl Make Objective-C work with automake
AM_CONDITIONAL([am__fastdepOBJC], false)
IT_PROG_INTLTOOL([0.35.0])
PKG_PROG_PKG_CONFIG([0.19])
@ -36,25 +33,10 @@ AM_GLIB_GNU_GETTEXT
AM_NLS
dnl ****
dnl pygtk and gtk+
dnl ****
PKG_CHECK_MODULES([PYGTK], [gtk+-2.0 >= 2.16.0 pygtk-2.0 >= 2.16.0])
AC_SUBST(PYGTK_CFLAGS)
AC_SUBST(PYGTK_LIBS)
PYGTK_DEFS=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
AC_SUBST(PYGTK_DEFS)
AM_PATH_PYTHON([2.5])
if test "x$PYTHON" = "x:"; then
AC_MSG_ERROR([Python not found])
fi
ACLOCAL_AMFLAGS="\${ACLOCAL_FLAGS}"
AC_SUBST(ACLOCAL_AMFLAGS)
AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
AC_SUBST([PYTHON_INCLUDES])
AM_PATH_PYTHON([2.5])
dnl ****
dnl enable installation in python-2.x/site-packages/gajim

View file

@ -6,6 +6,7 @@
<property name="border_width">12</property>
<property name="title" translatable="yes">Gajim: Account Creation Wizard</property>
<property name="resizable">False</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_wizard_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox77">

View file

@ -18,6 +18,7 @@
<property name="border_width">12</property>
<property name="title" translatable="yes">Accounts</property>
<property name="default_width">800</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_accounts_window_destroy"/>
<signal name="key_press_event" handler="on_accounts_window_key_press_event"/>
<child>
@ -484,6 +485,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Choose Client Cert</property>
<signal name="clicked" handler="on_browse_for_client_cert_button_clicked"/>
</object>
<packing>
<property name="expand">False</property>
@ -719,6 +721,7 @@
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>

View file

@ -6,6 +6,7 @@
<property name="border_width">6</property>
<property name="title" translatable="yes">Add New Contact</property>
<property name="resizable">False</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_add_new_contact_window_destroy"/>
<signal name="key_press_event" handler="on_add_new_contact_window_key_press_event"/>
<child>
@ -100,6 +101,7 @@
<property name="visible">True</property>
<property name="no_show_all">True</property>
<property name="model">liststore2</property>
<signal name="changed" handler="on_protocol_jid_combobox_changed"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes>

View file

@ -6,6 +6,7 @@
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Ad-hoc Commands - Gajim</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_adhoc_commands_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">

View file

@ -8,6 +8,7 @@
<property name="role">ace</property>
<property name="default_width">650</property>
<property name="default_height">540</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_advanced_configuration_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox70">

View file

@ -4,7 +4,7 @@
<!-- interface-naming-policy project-wide -->
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -18,7 +18,7 @@
</object>
<object class="GtkListStore" id="liststore2">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -35,7 +35,7 @@
</object>
<object class="GtkListStore" id="liststore3">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -52,7 +52,7 @@
</object>
<object class="GtkListStore" id="liststore4">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -69,6 +69,7 @@
</object>
<object class="GtkWindow" id="archiving_preferences_window">
<property name="border_width">12</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_archiving_preferences_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="blocked_contacts_window">
<property name="visible">True</property>
<property name="title" translatable="yes">Blocked Contacts</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_blocked_contacts_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">

File diff suppressed because it is too large Load diff

View file

@ -6,6 +6,7 @@
<property name="visible">True</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Invite Friends!</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_chat_to_muc_window_destroy"/>
<signal name="key_press_event" handler="on_chat_to_muc_window_key_press_event"/>
<child>

View file

@ -7,6 +7,7 @@
<property name="title" translatable="yes">Room Configuration</property>
<property name="default_width">650</property>
<property name="default_height">450</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_data_form_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox68">
@ -34,7 +35,7 @@
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="instructions_label">
<object class="GtkLabel" id="title_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
@ -47,7 +48,7 @@
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator15">
<object class="GtkHSeparator" id="title_hseparator">
<property name="visible">True</property>
</object>
<packing>
@ -65,7 +66,7 @@
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator14">
<object class="GtkHSeparator" id="config_hseparator">
<property name="visible">True</property>
</object>
<packing>

View file

@ -7,7 +7,7 @@
<property name="title" translatable="yes">Edit Groups</property>
<property name="modal">True</property>
<property name="default_height">290</property>
<property name="type_hint">normal</property>
<property name="type_hint">dialog</property>
<signal name="response" handler="on_edit_groups_dialog_response"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox6">

View file

@ -8,6 +8,7 @@
<property name="title" translatable="yes">Features</property>
<property name="default_width">300</property>
<property name="default_height">530</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="file_transfers_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">File Transfers</property>
<property name="type_hint">dialog</property>
<child internal-child="accessible">
<object class="AtkObject" id="file_transfers_window-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">File Transfers</property>
@ -40,11 +41,11 @@
</object>
</child>
<signal name="button_press_event" handler="on_transfers_list_button_press_event"/>
<signal name="motion_notify_event" handler="on_transfers_list_motion_notify_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="leave_notify_event" handler="on_transfers_list_leave_notify_event"/>
<signal name="motion_notify_event" handler="on_transfers_list_motion_notify_event"/>
<signal name="row_activated" handler="on_transfers_list_row_activated"/>
<signal name="button_release_event" handler="on_transfers_list_button_release_event"/>
</object>
</child>
</object>

View file

@ -4,7 +4,7 @@
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -25,6 +25,7 @@
<object class="GtkWindow" id="gajim_themes_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Gajim Themes Customization</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox97">
<property name="visible">True</property>
@ -326,6 +327,7 @@
<property name="visible">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>

View file

@ -66,6 +66,19 @@
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="request_voice_separator">
<property name="no_show_all">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="request_voice_menuitem">
<property name="label" translatable="yes">_Request Voice</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">False</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bookmark_separator">
<property name="no_show_all">True</property>

View file

@ -94,6 +94,15 @@
</child>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="invite_menuitem">
<property name="label" translatable="yes">In_vite to</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image7</property>
<property name="use_stock">False</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="separator6">
<property name="visible">True</property>
@ -185,4 +194,8 @@
<property name="stock">gtk-justify-fill</property>
<property name="icon-size">1</property>
</object>
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</object>
</interface>

View file

@ -2,118 +2,213 @@
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkVBox" id="groupchat_control_vbox">
<object class="GtkHBox" id="groupchat_control_hbox">
<property name="can_focus">True</property>
<property name="border_width">3</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkAlignment" id="alignment">
<property name="visible">True</property>
<property name="bottom_padding">1</property>
<property name="left_padding">3</property>
<property name="right_padding">3</property>
<object class="GtkVBox" id="groupchat_control_vbox">
<property name="can_focus">True</property>
<property name="border_width">3</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkEventBox" id="banner_eventbox">
<object class="GtkAlignment" id="alignment">
<property name="visible">True</property>
<property name="bottom_padding">1</property>
<property name="left_padding">3</property>
<property name="right_padding">3</property>
<child>
<object class="GtkHBox" id="hbox3024">
<object class="GtkEventBox" id="banner_eventbox">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="gc_banner_status_image">
<object class="GtkHBox" id="hbox3024">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="banner_vbox">
<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="border_width">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="banner_name_label">
<object class="GtkImage" id="gc_banner_status_image">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label">&lt;span weight="heavy" size="large"&gt;room jid&lt;/span&gt;</property>
<property name="use_markup">True</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="banner_label">
<object class="GtkVBox" id="banner_vbox">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">label</property>
<property name="use_markup">True</property>
<property name="selectable">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="border_width">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="banner_name_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label">&lt;span weight="heavy" size="large"&gt;room jid&lt;/span&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="banner_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">label</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHPaned" id="hpaned">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="border_width">3</property>
<property name="position">495</property>
<property name="position_set">True</property>
<child>
<object class="GtkVBox" id="gc_textviews_vbox">
<property name="width_request">0</property>
<object class="GtkHPaned" id="hpaned">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<property name="can_focus">True</property>
<property name="border_width">3</property>
<property name="position">495</property>
<property name="position_set">True</property>
<signal name="notify" handler="on_hpaned_notify"/>
<child>
<object class="GtkScrolledWindow" id="conversation_scrolledwindow">
<property name="width_request">200</property>
<property name="height_request">60</property>
<object class="GtkVBox" id="gc_textviews_vbox">
<property name="width_request">0</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<placeholder/>
<object class="GtkScrolledWindow" id="conversation_scrolledwindow">
<property name="width_request">200</property>
<property name="height_request">60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="message_scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">never</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="list_scrolledwindow">
<property name="width_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="list_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="border_width">1</property>
<property name="headers_visible">False</property>
</object>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="actions_hbox">
<property name="visible">True</property>
<child>
<object class="GtkHBox" id="hbox3023">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="emoticons_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Show a list of emoticons (Alt+M)</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="emoticons_button_image">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
<property name="icon-size">1</property>
</object>
</child>
</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="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="message_scrolledwindow">
<object class="GtkButton" id="formattings_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">never</property>
<property name="shadow_type">in</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="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Show a list of formattings</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
<child>
<placeholder/>
<object class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="stock">gtk-bold</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
@ -121,56 +216,30 @@
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="list_scrolledwindow">
<property name="width_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="list_treeview">
<object class="GtkVSeparator" id="vseparator2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="border_width">1</property>
<property name="headers_visible">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="actions_hbox">
<property name="visible">True</property>
<child>
<object class="GtkHBox" id="hbox3023">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="emoticons_button">
<object class="GtkButton" id="change_nick_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Change your nickname (Ctrl+N)</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="emoticons_button_image">
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-edit</property>
<property name="icon-size">1</property>
</object>
</child>
@ -178,246 +247,200 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="formattings_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
<child>
<object class="GtkImage" id="image11">
<object class="GtkButton" id="change_subject_button">
<property name="visible">True</property>
<property name="stock">gtk-bold</property>
<property name="icon-size">1</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Change the room's subject (Alt+T)</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image6">
<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-properties</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkButton" id="bookmark_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="no_show_all">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Bookmark this room (Ctrl+B)</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image7">
<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>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="history_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Browse the chat history (Ctrl+H)</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image8">
<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-justify-fill</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkVSeparator" id="vseparator4">
<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>
</object>
<packing>
<property name="expand">False</property>
<property name="position">7</property>
</packing>
</child>
<child>
<object class="GtkButton" id="muc_window_actions_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Show a menu of advanced functions (Alt+D)</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
<child>
<object class="GtkAlignment" id="alignment104">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkImage" id="image1344">
<property name="visible">True</property>
<property name="stock">gtk-execute</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">8</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="label_selector">
<property name="visible">True</property>
</object>
<packing>
<property name="position">9</property>
</packing>
</child>
<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>
<placeholder/>
</child>
</object>
<packing>
<property name="position">10</property>
</packing>
</child>
<child>
<object class="GtkButton" id="send_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkAlignment" id="alignment105">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox3016">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1345">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label377">
<property name="visible">True</property>
<property name="label" translatable="yes" comments="Make sure the character after &quot;_&quot; is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">11</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkVSeparator" id="vseparator2">
<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>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="change_nick_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image4">
<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-edit</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkButton" id="change_subject_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image6">
<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-properties</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkButton" id="bookmark_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="no_show_all">True</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image7">
<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>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="history_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="image8">
<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-justify-fill</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkVSeparator" id="vseparator4">
<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>
</object>
<packing>
<property name="expand">False</property>
<property name="position">7</property>
</packing>
</child>
<child>
<object class="GtkButton" id="muc_window_actions_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
<child>
<object class="GtkAlignment" id="alignment104">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkImage" id="image1344">
<property name="visible">True</property>
<property name="stock">gtk-execute</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">8</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="label_selector">
<property name="visible">True</property>
</object>
<packing>
<property name="position">9</property>
</packing>
</child>
<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>
<placeholder/>
</child>
</object>
<packing>
<property name="position">10</property>
</packing>
</child>
<child>
<object class="GtkButton" id="send_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkAlignment" id="alignment105">
<property name="visible">True</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox3016">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image1345">
<property name="visible">True</property>
<property name="stock">gtk-jump-to</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label377">
<property name="visible">True</property>
<property name="label" translatable="yes" comments="Make sure the character after &quot;_&quot; is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">11</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
<property name="position">0</property>
</packing>
</child>
</object>

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="groups_post_window">
<property name="visible">True</property>
<property name="title" translatable="yes">Create new post</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>

View file

@ -281,11 +281,10 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene
</child>
<child>
<object class="GtkImageMenuItem" id="delete_menuitem">
<property name="label" translatable="yes">Delete</property>
<property name="label">gtk-delete</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="accel_group">accelgroup1</property>
</object>
</child>
</object>
@ -346,5 +345,4 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene
<action-widget response="-5">save_button</action-widget>
</action-widgets>
</object>
<object class="GtkAccelGroup" id="accelgroup1"/>
</interface>

View file

@ -4,6 +4,7 @@
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="item_archiving_preferences_window">
<property name="border_width">12</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_item_archiving_preferences_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
@ -180,7 +181,7 @@
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -200,7 +201,7 @@
</object>
<object class="GtkListStore" id="liststore2">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="join_groupchat_window">
<property name="border_width">6</property>
<property name="title" translatable="yes">Join Group Chat</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_join_groupchat_window_destroy"/>
<signal name="key_press_event" handler="on_join_groupchat_window_key_press_event"/>
<child>
@ -235,10 +236,12 @@
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="y_options">GTK_EXPAND</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
@ -317,6 +320,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>

View file

@ -13,6 +13,7 @@
<property name="title" translatable="yes">Manage Bookmarks</property>
<property name="default_width">550</property>
<property name="default_height">300</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox86">
<property name="visible">True</property>
@ -105,7 +106,8 @@
<object class="GtkLabel" id="label318">
<property name="visible">True</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>
</object>
<packing>
<property name="top_attach">4</property>
@ -147,7 +149,8 @@
<object class="GtkLabel" id="label317">
<property name="visible">True</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>
</object>
<packing>
<property name="top_attach">3</property>
@ -160,7 +163,8 @@
<object class="GtkLabel" id="label316">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Room:</property>
<property name="label" translatable="yes">Roo_m:</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="top_attach">2</property>
@ -201,7 +205,8 @@
<object class="GtkLabel" id="label315">
<property name="visible">True</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>
</object>
<packing>
<property name="top_attach">1</property>
@ -214,7 +219,8 @@
<object class="GtkLabel" id="label325">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Title:</property>
<property name="label" translatable="yes">_Title:</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
@ -237,7 +243,8 @@
<object class="GtkLabel" id="label326">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Print status:</property>
<property name="label" translatable="yes">Pr_int status:</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="top_attach">6</property>
@ -274,7 +281,7 @@
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<object class="GtkCheckButton" id="autojoin_checkbutton">
<property name="label" translatable="yes">Auto join</property>
<property name="label" translatable="yes">A_uto join</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
@ -290,7 +297,7 @@
</child>
<child>
<object class="GtkCheckButton" id="minimize_checkbutton">
<property name="label" translatable="yes">Minimize on Auto Join</property>
<property name="label" translatable="yes">Minimi_ze on Auto Join</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
@ -309,6 +316,7 @@
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
</object>

View file

@ -7,6 +7,7 @@
<property name="title" translatable="yes">PEP Service Configuration</property>
<property name="default_width">350</property>
<property name="default_height">150</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_manage_pep_services_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">

View file

@ -4,7 +4,7 @@
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -22,6 +22,7 @@
<object class="GtkWindow" id="manage_proxies_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Manage Proxy Profiles</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_manage_proxies_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox87">
@ -49,8 +50,8 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<signal name="key_press_event" handler="on_proxies_treeview_key_press_event"/>
<signal name="cursor_changed" handler="on_proxies_treeview_cursor_changed"/>
<signal name="key_press_event" handler="on_proxies_treeview_key_press_event"/>
</object>
</child>
</object>

View file

@ -6,6 +6,7 @@
<property name="width_request">400</property>
<property name="height_request">350</property>
<property name="border_width">6</property>
<property name="type_hint">dialog</property>
<signal name="delete_event" handler="on_manage_sounds_window_delete_event"/>
<child>
<object class="GtkVBox" id="vbox1">

View file

@ -52,8 +52,6 @@
</child>
<child>
<object class="GtkButton" id="tab_close_button">
<property name="width_request">20</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>

View file

@ -9,6 +9,7 @@
<property name="title" translatable="yes">Plugins</property>
<property name="default_width">650</property>
<property name="default_height">500</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_plugins_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
@ -51,33 +52,12 @@
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox4">
<object class="GtkLabel" id="plugin_name_label">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="plugin_name_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&amp;lt;empty&amp;gt;</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<property name="xalign">0</property>
<property name="label" translatable="yes">&amp;lt;empty&amp;gt;</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -174,7 +154,6 @@
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
@ -194,7 +173,7 @@
<child>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="label" translatable="yes">Descrition:</property>
<property name="label" translatable="yes">Description:</property>
</object>
<packing>
<property name="expand">False</property>
@ -245,10 +224,47 @@
<property name="visible">True</property>
<property name="spacing">5</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="install_plugin_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_install_plugin_button_clicked"/>
<child>
<object class="GtkHBox" id="hbox13">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="image3">
<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="install_plugin_button_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Install</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="uninstall_plugin_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_uninstall_plugin_button_clicked"/>
<child>
@ -266,6 +282,7 @@
<child>
<object class="GtkLabel" id="uninstall_plugin_button_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Uninstall</property>
</object>
<packing>
@ -278,7 +295,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
<property name="position">1</property>
</packing>
</child>
<child>
@ -302,6 +319,7 @@
<child>
<object class="GtkLabel" id="configure_plugin_button_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Configure</property>
</object>
<packing>
@ -314,7 +332,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
</object>

View file

@ -9,16 +9,7 @@
</columns>
<data>
<row>
<col id="0" translatable="yes">Autodetect on every Gajim startup</col>
</row>
<row>
<col id="0" translatable="yes">Always use GNOME default applications</col>
</row>
<row>
<col id="0" translatable="yes">Always use KDE default applications</col>
</row>
<row>
<col id="0" translatable="yes">Always use Xfce default applications</col>
<col id="0" translatable="yes">Use default applications</col>
</row>
<row>
<col id="0" translatable="yes">Custom</col>
@ -116,10 +107,28 @@
</row>
</data>
</object>
<object class="GtkListStore" id="liststore7">
<columns>
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Always</col>
</row>
<row>
<col id="0" translatable="yes">Never</col>
</row>
<row>
<col id="0" translatable="yes">Last state</col>
</row>
</data>
</object>
<object class="GtkWindow" id="preferences_window">
<property name="border_width">6</property>
<property name="title" translatable="yes">Preferences</property>
<property name="role">preferences</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_preferences_window_destroy"/>
<signal name="key_press_event" handler="on_preferences_window_key_press_event"/>
<child>
@ -341,7 +350,7 @@
<object class="GtkTable" id="table1">
<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="n_rows">5</property>
<property name="n_rows">6</property>
<property name="n_columns">2</property>
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
@ -400,8 +409,8 @@
</object>
<packing>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
@ -418,8 +427,8 @@
</object>
<packing>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
@ -435,8 +444,8 @@
</object>
<packing>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
@ -460,6 +469,41 @@
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label28">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="xpad">1</property>
<property name="label" translatable="yes">_Show roster on startup:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">show_roster_on_startup</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="show_roster_on_startup">
<property name="width_request">50</property>
<property name="visible">True</property>
<property name="model">liststore7</property>
<signal name="changed" handler="on_show_roster_on_startup_changed"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext7"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
</object>
</child>
</object>
@ -672,7 +716,7 @@
<child>
<object class="GtkLabel" id="label11">
<property name="visible">True</property>
<property name="label" translatable="yes">Show systray:</property>
<property name="label" translatable="yes">Show notification area icon:</property>
</object>
<packing>
<property name="expand">False</property>
@ -702,33 +746,6 @@
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<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>
<child>
<object class="GtkButton" id="advanced_notifications_button">
<property name="label" translatable="yes">Advanced...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="clicked" handler="on_advanced_notifications_button_clicked"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">6</property>
</packing>
</child>
</object>
</child>
</object>
@ -1356,8 +1373,8 @@ $T will be replaced by auto-not-available timeout</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<signal name="key_press_event" handler="on_msg_treeview_key_press_event"/>
<signal name="cursor_changed" handler="on_msg_treeview_cursor_changed"/>
<signal name="key_press_event" handler="on_msg_treeview_key_press_event"/>
</object>
</child>
</object>

View file

@ -6,15 +6,16 @@
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Privacy List</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_privacy_list_edit_window_destroy"/>
<child>
<object class="GtkVBox" id="main_vbox">
<property name="width_request">600</property>
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkHBox" id="title_hbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="privacy_lists_title_label">
@ -591,7 +592,7 @@
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -611,13 +612,13 @@
</object>
<object class="GtkListStore" id="liststore2">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkListStore" id="liststore3">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
</object>

View file

@ -6,6 +6,7 @@
<property name="visible">True</property>
<property name="border_width">12</property>
<property name="title" translatable="yes">window1</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_privacy_lists_first_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
@ -167,7 +168,7 @@
</object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
</object>

View file

@ -4,6 +4,7 @@
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="profile_window">
<property name="title" translatable="yes">Personal Information</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_profile_window_destroy"/>
<signal name="key_press_event" handler="on_profile_window_key_press_event"/>
<child>

View file

@ -4,6 +4,7 @@
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="remove_account_window">
<property name="border_width">6</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_remove_account_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox69">

View file

@ -4,6 +4,7 @@
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="roster_item_exchange_window">
<property name="title" translatable="yes">Roster Item Exchange</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>

View file

@ -12,11 +12,11 @@
<accel-groups>
<group name="accelgroup1"/>
</accel-groups>
<signal name="focus_in_event" handler="on_roster_window_focus_in_event"/>
<signal name="key_press_event" handler="on_roster_window_key_press_event"/>
<signal name="delete_event" handler="on_roster_window_delete_event"/>
<signal name="focus_out_event" handler="on_roster_window_focus_out_event"/>
<signal name="popup_menu" handler="on_roster_window_popup_menu"/>
<signal name="delete_event" handler="on_roster_window_delete_event"/>
<signal name="focus_in_event" handler="on_roster_window_focus_in_event"/>
<child>
<object class="GtkVBox" id="roster_vbox">
<property name="visible">True</property>
@ -44,7 +44,7 @@
</child>
<child>
<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="use_underline">True</property>
<property name="image">image2</property>
<property name="use_stock">False</property>
@ -218,6 +218,16 @@
<signal name="toggled" handler="on_show_roster_menuitem_toggled"/>
</object>
</child>
<child>
<object class="GtkCheckMenuItem" id="show_rfilter_menuitem">
<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">Show Roster Fi_lter</property>
<property name="use_underline">True</property>
<accelerator key="L" signal="activate" modifiers="GDK_CONTROL_MASK"/>
<signal name="toggled" handler="on_show_rfilter_menuitem_toggled"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="separator3">
<property name="visible">True</property>
@ -325,11 +335,27 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="notify" handler="on_roster_hpaned_notify"/>
<child>
<object class="GtkVBox" id="roster_vbox2">
<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="orientation">vertical</property>
<child>
<object class="GtkEntry" id="rfilter_entry">
<property name="can_focus">True</property>
<property name="no_show_all">True</property>
<property name="editable">False</property>
<property name="primary_icon_stock">gtk-clear</property>
<property name="primary_icon_activatable">True</property>
<signal name="changed" handler="on_rfilter_entry_changed"/>
<signal name="icon_press" handler="on_rfilter_entry_icon_press"/>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
@ -342,21 +368,20 @@
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="reorderable">True</property>
<signal name="row_collapsed" handler="on_roster_treeview_row_collapsed"/>
<signal name="button_press_event" handler="on_roster_treeview_button_press_event"/>
<signal name="motion_notify_event" handler="on_roster_treeview_motion_notify_event"/>
<signal name="row_activated" handler="on_roster_treeview_row_activated"/>
<signal name="button_release_event" handler="on_roster_treeview_button_release_event"/>
<signal name="row_expanded" handler="on_roster_treeview_row_expanded"/>
<signal name="key_press_event" handler="on_roster_treeview_key_press_event"/>
<signal name="style_set" handler="on_roster_treeview_style_set"/>
<signal name="scroll_event" handler="on_roster_treeview_scroll_event"/>
<signal name="leave_notify_event" handler="on_roster_treeview_leave_notify_event"/>
<signal name="button_press_event" handler="on_roster_treeview_button_press_event"/>
<signal name="row_activated" handler="on_roster_treeview_row_activated"/>
<signal name="row_collapsed" handler="on_roster_treeview_row_collapsed"/>
<signal name="motion_notify_event" handler="on_roster_treeview_motion_notify_event"/>
<signal name="button_release_event" handler="on_roster_treeview_button_release_event"/>
</object>
</child>
</object>
<packing>
<property name="position">0</property>
<property name="position">1</property>
</packing>
</child>
<child>
@ -366,7 +391,7 @@
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
</object>

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="search_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Search</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_search_window_destroy"/>
<signal name="key_press_event" handler="on_search_window_key_press_event"/>
<child>

View file

@ -13,6 +13,7 @@
<property name="role">Service Discovery</property>
<property name="default_width">550</property>
<property name="default_height">420</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_service_discovery_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox11">

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="service_registration_window">
<property name="border_width">6</property>
<property name="title" translatable="yes">Register to</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="vbox12">
<property name="visible">True</property>

View file

@ -5,6 +5,8 @@
<object class="GtkWindow" id="subscription_request_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Subscription Request</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_subscription_request_window_destroy"/>
<child>
<object class="GtkVBox" id="vbox10">
<property name="visible">True</property>

View file

@ -7,7 +7,7 @@
<property name="title" translatable="yes">Synchronise contacts</property>
<property name="default_width">350</property>
<property name="default_height">300</property>
<property name="type_hint">normal</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox7">
<property name="visible">True</property>

View file

@ -7,7 +7,7 @@
<property name="title" translatable="yes">Synchronise : select contacts</property>
<property name="default_width">400</property>
<property name="default_height">300</property>
<property name="type_hint">normal</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox7">
<property name="visible">True</property>

View file

@ -5,6 +5,7 @@
<object class="GtkWindow" id="vcard_information_window">
<property name="border_width">12</property>
<property name="title" translatable="yes">Contact Information</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_vcard_information_window_destroy"/>
<signal name="key_press_event" handler="on_vcard_information_window_key_press_event"/>
<child>
@ -270,7 +271,9 @@
<object class="GtkLabel" id="user_avatar_label">
<property name="no_show_all">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">User avatar:</property>
<property name="ypad">5</property>
<property name="label" translatable="yes">&lt;b&gt;User avatar:&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -301,7 +304,8 @@
<object class="GtkLabel" id="custom_avatar_label">
<property name="no_show_all">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Configured avatar:</property>
<property name="label" translatable="yes">&lt;b&gt;Configured avatar:&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>

View file

@ -6,6 +6,7 @@
<property name="border_width">12</property>
<property name="title">Contact Information</property>
<property name="resizable">False</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_zeroconf_information_window_destroy"/>
<signal name="key_press_event" handler="on_zeroconf_information_window_key_press_event"/>
<child>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -2552,3 +2552,26 @@ O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
-----END CERTIFICATE-----
Deutsche Telekom Root CA 2
-----BEGIN CERTIFICATE-----
MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
Cm26OWMohpLzGITY+9HPBVZkVw==
-----END CERTIFICATE-----

View file

@ -1,403 +1,81 @@
<!-- This file lists the public Jabber servers registered with the
Jabber Software Foundation. The format of this file is defined
by the Service Discovery protocol:
http://www.jabber.org/jeps/jep-0030.html
To add your server to the list, contact stpeter@jabber.org -->
<query xmlns="http://jabber.org/protocol/disco#items">
<item jid="12jabber.com" name="Jabber server hosted by Anywise.com">
<active port="5222"/>
</item>
<item jid="admin-networks.org" name="">
<active port="5222"/>
</item>
<item jid="akl.lt" name="Jabber server in Lietuva (Lithuania)">
<active port="5222"/>
</item>
<item jid="amber.org.uk" name="">
<active port="5222"/>
</item>
<item jid="amessage.at" name="Austrian Jabber server">
<active port="5222"/>
</item>
<item jid="amessage.be" name="Belgian Jabber server">
<active port="5222"/>
</item>
<item jid="amessage.ch" name="Swiss Jabber server">
<active port="5222"/>
</item>
<item jid="amessage.de" name="German Jabber server">
<active port="5222"/>
</item>
<item jid="amessage.info" name="Jabber server from amessage">
<active port="5222"/>
<digest algo="sha1" value="69:FA:D6:32:BF:84:CE:01:D9:FC:C5:1A:E3:04:12:FB:A5:28:03:1A"/>
</item>
<item jid="amessage.li" name="Jabber server in Liechtenstein">
<active port="5222"/>
</item>
<item jid="aszlig.net" name="">
<active port="5222"/>
</item>
<item jid="blabla.kz" name="">
<active port="5222"/>
</item>
<item jid="bloodyxml.com" name="Hosted by Chote Networks (http://www.chote.com)">
<active port="5222"/>
</item>
<item jid="borderlinenormal.com" name="Hosted by Chote Networks (http://www.chote.com)">
<active port="5222"/>
</item>
<item jid="bulmalug.net" name="Server hosted by the Linux Users Group of the Balearic Islands">
<active port="5222"/>
</item>
<item jid="chat.mail2web.com" name="">
<active port="5222"/>
</item>
<item jid="default.co.yu" name="Server in Yugoslavia">
<active port="5222"/>
</item>
<item jid="deshalbfrei.org" name="">
<active port="5222"/>
</item>
<item jid="develog.com" name="">
<active port="5222"/>
</item>
<item jid="dotgeek.org" name="Jabber server in Switzerland">
<active port="5222"/>
</item>
<item jid="es.tipic.com" name="Spanish Jabber server hosted by Tipic">
<active port="5222"/>
</item>
<item jid="foxalpha.de" name="">
<active port="5222"/>
</item>
<item jid="fritalk.org" name="French Jabber Server">
<active port="5222"/>
</item>
<item jid="gnubox.eu" name="">
<active port="5222"/>
</item>
<item jid="here.dk" name="Jabber server in Denmark">
<active port="5222"/>
</item>
<item jid="illx.org" name="Jabber server hosted by illx.org">
<active port="5222"/>
</item>
<item jid='im.apinc.org' name='French server hosted by APINC'>
<active port='5222'/>
</item>
<item jid="im.flosoft.biz" name="">
<active port="5222"/>
</item>
<item jid="im.toile-libre.org" name="">
<active port="5222"/>
</item>
<item jid="ims.kelkoo.net" name="Server hosted by Kelkoo (France)">
<active port="5222"/>
</item>
<item jid="jabber-fr.net" name="French Jabber server">
<active port="5222"/>
</item>
<item jid="jabber-hispano.org" name="Servidor Jabber de la comunidad hispana">
<active port="5222"/>
</item>
<item jid="jabber.3gnt.org" name="Server in Portugal">
<active port="5222"/>
</item>
<item jid="jabber.ambrero.nl" name="">
<active port="5222"/>
</item>
<item jid="jabber.anywise.com" name="Jabber server hosted by Anywise.com">
<active port="5222"/>
</item>
<item jid="jabber.atman.pl" name="Another server in Poland">
<active port="5222"/>
</item>
<item jid="jabber.autocom.pl" name="Server associated with jabberpl.org">
<active port="5222"/>
</item>
<item jid="jabber.bettercom.de" name="Public server hosted by BetterCom">
<active port="5222"/>
</item>
<item jid="jabber.cc" name="">
<active port="5222"/>
</item>
<item jid="jabber.ccc.de" name="Service of the Chaos Computer Club">
<active port="5222"/>
</item>
<item jid="jabber.cd.chalmers.se" name="">
<active port="5222"/>
</item>
<item jid="jabber.cn" name="Jabber server for all of China! :-)">
<active port="5222"/>
</item>
<item jid="jabber.com" name="Jabber server offered by Jabber, Inc.">
<active port="5222"/>
</item>
<item jid="jabber.com.cn" name="Jabber server in China">
<active port="5222"/>
</item>
<item jid="jabber.cz" name="Czech Jabber server">
<active port="5222"/>
</item>
<item jid="jabber.dk" name="Jabber server in Denmark">
<active port="5222"/>
</item>
<item jid="jabber.earth.li" name="Jabber server hosted by earth.li">
<active port="5222"/>
</item>
<item jid="jabber.evilrealms.net" name="">
<active port="5222"/>
</item>
<item jid="jabber.felisberto.net" name="Server in Portugal">
<active port="5222"/>
</item>
<item jid="jabber.fr" name="French server hosted by APINC">
<active port="5222"/>
</item>
<item jid="jabber.freenet.de" name="Server in Germany">
<active port="5222"/>
</item>
<item jid="jabber.hot-chilli.net" name="">
<active port="5222"/>
</item>
<item jid="jabber.hu" name="Jabber server in Hungary">
<active port="5222"/>
</item>
<item jid="jabber.i-pobox.net" name="Server in Germany">
<active port="5222"/>
</item>
<item jid="jabber.kiev.ua" name="Server in Ukrain (Kiev)">
<active port="5222"/>
</item>
<item jid="jabber.killerbees.org.uk" name="">
<active port="5222"/>
</item>
<item jid="jabber.linux.it" name="Jabber server in Italy">
<active port="5222"/>
</item>
<item jid="jabber.lutix.org" name="">
<active port="5222"/>
</item>
<item jid="jabber.meta.net.nz" name="Jabber server in New Zealand">
<active port="5222"/>
</item>
<item jid="jabber.minus273.org" name="">
<active port="5222"/>
</item>
<item jid="jabber.mulasystems.com" name="">
<active port="5222"/>
</item>
<item jid="jabber.ngnet.it" name="Server in Italy">
<active port="5222"/>
</item>
<item jid="jabber.no" name="">
<active port="5222"/>
</item>
<item jid="jabber.noxa.de" name="Server in Germany">
<active port="5222"/>
</item>
<item jid="jabber.nuxo.net" name="Server in France">
<active port="5222"/>
</item>
<item jid="jabber.obsidian.co.za" name="Server in South Africa">
<active port="5222"/>
</item>
<item jid="jabber.od.ua" name="">
<active port="5222"/>
</item>
<item jid="jabber.or.id" name="Indonesian Jabber server">
<active port="5222"/>
</item>
<item jid="jabber.org" name="Server hosted by the Jabber Software Foundation">
<active port="5222"/>
<digest algo="sha1" value="66:9B:DB:4F:85:B7:A2:26:4D:76:01:C1:14:ED:0A:A9:24:15:8C:85"/>
</item>
<item jid="jabber.org.au" name="Server in Australia">
<active port="5222"/>
</item>
<item jid="jabber.org.nz" name="">
<active port="5222"/>
</item>
<item jid="jabber.palomine.net" name="Server located in Delray Beach, Florida">
<active port="5222"/>
</item>
<item jid="jabber.papla.pl" name="">
<active port="5222"/>
</item>
<item jid="jabber.pilgerer.de" name="">
<active port="5222"/>
</item>
<item jid="jabber.ru" name="Russian Jabber server">
<active port="5222"/>
</item>
<item jid="jabber.sim.pl" name="">
<active port="5222"/>
</item>
<item jid="jabber.sk" name="Slovak Jabber server">
<active port="5222"/>
<digest algo="sha1" value="EB:2C:ED:CC:FD:C1:F8:8F:58:07:CE:EF:09:0F:72:45:5E:1E:7A:96"/>
</item>
<item jid="jabber.snc.ru" name="Jabber server in Russia">
<active port="5222"/>
</item>
<item jid="jabber.te.ua" name="Server in Ukraine">
<active port="5222"/>
</item>
<item jid="jabber.ttn.ru" name="">
<active port="5222"/>
</item>
<item jid="jabber.turk-php.com" name="">
<active port="5222"/>
</item>
<item jid="jabber.tuxfamily.org" name="">
<active port="5222"/>
</item>
<item jid="jabber.typhon.net" name="">
<active port="5222"/>
</item>
<item jid="jabber.unesco.kz" name="First public server in Kazakhstan">
<active port="5222"/>
</item>
<item jid="jabber.unixfreunde.net" name="">
<active port="5222"/>
</item>
<item jid="jabber.unoc.net" name="">
<active port="5222"/>
</item>
<item jid="jabber.wiretrip.org" name="Jabber server from wiretrip.org">
<active port="5222"/>
</item>
<item jid="jabber.wp.pl" name="Large Jabber server in Poland">
<active port="5222"/>
</item>
<item jid="jabber.wroc.pl" name="">
<active port="5222"/>
</item>
<item jid="jabber.xs4all.nl" name="">
<active port="5222"/>
</item>
<item jid="jabber80.com" name="Jabber server over port 80 (SSL over port 443)">
<active port="80"/>
</item>
<item jid="jabberafrica.org" name="Jabber server in Africa">
<active port="5222"/>
</item>
<item jid="jabberes.org" name="Servidor Jabber de la comunidad hispana">
<active port="5222"/>
</item>
<item jid="jabberme.de" name="">
<active port="5222"/>
</item>
<item jid="jabbernet.dk" name="Jabber server in Denmark">
<active port="5222"/>
</item>
<item jid="jabbernuke.com" name="">
<active port="5222"/>
</item>
<item jid="jabberpl.org" name="Jabber server in Poland">
<active port="5222"/>
</item>
<item jid="jaim.at" name="">
<active port="5222"/>
</item>
<item jid="manya.urbanturban.no" name="">
<active port="5222"/>
</item>
<item jid="myjabber.net" name="The public Jabber server hosted by MyJabber">
<active port="5222"/>
</item>
<item jid="nedbsd.nl" name="Jabber server in the Netherlands">
<active port="5222"/>
</item>
<item jid="nedlinux.nl" name="Jabber server in the Netherlands">
<active port="5222"/>
</item>
<item jid="netmindz.net" name="">
<active port="5222"/>
</item>
<item jid="njs.netlab.cz" name="Czech Jabber server">
<active port="5222"/>
</item>
<item jid="nureality.ca" name="Public server provided by Nureality Networks">
<active port="5222"/>
</item>
<item jid="oborona.net" name="">
<active port="5222"/>
</item>
<item jid="om.beeonline.ru" name="">
<active port="5222"/>
</item>
<item jid="pan.ubishops.ca" name="Server run by the computer science club at Bishops University in Quebec.">
<active port="5222"/>
</item>
<item jid="pandion.be" name="">
<active port="5222"/>
</item>
<item jid="penwritten.com" name="">
<active port="5222"/>
</item>
<item jid="piramida.slask.pl" name="">
<active port="5222"/>
</item>
<item jid="pointblue.com.pl" name="">
<active port="5223"/>
</item>
<item jid="pono.mauiholm.org" name="">
<active port="5222"/>
</item>
<item jid="selfnet.at" name="">
<active port="5222"/>
</item>
<item jid="sistemas.unsa.edu.ar" name="Jabber server in Argentina">
<active port="5222"/>
</item>
<item jid="sourcecode.de" name="Server in Germany">
<active port="5222"/>
</item>
<item jid="sparetimegroup.net" name="Server in Romania">
<active port="5222"/>
</item>
<item jid="swissjabber.ch" name="Swiss Jabber server">
<active port="5222"/>
</item>
<item jid="swissjabber.de" name="Jabber server in Switzerland">
<active port="5222"/>
</item>
<item jid="swissjabber.li" name="Jabber server in Liechtenstein">
<active port="5222"/>
</item>
<item jid="swissjabber.org" name="Jabber server in Switzerland">
<active port="5222"/>
</item>
<item jid="syndicon.de" name="Server in Germany">
<active port="5222"/>
</item>
<item jid="tipic.com" name="Public server hosted by Tipic">
<active port="5222"/>
</item>
<item jid="transactim.net" name="Server hosted by TransactIM">
<active port="5222"/>
</item>
<item jid="unstable.nl" name="Server in the Netherlands">
<active port="5222"/>
</item>
<item jid="ursine.ca" name="">
<active port="5222"/>
</item>
<item jid="volgograd.ru" name="">
<active port="5222"/>
</item>
<item jid="xmpp.ru" name="">
<active port="5222"/>
</item>
<item jid="xmpp.us" name="">
<active port="5222"/>
</item>
<item jid="gajim.org" name="Official server of Gajim" hidden="True">
<active port="5222"/>
<digest algo="sha1" value="25:79:5D:AC:3A:62:C0:96:5A:C9:36:76:D8:B0:78:1F:AA:DA:79:18"/>
</item>
<?xml version="1.0"?>
<!--
This file lists the open XMPP servers registered with the XSF.
The format of this file is defined by the Service Discovery
protocol: http://xmpp.org/extensions/xep-0030.html
To add your server to the list, follow the instructions at
http://xmpp.org/services/register.shtml
-->
<query>
<item jid="0nl1ne.at"/>
<item jid="binaryfreedom.info"/>
<item jid="boese-ban.de"/>
<item jid="brauchen.info"/>
<item jid="cassilis.net"/>
<item jid="chatmask.com"/>
<item jid="climm.org"/>
<item jid="codingteam.net"/>
<item jid="darkdna.net"/>
<item jid="default.rs"/>
<item jid="deshalbfrei.org"/>
<item jid="draugr.de"/>
<item jid="im.apinc.org"/>
<item jid="im.flosoft.biz"/>
<item jid="internet-exception.de"/>
<item jid="jabber.ccc.de"/>
<item jid="jabber.chaotic.de"/>
<item jid="jabber.co.nz"/>
<item jid="jabber.cz"/>
<item jid="jabber.fourecks.de"/>
<item jid="jabber.fsinf.at"/>
<item jid="jabber.hot-chilli.net"/>
<item jid="jabber.iitsp.com"/>
<item jid="jabber.i-pobox.net"/>
<item jid="jabber.loudas.com"/>
<item jid="jabber.minus273.org"/>
<item jid="jabber.no"/>
<item jid="jabber.org"/>
<item jid="jabber.rootbash.com"/>
<item jid="jabber.rueckgr.at"/>
<item jid="jabber.scha.de"/>
<item jid="jabber.second-home.de"/>
<item jid="jabber.sow.as"/>
<item jid="jabber.tmkis.com"/>
<item jid="jabber.yeahnah.co.nz"/>
<item jid="jabber-br.org"/>
<item jid="jabber-hispano.org"/>
<item jid="jabberbr.com"/>
<item jid="jabberd.eu"/>
<item jid="jabberes.org"/>
<item jid="jabberim.de"/>
<item jid="jabbim.com"/>
<item jid="jabbim.cz"/>
<item jid="jabbim.pl"/>
<item jid="jabbim.sk"/>
<item jid="jabme.de"/>
<item jid="jabster.pl"/>
<item jid="jaim.at"/>
<item jid="lethyro.net"/>
<item jid="limun.org"/>
<item jid="linuxlovers.at"/>
<item jid="macjabber.de"/>
<item jid="na-di.de"/>
<item jid="neko.im"/>
<item jid="netmindz.net"/>
<item jid="njs.netlab.cz"/>
<item jid="pandion.im"/>
<item jid="programmer-art.org"/>
<item jid="richim.org"/>
<item jid="sternenschweif.de"/>
<item jid="swissjabber.ch"/>
<item jid="ubuntu-jabber.de"/>
<item jid="thiessen.im"/>
<item jid="thiessen.it"/>
<item jid="thiessen.org"/>
<item jid="ubuntu-jabber.net"/>
<item jid="verdammung.org"/>
<item jid="xabber.de"/>
<item jid="xmpp.jp"/>
<item jid="xmppnet.de"/>
<item jid="zsim.de"/>
</query>

View file

@ -3,4 +3,7 @@ gajim for Debian
If you want to use OpenPGP in gajim, you have to install python-gnupginterface.
For video chat support, you have to install python-farsight.
-- Yann Le Boulanger <asterix@lagaule.org>, Mon, 20 Jun 2005 12:02:31 +0200
-- Julien Valroff <julien@debian.org> Sat, 07 May 2011 13:50:27 +0200

24
debian/changelog vendored
View file

@ -1,8 +1,26 @@
gajim (0.13.90-1) unstable; urgency=low
gajim (0.14.1-1) unstable; urgency=low
* New upstream release.
[ Yann Leboulanger ]
* New upstream release. Closes: #604966
* Correctly sanitize menuentries in chat window action context menu.
Closes: #574839
* Fix traceback when closing file request dialog. Closes: #587186
* Recommend python-openssl >= 0.9. Closes: #594772
* Improve a string. Closes: #553527
* Fix cancelling file transfer. Closes: #587679
-- Yann Leboulanger <asterix@lagaule.org> Sat, 24 Jul 2010 10:25:26 +0200
[ Julien Valroff ]
* Switch to dh from CDBS and drop unused (build-)dependencies.
* Switch to dh_python2 from pysupport. Closes: #616819
* Drop useless debian/dirs.
* Switch to 3.0 (quilt) source format.
* Update Standards-Version to 3.9.2.
* Remove useless and unused shlibs:Depends substvar.
* Add a note about python-farsight in README.Debian.
* Add patch and use dh_autoreconf to remove build-dependencies on
python-dev, python-gtk2-dev and libgtk2.0-dev.
-- Yann Leboulanger <asterix@lagaule.org> Sat, 07 May 2011 16:01:37 +0200
gajim (0.13.4-1) unstable; urgency=low

11
debian/control vendored
View file

@ -2,19 +2,16 @@ Source: gajim
Section: net
Priority: optional
Maintainer: Yann Leboulanger <asterix@lagaule.org>
Build-Depends: debhelper (>= 7), cdbs (>= 0.4.43), python-support (>= 0.7.1), python-dev, libgtk2.0-dev, python-gtk2-dev, gettext (>= 0.17-4), intltool (>= 0.40.1), imagemagick
Build-Conflicts: python2.3
XS-Python-Version: >= 2.5
Standards-Version: 3.8.3
Build-Depends: debhelper (>= 7.0.50~), python (>= 2.6.6-3~), dh-autoreconf, gettext (>= 0.17-4), intltool (>= 0.40.1), imagemagick, libglib2.0-dev
Standards-Version: 3.9.2
Homepage: http://www.gajim.org
Vcs-Hg: http://hg.gajim.org/gajim/
Vcs-Browser: http://hg.gajim.org/gajim/file
Package: gajim
Architecture: all
XB-Python-Version: ${python:Versions}
Depends: ${misc:Depends}, ${shlibs:Depends}, ${python:Depends}, python-support (>= 0.7.1), python-glade2 (>= 2.12.0), python-gtk2 (>= 2.12.0), dnsutils
Recommends: dbus, python-dbus, notification-daemon, python-gnupginterface, python-openssl, python-crypto
Depends: ${misc:Depends}, ${python:Depends}, python-gtk2 (>= 2.16.0), dnsutils
Recommends: dbus, python-dbus, notification-daemon, python-gnupginterface, python-openssl (>= 0.9), python-crypto
Suggests: python-gconf, python-gnome2, nautilus-sendto, avahi-daemon, python-avahi, network-manager, libgtkspell0, aspell-en, python-gnomekeyring, gnome-keyring, python-sexy, python-kerberos (>= 1.1), texlive-latex-base, dvipng, python-farsight, gstreamer0.10-plugins-ugly
Description: Jabber client written in PyGTK
Gajim is a Jabber client. It has a tabbed user interface with normal chats,

3
debian/copyright vendored
View file

@ -7,10 +7,9 @@ It was downloaded from:
Upstream Authors:
- Alexander Cherniuk <ts33kr@gmail.com>
- Yann Le Boulanger <asterix@lagaule.org>
- Jonathan Schleifer <js-gajim@webkeks.org>
Copyright: (c) 2003-2010 Gajim Team
Copyright: (c) 2003-2011 Gajim Team
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

8
debian/dirs vendored
View file

@ -1,8 +0,0 @@
usr/bin
usr/share/gajim
usr/share/man/man1
usr/share/pixmaps
usr/share/applications
usr/share/menu
usr/share/lintian/overrides
usr/lib/gajim

23
debian/patches/00_debian-copying.diff vendored Normal file
View file

@ -0,0 +1,23 @@
Description: don't install useless COPYING file
Forwarded: not-neded
--- a/Makefile.am
+++ b/Makefile.am
@@ -8,7 +8,6 @@
docfiles_DATA = README \
README.html \
ChangeLog \
- COPYING \
THANKS \
THANKS.artists \
AUTHORS
--- a/Makefile.in
+++ b/Makefile.in
@@ -299,7 +299,6 @@
docfiles_DATA = README \
README.html \
ChangeLog \
- COPYING \
THANKS \
THANKS.artists \
AUTHORS

View file

@ -1,22 +0,0 @@
Index: Makefile.am
===================================================================
--- Makefile.am (revision 7202)
+++ Makefile.am (working copy)
@@ -9,7 +9,6 @@
docfiles_DATA = README \
README.html \
ChangeLog \
- COPYING \
THANKS \
AUTHORS
--- Makefile.in
+++ Makefile.in
@@ -273,7 +273,6 @@
docfiles_DATA = README \
README.html \
ChangeLog \
- COPYING \
THANKS \
AUTHORS

34
debian/patches/01_configure-ac.diff vendored Normal file
View file

@ -0,0 +1,34 @@
Description: don't require python headers to remove build-dep on python-dev and python-gtk2-dev
Author: Yann Leboulanger <asterix@lagaule.org>
Origin: upstream,http://hg.gajim.org/gajim/diff/252bb3cf2c59/configure.ac
Last-Update: 2011-05-07
--- a/configure.ac
+++ b/configure.ac
@@ -36,25 +36,10 @@
AM_NLS
-dnl ****
-dnl pygtk and gtk+
-dnl ****
-PKG_CHECK_MODULES([PYGTK], [gtk+-2.0 >= 2.16.0 pygtk-2.0 >= 2.16.0])
-AC_SUBST(PYGTK_CFLAGS)
-AC_SUBST(PYGTK_LIBS)
-PYGTK_DEFS=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
-AC_SUBST(PYGTK_DEFS)
-
-AM_PATH_PYTHON([2.5])
-if test "x$PYTHON" = "x:"; then
- AC_MSG_ERROR([Python not found])
-fi
-
ACLOCAL_AMFLAGS="\${ACLOCAL_FLAGS}"
AC_SUBST(ACLOCAL_AMFLAGS)
-AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
-AC_SUBST([PYTHON_INCLUDES])
+AM_PATH_PYTHON([2.5])
dnl ****
dnl enable installation in python-2.x/site-packages/gajim

2
debian/patches/series vendored Normal file
View file

@ -0,0 +1,2 @@
00_debian-copying.diff
01_configure-ac.diff

28
debian/rules vendored
View file

@ -1,17 +1,19 @@
#!/usr/bin/make -f
DEB_PYTHON_SYSTEM=pysupport
# Debhelper must be included before python-distutils to use
# # # dh_python / dh_pycentral / dh_pysupport
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/rules/simple-patchsys.mk
include /usr/share/cdbs/1/class/autotools.mk
%:
dh $@ --with python2,autoreconf
DEB_CONFIGURE_EXTRA_FLAGS := --prefix=/usr
DEB_MAKE_BUILD_TARGET := all
DEB_MAKE_INSTALL_TARGET = install DESTDIR=$(DEB_DESTDIR)
# test target is broken
override_dh_auto_test:
binary-install/gajim::
rm $(DEB_DESTDIR)/usr/share/gajim/src/common/GnuPGInterface.py*
dh_pysupport -pgajim
convert $(DEB_DESTDIR)/usr/share/icons/hicolor/64x64/apps/gajim.png -resize 32x32 $(DEB_DESTDIR)/usr/share/pixmaps/gajim.xpm
override_dh_auto_configure:
convert icons/hicolor/64x64/apps/gajim.png -resize 32x32 debian/gajim.xpm
dh_auto_configure
override_dh_auto_install:
dh_auto_install
rm debian/gajim/usr/share/gajim/src/common/GnuPGInterface.py*
override_dh_auto_clean:
-rm -f debian/gajim.xpm
dh_auto_clean

View file

@ -146,48 +146,49 @@ Section "Gajim" SecGajim
File "THANKS.artists"
SetOutPath "$INSTDIR\bin"
File "bin\cairo._cairo.pyd"
File "bin\_ctypes.pyd"
File "bin\gobject._gobject.pyd"
File "bin\gtk._gtk.pyd"
File "bin\_hashlib.pyd"
File "bin\_socket.pyd"
File "bin\_sqlite3.pyd"
File "bin\_ssl.pyd"
File "bin\_win32sysloader.pyd"
File "bin\Crypto.Cipher.AES.pyd"
File "bin\atk.pyd"
File "bin\bz2.pyd"
File "bin\OpenSSL.crypto.pyd"
File "bin\cairo._cairo.pyd"
File "bin\Crypto.Cipher.AES.pyd"
File "bin\Crypto.Hash.SHA256.pyd"
File "bin\Crypto.Random.OSRNG.winrandom.pyd"
File "bin\Crypto.Util._counter.pyd"
File "bin\gajim.exe"
File "bin\gio._gio.pyd"
File "bin\glib._glib.pyd"
File "bin\gobject._gobject.pyd"
File "bin\gtk._gtk.pyd"
File "bin\history_manager.exe"
File "bin\OpenSSL.crypto.pyd"
File "bin\libeay32.dll"
File "bin\library.zip"
File "bin\libxml2.dll"
File "bin\msvcr71.dll"
File "bin\pangocairo.pyd"
File "bin\pango.pyd"
File "bin\pyexpat.pyd"
File "bin\python25.dll"
File "bin\pywintypes25.dll"
File "bin\python26.dll"
File "bin\pywintypes26.dll"
File "bin\OpenSSL.rand.pyd"
File "bin\select.pyd"
File "bin\sqlite3.dll"
File "bin\ssleay32.dll"
File "bin\OpenSSL.SSL.pyd"
File "bin\unicodedata.pyd"
File "bin\w9xpopen.exe"
File "bin\win32api.pyd"
File "bin\win32file.pyd"
File "bin\win32pipe.pyd"
File "bin\winsound.pyd"
File "bin\zlib1.dll"
File /r "bin\docutils"
File "msvcr90.dll"
WriteRegStr HKCU "Software\Gajim" "" $INSTDIR
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayName" "Gajim"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayIcon" "$INSTDIR\bin\Gajim.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayVersion" "0.12.1"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayVersion" "0.14.1"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "URLInfoAbout" "http://www.gajim.org/"
WriteUninstaller "$INSTDIR\Uninstall.exe"
@ -209,6 +210,9 @@ Section "Gajim" SecGajim
File /r "data\other"
File /r "data\pixmaps"
File /r "data\sounds"
SetOutPath "$INSTDIR\icons"
File /r "icons\hicolor"
SectionEnd
Section "Gtk+ 2" SecGtk
@ -641,39 +645,38 @@ Section "Uninstall"
Delete "$INSTDIR\bin\_hashlib.pyd"
Delete "$INSTDIR\bin\_socket.pyd"
Delete "$INSTDIR\bin\_sqlite3.pyd"
Delete "$INSTDIR\bin\_sqlite.pyd"
Delete "$INSTDIR\bin\_ssl.pyd"
Delete "$INSTDIR\bin\_win32sysloader.pyd"
Delete "$INSTDIR\bin\atk.pyd"
Delete "$INSTDIR\bin\bz2.pyd"
Delete "$INSTDIR\bin\cairo._cairo.pyd"
Delete "$INSTDIR\bin\Crypto.Cipher.AES.pyd"
Delete "$INSTDIR\bin\Crypto.Hash.SHA256.pyd"
Delete "$INSTDIR\bin\Crypto.Random.OSRNG.winrandom.pyd"
Delete "$INSTDIR\bin\Crypto.Util._counter.pyd"
Delete "$INSTDIR\bin\gajim.exe"
Delete "$INSTDIR\bin\gio._gio.pyd"
Delete "$INSTDIR\bin\glib._glib.pyd"
Delete "$INSTDIR\bin\gobject._gobject.pyd"
Delete "$INSTDIR\bin\gtk._gtk.pyd"
Delete "$INSTDIR\bin\history_manager.exe"
Delete "$INSTDIR\bin\libeay32.dll"
Delete "$INSTDIR\bin\library.zip"
Delete "$INSTDIR\bin\libxml2.dll"
Delete "$INSTDIR\bin\msvcr71.dll"
Delete "$INSTDIR\bin\OpenSSL.crypto.pyd"
Delete "$INSTDIR\bin\OpenSSL.rand.pyd"
Delete "$INSTDIR\bin\OpenSSL.SSL.pyd"
Delete "$INSTDIR\bin\pangocairo.pyd"
Delete "$INSTDIR\bin\pango.pyd"
Delete "$INSTDIR\bin\pangocairo.pyd"
Delete "$INSTDIR\bin\pyexpat.pyd"
Delete "$INSTDIR\bin\python25.dll"
Delete "$INSTDIR\bin\pywintypes25.dll"
Delete "$INSTDIR\bin\python26.dll"
Delete "$INSTDIR\bin\pywintypes26.dll"
Delete "$INSTDIR\bin\select.pyd"
Delete "$INSTDIR\bin\sqlite3.dll"
Delete "$INSTDIR\bin\ssleay32.dll"
Delete "$INSTDIR\bin\unicodedata.pyd"
Delete "$INSTDIR\bin\w9xpopen.exe"
Delete "$INSTDIR\bin\win32api.pyd"
Delete "$INSTDIR\bin\win32file.pyd"
Delete "$INSTDIR\bin\win32pipe.pyd"
Delete "$INSTDIR\bin\winsound.pyd"
Delete "$INSTDIR\bin\zlib1.dll"
RMDir /r "$INSTDIR\bin\docutils"
RMDir "$INSTDIR\bin"
RMDir /r "$INSTDIR\data\gui"
RMDir /r "$INSTDIR\data\moods"
@ -695,6 +698,8 @@ Section "Uninstall"
RMDir /r "$INSTDIR\data\iconsets\transports"
RMDir "$INSTDIR\data\iconsets"
RMDir "$INSTDIR\data"
RMDir /r "$INSTDIR\icons\hicolor"
RMDir "$INSTDIR\icons"
RMDir /r "$INSTDIR\po\be"
RMDir /r "$INSTDIR\po\be@latin"
RMDir /r "$INSTDIR\po\bg"

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

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

View file

@ -43,8 +43,8 @@ AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
[AC_REQUIRE([AM_PATH_PYTHON])
AC_MSG_CHECKING(for headers required to compile python extensions)
dnl deduce PYTHON_INCLUDES
py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
py_prefix=`$PYTHON -c "import sys; print(sys.prefix)"`
py_exec_prefix=`$PYTHON -c "import sys; print(sys.exec_prefix)"`
PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
if test "$py_prefix" != "$py_exec_prefix"; then
PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"

View file

@ -2,9 +2,16 @@ INCLUDES = \
$(PYTHON_INCLUDES)
gajimpluginsdir = $(gajim_pluginsdir)
nobase_dist_gajimplugins_PYTHON = \
$(srcdir)/*.py \
installedplugins = acronyms_expander banner_tweaks ftp_manager length_notifier whiteboard
installedpluginsfiles = $(wildcard ${srcdir}/${p}/*.py ${srcdir}/${p}/manifest.ini ${srcdir}/${p}/*.ui ${srcdir}/${p}/*.png)
nobase_dist_gajimplugins_PYTHON = $(foreach p, ${installedplugins}, $(installedpluginsfiles))
EXTRA_DIST = \
$(srcdir)/*/*.py \
$(srcdir)/*/manifest.ini \
$(srcdir)/*/*.ui
MAINTAINERCLEANFILES = Makefile.in

View file

@ -0,0 +1 @@
from acronyms_expander import AcronymsExpanderPlugin

View file

@ -33,12 +33,6 @@ from plugins import GajimPlugin
from plugins.helpers import log, log_calls
class AcronymsExpanderPlugin(GajimPlugin):
name = u'Acronyms Expander'
short_name = u'acronyms_expander'
version = u'0.1'
description = u'''Replaces acronyms (or other strings) with given expansions/substitutes.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('AcronymsExpanderPlugin')
def init(self):

View file

@ -0,0 +1,9 @@
[info]
name: Acronyms Expander
short_name: acronyms_expander
version: 0.1
description: Replaces acronyms (or other strings) with given expansions/substitutes.
authors: Mateusz Biliński <mateusz@bilinski.it>
homepage: http://blog.bilinski.it

View file

@ -0,0 +1,10 @@
[info]
name: Banner Tweaks
short_name: banner_tweaks
version: 0.1
description: Allows user to tweak chat window banner appearance (eg. make it compact).
Based on patch by pb in ticket #4133:
http://trac.gajim.org/attachment/ticket/4133.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -43,15 +43,6 @@ from plugins.helpers import log, log_calls
from plugins.gui import GajimPluginConfigDialog
class BannerTweaksPlugin(GajimPlugin):
name = u'Banner Tweaks'
short_name = u'banner_tweaks'
version = u'0.1'
description = u'''Allows user to tweak chat window banner appearance (eg. make it compact).
Based on patch by pb in ticket #4133:
http://trac.gajim.org/attachment/ticket/4133'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('BannerTweaksPlugin')
def init(self):
@ -88,7 +79,12 @@ http://trac.gajim.org/attachment/ticket/4133'''
chat_control.banner_status_label.set_markup(status_text)
if not self.config['show_banner_image']:
banner_status_img = chat_control.xml.get_object('banner_status_image')
if chat_control.TYPE_ID == message_control.TYPE_GC:
banner_status_img = chat_control.xml.get_object(
'gc_banner_status_image')
else:
banner_status_img = chat_control.xml.get_object(
'banner_status_image')
banner_status_img.clear()
# TODO: part below repeats a lot of code from ChatControl.draw_banner_text()

View file

@ -0,0 +1,10 @@
[info]
name: D-Bus Support
short_name: dbus
version: 0.1
description: D-Bus support. Based on remote_control module from
Gajim core but uses new events handling system.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -98,7 +98,8 @@ if dbus_support.supported:
class SignalObject(dbus.service.Object):
''' Local object definition for /org/gajim/dbus/RemoteObject.
(This docstring is not be visible, because the clients can access only the remote object.)'''
(This docstring is not be visible,
because the clients can access only the remote object.)'''
def __init__(self, bus_name):
self.first_show = True
@ -175,6 +176,10 @@ if dbus_support.supported:
def NewGmail(self, account_and_array):
pass
@dbus.service.signal(INTERFACE, signature='av')
def EntityTime(self, account_and_array):
pass
def raise_signal(self, signal, arg):
'''raise a signal, with a single argument of unspecified type
Instead of obj.raise_signal("Foo", bar), use obj.Foo(bar).'''
@ -625,7 +630,7 @@ if dbus_support.supported:
contact_dict['resources'] = dbus.Array([], signature='(sis)')
for contact in contacts:
resource_props = dbus.Struct((DBUS_STRING(contact.resource),
dbus.Int32(contact.priority), DBUS_STRING(contact.status)))
dbus.Int32(contact.priority), DBUS_STRING(contact.status)))
contact_dict['resources'].append(resource_props)
contact_dict['groups'] = dbus.Array([], signature='(s)')
for group in prim_contact.groups:
@ -680,13 +685,6 @@ from plugins.helpers import log_calls, log
from common import ged
class DBusPlugin(GajimPlugin):
name = u'D-Bus Support'
short_name = u'dbus'
version = u'0.1'
description = u'''D-Bus support. Based on remote_control module from
Gajim core but uses new events handling system.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('DBusPlugin')
def init(self):
@ -695,11 +693,11 @@ Gajim core but uses new events handling system.'''
#self.config_default_values = {}
self.events_names = ['Roster', 'AccountPresence', 'ContactPresence',
'ContactAbsence', 'ContactStatus', 'NewMessage',
'Subscribe', 'Subscribed', 'Unsubscribed',
'NewAccount', 'VcardInfo', 'LastStatusTime',
'OsInfo', 'GCPresence', 'GCMessage', 'RosterInfo',
'NewGmail']
'ContactAbsence', 'ContactStatus', 'NewMessage',
'Subscribe', 'Subscribed', 'Unsubscribed',
'NewAccount', 'VcardInfo', 'LastStatusTime',
'OsInfo', 'GCPresence', 'GCMessage', 'RosterInfo',
'NewGmail', 'EntityTime']
self.signal_object = None
@ -727,7 +725,7 @@ Gajim core but uses new events handling system.'''
self,
DBusPlugin))
self.events_handlers[event_name] = (ged.POSTCORE,
getattr(self, event_name))
getattr(self, event_name))
def _generate_handling_method(self, event_name):
def handler(self, arg):

View file

@ -0,0 +1,8 @@
[info]
name: Events Dump
short_name: events_dump
version: 0.1
description: Dumps info about selected events to console.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -33,12 +33,6 @@ from plugins.helpers import log_calls, log
from common import ged
class EventsDumpPlugin(GajimPlugin):
name = u'Events Dump'
short_name = u'events_dump'
version = u'0.1'
description = u'''Dumps info about selected events to console.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('EventsDumpPlugin')
def init(self):

View file

@ -0,0 +1 @@
from ftp_manager import FtpManager

View file

@ -0,0 +1,281 @@
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkTextBuffer" id="textbuffer1">
<property name="text" translatable="yes">Plug-in decription should be displayed here. This text will be erased during PluginsWindow initialization.</property>
</object>
<object class="GtkWindow" id="window1">
<child>
<object class="GtkHPaned" id="hpaned2">
<property name="width_request">600</property>
<property name="height_request">350</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="position">340</property>
<property name="position_set">True</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="border_width">6</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="available_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="search_column">1</property>
</object>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox4">
<property name="visible">True</property>
<property name="border_width">5</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="plugin_name_label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;empty&gt;</property>
<property name="selectable">True</property>
<property name="ellipsize">end</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox8">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="label" translatable="yes">Authors:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="plugin_authors_label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="xpad">6</property>
<property name="label" translatable="yes">&lt;empty&gt;</property>
<property name="selectable">True</property>
<property name="ellipsize">end</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox9">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="label" translatable="yes">Homepage:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLinkButton" id="plugin_homepage_linkbutton1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox5">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkHBox" id="hbox10">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="label" translatable="yes">Description:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
</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="GtkTextView" id="plugin_description_textview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="pixels_above_lines">6</property>
<property name="wrap_mode">word</property>
<property name="left_margin">6</property>
<property name="right_margin">6</property>
<property name="indent">1</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox15">
<property name="visible">True</property>
<child>
<object class="GtkProgressBar" id="progressbar">
<property name="ellipsize">end</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox3">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="inslall_upgrade_button">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_inslall_upgrade_clicked"/>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-refresh</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Install/Upgrade</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="window2">
<child>
<object class="GtkHBox" id="hbox111">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Ftp server:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="ftp_server">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View file

@ -0,0 +1,460 @@
# -*- coding: utf-8 -*-
#
## plugins/ftp_manager/ftp_manager.py
##
## Copyright (C) 2010 Denis Fomin <fominde AT gmail.com>
##
## This file is part of Gajim.
##
## Gajim is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 3 only.
##
## Gajim is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
import gtk
import pango
import gobject
import ftplib
import io
import threading
import ConfigParser
import os
import fnmatch
import sys
from common import gajim
from plugins import GajimPlugin
from plugins.helpers import log_calls, log
from dialogs import WarningDialog, HigDialog
from plugins.gui import GajimPluginConfigDialog
from common import i18n
class FtpManager(GajimPlugin):
@log_calls('FtpManagerPlugin')
def init(self):
self.config_dialog = FtpManagerPluginConfigDialog(self)
self.config_default_values = {'ftp_server': ('ftp.gajim.org', '')}
@log_calls('FtpManagerPlugin')
def activate(self):
self.pl_menuitem = gajim.interface.roster.xml.get_object(
'plugins_menuitem')
self.id_ = self.pl_menuitem.connect_after('activate', self.on_activate)
if 'plugins' in gajim.interface.instances:
self.on_activate(None)
@log_calls('FtpManagerPlugin')
def deactivate(self):
self.pl_menuitem.disconnect(self.id_)
if hasattr(self, 'page_num'):
self.notebook.remove_page(self.page_num)
self.notebook.set_current_page(0)
if hasattr(self, 'ftp'):
del self.ftp
def on_activate(self, widget):
if 'plugins' not in gajim.interface.instances:
return
self.installed_plugins_model = gajim.interface.instances[
'plugins'].installed_plugins_model
self.notebook = gajim.interface.instances['plugins'].plugins_notebook
self.id_n = self.notebook.connect('switch-page',
self.on_notebook_switch_page)
self.window = gajim.interface.instances['plugins'].window
self.window.connect('destroy', self.on_win_destroy)
self.GTK_BUILDER_FILE_PATH = self.local_file_path(
'config_dialog.ui')
self.xml = gtk.Builder()
self.xml.set_translation_domain(i18n.APP)
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
['hpaned2'])
hpaned = self.xml.get_object('hpaned2')
self.page_num = self.notebook.append_page(hpaned,
gtk.Label('Ftp Manager'))
widgets_to_extract = ('plugin_name_label1',
'available_treeview', 'progressbar', 'inslall_upgrade_button',
'plugin_authors_label1', 'plugin_authors_label1',
'plugin_homepage_linkbutton1', 'plugin_description_textview1')
for widget_name in widgets_to_extract:
setattr(self, widget_name, self.xml.get_object(widget_name))
attr_list = pango.AttrList()
attr_list.insert(pango.AttrWeight(pango.WEIGHT_BOLD, 0, -1))
self.plugin_name_label1.set_attributes(attr_list)
self.available_plugins_model = gtk.ListStore(gobject.TYPE_PYOBJECT,
gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING,
gobject.TYPE_BOOLEAN, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT,
gobject.TYPE_PYOBJECT)
self.available_treeview.set_model(self.available_plugins_model)
self.progressbar.set_property('no-show-all', True)
renderer = gtk.CellRendererText()
col = gtk.TreeViewColumn(_('Plugin'), renderer, text=1)
col.set_resizable(True)
col.set_property('expand', True)
col.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY)
self.available_treeview.append_column(col)
col = gtk.TreeViewColumn(_('Installed\nversion'), renderer, text=2)
self.available_treeview.append_column(col)
col = gtk.TreeViewColumn(_('Available\nversion'), renderer, text=3)
col.set_property('expand', False)
self.available_treeview.append_column(col)
renderer = gtk.CellRendererToggle()
renderer.set_property('activatable', True)
renderer.connect('toggled', self.available_plugins_toggled_cb)
col = gtk.TreeViewColumn(_('Install /\nUpgrade'), renderer, active=4)
self.available_treeview.append_column(col)
if gobject.signal_lookup('error_signal', self.window) is 0:
gobject.signal_new('error_signal', self.window,
gobject.SIGNAL_RUN_LAST, gobject.TYPE_STRING,
(gobject.TYPE_STRING,))
gobject.signal_new('plugin_downloaded', self.window,
gobject.SIGNAL_RUN_LAST, gobject.TYPE_STRING,
(gobject.TYPE_PYOBJECT,))
self.window.connect('error_signal', self.on_some_ftp_error)
self.window.connect('plugin_downloaded', self.on_plugin_downloaded)
selection = self.available_treeview.get_selection()
selection.connect('changed',
self.available_plugins_treeview_selection_changed)
selection.set_mode(gtk.SELECTION_SINGLE)
self._clear_available_plugin_info()
self.xml.connect_signals(self)
self.window.show_all()
def on_win_destroy(self, widget):
if hasattr(self, 'ftp'):
del self.ftp
def available_plugins_toggled_cb(self, cell, path):
is_active = self.available_plugins_model[path][4]
self.available_plugins_model[path][4] = not is_active
dir_list = []
for i in xrange(len(self.available_plugins_model)):
if self.available_plugins_model[i][4]:
dir_list.append(self.available_plugins_model[i][0])
if not dir_list:
self.inslall_upgrade_button.set_property('sensitive', False)
else:
self.inslall_upgrade_button.set_property('sensitive', True)
def on_notebook_switch_page(self, widget, page, page_num,):
if not hasattr(self, 'ftp') and self.page_num == page_num:
self.available_plugins_model.clear()
self.progressbar.show()
self.ftp = Ftp(self)
self.ftp.remote_dirs = None
self.ftp.start()
def on_inslall_upgrade_clicked(self, widget):
self.inslall_upgrade_button.set_property('sensitive', False)
dir_list = []
for i in xrange(len(self.available_plugins_model)):
if self.available_plugins_model[i][4]:
dir_list.append(self.available_plugins_model[i][0])
ftp = Ftp(self)
ftp.remote_dirs = dir_list
ftp.start()
def on_some_ftp_error(self, widget, error_text):
for i in xrange(len(self.available_plugins_model)):
self.available_plugins_model[i][4] = False
self.progressbar.hide()
WarningDialog('Ftp error', error_text, self.window)
def on_plugin_downloaded(self, widget, plugin_dirs):
for _dir in plugin_dirs:
is_active = False
plugins = None
plugin_dir = os.path.join(gajim.PLUGINS_DIRS[1], _dir)
plugin = gajim.plugin_manager.get_plugin_by_path(plugin_dir)
if plugin:
if plugin.active and plugin.name != self.name:
is_active = True
gobject.idle_add(gajim.plugin_manager.deactivate_plugin,
plugin)
gajim.plugin_manager.plugins.remove(plugin)
model = self.installed_plugins_model
for row in xrange(len(model)):
if plugin == model[row][0]:
model.remove(model.get_iter((row, 0)))
break
plugins = self.scan_dir_for_plugin(plugin_dir)
if not plugins:
continue
gajim.plugin_manager.add_plugin(plugins[0])
plugin = gajim.plugin_manager.plugins[-1]
for row in xrange(len(self.available_plugins_model)):
if plugin.name == self.available_plugins_model[row][1]:
self.available_plugins_model[row][2] = plugin.version
self.available_plugins_model[row][4] = False
continue
if is_active and plugin.name != self.name:
gobject.idle_add(gajim.plugin_manager.activate_plugin, plugin)
if plugin.name != 'Ftp Manager':
self.installed_plugins_model.append([plugin, plugin.name,
is_active])
dialog = HigDialog(None, gtk.MESSAGE_INFO, gtk.BUTTONS_OK,
'', 'All selected plugins downloaded')
dialog.set_modal(False)
dialog.set_transient_for(self.window)
dialog.popup()
def available_plugins_treeview_selection_changed(self, treeview_selection):
model, iter = treeview_selection.get_selected()
if iter:
self.plugin_name_label1.set_text(model.get_value(iter, 1))
self.plugin_authors_label1.set_text(model.get_value(iter, 6))
self.plugin_homepage_linkbutton1.set_uri(model.get_value(iter, 7))
self.plugin_homepage_linkbutton1.set_label(model.get_value(iter, 7))
label = self.plugin_homepage_linkbutton1.get_children()[0]
label.set_ellipsize(pango.ELLIPSIZE_END)
self.plugin_homepage_linkbutton1.set_property('sensitive', True)
desc_textbuffer = self.plugin_description_textview1.get_buffer()
desc_textbuffer.set_text(model.get_value(iter, 5))
self.plugin_description_textview1.set_property('sensitive', True)
else:
self._clear_available_plugin_info()
def _clear_available_plugin_info(self):
self.plugin_name_label1.set_text('')
self.plugin_authors_label1.set_text('')
self.plugin_homepage_linkbutton1.set_uri('')
self.plugin_homepage_linkbutton1.set_label('')
self.plugin_homepage_linkbutton1.set_property('sensitive', False)
desc_textbuffer = self.plugin_description_textview1.get_buffer()
desc_textbuffer.set_text('')
self.plugin_description_textview1.set_property('sensitive', False)
def scan_dir_for_plugin(self, path):
plugins_found = []
conf = ConfigParser.ConfigParser()
fields = ('name', 'short_name', 'version', 'description', 'authors',
'homepage')
if not os.path.isdir(path):
return plugins_found
dir_list = os.listdir(path)
dir_, mod = os.path.split(path)
sys.path.insert(0, dir_)
manifest_path = os.path.join(path, 'manifest.ini')
if not os.path.isfile(manifest_path):
return plugins_found
for elem_name in dir_list:
file_path = os.path.join(path, elem_name)
module = None
if os.path.isfile(file_path) and fnmatch.fnmatch(file_path, '*.py'):
module_name = os.path.splitext(elem_name)[0]
if module_name == '__init__':
continue
try:
module = __import__('%s.%s' % (mod, module_name))
except ValueError, value_error:
pass
except ImportError, import_error:
pass
except AttributeError, attribute_error:
pass
if module is None:
continue
for module_attr_name in [attr_name for attr_name in dir(module)
if not (attr_name.startswith('__') or attr_name.endswith('__'))]:
module_attr = getattr(module, module_attr_name)
try:
if not issubclass(module_attr, GajimPlugin) or \
module_attr is GajimPlugin:
continue
module_attr.__path__ = os.path.abspath(os.path.dirname(
file_path))
# read metadata from manifest.ini
conf.readfp(open(manifest_path, 'r'))
for option in fields:
if conf.get('info', option) is '':
raise ConfigParser.NoOptionError, 'field empty'
setattr(module_attr, option, conf.get('info', option))
conf.remove_section('info')
plugins_found.append(module_attr)
except TypeError, type_error:
pass
except ConfigParser.NoOptionError, type_error:
# all fields are required
pass
return plugins_found
class Ftp(threading.Thread):
def __init__(self, plugin):
super(Ftp, self).__init__()
self.window = plugin.window
self.server = plugin.config['ftp_server']
self.progressbar = plugin.progressbar
self.model = plugin.available_plugins_model
self.config = ConfigParser.ConfigParser()
self.buffer_ = io.BytesIO()
self.remote_dirs = None
self.append_to_model = True
def model_append(self, row):
self.model.append(row)
return False
def progressbar_pulse(self):
self.progressbar.pulse()
return True
def get_plugin_version(self, plugin_name):
for plugin in gajim.plugin_manager.plugins:
if plugin.name == plugin_name:
return plugin.version
def run(self):
try:
gobject.idle_add(self.progressbar.set_text,
'Connecting to server')
self.ftp = ftplib.FTP(self.server)
self.ftp.login()
self.ftp.cwd('plugins')
if not self.remote_dirs:
self.plugins_dirs = self.ftp.nlst()
progress_step = 1.0 / len(self.plugins_dirs)
gobject.idle_add(self.progressbar.set_text,
'Scan files on the server')
for dir_ in self.plugins_dirs:
fract = self.progressbar.get_fraction() + progress_step
gobject.idle_add(self.progressbar.set_fraction, fract)
gobject.idle_add(self.progressbar.set_text,
'Read "%s"' % dir_)
try:
self.ftp.retrbinary('RETR %s/manifest.ini' % dir_,
self.handleDownload)
except Exception, error:
if str(error).startswith('550'):
continue
self.config.readfp(io.BytesIO(self.buffer_.getvalue()))
local_version = self.get_plugin_version(
self.config.get('info', 'name'))
gobject.idle_add(self.model_append, [dir_,
self.config.get('info', 'name'), local_version,
self.config.get('info', 'version'), False,
self.config.get('info', 'description'),
self.config.get('info', 'authors'),
self.config.get('info', 'homepage'), ])
self.plugins_dirs = None
self.ftp.quit()
gobject.idle_add(self.progressbar.set_fraction, 0)
if self.remote_dirs:
self.download_plugin()
gobject.idle_add(self.progressbar.hide)
except Exception, e:
self.window.emit('error_signal', str(e))
def handleDownload(self, block):
self.buffer_.write(block)
def download_plugin(self):
gobject.idle_add(self.progressbar.show)
self.pulse = gobject.timeout_add(150, self.progressbar_pulse)
gobject.idle_add(self.progressbar.set_text,
'Create a list of files')
for remote_dir in self.remote_dirs:
def nlstr(dir_, subdir=None):
if subdir:
dir_ = dir_ + '/' + subdir
list_ = self.ftp.nlst(dir_)
for i in list_:
name = i.split('/')[-1]
if '.' not in name:
try:
if i == self.ftp.nlst(i)[0]:
files.append(i[1:])
del dirs[i[1:]]
except Exception, e:
# empty dir or file
continue
dirs.append(i[1:])
subdirs = name
nlstr(dir_, subdirs)
else:
files.append(i[1:])
dirs, files = [], []
nlstr('/plugins/' + remote_dir)
if not os.path.isdir(gajim.PLUGINS_DIRS[1]):
os.mkdir(gajim.PLUGINS_DIRS[1])
local_dir = ld = os.path.join(gajim.PLUGINS_DIRS[1], remote_dir)
if not os.path.isdir(local_dir):
os.mkdir(local_dir)
local_dir = os.path.split(gajim.PLUGINS_DIRS[1])[0]
# creating dirs
for dir_ in dirs:
try:
os.mkdir(os.path.join(local_dir, dir_))
except OSError, e:
if str(e).startswith('[Errno 17]'):
continue
raise
# downloading files
for filename in files:
gobject.idle_add(self.progressbar.set_text,
'Downloading "%s"' % filename)
full_filename = os.path.join(local_dir, filename)
try:
self.ftp.retrbinary('RETR /%s' % filename,
open(full_filename, 'wb').write)
#full_filename.close()
except ftplib.error_perm:
print 'ERROR: cannot read file "%s"' % filename
os.unlink(filename)
self.ftp.quit()
self.window.emit('plugin_downloaded', self.remote_dirs)
gobject.source_remove(self.pulse)
class FtpManagerPluginConfigDialog(GajimPluginConfigDialog):
def init(self):
self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
'config_dialog.ui')
self.xml = gtk.Builder()
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
['hbox111'])
hbox = self.xml.get_object('hbox111')
self.child.pack_start(hbox)
self.xml.connect_signals(self)
self.connect('hide', self.on_hide)
def on_run(self):
widget = self.xml.get_object('ftp_server')
widget.set_text(str(self.plugin.config['ftp_server']))
def on_hide(self, widget):
widget = self.xml.get_object('ftp_server')
self.plugin.config['ftp_server'] = widget.get_text()

View file

@ -0,0 +1,7 @@
[info]
name: Ftp Manager
short_name: ftp_manager
version: 0.3
description: Install and upgrade plugins from ftp
authors: Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/

View file

@ -0,0 +1,8 @@
[info]
name: Google Translation
short_name: google_translation
version: 0.1
description: Translates (currently only incoming) messages using Google Translate.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -30,6 +30,7 @@ import re
import urllib2
import new
from pprint import pformat
from sys import getfilesystemencoding
from common import helpers
from common import gajim
@ -40,56 +41,54 @@ from common import ged
from common import nec
class GoogleTranslationPlugin(GajimPlugin):
name = u'Google Translation'
short_name = u'google_translation'
version = u'0.1'
description = u'''Translates (currently only incoming) messages using Google Translate.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('GoogleTranslationPlugin')
def init(self):
self.config_dialog = None
#self.gui_extension_points = {}
self.config_default_values = {'from_lang' : (u'en', _(u'Language of text to be translated')),
'to_lang' : (u'fr', _(u'Language to which translation will be made')),
'user_agent' : (u'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080213 Firefox/2.0.0.11',
_(u'User Agent data to be used with urllib2 when connecting to Google Translate service'))}
self.config_default_values = {
'from_lang' :
(u'en', _(u'Language of text to be translated')),
'to_lang' :
(u'fr', _(u'Language to which translation will be made')),
'user_agent' :
(u'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) '
'Gecko/20080213 Firefox/2.0.0.11',
_(u'User Agent data to be used with urllib2 '
'when connecting to Google Translate service'))}
#self.events_handlers = {}
self.events = [GoogleTranslateMessageReceivedEvent]
self.translated_text_re = \
re.compile(r'google.language.callbacks.id100\(\'22\',{"translatedText":"(?P<text>[^"]*)"}, 200, null, 200\)')
self.translated_text_re = re.compile(
r'google.language.callbacks.id100\(\'22\','
'{"translatedText":"(?P<text>[^"]*)"}, 200, null, 200\)')
@log_calls('GoogleTranslationPlugin')
def translate_text(self, text, from_lang, to_lang):
text = self.prepare_text_for_url(text)
# Converts text so it can be used within URL as query to Google
# Translate.
quoted_text = urllib2.quote(text.encode(getfilesystemencoding()))
# prepare url
headers = { 'User-Agent' : self.config['user_agent'] }
translation_url = u'http://www.google.com/uds/Gtranslate?callback=google.language.callbacks.id100&context=22&q=%(text)s&langpair=%(from_lang)s%%7C%(to_lang)s&key=notsupplied&v=1.0'%locals()
translation_url = u'http://www.google.com/uds/Gtranslate?callback='\
'google.language.callbacks.id100&context=22&q=%(quoted_text)s&'\
'langpair=%(from_lang)s%%7C%(to_lang)s&key=notsupplied&v=1.0' % \
locals()
request = urllib2.Request(translation_url, headers=headers)
response = urllib2.urlopen(request)
results = response.read()
try:
response = urllib2.urlopen(request)
except urllib2.URLError, e:
# print e
return text
results = response.read()
translated_text = self.translated_text_re.search(results).group('text')
return translated_text
@log_calls('GoogleTranslationPlugin')
def prepare_text_for_url(self, text):
'''
Converts text so it can be used within URL as query to Google Translate.
'''
# There should be more replacements for plugin to work in any case:
char_replacements = { ' ' : '%20',
'+' : '%2B'}
for char, replacement in char_replacements.iteritems():
text = text.replace(char, replacement)
if translated_text:
return translated_text
return text
@log_calls('GoogleTranslationPlugin')
@ -105,14 +104,15 @@ class GoogleTranslateMessageReceivedEvent(nec.NetworkIncomingEvent):
base_network_events = ['raw-message-received']
def generate(self):
msg_type = self.base_event.xmpp_msg.attrs.get('type', None)
msg_type = self.base_event.stanza.attrs.get('type', None)
if msg_type == u'chat':
msg_text = "".join(self.base_event.xmpp_msg.kids[0].data)
msg_text = "".join(self.base_event.stanza.kids[0].data)
if msg_text:
from_lang = self.plugin.config['from_lang']
to_lang = self.plugin.config['to_lang']
self.base_event.xmpp_msg.kids[0].setData(
self.plugin.translate_text(msg_text, from_lang, to_lang))
self.base_event.stanza.kids[0].setData(
self.plugin.translate_text(msg_text, from_lang, to_lang))
return False # We only want to modify old event, not emit another,
# so we return False here.
# We only want to modify old event, not emit another, so we return False
# here.
return False

View file

@ -34,12 +34,6 @@ from plugins.helpers import log, log_calls
from plugins.gui import GajimPluginConfigDialog
class LengthNotifierPlugin(GajimPlugin):
name = u'Message Length Notifier'
short_name = u'length_notifier'
version = u'0.1'
description = u'''Highlights message entry field in chat window when given length of message is exceeded.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('LengthNotifierPlugin')
def init(self):

View file

@ -0,0 +1,9 @@
[info]
name: Message Length Notifier
short_name: length_notifier
version: 0.1
description: Highlights message entry field in chat window when given length of message is exceeded.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -0,0 +1,11 @@
[info]
name: New Events Example
short_name: new_events_example
version: 0.1
description: Shows how to generate new network events based on existing one using Network Events Controller.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -38,12 +38,6 @@ from common import ged
from common import nec
class NewEventsExamplePlugin(GajimPlugin):
name = u'New Events Example'
short_name = u'new_events_example'
version = u'0.1'
description = u'''Shows how to generate new network events based on existing one using Network Events Controller.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('NewEventsExamplePlugin')
def init(self):
@ -52,34 +46,31 @@ class NewEventsExamplePlugin(GajimPlugin):
#self.config_default_values = {}
self.events_handlers = {'raw-message-received' :
(ged.POSTCORE,
self.raw_message_received),
'customized-message-received' :
(ged.POSTCORE,
self.customized_message_received),
'enriched-chat-message-received' :
(ged.POSTCORE,
self.enriched_chat_message_received)}
(ged.POSTCORE, self.raw_message_received),
'customized-message-received' :
(ged.POSTCORE, self.customized_message_received),
'enriched-chat-message-received' :
(ged.POSTCORE, self.enriched_chat_message_received)}
self.events = [CustomizedMessageReceivedEvent,
MoreCustomizedMessageReceivedEvent,
ModifyOnlyMessageReceivedEvent,
EnrichedChatMessageReceivedEvent]
MoreCustomizedMessageReceivedEvent,
ModifyOnlyMessageReceivedEvent,
EnrichedChatMessageReceivedEvent]
def enriched_chat_message_received(self, event_object):
pass
#print "Event '%s' occured. Event object: %s\n\n===\n"%(event_object.name,
#event_object)
# print "Event '%s' occured. Event object: %s\n\n===\n" % \
# (event_object.name, event_object)
def raw_message_received(self, event_object):
pass
#print "Event '%s' occured. Event object: %s\n\n===\n"%(event_object.name,
#event_object)
# print "Event '%s' occured. Event object: %s\n\n===\n" % \
# (event_object.name,event_object)
def customized_message_received(self, event_object):
pass
#print "Event '%s' occured. Event object: %s\n\n===\n"%(event_object.name,
#event_object
# print "Event '%s' occured. Event object: %s\n\n===\n" % \
# (event_object.name, event_object
@log_calls('NewEventsExamplePlugin')
def activate(self):
@ -113,11 +104,11 @@ class ModifyOnlyMessageReceivedEvent(nec.NetworkIncomingEvent):
base_network_events = ['raw-message-received']
def generate(self):
msg_type = self.base_event.xmpp_msg.attrs.get('type', None)
msg_type = self.base_event.stanza.attrs.get('type', None)
if msg_type == u'chat':
msg_text = "".join(self.base_event.xmpp_msg.kids[0].data)
self.base_event.xmpp_msg.kids[0].setData(
u'%s [MODIFIED BY CUSTOM NETWORK EVENT]'%(msg_text))
msg_text = ''.join(self.base_event.stanza.kids[0].data)
self.base_event.stanza.kids[0].setData(
u'%s [MODIFIED BY CUSTOM NETWORK EVENT]' % (msg_text))
return False
@ -130,17 +121,17 @@ class EnrichedChatMessageReceivedEvent(nec.NetworkIncomingEvent):
base_network_events = ['raw-message-received']
def generate(self):
msg_type = self.base_event.xmpp_msg.attrs.get('type', None)
msg_type = self.base_event.stanza.attrs.get('type', None)
if msg_type == u'chat':
self.xmpp_msg = self.base_event.xmpp_msg
self.stanza = self.base_event.stanza
self.conn = self.base_event.conn
self.from_jid = helpers.get_full_jid_from_iq(self.xmpp_msg)
self.from_jid_without_resource = gajim.get_jid_without_resource(self.from_jid)
self.account = self.base_event.account
self.from_nickname = gajim.get_contact_name_from_jid(
self.account,
self.from_jid_without_resource)
self.msg_text = "".join(self.xmpp_msg.kids[0].data)
self.from_jid = helpers.get_full_jid_from_iq(self.stanza)
self.from_jid_without_resource = gajim.get_jid_without_resource(
self.from_jid)
self.account = self.conn.name
self.from_nickname = gajim.get_contact_name_from_jid( self.account,
self.from_jid_without_resource)
self.msg_text = ''.join(self.stanza.kids[0].data)
return True

View file

@ -0,0 +1,10 @@
[info]
name: Roster Buttons
short_name: roster_buttons
version: 0.1
description: Adds quick action buttons to roster window.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -34,12 +34,6 @@ from plugins import GajimPlugin
from plugins.helpers import log, log_calls
class RosterButtonsPlugin(GajimPlugin):
name = u'Roster Buttons'
short_name = u'roster_buttons'
version = u'0.1'
description = u'''Adds quick action buttons to roster window.'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('RosterButtonsPlugin')
def init(self):

View file

@ -0,0 +1,11 @@
[info]
name: Snarl Notifications
short_name: snarl_notifications
version: 0.1
description: Shows events notification using Snarl (http://www.fullphat.net/) under Windows. Snarl needs to be installed in system.
PySnarl bindings are used (http://code.google.com/p/pysnarl/).
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://blog.bilinski.it

View file

@ -38,13 +38,6 @@ from plugins.helpers import log_calls, log
from common import ged
class SnarlNotificationsPlugin(GajimPlugin):
name = u'Snarl Notifications'
short_name = u'snarl_notifications'
version = u'0.1'
description = u'''Shows events notification using Snarl (http://www.fullphat.net/) under Windows. Snarl needs to be installed in system.
PySnarl bindings are used (http://code.google.com/p/pysnarl/).'''
authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
homepage = u'http://blog.bilinski.it'
@log_calls('SnarlNotificationsPlugin')
def init(self):
@ -52,7 +45,7 @@ PySnarl bindings are used (http://code.google.com/p/pysnarl/).'''
#self.gui_extension_points = {}
#self.config_default_values = {}
self.events_handlers = {'NewMessage' : (ged.POSTCORE, self.newMessage)}
self.events_handlers = {'notification' : (ged.POSTCORE, self.notif)}
@log_calls('SnarlNotificationsPlugin')
def activate(self):
@ -63,28 +56,12 @@ PySnarl bindings are used (http://code.google.com/p/pysnarl/).'''
pass
@log_calls('SnarlNotificationsPlugin')
def newMessage(self, args):
event_name = "NewMessage"
data = args
account = data[0]
jid = data[1][0]
jid_without_resource = gajim.get_jid_without_resource(jid)
msg = data[1][1]
msg_type = data[1][4]
if msg_type == 'chat':
nickname = gajim.get_contact_name_from_jid(account,
jid_without_resource)
elif msg_type == 'pm':
nickname = gajim.get_resource_from_jid(jid)
print "Event '%s' occured. Arguments: %s\n\n===\n"%(event_name, pformat(args))
print "Event '%s' occured. Arguments: \naccount = %s\njid = %s\nmsg = %s\nnickname = %s"%(
event_name, account, jid, msg, nickname)
def notif(self, obj):
print "Event '%s' occured.\n\n===\n" % obj.popup_event_type
#if PySnarl.snGetVersion() != False:
#(major, minor) = PySnarl.snGetVersion()
#print "Found Snarl version",str(major)+"."+str(minor),"running."
#PySnarl.snShowMessage(nickname, msg[:20]+'...')
#PySnarl.snShowMessage(obj.popup_title, obj.popup_text)
#else:
#print "Sorry Snarl does not appear to be running"

View file

@ -0,0 +1 @@
from triggers import Triggers

View file

@ -4,7 +4,7 @@
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
@ -21,34 +21,13 @@
</object>
<object class="GtkListStore" id="liststore2">
<columns>
<!-- column-name item text -->
<!-- column-name item -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Receive a Message</col>
</row>
<row>
<col id="0" translatable="yes">Contact Disconnected </col>
</row>
<row>
<col id="0" translatable="yes">Contact Change Status </col>
</row>
<row>
<col id="0" translatable="yes">Group Chat Message Highlight </col>
</row>
<row>
<col id="0" translatable="yes">Group Chat Message Received </col>
</row>
<row>
<col id="0" translatable="yes">File Transfer Request </col>
</row>
<row>
<col id="0" translatable="yes">File Transfer Started </col>
</row>
<row>
<col id="0" translatable="yes">File Transfer Finished</col>
</row>
</data>
</object>
<object class="GtkWindow" id="advanced_notifications_window">
@ -58,36 +37,11 @@
<property name="resizable">False</property>
<property name="destroy_with_parent">True</property>
<child>
<object class="GtkVBox" id="vbox95">
<object class="GtkVBox" id="vbox">
<property name="visible">True</property>
<property name="border_width">12</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkHBox" id="hbox3041">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label396">
<property name="visible">True</property>
<property name="label">Hi HG users ! This window does nothing for the moment. Discussions about this take place in ticket #1005.</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox100">
<property name="visible">True</property>
@ -208,7 +162,7 @@
</child>
</object>
<packing>
<property name="position">1</property>
<property name="position">0</property>
</packing>
</child>
<child>
@ -814,7 +768,7 @@
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="use_systray_cb">
<property name="label" translatable="yes">_Show event in systray</property>
<property name="label" translatable="yes">_Show event in notification area</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@ -830,7 +784,7 @@
</child>
<child>
<object class="GtkCheckButton" id="disable_systray_cb">
<property name="label" translatable="yes">_Disable showing event in systray</property>
<property name="label" translatable="yes">_Disable showing event in notification area</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@ -891,14 +845,14 @@
</packing>
</child>
<child>
<object class="GtkCheckButton" id="urgency_hint_cb">
<object class="GtkCheckButton" id="use_urgency_hint_cb">
<property name="label" translatable="yes">_Activate window manager's UrgencyHint to make chat window in taskbar flash</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="no_show_all">True</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_urgency_hint_checkbutton_toggled"/>
<signal name="toggled" handler="on_use_urgency_hint_cb_toggled"/>
</object>
<packing>
<property name="expand">False</property>
@ -906,6 +860,22 @@
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="disable_urgency_hint_cb">
<property name="label" translatable="yes">_Deactivate window manager's UrgencyHint</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="no_show_all">True</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_disable_urgency_hint_cb_toggled"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
<child type="label">
@ -921,28 +891,7 @@
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment97">
<property name="visible">True</property>
<property name="left_padding">413</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>
<signal name="clicked" handler="on_close_window"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
<property name="position">1</property>
</packing>
</child>
</object>

View file

@ -0,0 +1,7 @@
[info]
name: Triggers
short_name: triggers
version: 0.0.1
description: Configure Gajim's behaviour for each contact
authors: Yann Leboulanger <asterix@lagaule.org>
homepage: http://trac.gajim.org/wiki/

View file

@ -0,0 +1,637 @@
# -*- coding: utf-8 -*-
#
## plugins/triggers/triggers.py
##
## Copyright (C) 2011 Yann Leboulanger <asterix AT lagaule.org>
##
## This file is part of Gajim.
##
## Gajim is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 3 only.
##
## Gajim is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
import gtk
import sys
from common import gajim
from plugins import GajimPlugin
from plugins.helpers import log_calls, log
from plugins.gui import GajimPluginConfigDialog
from common import i18n
from common import ged
from common import helpers
class Triggers(GajimPlugin):
@log_calls('TriggersPlugin')
def init(self):
self.config_dialog = TriggersPluginConfigDialog(self)
self.config_default_values = {}
self.events_handlers = {'notification' : (ged.PREGUI, self._nec_notif),
'decrypted-message-received': (ged.PREGUI2,
self._nec_decrypted_message_received)}
def _check_rule_recipients(self, obj, rule):
rule_recipients = [t.strip() for t in rule['recipients'].split(',')]
if rule['recipient_type'] == 'contact' and obj.jid not in \
rule_recipients:
return False
contact_groups = gajim.contacts.get_first_contact_from_jid(
obj.conn.name, obj.jid).groups
group_found = False
for group in contact_groups:
if group in rule_recipients:
group_found = True
break
if rule['recipient_type'] == 'group' and not group_found:
return False
return True
def _check_rule_status(self, obj, rule):
rule_statuses = rule['status'].split()
our_status = gajim.SHOW_LIST[obj.conn.connected]
if rule['status'] != 'all' and our_status not in rule_statuses:
return False
return True
def _check_rule_tab_opened(self, obj, rule):
if rule['tab_opened'] == 'both':
return True
tab_opened = False
if gajim.interface.msg_win_mgr.get_control(obj.jid, obj.conn.name):
tab_opened = True
if tab_opened and rule['tab_opened'] == 'no':
return False
elif not tab_opened and rule['tab_opened'] == 'yes':
return False
return True
def check_rule_apply_notif(self, obj, rule):
# Check notification type
notif_type = ''
if obj.notif_type == 'msg':
notif_type = 'message_received'
if notif_type != rule['event']:
return False
# notification type is ok. Now check recipient
if not self._check_rule_recipients(obj, rule):
return False
# recipient is ok. Now check our status
if not self._check_rule_status(obj, rule):
return False
# our_status is ok. Now check opened chat window
if not self._check_rule_tab_opened(obj, rule):
return False
# All is ok
return True
def check_rule_apply_decrypted_msg(self, obj, rule):
# Check notification type
if rule['event'] != 'message_received':
return False
# notification type is ok. Now check recipient
if not self._check_rule_recipients(obj, rule):
return False
# recipient is ok. Now check our status
if not self._check_rule_status(obj, rule):
return False
# our_status is ok. Now check opened chat window
if not self._check_rule_tab_opened(obj, rule):
return False
# All is ok
return True
def apply_rule(self, obj, rule):
if rule['sound'] == 'no':
obj.do_sound = False
elif rule['sound'] == 'yes':
obj.do_sound = True
obj.sound_event = ''
obj.sound_file = rule['sound_file']
if rule['popup'] == 'no':
obj.do_popup = False
elif rule['popup'] == 'yes':
obj.do_popup = True
if rule['run_command']:
obj.do_command = True
obj.command = rule['command']
else:
obj.do_command = False
if rule['systray'] == 'no':
obj.show_in_notification_area = False
elif rule['systray'] == 'yes':
obj.show_in_notification_area = True
if rule['roster'] == 'no':
obj.show_in_roster = False
elif rule['roster'] == 'yes':
obj.show_in_roster = True
# if rule['urgency_hint'] == 'no':
# ?? not in obj actions
# elif rule['urgency_hint'] == 'yes':
def _nec_notif(self, obj):
# check rules in order
rules_num = [int(i) for i in self.config.keys()]
rules_num.sort()
for num in rules_num:
if self.check_rule_apply_notif(obj, self.config[str(num)]):
self.apply_rule(obj, self.config[str(num)])
# Should we stop after first valid rule ?
# break
def _nec_decrypted_message_received(self, obj):
rules_num = [int(i) for i in self.config.keys()]
rules_num.sort()
for num in rules_num:
rule = self.config[str(num)]
if self.check_rule_apply_decrypted_msg(obj, rule):
if rule['auto_open'] == 'no':
obj.popup = False
elif rule['auto_open'] == 'yes':
obj.popup = True
class TriggersPluginConfigDialog(GajimPluginConfigDialog):
events_list = ['message_received']#, 'contact_connected',
#'contact_disconnected', 'contact_change_status', 'gc_msg_highlight',
#'gc_msg']
recipient_types_list = ['contact', 'group', 'all']
config_options = ['event', 'recipient_type', 'recipients', 'status',
'tab_opened', 'sound', 'sound_file', 'popup', 'auto_open',
'run_command', 'command', 'systray', 'roster', 'urgency_hint']
def init(self):
self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
'config_dialog.ui')
self.xml = gtk.Builder()
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
['vbox', 'liststore1', 'liststore2'])
vbox = self.xml.get_object('vbox')
self.child.pack_start(vbox)
self.xml.connect_signals(self)
self.connect('hide', self.on_hide)
def on_run(self):
# fill window
for w in ('conditions_treeview', 'config_vbox', 'event_combobox',
'recipient_type_combobox', 'recipient_list_entry', 'delete_button',
'status_hbox', 'use_sound_cb', 'disable_sound_cb', 'use_popup_cb',
'disable_popup_cb', 'use_auto_open_cb', 'disable_auto_open_cb',
'use_systray_cb', 'disable_systray_cb', 'use_roster_cb',
'disable_roster_cb', 'tab_opened_cb', 'not_tab_opened_cb',
'sound_entry', 'sound_file_hbox', 'up_button', 'down_button',
'run_command_cb', 'command_entry', 'use_urgency_hint_cb',
'disable_urgency_hint_cb'):
self.__dict__[w] = self.xml.get_object(w)
self.config = {}
for n in self.plugin.config:
self.config[int(n)] = self.plugin.config[n]
# Contains status checkboxes
childs = self.status_hbox.get_children()
self.all_status_rb = childs[0]
self.special_status_rb = childs[1]
self.online_cb = childs[2]
self.away_cb = childs[3]
self.xa_cb = childs[4]
self.dnd_cb = childs[5]
self.invisible_cb = childs[6]
if not self.conditions_treeview.get_column(0):
# window never opened
model = gtk.ListStore(int, str)
model.set_sort_column_id(0, gtk.SORT_ASCENDING)
self.conditions_treeview.set_model(model)
# means number
col = gtk.TreeViewColumn(_('#'))
self.conditions_treeview.append_column(col)
renderer = gtk.CellRendererText()
col.pack_start(renderer, expand=False)
col.set_attributes(renderer, text=0)
col = gtk.TreeViewColumn(_('Condition'))
self.conditions_treeview.append_column(col)
renderer = gtk.CellRendererText()
col.pack_start(renderer, expand=True)
col.set_attributes(renderer, text=1)
else:
model = self.conditions_treeview.get_model()
model.clear()
# Fill conditions_treeview
num = 0
while num in self.config:
iter_ = model.append((num, ''))
path = model.get_path(iter_)
self.conditions_treeview.set_cursor(path)
self.active_num = num
self.initiate_rule_state()
self.set_treeview_string()
num += 1
# No rule selected at init time
self.conditions_treeview.get_selection().unselect_all()
self.active_num = -1
self.config_vbox.set_sensitive(False)
self.delete_button.set_sensitive(False)
self.down_button.set_sensitive(False)
self.up_button.set_sensitive(False)
def initiate_rule_state(self):
"""
Set values for all widgets
"""
if self.active_num < 0:
return
# event
value = self.config[self.active_num]['event']
if value:
self.event_combobox.set_active(self.events_list.index(value))
else:
self.event_combobox.set_active(-1)
# recipient_type
value = self.config[self.active_num]['recipient_type']
if value:
self.recipient_type_combobox.set_active(
self.recipient_types_list.index(value))
else:
self.recipient_type_combobox.set_active(-1)
# recipient
value = self.config[self.active_num]['recipients']
if not value:
value = ''
self.recipient_list_entry.set_text(value)
# status
value = self.config[self.active_num]['status']
if value == 'all':
self.all_status_rb.set_active(True)
else:
self.special_status_rb.set_active(True)
values = value.split()
for v in ('online', 'away', 'xa', 'dnd', 'invisible'):
if v in values:
self.__dict__[v + '_cb'].set_active(True)
else:
self.__dict__[v + '_cb'].set_active(False)
self.on_status_radiobutton_toggled(self.all_status_rb)
# tab_opened
value = self.config[self.active_num]['tab_opened']
self.tab_opened_cb.set_active(True)
self.not_tab_opened_cb.set_active(True)
if value == 'no':
self.tab_opened_cb.set_active(False)
elif value == 'yes':
self.not_tab_opened_cb.set_active(False)
# sound_file
value = self.config[self.active_num]['sound_file']
self.sound_entry.set_text(value)
# sound, popup, auto_open, systray, roster
for option in ('sound', 'popup', 'auto_open', 'systray', 'roster',
'urgency_hint'):
value = self.config[self.active_num][option]
if value == 'yes':
self.__dict__['use_' + option + '_cb'].set_active(True)
else:
self.__dict__['use_' + option + '_cb'].set_active(False)
if value == 'no':
self.__dict__['disable_' + option + '_cb'].set_active(True)
else:
self.__dict__['disable_' + option + '_cb'].set_active(False)
# run_command
value = self.config[self.active_num]['run_command']
self.run_command_cb.set_active(value)
# command
value = self.config[self.active_num]['command']
self.command_entry.set_text(value)
def set_treeview_string(self):
(model, iter_) = self.conditions_treeview.get_selection().get_selected()
if not iter_:
return
event = self.event_combobox.get_active_text()
recipient_type = self.recipient_type_combobox.get_active_text()
recipient = ''
if recipient_type != 'everybody':
recipient = self.recipient_list_entry.get_text()
if self.all_status_rb.get_active():
status = ''
else:
status = _('when I am ')
for st in ('online', 'away', 'xa', 'dnd', 'invisible'):
if self.__dict__[st + '_cb'].get_active():
status += helpers.get_uf_show(st) + ' '
model[iter_][1] = "When %s for %s %s %s" % (event, recipient_type,
recipient, status)
def on_conditions_treeview_cursor_changed(self, widget):
(model, iter_) = widget.get_selection().get_selected()
if not iter_:
self.active_num = ''
return
self.active_num = model[iter_][0]
if self.active_num == '0':
self.up_button.set_sensitive(False)
else:
self.up_button.set_sensitive(True)
max = self.conditions_treeview.get_model().iter_n_children(None)
if self.active_num == max - 1:
self.down_button.set_sensitive(False)
else:
self.down_button.set_sensitive(True)
self.initiate_rule_state()
self.config_vbox.set_sensitive(True)
self.delete_button.set_sensitive(True)
def on_new_button_clicked(self, widget):
model = self.conditions_treeview.get_model()
num = self.conditions_treeview.get_model().iter_n_children(None)
self.config[num] = {'event': '', 'recipient_type': 'all',
'recipients': '', 'status': 'all', 'tab_opened': 'both',
'sound': '', 'sound_file': '', 'popup': '', 'auto_open': '',
'run_command': False, 'command': '', 'systray': '', 'roster': '',
'urgency_hint': False}
iter_ = model.append((num, ''))
path = model.get_path(iter_)
self.conditions_treeview.set_cursor(path)
self.active_num = num
self.set_treeview_string()
self.config_vbox.set_sensitive(True)
def on_delete_button_clicked(self, widget):
(model, iter_) = self.conditions_treeview.get_selection().get_selected()
if not iter_:
return
# up all others
iter2 = model.iter_next(iter_)
num = self.active_num
while iter2:
num = model[iter2][0]
model[iter2][0] = num - 1
self.config[num-1] = self.config[num].copy()
iter2 = model.iter_next(iter2)
model.remove(iter_)
del self.config[num]
self.active_num = ''
self.config_vbox.set_sensitive(False)
self.delete_button.set_sensitive(False)
self.up_button.set_sensitive(False)
self.down_button.set_sensitive(False)
def on_up_button_clicked(self, widget):
(model, iter_) = self.conditions_treeview.get_selection().get_selected()
if not iter_:
return
conf = self.config[self.active_num].copy()
self.config[self.active_num] = self.config[self.active_num - 1]
self.config[self.active_num - 1] = conf
model[iter_][0] =self.active_num - 1
# get previous iter
path = model.get_path(iter_)
iter_ = model.get_iter((path[0] - 1,))
model[iter_][0] = self.active_num
self.on_conditions_treeview_cursor_changed(self.conditions_treeview)
def on_down_button_clicked(self, widget):
(model, iter_) = self.conditions_treeview.get_selection().get_selected()
if not iter_:
return
conf = self.config[self.active_num].copy()
self.config[self.active_num] = self.config[self.active_num + 1]
self.config[self.active_num + 1] = conf
model[iter_][0] = self.active_num + 1
iter_ = model.iter_next(iter_)
model[iter_][0] = self.active_num
self.on_conditions_treeview_cursor_changed(self.conditions_treeview)
def on_event_combobox_changed(self, widget):
if self.active_num < 0:
return
active = self.event_combobox.get_active()
if active == -1:
event = ''
else:
event = self.events_list[active]
self.config[self.active_num]['event'] = event
self.set_treeview_string()
def on_recipient_type_combobox_changed(self, widget):
if self.active_num < 0:
return
recipient_type = self.recipient_types_list[
self.recipient_type_combobox.get_active()]
self.config[self.active_num]['recipient_type'] = recipient_type
if recipient_type == 'all':
self.recipient_list_entry.hide()
else:
self.recipient_list_entry.show()
self.set_treeview_string()
def on_recipient_list_entry_changed(self, widget):
if self.active_num < 0:
return
recipients = widget.get_text().decode('utf-8')
#TODO: do some check
self.config[self.active_num]['recipients'] = recipients
self.set_treeview_string()
def set_status_config(self):
if self.active_num < 0:
return
status = ''
for st in ('online', 'away', 'xa', 'dnd', 'invisible'):
if self.__dict__[st + '_cb'].get_active():
status += st + ' '
if status:
status = status[:-1]
self.config[self.active_num]['status'] = status
self.set_treeview_string()
def on_status_radiobutton_toggled(self, widget):
if self.active_num < 0:
return
if self.all_status_rb.get_active():
self.config[self.active_num]['status'] = 'all'
# 'All status' clicked
for st in ('online', 'away', 'xa', 'dnd', 'invisible'):
self.__dict__[st + '_cb'].hide()
self.special_status_rb.show()
else:
self.set_status_config()
# 'special status' clicked
for st in ('online', 'away', 'xa', 'dnd', 'invisible'):
self.__dict__[st + '_cb'].show()
self.special_status_rb.hide()
self.set_treeview_string()
def on_status_cb_toggled(self, widget):
if self.active_num < 0:
return
self.set_status_config()
# tab_opened OR (not xor) not_tab_opened must be active
def on_tab_opened_cb_toggled(self, widget):
if self.active_num < 0:
return
if self.tab_opened_cb.get_active():
if self.not_tab_opened_cb.get_active():
self.config[self.active_num]['tab_opened'] = 'both'
else:
self.config[self.active_num]['tab_opened'] = 'yes'
else:
self.not_tab_opened_cb.set_active(True)
self.config[self.active_num]['tab_opened'] = 'no'
def on_not_tab_opened_cb_toggled(self, widget):
if self.active_num < 0:
return
if self.not_tab_opened_cb.get_active():
if self.tab_opened_cb.get_active():
self.config[self.active_num]['tab_opened'] = 'both'
else:
self.config[self.active_num]['tab_opened'] = 'no'
else:
self.tab_opened_cb.set_active(True)
self.config[self.active_num]['tab_opened'] = 'yes'
def on_use_it_toggled(self, widget, oposite_widget, option):
if widget.get_active():
if oposite_widget.get_active():
oposite_widget.set_active(False)
self.config[self.active_num][option] = 'yes'
elif oposite_widget.get_active():
self.config[self.active_num][option] = 'no'
else:
self.config[self.active_num][option] = ''
def on_disable_it_toggled(self, widget, oposite_widget, option):
if widget.get_active():
if oposite_widget.get_active():
oposite_widget.set_active(False)
self.config[self.active_num][option] = 'no'
elif oposite_widget.get_active():
self.config[self.active_num][option] = 'yes'
else:
self.config[self.active_num][option] = ''
def on_use_sound_cb_toggled(self, widget):
self.on_use_it_toggled(widget, self.disable_sound_cb, 'sound')
if widget.get_active():
self.sound_file_hbox.set_sensitive(True)
else:
self.sound_file_hbox.set_sensitive(False)
def on_browse_for_sounds_button_clicked(self, widget, data=None):
if self.active_num < 0:
return
def on_ok(widget, path_to_snd_file):
dialog.destroy()
if not path_to_snd_file:
path_to_snd_file = ''
self.config[self.active_num]['sound_file'] = path_to_snd_file
self.sound_entry.set_text(path_to_snd_file)
path_to_snd_file = self.sound_entry.get_text().decode('utf-8')
path_to_snd_file = os.path.join(os.getcwd(), path_to_snd_file)
dialog = SoundChooserDialog(path_to_snd_file, on_ok)
def on_play_button_clicked(self, widget):
helpers.play_sound_file(self.sound_entry.get_text().decode('utf-8'))
def on_disable_sound_cb_toggled(self, widget):
self.on_disable_it_toggled(widget, self.use_sound_cb, 'sound')
def on_sound_entry_changed(self, widget):
self.config[self.active_num]['sound_file'] = widget.get_text().\
decode('utf-8')
def on_use_popup_cb_toggled(self, widget):
self.on_use_it_toggled(widget, self.disable_popup_cb, 'popup')
def on_disable_popup_cb_toggled(self, widget):
self.on_disable_it_toggled(widget, self.use_popup_cb, 'popup')
def on_use_auto_open_cb_toggled(self, widget):
self.on_use_it_toggled(widget, self.disable_auto_open_cb, 'auto_open')
def on_disable_auto_open_cb_toggled(self, widget):
self.on_disable_it_toggled(widget, self.use_auto_open_cb, 'auto_open')
def on_run_command_cb_toggled(self, widget):
self.config[self.active_num]['run_command'] = widget.get_active()
if widget.get_active():
self.command_entry.set_sensitive(True)
else:
self.command_entry.set_sensitive(False)
def on_command_entry_changed(self, widget):
self.config[self.active_num]['command'] = widget.get_text().\
decode('utf-8')
def on_use_systray_cb_toggled(self, widget):
self.on_use_it_toggled(widget, self.disable_systray_cb, 'systray')
def on_disable_systray_cb_toggled(self, widget):
self.on_disable_it_toggled(widget, self.use_systray_cb, 'systray')
def on_use_roster_cb_toggled(self, widget):
self.on_use_it_toggled(widget, self.disable_roster_cb, 'roster')
def on_disable_roster_cb_toggled(self, widget):
self.on_disable_it_toggled(widget, self.use_roster_cb, 'roster')
def on_use_urgency_hint_cb_toggled(self, widget):
self.on_use_it_toggled(widget, self.disable_urgency_hint_cb,
'uregency_hint')
def on_disable_urgency_hint_cb_toggled(self, widget):
self.on_disable_it_toggled(widget, self.use_urgency_hint_cb,
'uregency_hint')
def on_hide(self, widget):
# save config
for n in self.plugin.config:
del self.plugin.config[n]
for n in self.config:
self.plugin.config[str(n)] = self.config[n]

View file

@ -0,0 +1 @@
from plugin import WhiteboardPlugin

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,7 @@
[info]
name: Whiteboard
short_name: whiteboard
version: 0.1
description: Shows a whiteboard in chat. python-pygoocanvas is required.
authors = Yann Leboulanger <asterix@lagaule.org>
homepage = www.gajim.org

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