merge from trunk
10
ChangeLog
|
@ -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
|
||||
|
|
19
README.html
|
@ -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/>
|
||||
|
|
|
@ -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} $@
|
||||
|
|
20
configure.ac
|
@ -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
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"><span weight="heavy" size="large">room jid</span></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"><span weight="heavy" size="large">room jid</span></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 "_" 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 "_" 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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">&lt;empty&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">&lt;empty&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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"><b>User avatar:</b></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"><b>Configured avatar:</b></property>
|
||||
<property name="use_markup">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
|
|
@ -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>
|
||||
|
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
@ -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-----
|
||||
|
|
|
@ -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>
|
||||
|
|
3
debian/README.Debian
vendored
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
22
debian/patches/00_debian-copying.patch
vendored
|
@ -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
|
@ -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
|
@ -0,0 +1,2 @@
|
|||
00_debian-copying.diff
|
||||
01_configure-ac.diff
|
28
debian/rules
vendored
|
@ -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
|
||||
|
|
53
gajim.nsi
|
@ -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"
|
||||
|
|
BIN
icons/hicolor/48x48/actions/gajim-warning.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
|
@ -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 "$@"
|
||||
|
|
|
@ -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}"
|
||||
|
|
|
@ -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
|
||||
|
|
1
plugins/acronyms_expander/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from acronyms_expander import AcronymsExpanderPlugin
|
|
@ -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):
|
9
plugins/acronyms_expander/manifest.ini
Normal 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
|
||||
|
||||
|
10
plugins/banner_tweaks/manifest.ini
Normal 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
|
||||
|
|
@ -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()
|
||||
|
|
10
plugins/dbus_plugin/manifest.ini
Normal 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
|
||||
|
||||
|
|
@ -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):
|
||||
|
|
8
plugins/events_dump/manifest.ini
Normal 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
|
||||
|
|
@ -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):
|
||||
|
|
1
plugins/ftp_manager/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from ftp_manager import FtpManager
|
281
plugins/ftp_manager/config_dialog.ui
Normal 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"><empty></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"><empty></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">●</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
460
plugins/ftp_manager/ftp_manager.py
Normal 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()
|
7
plugins/ftp_manager/manifest.ini
Normal 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/
|
8
plugins/google_translation/manifest.ini
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
9
plugins/length_notifier/manifest.ini
Normal 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
|
||||
|
||||
|
11
plugins/new_events_example/manifest.ini
Normal 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
|
||||
|
||||
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
10
plugins/roster_buttons/manifest.ini
Normal 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
|
||||
|
||||
|
||||
|
|
@ -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):
|
||||
|
|
11
plugins/snarl_notifications/manifest.ini
Normal 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
|
||||
|
||||
|
||||
|
|
@ -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"
|
||||
|
|
1
plugins/triggers/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from triggers import Triggers
|
|
@ -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>
|
7
plugins/triggers/manifest.ini
Normal 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/
|
637
plugins/triggers/triggers.py
Normal 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]
|
1
plugins/whiteboard/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from plugin import WhiteboardPlugin
|
BIN
plugins/whiteboard/brush_tool.png
Normal file
After Width: | Height: | Size: 806 B |
BIN
plugins/whiteboard/line_tool.png
Normal file
After Width: | Height: | Size: 1 KiB |
7
plugins/whiteboard/manifest.ini
Normal 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
|