pidgin/purple-plugin-pack
Clone
propagate from branch 'org.guifications.plugins.smartear' (head 7c1dbd0927a24b34c7c8423181b88a5032cc558d)
to branch 'org.guifications.plugins' (head df7eace8c31b0afd1bf8f2ce5cce1c0ace3bf4d8)
--- a/.mtn-ignore Mon Mar 24 15:08:23 2008 -0400
+++ b/.mtn-ignore Sun May 04 04:13:52 2008 -0400
@@ -15,10 +15,11 @@
purple-plugin_pack-[0-9]+\.[0-9]+([Bb][Ee][Tt][Aa][0-9]+)?(mtn)?\/?
--- a/AUTHORS Mon Mar 24 15:08:23 2008 -0400
+++ b/AUTHORS Sun May 04 04:13:52 2008 -0400
@@ -53,6 +53,8 @@
+Eoin Coffey - For being the channel vagrant and the person who *almost* + completes shit before being distracted by shiny objects Kathryn Kulick - For providing a female presence in our IRC channel
Robert O'Connor - Kicktoy... 'nuff said :)
Dennis Ristuccia - For random gibberish that forces us to take a break from coding
--- a/ChangeLog Mon Mar 24 15:08:23 2008 -0400
+++ b/ChangeLog Sun May 04 04:13:52 2008 -0400
@@ -1,6 +1,12 @@
* Merged the Autoprofile plugin into our build system.
* Fixed convbadger's failure to update on conversation switch.
+ * Added Ike Gingerich's colorize plugin + * Added Ike Gingerich's splitter plugin + * Fixed dewysiwygification's debug messages not properly ending lines. + * Added google plugin for "I'm Feeling Lucky" searches. + * Fixed aspell dependency in switchspell (fixes gentoo bug #196693) + * Added nodashi's manualsize plugin * Fixed a typo in irc-more's source that allowed a potential double-free
--- a/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -13,7 +13,8 @@
@@ -22,9 +23,13 @@
-DIST_SUBDIRS = common doc m4 po $(PP_PURPLE) $(PP_PIDGIN) $(PP_FINCH)
-SUBDIRS = common doc m4 po $(PP_PURPLE_BUILD) $(PP_PIDGIN_BUILD) $(PP_FINCH_BUILD)
+DIST_SUBDIRS = common doc po $(PP_DIST_DIRS) +SUBDIRS = common doc $(PO_DIR) $(PP_BUILD_DIRS) @@ -48,25 +53,7 @@
echo $(DIST_ARCHIVES) | xargs -n 1 gpg -a -b
- @echo "---------------------------------------"
- @echo "Plugin Pack Info"
- @echo "---------------------------------------"
- @echo "Purple Plugins:"
- @echo " Available..: $(PP_PURPLE)"
- @echo " Abusive....: $(PP_PURPLE_ABUSIVE)"
- @echo " Incomplete.: $(PP_PURPLE_INCOMPLETE)"
- @echo " Building...: $(PP_PURPLE_BUILD)"
- @echo "---------------------------------------"
- @echo "Pidgin Plugins:"
- @echo " Available..: $(PP_PIDGIN)"
- @echo " Abusive....: $(PP_PIDGIN_ABUSIVE)"
- @echo " Incomplete.: $(PP_PIDGIN_INCOMPLETE)"
- @echo " Building...: $(PP_PIDGIN_BUILD)"
- @echo "---------------------------------------"
- @echo " Available..: $(PP_FINCH)"
- @echo " Abusive....: $(PP_FINCH_ABUSIVE)"
- @echo " Incomplete.: $(PP_FINCH_INCOMPLETE)"
- @echo " Building...: $(PP_FINCH_BUILD)"
- @echo "---------------------------------------"
+ @$(PYTHON) plugin_pack.py stats
--- a/album/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/album/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,10 +1,12 @@
albumdir = $(PIDGIN_LIBDIR)
album_la_LDFLAGS = -module -avoid-version
--- a/album/album.c Mon Mar 24 15:08:23 2008 -0400
+++ b/album/album.c Sun May 04 04:13:52 2008 -0400
@@ -141,7 +141,7 @@
static void store_buddy_icon(PurpleBuddyIcon *icon, PurpleBuddy *buddy)
@@ -194,6 +194,7 @@
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/album/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Archives buddy icons +authors=Richard Laager,Sadrul Habib Chowdhury --- a/autogen.sh Mon Mar 24 15:08:23 2008 -0400
+++ b/autogen.sh Sun May 04 04:13:52 2008 -0400
@@ -53,9 +53,11 @@
###############################################################################
echo -n "checking for ${CMD}... "
+ BIN=`which ${CMD} $@ 2>/dev/null` if [ x"${BIN}" = x"" ] ; then
@@ -70,17 +72,23 @@
+ OUTPUT=`mktemp autogen-XXXX` echo -n "running ${CMD} ${@}... "
- OUTPUT=`${CMD} ${@} 2>&1`
+ ${CMD} ${@} >${OUTPUT} 2>&1
- if [ x"${OUTPUT}" != x"" ] ; then
+ if [ `stat --printf="%s" ${OUTPUT}` -ge 0 ] ; then @@ -102,7 +110,7 @@
if [ -f ${ARGS_FILE} ] ; then
echo -n "sourcing ${ARGS_FILE}: "
@@ -117,13 +125,23 @@
check "autoheader"; AUTOHEADER=${BIN};
check "automake"; AUTOMAKE=${BIN};
check "autoconf"; AUTOCONF=${BIN};
+check "python" -V; PYTHON=${BIN}; +############################################################################### +############################################################################### +CONFIG_FILE="plugin_pack.m4" +echo -n "creating ${CONFIG_FILE} ..." +${PYTHON} plugin_pack.py config_file > ${CONFIG_FILE} 2>/dev/null ###############################################################################
###############################################################################
run_or_die ${LIBTOOLIZE} -c -f --automake ${LIBTOOLIZE_FLAGS}
run_or_die ${INTLTOOLIZE} -c -f --automake ${INTLTOOLIZE_FLAGS}
-run_or_die ${ACLOCAL} -I m4 ${ACLOCAL_FLAGS}
+run_or_die ${ACLOCAL} ${ACLOCAL_FLAGS} run_or_die ${AUTOHEADER} ${AUTOHEADER_FLAGS}
run_or_die ${AUTOMAKE} -a -c -f --gnu ${AUTOMAKE_FLAGS}
run_or_die ${AUTOCONF} -f ${AUTOCONF_FLAGS}
--- a/autoprofile/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/autoprofile/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,6 +1,5 @@
autoprofiledir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/autoprofile/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=User profile and status message content generator +description=Allows user to place dynamic text into profiles and status messages, with the text automatically updated whenever content changes
--- a/autoreply/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/autoreply/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
autoreplydir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/autoreply/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Autoreply for all the protocols +description=This plugin lets you set autoreply message for any protocol. You can set the global autoreply message from the plugin options dialog. To set some specific autoreply message for a particular buddy, right click on the buddy in the buddy-list window. To set autoreply messages for some accounts, go to the `Advanced' tab of the account edit dialog. +authors=Sadrul Habib Chowdhury
--- a/awaynotify/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/awaynotify/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .purple-plugin .incomplete
plugindir=$(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/awaynotify/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+[Away State Notification] +summary=Notifies in a conversation window when a buddy goes or returns from away
--- a/bash/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/bash/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,7 +1,6 @@
bashdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bash/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Generates links for quotes at bash.org +description=Generates links for quotes at bash.org or allows the user to specify a quote. Provides the /bash command.
--- a/bit/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/bit/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .pidgin-plugin Makefile.mingw .incomplete
bitdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bit/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Tools to manipulate buddy icons. *DANGEROUS* +description=Whilst working on Purple 2.0.0, I found a need to destroy all my buddies' buddy icons. There's nothing to do these functions in Purple, so here they are. Completely, thoroughly untested.
--- a/blistops/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/blistops/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .pidgin-plugin .build Makefile.mingw
blistopsdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/blistops/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Gives extended options to the buddy list
--- a/buddytime/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/buddytime/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .incomplete .purple-plugin .pidgin-plugin
noinst_PROGRAMS = recursetest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buddytime/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,18 @@
+summary=Quickly see the local time of a buddy +authors=Gary Kramlich,Richard Laager +[Buddy Time (Pidgin UI)] +depends=pidgin buddytime +summary=Pidgin user interface for the Buddy Time plugin. +authors=Gary Kramlich,Richard Laager
--- a/chronic/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/chronic/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .purple-plugin .incomplete
chronicdir=$(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chronic/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Sound playing triggers +description=Allows buddies to remotely trigger sound playing in your running libpurple client with {S <sound>. Inspired by IRC channel resident EvilDennisR and ancient versions of AOL. THIS PLUGIN IS NOT YET FUNCTIONAL! IT IS USELESS! --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/colorize/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,28 @@
+colorizedir = $(PURPLE_LIBDIR) +colorize_la_LDFLAGS = -module -avoid-version +colorize_LTLIBRARIES = colorize.la + -DLIBDIR=\"$(PURPLE_LIBDIR)\" \ + -DDATADIR=\"$(PURPLE_DATADIR)\" \ + -DPIXMAPSDIR=\"$(PURPLE_PIXMAPSDIR)\" \ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/colorize/Makefile.mingw Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,12 @@
+# Description: Makefile for dice plugin. +include $(PP_TOP)/win_pp.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/colorize/colorize.c Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,298 @@
+/* Gaim Colorize Plug-in v0.2 + * Colorizes outgoing text to a gradient of specified starting and + * - echo color formatting to local color log + * - fix HTML-mixed messages (currently strips all HTML) + * Copyright (C) 2005, Ike Gingerich <ike_@users.sourceforge.net> + * 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 the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +#include "../common/pp_internal.h" +#define PLUGIN_ID "core-plugin_pack-colorize" +#define PLUGIN_AUTHOR "Ike Gingerich <ike_@users.sourceforge.net>" +#define PREFS_PREFIX "/plugins/core/" PLUGIN_ID +#define PREFS_I_RED PREFS_PREFIX "/initial_r" +#define PREFS_I_GREEN PREFS_PREFIX "/initial_g" +#define PREFS_I_BLUE PREFS_PREFIX "/initial_b" +#define PREFS_T_RED PREFS_PREFIX "/target_r" +#define PREFS_T_GREEN PREFS_PREFIX "/target_g" +#define PREFS_T_BLUE PREFS_PREFIX "/target_b" +static const guint8 default_initial_rgb[3] = { 0xFF, 0x00, 0x00 }; +static const guint8 default_target_rgb[3] = { 0x00, 0x00, 0x00 }; +/* set up preferences dialog */ +static PurplePluginPrefFrame * +init_pref_frame(PurplePlugin *plugin) { + PurplePluginPrefFrame *frame; + PurplePluginPref *ppref; + frame = purple_plugin_pref_frame_new(); + ppref = purple_plugin_pref_new_with_label("Initial Color"); + purple_plugin_pref_frame_add(frame, ppref); + /* initial red intensity */ + ppref = purple_plugin_pref_new_with_name_and_label(PREFS_I_RED, + "Red intensity (0-255): "); + purple_plugin_pref_set_bounds(ppref, 0, 255); + purple_plugin_pref_frame_add(frame, ppref); + /* initial green intensity */ + ppref = purple_plugin_pref_new_with_name_and_label(PREFS_I_GREEN, + "Green intensity (0-255): "); + purple_plugin_pref_set_bounds(ppref, 0, 255); + purple_plugin_pref_frame_add(frame, ppref); + /* initial blue intensity */ + ppref = purple_plugin_pref_new_with_name_and_label(PREFS_I_BLUE, + "Blue intensity (0-255): "); + purple_plugin_pref_set_bounds(ppref, 0, 255); + purple_plugin_pref_frame_add(frame, ppref); + ppref = purple_plugin_pref_new_with_label("Target Color"); + purple_plugin_pref_frame_add(frame, ppref); + /* target red intensity */ + ppref = purple_plugin_pref_new_with_name_and_label(PREFS_T_RED, + "Red intensity (0-255): "); + purple_plugin_pref_set_bounds(ppref, 0, 255); + purple_plugin_pref_frame_add(frame, ppref); + /* target green intensity */ + ppref = purple_plugin_pref_new_with_name_and_label(PREFS_T_GREEN, + "Green intensity (0-255): "); + purple_plugin_pref_set_bounds(ppref, 0, 255); + purple_plugin_pref_frame_add(frame, ppref); + /* target blue intensity */ + ppref = purple_plugin_pref_new_with_name_and_label(PREFS_T_BLUE, + "Blue intensity (0-255): "); + purple_plugin_pref_set_bounds(ppref, 0, 255); + purple_plugin_pref_frame_add(frame, ppref); +round_gfloat_to_guint8(gfloat f) { + return ((guchar)(f + 0.5f)); +rgb_equals(guint8 a[3], gfloat b[3]) { + return ( a[0] == round_gfloat_to_guint8(b[0]) && + a[1] == round_gfloat_to_guint8(b[1]) && + a[2] == round_gfloat_to_guint8(b[2]) ); +colorize_message(char **message) { + gfloat d_grad[3], grad[3]; + guint8 initial_rgb[3], target_rgb[3], last_rgb[3]; + gchar *formatted_char, *tmp, *new_msg; + g_return_if_fail(message != NULL); + g_return_if_fail(*message != NULL); + g_return_if_fail(**message != '\0'); + new_msg = g_strdup(""); + len = strlen( *message ); + /* get colors from preferences */ + initial_rgb[0] = (guint8)purple_prefs_get_int(PREFS_I_RED); + initial_rgb[1] = (guint8)purple_prefs_get_int(PREFS_I_GREEN); + initial_rgb[2] = (guint8)purple_prefs_get_int(PREFS_I_BLUE); + target_rgb[0] = (guint8)purple_prefs_get_int(PREFS_T_RED); + target_rgb[1] = (guint8)purple_prefs_get_int(PREFS_T_GREEN); + target_rgb[2] = (guint8)purple_prefs_get_int(PREFS_T_BLUE); + /* initialize current gradient value */ + grad[0] = (gfloat)initial_rgb[0]; + grad[1] = (gfloat)initial_rgb[1]; + grad[2] = (gfloat)initial_rgb[2]; + /* determine the delta gradient value */ + d_grad[0] = (gfloat)(target_rgb[0] - initial_rgb[0]) / (gfloat)len; + d_grad[1] = (gfloat)(target_rgb[1] - initial_rgb[1]) / (gfloat)len; + d_grad[2] = (gfloat)(target_rgb[2] - initial_rgb[2]) / (gfloat)len; + /* open initial font tag and format first character */ + formatted_char = g_strdup_printf("<font color=\"#%02x%02x%02x\">%c", + round_gfloat_to_guint8(grad[0]), + round_gfloat_to_guint8(grad[1]), + round_gfloat_to_guint8(grad[2]), + /* create a new string with the newly formatted char and free the old one */ + tmp = g_strconcat(new_msg, formatted_char, NULL); + g_free(formatted_char); + /* format each character one by one: + * (if it is not a space) AND + * (if it is not the same color as the last character) + last_rgb[0] = round_gfloat_to_guint8(grad[0]); + last_rgb[1] = round_gfloat_to_guint8(grad[1]); + last_rgb[2] = round_gfloat_to_guint8(grad[2]); + /* increment the gradient */ + /* format next character appropriately */ + if( g_ascii_isspace ( *(*message+i) ) || + rgb_equals(last_rgb, grad) ) + formatted_char = g_strdup_printf("%c", *(*message+i)); + formatted_char = g_strdup_printf("</font><font color=\"#%02x%02x%02x\">%c", + round_gfloat_to_guint8(grad[0]), + round_gfloat_to_guint8(grad[1]), + round_gfloat_to_guint8(grad[2]), + /* create a new string with the newly formatted char and free the old one */ + tmp = g_strconcat(new_msg, formatted_char, NULL); + g_free(formatted_char); + /* close final font tag */ + new_msg = g_strconcat(new_msg, "</font>", NULL); +/* respond to a sending-im signal by replacing outgoing text + * with colorized version +sending_im_msg(PurpleAccount *account, gchar *receiver, gchar **message) { + gchar *stripped_message; + /* strip any existing HTML */ + stripped_message = purple_markup_strip_html(*message); + /* colorize the message with HTML font tags */ + *message = stripped_message; + colorize_message(message); + /* todo: additional conversation manipulation is going to be required to + display the colorized version of the message locally */ +/* register sendin-im signal */ +plugin_load(PurplePlugin *plugin) { + purple_signal_connect(purple_conversations_get_handle(), "sending-im-msg", + plugin, PURPLE_CALLBACK(sending_im_msg), NULL); +plugin_unload(PurplePlugin *plugin) { +static PurplePluginUiInfo prefs_info = { +static PurplePluginInfo info = + PURPLE_PLUGIN_STANDARD, + PURPLE_PRIORITY_DEFAULT, +/* initialize default preferences */ +init_plugin(PurplePlugin *plugin) { + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + info.name = _("Colorize"); + info.summary = _("Colorizes outgoing message text."); + info.description = _("Colorizes outgoing message text to a gradient of " + "specified starting and ending RGB values."); + purple_prefs_add_none(PREFS_PREFIX); + purple_prefs_add_int(PREFS_I_RED, default_initial_rgb[0]); + purple_prefs_add_int(PREFS_I_GREEN, default_initial_rgb[1]); + purple_prefs_add_int(PREFS_I_BLUE, default_initial_rgb[2]); + purple_prefs_add_int(PREFS_T_RED, default_target_rgb[0]); + purple_prefs_add_int(PREFS_T_GREEN, default_target_rgb[1]); + purple_prefs_add_int(PREFS_T_BLUE, default_target_rgb[2]); +PURPLE_INIT_PLUGIN(colorize, init_plugin, info) --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/colorize/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Colorizes outgoing message text. +description=Colorizes outgoing message text to a gradient of specified starting and ending RGB values. --- a/configure.ac Mon Mar 24 15:08:23 2008 -0400
+++ b/configure.ac Sun May 04 04:13:52 2008 -0400
@@ -11,10 +11,10 @@
AC_PATH_PROG(sedpath, sed)
-dnl This disables check of libtool for these compilers
+dnl ####################################################################### +dnl # Initialize some variables that get passed to plugin_pack.py +dnl ####################################################################### dnl #######################################################################
@@ -77,6 +77,7 @@
AM_CONDITIONAL(HAVE_PURPLE, true)
+DEPENDENCIES="$DEPENDENCIES,purple" if test x"$prefix" = x"NONE" ; then
PURPLE_LIBDIR=`pkg-config --variable=libdir purple`
@@ -118,6 +119,7 @@
AC_DEFINE(HAVE_PIDGIN, 1, [Define if we've found pidgin.])
AM_CONDITIONAL(HAVE_PIDGIN, true)
+ DEPENDENCIES="$DEPENDENCIES,pidgin" @@ -157,6 +159,7 @@
AC_DEFINE(HAVE_FINCH, 1, [Define if we've found finch.])
AM_CONDITIONAL(HAVE_FINCH, true)
+ DEPENDENCIES="$DEPENDENCIES,finch" @@ -217,10 +220,8 @@
dnl #######################################################################
-dnl # Plugin dependency checking
+dnl # Check for talkfilters dnl #######################################################################
AC_CHECK_HEADER(talkfilters.h, HAVE_TALKFILTERS=yes, AC_MSG_WARN([
*** GNU Talk Filters is required to build the talkfilters plugin;
*** please make sure you have the GNU Talk Filters development headers installed.
@@ -233,9 +234,12 @@
dnl work out that the library exists
AC_CHECK_LIB(talkfilters, gtf_filter_count, TALKFILTERS_LIBS="-ltalkfilters")
AC_SUBST(TALKFILTERS_LIBS)
+ DEPENDENCIES="$DEPENDENCIES,talkfilters"
+dnl ####################################################################### +dnl # Check for switchspell +dnl ####################################################################### PKG_CHECK_MODULES(GTKSPELL, gtkspell-2.0 >= 2.0.2, [], [gtkspell=no])
AC_SUBST(GTKSPELL_CFLAGS)
@@ -250,9 +254,31 @@
+AC_CHECK_HEADER([aspell.h], HAVE_ASPELL_H=yes, AC_MSG_WARN([ +*** libaspell is required to build the switchspell plugin.]) +if test x"$HAVE_ASPELL_H" = x"yes" ; then + AC_CHECK_LIB([aspell], [new_aspell_config], ASPELL_LIBS="-laspell", BUILD_SWITCH_SPELL=no) AM_CONDITIONAL(BUILD_SWITCH_SPELL, test x"$BUILD_SWITCH_SPELL" = x"yes")
+if test x"$BUILD_SWITCH_SPELL" = x"yes" ; then + DEPENDENCIES="$DEPENDENCIES,gtkspell,aspell" +dnl ####################################################################### +dnl ####################################################################### @@ -276,6 +302,8 @@
if test x"$HAVE_XMMS" = x"yes" ; then
+ DEPENDENCIES="$DEPENDENCIES,xmms" @@ -284,12 +312,17 @@
+dnl ####################################################################### +dnl # Check for some basic headers +dnl ####################################################################### AC_CHECK_HEADERS(regex.h)
dnl #######################################################################
-dnl # Run our plugin checking
+dnl # Disable installation of translation files dnl #######################################################################
+AC_ARG_ENABLE(nls, AC_HELP_STRING([--enable-nls], [enable installation of translation files]), enable_i18n="$enableval", enable_i18n=yes) +AM_CONDITIONAL(INSTALL_I18N, test "x$enable_i18n" = "xyes") dnl #######################################################################
@@ -306,65 +339,24 @@
dnl #######################################################################
+dnl # plugin_pack.py has already done our heavy lifting from the boot +dnl # strap. So we'll include our config file it created and call it to +dnl # determine our build directories +dnl ####################################################################### +AC_PATH_PROG([PYTHON], [python], [no]) +dnl # include the config file we created during bootstrapping +m4_include([plugin_pack.m4]) +dnl ####################################################################### dnl #######################################################################
- dewysiwygification/Makefile
- xmmsremote/pixmaps/Makefile
dnl #######################################################################
@@ -380,12 +372,8 @@
if test x"$HAVE_PURPLE" = x"yes" ; then
echo Installing purple plugins to.....: `eval eval echo $PURPLE_LIBDIR`
echo Installing purple plugin data to.: `eval eval echo $PURPLE_DATADIR`
- if test x"$PP_PURPLE_BUILD" = x"" ; then
- echo Purple plugins to be built.......: none
- echo Purple plugins to be built.......:
- echo $PP_PURPLE_BUILD | xargs -n 4 echo " "
+ echo Purple plugins to be built.......: @@ -393,12 +381,8 @@
if test x"$HAVE_PIDGIN" = x"yes" ; then
echo Installing pidgin plugins to.....: `eval eval echo $PIDGIN_LIBDIR`
echo Installing pidgin plugin data to.: `eval eval echo $PIDGIN_DATADIR`
- if test x"$PP_PIDGIN_BUILD" = x"" ; then
- echo Pidgin plugins to be built.......: none
- echo Pidgin plugins to be built.......:
- echo $PP_PIDGIN_BUILD | xargs -n 4 echo " "
+ echo Pidgin plugins to be built.......: @@ -406,12 +390,9 @@
if test x"$HAVE_FINCH" = x"yes" ; then
echo Installing finch plugins to......: `eval eval echo $FINCH_LIBDIR`
echo Installing finch plugin data to..: `eval eval echo $FINCH_DATADIR`
- if test x"$PP_FINCH_BUILD" = x"" ; then
- echo Finch plugins to be built........: none - THIS IS NORMAL
- echo Finch plugins to be built........:
- echo $PP_FINCH_BUILD | xargs -n 4 echo " "
+ echo Finch plugins to be built........: none - THIS IS NORMAL + # uncomment this when we have finch plugins
--- a/convbadger/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/convbadger/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,7 +1,6 @@
convbadgerdir = $(PIDGIN_LIBDIR)
--- a/convbadger/convbadger.c Mon Mar 24 15:08:23 2008 -0400
+++ b/convbadger/convbadger.c Sun May 04 04:13:52 2008 -0400
@@ -105,7 +105,7 @@
*****************************************************************************/
-convbadger_conv_created_cb(PurpleConversation *conv, gpointer data) {
+conv_badger_conv_created_cb(PurpleConversation *conv, gpointer data) { PidginConversation *pconv = PIDGIN_CONVERSATION(conv);
PidginWindow *win = pidgin_conv_get_window(pconv);
@@ -113,11 +113,11 @@
-convbadger_conv_destroyed_cb(PurpleConversation *conv, gpointer data) {
+conv_badger_conv_destroyed_cb(PurpleConversation *conv, gpointer data) { -convbadger_conv_switched_cb(PurpleConversation *conv, gpointer data) {
+conv_badger_conv_switched_cb(PurpleConversation *conv, gpointer data) { PidginConversation *pconv = PIDGIN_CONVERSATION(conv);
PidginWindow *win = pidgin_conv_get_window(pconv);
@@ -135,13 +135,13 @@
purple_signal_connect(conv_handle, "conversation-created", plugin,
- PURPLE_CALLBACK(convbadger_conv_created_cb), NULL);
+ PURPLE_CALLBACK(conv_badger_conv_created_cb), NULL); purple_signal_connect(conv_handle, "deleting-conversation", plugin,
- PURPLE_CALLBACK(convbadger_conv_destroyed_cb), NULL);
+ PURPLE_CALLBACK(conv_badger_conv_destroyed_cb), NULL); purple_signal_connect(pidgin_conversations_get_handle(),
"conversation-switched", plugin,
- PURPLE_CALLBACK(convbadger_conv_switched_cb), NULL);
+ PURPLE_CALLBACK(conv_badger_conv_switched_cb), NULL); --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/convbadger/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Badges conversations with the protocol icon. +notes=Completed for 2.1.0, buildsystem issues fixed in 2.1.1.
--- a/dewysiwygification/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/dewysiwygification/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
dewysiwygificationdir = $(PURPLE_LIBDIR)
--- a/dewysiwygification/dewysiwygification.c Mon Mar 24 15:08:23 2008 -0400
+++ b/dewysiwygification/dewysiwygification.c Sun May 04 04:13:52 2008 -0400
@@ -50,7 +50,7 @@
- purple_debug_misc("dewysiwygification", "it's now: %s", tmp);
+ purple_debug_misc("dewysiwygification", "it's now: %s\n", tmp); @@ -67,7 +67,7 @@
- purple_debug_misc("dewysiwygification", "it's now: %s", tmp);
+ purple_debug_misc("dewysiwygification", "it's now: %s\n", tmp); --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dewysiwygification/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+[DeWYSIWYGification Plugin] +provides=dewysiwygification +summary=Lets you type in HTML without it being escaped to entities. +description=%(summary)s This will not work well for some protocols. Use "<" for a literal "<".
--- a/dice/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/dice/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
dicedir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dice/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Rolls dice in a chat or im +description=Adds a command (/dice) to roll an arbitrary number of dice with an arbitrary number of sides. Now supports dice notation! /help dice for details
--- a/difftopic/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/difftopic/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .pidgin-plugin Makefile.mingw .build
difftopicdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/difftopic/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Show the old topic when the topic in a chat room changes. +authors=Sadrul Habib Chowdhury
--- a/eight_ball/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/eight_ball/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .purple-plugin Makefile.mingw
eight_balldir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/eight_ball/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Provides Magic 8-ball like functionality +description=%(summary)s with the /8ball command, as well as similar functionality for common Stargate words or phrases with the /sg-ball command.
--- a/enhancedhist/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/enhancedhist/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,7 +1,6 @@
enhancedhistdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/enhancedhist/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=An enhanced version of the history plugin. +description=%(summary)s Grants ability to select the number of previous conversations to show instead of just one.
--- a/findip/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/findip/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .abusive Makefile.mingw
findipdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/findip/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Find the IP of a person in the buddylist. +description=%(summary)s This doesn't really work. +authors=Sadrul Habib Chowdhury
--- a/flip/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/flip/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
flipdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flip/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Flips a coin and outputs the result +description=Adds a command (/flip) to flip a coin and outputs the result in the active conversation
--- a/gRIM/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/gRIM/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .pidgin-plugin Makefile.mingw .build
gRIMdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gRIM/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=A completely stupid and pointless plugin +description=Adds commands to annoy buddies with. Inspired by a dumb IRC convo and Red Dwarf. +authors=Peter Lawler,Sadrul Habib Chowdhury --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/google/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,28 @@
+googledir = $(PURPLE_LIBDIR) +google_la_LDFLAGS = -module -avoid-version +google_LTLIBRARIES = google.la + -DLIBDIR=\"$(PURPLE_LIBDIR)\" \ + -DDATADIR=\"$(PURPLE_DATADIR)\" \ + -DPIXMAPSDIR=\"$(PURPLE_PIXMAPSDIR)\" \ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/google/Makefile.mingw Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,12 @@
+# Description: Makefile for the google plugin. +include $(PP_TOP)/win_pp.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/google/google.c Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,325 @@
+ * Adds a command to return the first url for a google I'm feeling lucky search + * Copyright (C) 2008 Gary Kramlich <grim@reaperworld.com> + * 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 the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA. +#include "../common/pp_internal.h" +#include <conversation.h> +static PurpleCmdId google_cmd_id = 0; +#define GOOGLE_URL_FORMAT "http://%s/search?q=%s&btnI=I%%27m+Feeling+Lucky" +/****************************************************************************** + *****************************************************************************/ + PurpleConversation *conv; + PurpleProxyConnectData *conn_data; +/****************************************************************************** + * GoogleFetchUrlData API + *****************************************************************************/ +static GoogleFetchUrlData * +google_fetch_url_data_new(const gchar *url) { + GoogleFetchUrlData *gfud = g_new0(GoogleFetchUrlData, 1); + if(!purple_url_parse(url, &gfud->host, &gfud->port, &gfud->path, NULL, + gfud->response = g_string_new(""); +google_fetch_url_data_free(GoogleFetchUrlData *gfud) { + g_string_free(gfud->response, TRUE); + purple_input_remove(gfud->inpa); + purple_proxy_connect_cancel(gfud->conn_data); +/****************************************************************************** + * The final result (hiding in the middle, very sneaky) + *****************************************************************************/ +google_output_url(GoogleFetchUrlData *gfud) { + gchar *str = NULL, *url_s = NULL, *url_e = NULL; + const gchar *needle = "Location: "; + /* if our conv has disappeared from under us, drop out */ + str = gfud->response->str; + len = gfud->response->len; + url_s = g_strstr_len(str, len, needle); + url_s += strlen(needle); + url_e = g_strstr_len(url_s, len, "\r\n"); + if(gfud->conv->type == PURPLE_CONV_TYPE_IM) + purple_conv_im_send(PURPLE_CONV_IM(gfud->conv), url_s); + else if(gfud->conv->type == PURPLE_CONV_TYPE_CHAT) + purple_conv_chat_send(PURPLE_CONV_CHAT(gfud->conv), url_s); +/****************************************************************************** + *****************************************************************************/ +im_feeling_lucky_recv_cb(gpointer data, gint source, PurpleInputCondition c) { + GoogleFetchUrlData *gfud = (GoogleFetchUrlData *)data; + while((len = read(source, buff, sizeof(buff))) > 0) + gfud->response = g_string_append_len(gfud->response, buff, len); + google_output_url(gfud); + google_fetch_url_data_free(gfud); +im_feeling_lucky_send_cb(gpointer data, gint source, PurpleInputCondition c) { + GoogleFetchUrlData *gfud = (GoogleFetchUrlData *)data; + total_len = strlen(gfud->request); + len = write(gfud->fd, gfud->request + gfud->request_written, + total_len - gfud->request_written); + gfud->request_written += len; + if(gfud->request_written < total_len) + /* done writing the request, now read the response */ + purple_input_remove(gfud->inpa); + gfud->inpa = purple_input_add(gfud->fd, PURPLE_INPUT_READ, + im_feeling_lucky_recv_cb, gfud); +im_feeling_lucky_cb(gpointer data, gint source, const gchar *e) { + GoogleFetchUrlData *gfud = (GoogleFetchUrlData *)data; + gfud->conn_data = NULL; + purple_debug_error("google", "unable to connect to %s: %s\n", + gfud->host, gfud->path); + google_fetch_url_data_free(gfud); + gfud->request = g_strdup_printf( + "User-Agent: Purple/%u.%u.%u\r\n" + "Connection: close\r\n" + purple_major_version, purple_minor_version, purple_micro_version, + gfud->inpa = purple_input_add(gfud->fd, PURPLE_INPUT_WRITE, + im_feeling_lucky_send_cb, gfud); + im_feeling_lucky_send_cb(gfud, gfud->fd, PURPLE_INPUT_WRITE); +/****************************************************************************** + *****************************************************************************/ +im_feeling_lucky(PurpleConversation *conv, const gchar *cmd, gchar **args, + gchar *error, void *data) + GoogleFetchUrlData *gfud = NULL; + PurplePlugin *plugin = (PurplePlugin *)data; + url = g_strdup_printf(GOOGLE_URL_FORMAT, "www.google.com", + purple_url_encode(args[0])); + gfud = google_fetch_url_data_new(url); + return PURPLE_CMD_RET_FAILED; + /* now make the connection */ + purple_proxy_connect(plugin, NULL, gfud->host, gfud->port, + im_feeling_lucky_cb, gfud); + google_fetch_url_data_free(gfud); + return PURPLE_CMD_RET_FAILED; + return PURPLE_CMD_RET_OK; +/****************************************************************************** + *****************************************************************************/ +plugin_load(PurplePlugin *plugin) { + purple_cmd_register("google", "s", PURPLE_CMD_P_PLUGIN, + PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_CHAT, + NULL, PURPLE_CMD_FUNC(im_feeling_lucky), + _("Returns the url for a Google I'm feeling lucky " +plugin_unload(PurplePlugin *plugin) { + purple_cmd_unregister(google_cmd_id); +static PurplePluginInfo info = { + PURPLE_PLUGIN_STANDARD, + PURPLE_PRIORITY_DEFAULT, + "core-plugin_pack-google", + "Gary Kramlich <grim@reaperworld.com>", +init_plugin(PurplePlugin *plugin) { + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + info.name = _("Google"); + info.summary = _("Returns the url for a Google I'm feeling lucky search"); + info.description = info.summary; +PURPLE_INIT_PLUGIN(google, init_plugin, info) --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/google/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,8 @@
+summary=Writes the url for a Google I'm feeling lucky search to the active conversation
--- a/groupmsg/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/groupmsg/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .abusive Makefile.mingw
groupmsgdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/groupmsg/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Send an IM to a group of buddies. +description=Adds the option to send an IM to every online buddy in a group.
--- a/hideconv/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/hideconv/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .pidgin-plugin Makefile.mingw .incomplete
hideconvdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hideconv/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Hide conversations without closing them. +authors=Sadrul Habib Chowdhury +notes=Superseded by functionality present in Pidgin 2.3.0 and newer
--- a/highlight/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/highlight/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin Makefile.mingw .build
highlightdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/highlight/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Support for highlighting words. +authors=Sadrul Habib Chowdhury
--- a/ignorance/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/ignorance/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,8 +1,5 @@
@@ -13,6 +10,11 @@
ignorancedir = $(PIDGIN_LIBDIR)/pidgin
ignorance_la_LDFLAGS = -module -avoid-version
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ignorance/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Allows you to manage lists of users with various levels of allowable activity. +notes=Needs some TLC. It builds and probably works, but is far from an acceptible state.
--- a/ignore/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/ignore/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .purple-plugin Makefile.mingw
ignoredir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ignore/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Flexible plugin to selectively ignore people. Please do not use if you have amnesia. +authors=Sadrul Habib Chowdhury
--- a/infopane/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/infopane/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,7 +1,6 @@
infopanedir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/infopane/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Allow customizing the details information in conversation windows. +authors=Sadrul Habib Chowdhury +notes=Requires Pidgin 2.1.0 or newer.
--- a/irc-more/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/irc-more/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .purple-plugin Makefile.mingw
irc_moredir = $(PURPLE_LIBDIR)
--- a/irc-more/irc-more.c Mon Mar 24 15:08:23 2008 -0400
+++ b/irc-more/irc-more.c Sun May 04 04:13:52 2008 -0400
@@ -51,13 +51,18 @@
/* So you think you can kick me? I'll show you! */
PurpleConversation *conv = data;
- char *command = g_strdup_printf("join %s", purple_conversation_get_name(conv));
- char *markup = g_markup_escape_text(command, -1);
- purple_cmd_do_command(conv, command, markup, &error); /* Do anything with the return value? */
+ char *conv_name = NULL, *command = NULL, *markup = NULL, *error = NULL; + command = g_strdup_printf("join %s", conv_name); + markup = g_markup_escape_text(command, -1); + purple_cmd_do_command(conv, command, markup, &error); /* Do anything with the return value? */ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/irc-more/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Adds additional IRC features. +description=Adds additional IRC features, including a customizable quit message, a customizable CTCP VERSION reply, and the /notice command for notices where libpurple does not support it. +authors=Sadrul Habib Chowdhury,John Bailey +notes=Support for /notice only when built with libpurple older than 2.4.0.
--- a/irchelper/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/irchelper/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
irchelperdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/irchelper/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Handles the rough edges of the IRC protocol. +description=Provides transparent authentication with a variety of services and suppresses various useless messages
--- a/irssi/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/irssi/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,13 +1,15 @@
irssidir = $(PIDGIN_LIBDIR)
irssi_la_LDFLAGS = -module -avoid-version
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/irssi/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Implements features of the irssi IRC client for use in Pidgin. +description=Implements some features of the IRC client irssi to be used in Purple. It lets you know in all open conversations when the day has changed, adds the lastlog command, adds the window command, etc. The day changed message is not logged. +authors=Gary Kramlich,John Bailey,Sadrul Habib Chowdhury +notes=Originally introduced as 'irssidate', but renamed in version 1.0beta3.1 when additional functionality was added. --- a/irssi/textfmt.c Mon Mar 24 15:08:23 2008 -0400
+++ b/irssi/textfmt.c Sun May 04 04:13:52 2008 -0400
@@ -60,7 +60,7 @@
- if(!(account)->gc->flags & PURPLE_CONNECTION_HTML) \
+ if(!((account)->gc->flags & PURPLE_CONNECTION_HTML)) \
--- a/lastseen/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/lastseen/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .pidgin-plugin .build Makefile.mingw
lastseendir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lastseen/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Record when a buddy was last seen. +description=Logs the time of a last received message, what they said, when they logged in, and when they logged out, for buddies on your buddy list. +notes=Partially superseded by functionality added in Pidgin 2.1.0.
--- a/listhandler/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/listhandler/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,7 +1,4 @@
@@ -10,6 +7,11 @@
listhandlerdir = $(PURPLE_LIBDIR)
listhandler_la_LDFLAGS = -module -avoid-version
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/listhandler/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Provides numerous user-requested list-handling capabilities. +description=Provides numerous user-requested list-handling capabilities, such as importing and exporting of AIM .blt files and generic protocol-agnostic XML .blist files, as well as direct copying of buddies from one account to another. --- a/m4/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
--- a/m4/pluginpack.m4 Mon Mar 24 15:08:23 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-dnl ###########################################################################
-dnl # m4 Build Helper for the purple plugin pack
-dnl # Copyright (C) 2005-2007 Gary Kramlich <grim@reaperworld.com>
-dnl # awk foo and other sanity graciously provided by Caleb Gilmour
-dnl ###########################################################################
-dnl # AM_BUILD_PLUGIN_LIST
-dnl # Searches a dir, for subdir's which have a .plugin file defining them
-dnl # as plugins for the plugin pack.
-dnl ###########################################################################
-AC_DEFUN([AM_BUILD_PLUGIN_LIST],
- PP_PURPLE_INCOMPLETE=""
- PP_PIDGIN_INCOMPLETE=""
- dnl #######################################################################
- dnl # Build a list of all the available plugins
- dnl #######################################################################
- if ! test -d "$d"; then
- if test -f "$d/Makefile.am" -a ! "$d" = "$srcdir/common" -a ! "$d" = "$srcdir/doc" -a ! "$d" = "$srcdir/m4" -a ! -f "$d/configure" -a ! -f "$d/.abusive" -a ! -f "$d/.build" -a ! -f "$d/.incomplete" ; then
-*** Plugin Directory $d is misconfigured
-*** You should *NEVER* see this in a release. If this is a release and not
-*** monotone, please file a ticket at http://plugins.guifications.org/
-*** If you are a developer, please ensure that $d contains a .build,
-*** .incomplete, or .abusive file.
- if test -f "$d/.purple-plugin" ; then
- if test -f $d/.abusive ; then
- PP_PURPLE_ABUSIVE="$PP_PURPLE_ABUSIVE $base"
- elif test -f "$d/.build" ; then
- PP_PURPLE_BUILD="$PP_PURPLE_BUILD $base"
- if test -f "$d/.incomplete" ; then
- PP_PURPLE_INCOMPLETE="$PP_PURPLE_INCOMPLETE $base"
- PP_PURPLE="$PP_PURPLE $base"
- if test -f "$d/.pidgin-plugin" ; then
- if test -f "$d/.abusive" ; then
- PP_PIDGIN_ABUSIVE="$PP_PIDGIN_ABUSIVE $base"
- elif test -f "$d/.build" ; then
- PP_PIDGIN_BUILD="$PP_PIDGIN_BUILD $base"
- if test -f "$d/.incomplete" ; then
- PP_PIDGIN_INCOMPLETE="$PP_PIDGIN_INCOMPLETE $base"
- PP_PIDGIN="$PP_PIDGIN $base"
- if test -f "$d/.finch-plugin" ; then
- if test -f "$d/.abusive" ; then
- PP_FINCH_ABUSIVE="$PP_FINCH_ABUSIVE $base"
- elif test -f "$d/.build" ; then
- PP_FINCH_BUILD="$PP_FINCH_BUILD $base"
- if test -f "$d/.incomplete" ; then
- PP_FINCH_INCOMPLETE="$PP_FINCH_INCOMPLETE $base"
- PP_FINCH="$PP_FINCH $base"
- dnl #######################################################################
- dnl #######################################################################
- AC_HELP_STRING([--with-plugins], [what plugins to build]),
- dnl #######################################################################
- dnl # Now determine which ones have been selected
- dnl #######################################################################
- case "$with_plugins" in
- PP_FINCH_BUILD="$PP_FINCH_ABUSIVE $PP_FINCH_BUILD"
- PP_PIDGIN_BUILD="$PP_PIDGIN_ABUSIVE $PP_PIDGIN_BUILD"
- PP_PURPLE_BUILD="$PP_PURPLE_ABUSIVE $PP_PURPLE_BUILD"
- dnl # we don't do anything if the defaults are selected, they're
- dnl # already set up :)
- dnl # clear out the build variables
- dnl # turn the with plugins variable into a space delimited list
- exp_plugins=`echo "$with_plugins" | sed 's/,/ /g'`
- dnl # loop through the with plugins list and update the build variables
- dnl # as we find the plugins in each type.
- PP_FINCH_BUILD="$PP_FINCH_BUILD $p"
- PP_PIDGIN_BUILD="$PP_PIDGIN_BUILD $p"
- PP_PURPLE_BUILD="$PP_PURPLE_BUILD $p"
- PP_FINCH_BUILD=`echo $PP_FINCH_BUILD | awk '{for (i = 1; i <=NF; i++) { print $i } }' | sort | uniq | xargs echo`
- PP_PIDGIN_BUILD=`echo $PP_PIDGIN_BUILD | awk '{for (i = 1; i <=NF; i++) { print $i } } ' | sort | uniq | xargs echo`
- PP_PURPLE_BUILD=`echo $PP_PURPLE_BUILD | awk '{for (i = 1; i <=NF; i++) { print $i } } ' | sort | uniq | xargs echo`
- dnl #######################################################################
- dnl # substitue our sub dirs
- dnl #######################################################################
- AC_SUBST(PP_PURPLE_ABUSIVE)
- AC_SUBST(PP_PURPLE_INCOMPLETE)
- AC_SUBST(PP_PURPLE_BUILD)
- AC_SUBST(PP_PIDGIN_ABUSIVE)
- AC_SUBST(PP_PIDGIN_INCOMPLETE)
- AC_SUBST(PP_PIDGIN_BUILD)
- AC_SUBST(PP_FINCH_ABUSIVE)
- AC_SUBST(PP_FINCH_INCOMPLETE)
- AC_SUBST(PP_FINCH_BUILD)
- dnl #######################################################################
- dnl # build some statistics info
- dnl #######################################################################
- PP_PURPLE_ABUSIVE_COUNT=`echo $PP_PURPLE_ABUSIVE | wc -w`
- PP_PURPLE_INCOMPLETE_COUNT=`echo $PP_PURPLE_INCOMPLETE | wc -w`
- PP_PURPLE_BUILD_COUNT=`echo $PP_PURPLE_BUILD | wc -w`
- PP_PURPLE_TOTAL_COUNT=`echo $PP_PURPLE | wc -w`
- AC_SUBST(PP_PURPLE_ABUSIVE_COUNT)
- AC_SUBST(PP_PURPLE_INCOMPLETE_COUNT)
- AC_SUBST(PP_PURPLE_BUILD_COUNT)
- AC_SUBST(PP_PURPLE_TOTAL_COUNT)
- PP_PIDGIN_ABUSIVE_COUNT=`echo $PP_PIDGIN_ABUSIVE | wc -w`
- PP_PIDGIN_INCOMPLETE_COUNT=`echo $PP_PIDGIN_INCOMPLETE | wc -w`
- PP_PIDGIN_BUILD_COUNT=`echo $PP_PIDGIN_BUILD | wc -w`
- PP_PIDGIN_TOTAL_COUNT=`echo $PP_PIDGIN | wc -w`
- AC_SUBST(PP_PIDGIN_ABUSIVE_COUNT)
- AC_SUBST(PP_PIDGIN_INCOMPLETE_COUNT)
- AC_SUBST(PP_PIDGIN_BUILD_COUNT)
- AC_SUBST(PP_PIDGIN_TOTAL_COUNT)
- PP_FINCH_ABUSIVE_COUNT=`echo $PP_FINCH_ABUSIVE | wc -w`
- PP_FINCH_INCOMPLETE_COUNT=`echo $PP_FINCH_INCOMPLETE | wc -w`
- PP_FINCH_BUILD_COUNT=`echo $PP_FINCH_BUILD | wc -w`
- PP_FINCH_TOTAL_COUNT=`echo $PP_FINCH | wc -w`
- AC_SUBST(PP_FINCH_ABUSIVE_COUNT)
- AC_SUBST(PP_FINCH_INCOMPLETE_COUNT)
- AC_SUBST(PP_FINCH_BUILD_COUNT)
- AC_SUBST(PP_FINCH_TOTAL_COUNT)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/manualsize/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,27 @@
+EXTRA_DIST = .pidgin-plugin .build Makefile.mingw +manualsizedir = $(PIDGIN_LIBDIR) +manualsize_la_LDFLAGS = -module -avoid-version +manualsize_LTLIBRARIES = manualsize.la +manualsize_la_SOURCES = \ +manualsize_la_LIBADD = \ + -DLIBDIR=\"$(PIDGIN_LIBDIR)\" \ + -DDATADIR=\"$(PIDGIN_DATADIR)\" \ + -DPIXMAPSDIR=\"$(PIDGIN_PIXMAPSDIR)\" \ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/manualsize/Makefile.mingw Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,12 @@
+# Description: Makefile for manualsize plugin. +include $(PP_TOP)/win_pp.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/manualsize/manualsize.c Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,329 @@
+ * Pidgin 2.4 manual entry area height sizing plugin + * License: GPL version 2 or later + * Copyright (C) 2008, Artemy Kapitula <dalt74@gmail.com> +#include "../common/pp_internal.h" +#include <conversation.h> +#define NOTIFY_PLUGIN_ID "pidgin-entry-manual-height" +#define PREF_PREFIX "/plugins/manualsize" +#define PREF_CHAT_ENTRY_HEIGHT PREF_PREFIX "/chat_entry_height" +#define PREF_IM_ENTRY_HEIGHT PREF_PREFIX "/im_entry_height" +static gboolean page_added = FALSE; // The flag of page has been added. + // It's used to track a case when we add a second page and should to do some + // additional work to track a page resize issues +static GList * books_connected = NULL; + // List of notebooks we connected to. When plugin is unloaded, + // we will disconnect our handler for a "page-added" signal + * Find a first "placed" objects (the object that has allocation with a height > 1) + * and it's internal height. + * It's required because when creating a non-first page in the notebook, + * the widget of the added page has allocation->heigth = 1, and we cannot + * use it as a base for evaluating position of separator in a GtkVPaned +find_placed_object(GtkWidget *w, gint *client_height) { + border_width = gtk_container_get_border_width(GTK_CONTAINER(w)); + if((w->allocation.height > 1) || (gtk_widget_get_parent(w)==NULL)) { + *client_height = w->allocation.height; + ret = find_placed_object(gtk_widget_get_parent(w), client_height); + *client_height = *client_height - border_width + 2; + * Find a GtkNotebook in the widget's parents + * It's used to find a GtkNotebook in a conversation window + * to attach a "page-added" signal handler +get_notebook(GtkWidget * w) { + const gchar *name = NULL; + name = G_OBJECT_TYPE_NAME(w); + if (name && strcmp("GtkNotebook", name) == 0) + if(gtk_widget_get_parent(w) == NULL) + return get_notebook(gtk_widget_get_parent(w)); + * Signal handler. Triggers a page_added flag. +on_page_add(GtkNotebook *book, GtkWidget *widget, guint page_num, + * When removing last page, forget this notebook +on_page_remove(GtkNotebook *book, GtkWidget *widget, guint page_num, + if(gtk_notebook_get_n_pages(book) == 0) { + books_connected = g_list_remove(books_connected, book); + * Attach a handlers on a notebook if it is not already attached + * Adds a notebook into a tracked objects list +connect_notebook_handler(GtkNotebook * notebook) { + GList * item = g_list_find(books_connected, notebook); + g_signal_connect_after(notebook, "page-added", + G_CALLBACK(on_page_add), NULL); + g_signal_connect_after(notebook, "page-removed", + G_CALLBACK(on_page_remove), NULL); + books_connected = g_list_append( books_connected, notebook ); + * Rebuild conversation pane. + * Find a conversation pane ("pane") + * Find a parent for a pane ("top") + * Create GtkVPaned ("vpaned") + * Move "pane" from a "top" to the up of "vpaned" + * Move "lower_hbox" of conversation to the bottom "vpaned" + * Insert "vpaned" into a "top" + * Change "vpaned" divider position +rebuild_container(PidginConversation *conv) { + GtkWidget * pane = gtk_widget_get_parent(GTK_WIDGET(conv->lower_hbox)); + GtkWidget * top = gtk_widget_get_parent( pane ); + GtkWidget * vpaned = gtk_vpaned_new(); + GtkNotebook * notebook = GTK_NOTEBOOK(get_notebook(top)); + GtkPositionType tabpos = -1; + gint stored_height = 0; + if(purple_conversation_get_type(conv->active_conv) == PURPLE_CONV_TYPE_CHAT) + stored_height = purple_prefs_get_int(PREF_CHAT_ENTRY_HEIGHT); + stored_height = purple_prefs_get_int(PREF_IM_ENTRY_HEIGHT); + if (stored_height < 0) stored_height = 128; + tabpos = gtk_notebook_get_tab_pos( notebook ); + connect_notebook_handler( notebook ); + g_value_init( &v, G_TYPE_BOOLEAN ); + gtk_widget_show( vpaned ); + g_value_set_boolean( &v, TRUE ); + gtk_widget_reparent( pane, vpaned ); + gtk_container_child_set_property( GTK_CONTAINER(vpaned), pane, "resize", &v ); + g_value_set_boolean( &v, FALSE ); + gtk_widget_reparent( conv->lower_hbox, vpaned ); + gtk_container_child_set_property( GTK_CONTAINER(vpaned), conv->lower_hbox, "resize", &v ); + gtk_container_add( GTK_CONTAINER(top), vpaned ); + gtk_widget_style_get( vpaned, "handle-size", &handle_size, NULL ); + find_placed_object( top, &parent_area ); + border_size = gtk_container_get_border_width(GTK_CONTAINER(top)); + (((page_added==TRUE)&&((tabpos==GTK_POS_TOP)||(tabpos==GTK_POS_BOTTOM)))?24:0); + gtk_paned_set_position( GTK_PANED(vpaned), new_pos ); + gtk_widget_grab_focus( conv->entry ); + * Store input area size depending on a conversation type +store_area_size(PidginConversation *gtkconv) { + GtkWidget *parent = NULL; + const gchar *name = NULL; + parent = gtk_widget_get_parent(GTK_WIDGET(gtkconv->lower_hbox)); + name = G_OBJECT_TYPE_NAME(parent); + if(name && strcmp("GtkVPaned", name) == 0) { + PurpleConversation *conv = gtkconv->active_conv; + if(purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + purple_prefs_set_int(PREF_CHAT_ENTRY_HEIGHT, + gtkconv->lower_hbox->allocation.height); + purple_prefs_set_int(PREF_IM_ENTRY_HEIGHT, + gtkconv->lower_hbox->allocation.height); + * Signal handler. Called when conversation created, and rebuilds a conversation pane +on_display(gpointer data) { + PidginConversation *gtkconv = (PidginConversation *)data; + rebuild_container(gtkconv); + * Signal handler. Called when conversation destroyed, to store an input area size +on_destroy(void * data) { + PurpleConversation *conv = (PurpleConversation*)data; + PidginConversation * gtkconv = PIDGIN_CONVERSATION(conv); + store_area_size(gtkconv); + * Traverse connected notebooks and remove our signal handler +cleanup_callback(gpointer data, gpointer user_data) { + g_signal_handlers_disconnect_by_func( data, on_page_add, NULL ); + g_signal_handlers_disconnect_by_func( data, on_page_remove, NULL ); +plugin_load(PurplePlugin *plugin) { + void *gtk_conv_handle = pidgin_conversations_get_handle(); + void *conv_handle = purple_conversations_get_handle(); + purple_prefs_add_none(PREF_PREFIX); + purple_prefs_add_int(PREF_CHAT_ENTRY_HEIGHT, 128); + purple_prefs_add_int(PREF_IM_ENTRY_HEIGHT, 128); + purple_signal_connect(gtk_conv_handle, "conversation-displayed", plugin, + PURPLE_CALLBACK(on_display), NULL); + purple_signal_connect(conv_handle, "deleting-conversation", plugin, + PURPLE_CALLBACK(on_destroy), NULL); +plugin_unload(PurplePlugin *plugin) { + g_list_foreach(books_connected, cleanup_callback, NULL); + g_list_free(books_connected); +static PurplePluginInfo info = + PURPLE_PLUGIN_STANDARD, /**< type */ + PIDGIN_PLUGIN_TYPE, /**< ui_requirement */ + NULL, /**< dependencies */ + PURPLE_PRIORITY_DEFAULT, /**< priority */ + NOTIFY_PLUGIN_ID, /**< id */ + PP_VERSION, /**< version */ + NULL, /** description */ + "Artemy Kapitula <dalt74@gmail.com>", /**< author */ + PP_WEBSITE, /**< homepage */ + plugin_load, /**< load */ + plugin_unload, /**< unload */ + NULL, /**< extra_info */ +init_plugin(PurplePlugin *plugin) { + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + info.name = _("Entry area manual sizing"); + info.summary = _("Allows you to change entry area height"); + info.description = info.summary; +PURPLE_INIT_PLUGIN(manualsize, init_plugin, info) --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/msglen/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,27 @@
+EXTRA_DIST = .pidgin-plugin .incomplete Makefile.mingw +msglendir = $(PIDGIN_LIBDIR) +msglen_la_LDFLAGS = -module -avoid-version +msglen_LTLIBRARIES = msglen.la + -DLIBDIR=\"$(PIDGIN_LIBDIR)\" \ + -DDATADIR=\"$(PIDGIN_DATADIR)\" \ + -DPIXMAPSDIR=\"$(PIDGIN_PIXMAPSDIR)\" \ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/msglen/Makefile.mingw Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,12 @@
+# Description: Makefile for convbadger plugin. +include $(PP_TOP)/win_pp.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/msglen/msglen.c Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,217 @@
+ * msglen - Adds the current message's length to the menutray of a conversation + * Copyright (C) 2008 Gary Kramlich <grim@reaperworld.com> + * 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 the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA. +/* If you can't figure out what this line is for, DON'T TOUCH IT. */ +#include "../common/pp_internal.h" +#include <conversation.h> +#include <gtkmenutray.h> +/****************************************************************************** + *****************************************************************************/ + PurpleConversation *conv; +/****************************************************************************** + *****************************************************************************/ +static GHashTable *data = NULL; +/****************************************************************************** + *****************************************************************************/ +msg_len_data_free(MsgLenData *mld) { + if(mld->label && GTK_IS_LABEL(mld->label)) + gtk_widget_destroy(mld->label); +msg_len_data_free_helper(gpointer k, gpointer v, gpointer d) { + MsgLenData *mld = (MsgLenData *)v; + msg_len_data_free(mld); +msg_len_update(PidginWindow *win, PurpleConversation *conv) { + PidginConversation *gtkconv = NULL; + MsgLenData *mld = NULL; + g_return_if_fail(conv); + mld = g_hash_table_lookup(data, conv); + mld = g_new0(MsgLenData, 1); + mld->label = gtk_label_new(""); + pidgin_menu_tray_append(PIDGIN_MENU_TRAY(win->menu.tray), mld->label, + gtk_widget_show(mld->label); + g_signal_connect_swapped(G_OBJECT(mld->label), "destroy", + G_CALLBACK(g_nullify_pointer), &mld->label); + gtkconv = PIDGIN_CONVERSATION(conv); + count = gtk_text_buffer_get_char_count(gtkconv->entry_buffer); + text = g_strdup_printf("%d", count); + gtk_label_set_text(GTK_LABEL(mld->label), text); + g_hash_table_insert(data, win, mld); +/****************************************************************************** + *****************************************************************************/ +msg_len_conv_created_cb(PurpleConversation *conv, gpointer data) { + PidginConversation *pconv = PIDGIN_CONVERSATION(conv); + PidginWindow *win = pidgin_conv_get_window(pconv); + purple_debug_info("msglen", "created\n"); + msg_len_update(win, conv); +msg_len_conv_destroyed_cb(PurpleConversation *conv, gpointer data) { + purple_debug_info("msglen", "destroyed\n"); +msg_len_conv_switched_cb(PurpleConversation *conv, gpointer data) { + PidginConversation *pconv = PIDGIN_CONVERSATION(conv); + PidginWindow *win = pidgin_conv_get_window(pconv); + purple_debug_info("msglen", "switched\n"); + msg_len_update(win, conv); +/****************************************************************************** + *****************************************************************************/ +plugin_load(PurplePlugin *plugin) { + void *conv_handle = purple_conversations_get_handle(); + data = g_hash_table_new_full(g_direct_hash, g_direct_equal, + purple_signal_connect(conv_handle, "conversation-created", plugin, + PURPLE_CALLBACK(msg_len_conv_created_cb), NULL); + purple_signal_connect(conv_handle, "deleting-conversation", plugin, + PURPLE_CALLBACK(msg_len_conv_destroyed_cb), NULL); + purple_signal_connect(pidgin_conversations_get_handle(), + "conversation-switched", plugin, + PURPLE_CALLBACK(msg_len_conv_switched_cb), NULL); +plugin_unload(PurplePlugin *plugin) { + g_hash_table_foreach(data, msg_len_data_free_helper, NULL); + g_hash_table_destroy(data); +static PurplePluginInfo info = { + PURPLE_PLUGIN_STANDARD, + PURPLE_PRIORITY_DEFAULT, + "gtk-plugin_pack-msglen", + "Gary Kramlich <grim@reaperworld.com>", +init_plugin(PurplePlugin *plugin) { + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + info.name = _("Message Length"); + info.summary = _("Shows the length of your current message in the menu " + info.description = info.summary; +PURPLE_INIT_PLUGIN(msg_len, init_plugin, info) --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/msglen/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,8 @@
+summary=Shows the length of your current message in the menu tray
--- a/mystatusbox/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/mystatusbox/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .pidgin-plugin Makefile.mingw
mystatusboxdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mystatusbox/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+[Mystatusbox (Show Statusboxes)] +summary=Hide/Show the per-account statusboxes +description=You can show all the per-account statusboxes, hide all of them, or just show the ones that are in a different status from the global status. For ease of use, you can bind keyboard shortcuts for the menu items. +authors=Sadrul Habib Chowdhury
--- a/napster/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/napster/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,10 +1,12 @@
napsterdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/napster/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=NAPSTER Protocol Plugin +notes=Introduced into the Purple Plugin Pack after it was removed from libpurple.
--- a/nicksaid/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/nicksaid/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .pidgin-plugin Makefile.mingw
nicksaiddir = $(PIDGIN_LIBDIR)
--- a/nicksaid/nicksaid.c Mon Mar 24 15:08:23 2008 -0400
+++ b/nicksaid/nicksaid.c Sun May 04 04:13:52 2008 -0400
@@ -199,7 +199,9 @@
clear_list(GtkWidget *w, PidginConversation *gtkconv)
- GList *list = g_object_get_data(G_OBJECT(gtkconv->imhtml), "nicksaid:list");
+ ll = list = g_object_get_data(G_OBJECT(gtkconv->imhtml), "nicksaid:list"); @@ -209,6 +211,7 @@
g_object_set_data(G_OBJECT(gtkconv->imhtml), "nicksaid:list", NULL);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nicksaid/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Record when someone said your nick in a chat. +authors=Sadrul Habib Chowdhury
--- a/oldlogger/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/oldlogger/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
oldloggerdir = $(PURPLE_LIBDIR)
--- a/oldlogger/oldlogger.c Mon Mar 24 15:08:23 2008 -0400
+++ b/oldlogger/oldlogger.c Sun May 04 04:13:52 2008 -0400
@@ -114,7 +114,7 @@
@@ -146,7 +146,6 @@
if ((index_fd = g_mkstemp(index_tmp)) == -1) {
purple_debug_error("log", "Failed to open index temp file: %s\n",
@@ -177,8 +176,11 @@
purple_debug_warning("log", "Failed to rename index temp file \"%s\" to \"%s\": %s\n",
index_tmp, index_path, strerror(errno));
static void old_logger_finalize(PurpleLog *log)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/oldlogger/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,8 @@
+summary=Re-implements the legacy, deficient, logging
--- a/plonkers/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/plonkers/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .pidgin-plugin .build
plonkersdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plonkers/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Tell plonkers what you really think. +description=Plonkers is a small plugin that lets you announce to a chat room your current list of ignores, as well as providing other pointless ignore and privacy tools for dealing with idiots. The name is inspired by the British/Irish word for 'idiots.' --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin_pack.py Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,504 @@
+# plugin_pack.py - Helper script for obtaining info about the plugin pack +# Copyright (C) 2008 Gary Kramlich <grim@reaperworld.com> +# 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 the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA. +"""Usage: plugin_pack.py [OPTION...] command + -a Load abusive plugins + -d Load default plugins + -i Load incomplate plugins + print >> sys.stderr, msg + def __init__(self, directory, name, parser): + self.directory = directory + self.type = parser.get(name, 'type') + self.depends = parser.get(name, 'depends').split() + self.provides = parser.get(name, 'provides') + self.summary = parser.get(name, 'summary') + self.description = parser.get(name, 'description') + self.authors = parser.get(name, 'authors').split(',') + self.introduced = parser.get(name, 'introduced') + if parser.has_option(name, 'notes'): + self.notes = parser.get(name, 'notes') + if self.type != 'default' and self.type != 'incomplete' and self.type != 'abusive': + printerr('\'%s\' has an unknown type of \'%s\'!' % (self.name, self.type)) + output = 'name: %s\n' % self.name + output += 'authors: %s\n' % string.join(self.authors, ', ') + output += 'type: %s\n' % self.type + output += 'depends: %s\n' % string.join(self.depends, ' ') + output += 'provides: %s\n' % self.provides + output += 'directory: %s\n' % self.directory + output += 'summary: %s\n' % self.summary + output += 'description: %s\n' % self.description + output += 'notes: %s\n' % self.notes + def load_plugins(self, types, depends): + for file in glob.glob('*/plugins.cfg'): + parser = ConfigParser.ConfigParser() + except ConfigParser.ParsingError, msg: + printerr('Failed to parse \'%s\':\n%s' % (file, msg)) + for plugin in parser.sections(): + p = Plugin(os.path.dirname(file), plugin, parser) + # this is kind of hacky, but if we have types, we check to see + # if the type is in list of types to load. + if types and not p.type in types: + # now we check if the give plugins depends match the search + if len(set(depends).intersection(set(p.depends))) == 0: + self.plugins[p.provides] = p + def list_type(self, type): + for name in self.plugins.keys(): + plugin = self.plugins[name] + if plugin.type == type: + def list_dep(self, dep): + for name in self.plugins.keys(): + plugin = self.plugins[name] + if dep in plugin.depends: + def print_names(self, list): + names.append(plugin.name) + print string.join(names, ',') + def default_plugins(self): + return self.list_type('default') + def abusive_plugins(self): + return self.list_type('abusive') + def incomplete_plugins(self): + return self.list_type('incomplete') + def purple_plugins(self): + return self.list_dep('purple') + def finch_plugins(self): + return self.list_dep('finch') + def pidgin_plugins(self): + return self.list_dep('pidgin') + for name in self.plugins.keys(): + dirs[self.plugins[name].directory] = 1 + """Displays information about other commands""" + cmd = self.commands[args[0]] + print 'command \'%s\' was not found' % args[0] + commands['help'] = help + def dist_dirs(self, args): + """Displays a list of all plugin directories to included in the distribution""" + print string.join(self.unique_dirs(), ' ') + commands['dist_dirs'] = dist_dirs + def build_dirs(self, args): + """Displays a list of the plugins that can be built""" + printerr('build_dirs expects 2 arguments:') + printerr('\ta comma separated list of dependencies') + printerr('\ta comma separated list of plugins to build') + # store the external depedencies + externals = args[0].split(',') + # run through the provided dependencies, setting their dependencies to + # nothing since we know we already have them + # now run through the plugins adding their deps to the dictionary + for name in self.plugins.keys(): + plugin = self.plugins[name] + deps[plugin.provides] = plugin.depends + # run through the requested plugins and store their plugin instance in check + for provides in args[1].split(','): + for p in self.default_plugins(): + defaults.append(p.provides) + plugin = self.plugins[provides] + check.append(plugin.provides) + # convert our list of plugins to check into a set to remove dupes + # create our list of plugins to build + # now define a function to check our deps + def has_deps(provides): + # don't add anything to build more than once + dep_list = deps[provides] + # now check the dependencies + # make sure the provides isn't an external + if not provides in externals: + # everything checks out! + # check all the plugins we were told to for their dependencies + # now create a list of all directories to build + plugin = self.plugins[provides] + output.append(plugin.directory) + print "%s" % (string.join(output, ',')) + commands['build_dirs'] = build_dirs + def config_file(self, args): + """Outputs the contents for the file to be m4_include()'d from configure""" + uniqdirs = self.unique_dirs() + # add our --with-plugins option + print 'AC_ARG_WITH(plugins,' + print ' AC_HELP_STRING([--with-plugins], [what plugins to build]),' + print ' ,WITH_PLUGINS=all)' + # determine and add our output files + print 'PP_DIST_DIRS="%s"' % (string.join(uniqdirs, ' ')) + print 'AC_SUBST(PP_DIST_DIRS)' + print 'AC_CONFIG_FILES([' + print '\t%s/Makefile' % (dir) + # setup a second call to determine the plugins to be built + print 'PP_BUILD=`$PYTHON $srcdir/plugin_pack.py build_dirs $DEPENDENCIES $WITH_PLUGINS`' + print 'PP_BUILD_DIRS=`echo $PP_BUILD | sed \'s/,/\ /g\'`' + print 'AC_SUBST(PP_BUILD_DIRS)' + print 'PP_PURPLE_BUILD="$PYTHON $srcdir/plugin_pack.py -p show_names $PP_BUILD"' + print 'PP_PIDGIN_BUILD="$PYTHON $srcdir/plugin_pack.py -P show_names $PP_BUILD"' + print 'PP_FINCH_BUILD="$PYTHON $srcdir/plugin_pack.py -f show_names $PP_BUILD"' + commands['config_file'] = config_file + def dependency_graph(self, args): + """Outputs a graphviz script showing plugin dependencies""" + def node_label(plugin): + node = plugin.provides.replace('-', '_') + def print_plugins(list): + node, label = node_label(plugin) + print '\t%s[label="%s"];' % (node, label) + print '\tlabel="Dependency Graph";' + print '\tlabelloc="t";' + print '\tsplines=TRUE;' + print '\toverlap=FALSE;' + print '\tnode[fontname="sans", fontsize="8", style="filled"];' + # run through the default plugins + print '\t/* default plugins */' + print '\tnode[fillcolor="palegreen",shape="tab"];' + print_plugins(self.default_plugins()) + # run through the incomplete plugins + print '\t/* incomplete plugins */' + print '\tnode[fillcolor="lightyellow1",shape="note"];' + print_plugins(self.incomplete_plugins()) + # run through the abusive plugins + print '\t/* abusive plugins */' + print '\tnode[fillcolor="lightpink",shape="octagon"];' + print_plugins(self.abusive_plugins()) + # run through again, this time showing the relations + print '\t/* dependencies' + print '\t * exteranl ones that don\'t have nodes get colored to the following' + print '\tnode[fillcolor="powderblue", shape="egg"];' + for name in self.plugins.keys(): + plugin = self.plugins[name] + node, label = node_label(plugin) + for dep in plugin.depends: + dep = dep.replace('-', '_') + print '\t%s -> %s;' % (node, dep) + commands['dependency_graph'] = dependency_graph + def show_names(self, args): + """Displays the names of the given comma separated list of provides""" + provides = args[0].split(',') + for provide in provides: + if not provide in self.plugins: + name = self.plugins[provide].name + if len(line) + len(name) + 2 > 75: + commands['show_names'] = show_names + """Displays all information about the given plugins""" + print self.plugins[p].__str__().strip() + print 'Failed to find a plugin that provides \'%s\'' % (p) + commands['info'] = info + """Displays stats about the plugin pack""" + counts['total'] = len(self.plugins) + counts['default'] = len(self.default_plugins()) + counts['incomplete'] = len(self.incomplete_plugins()) + counts['abusive'] = len(self.abusive_plugins()) + counts['purple'] = len(self.purple_plugins()) + counts['finch'] = len(self.finch_plugins()) + counts['pidgin'] = len(self.pidgin_plugins()) + return "%3d (%0.2f%%)" % (val, (float(val) / float(counts['total'])) * 100.0) + print "Purple Plugin Pack Stats" + print "%d plugins in total" % (counts['total']) + print " complete: %s" % (value(counts['default'])) + print " incomplete: %s" % (value(counts['incomplete'])) + print " abusive: %s" % (value(counts['abusive'])) + print " purple: %s" % (value(counts['purple'])) + print " finch: %s" % (value(counts['finch'])) + print " pidgin: %s" % (value(counts['pidgin'])) + commands['stats'] = stats +def show_usage(pp, exitcode): + cmds = pp.commands.keys() + print " %-20s %s" % (cmd, pp.commands[cmd].__doc__) + # create our main instance + opts, args = getopt.getopt(sys.argv[1:], shortopts) + except getopt.error, msg: + types.append('abusive') + types.append('default') + types.append('incomplete') + depends.append('finch') + depends.append('pidgin') + depends.append('purple') + # load the plugins that have been requested, if both lists are empty, all + pp.load_plugins(types, depends) + pp.commands[cmd](pp, args) + printerr('\'%s\' command not found' % (cmd)) +if __name__ == '__main__': --- a/po/POTFILES.in Mon Mar 24 15:08:23 2008 -0400
+++ b/po/POTFILES.in Sun May 04 04:13:52 2008 -0400
@@ -1,5 +1,22 @@
+autoprofile/autoprofile.c +autoprofile/comp_countdownup.c +autoprofile/comp_executable.c +autoprofile/comp_logstats.c +autoprofile/comp_logstats_gtk.c +autoprofile/comp_quotation.c +autoprofile/comp_textfile.c +autoprofile/comp_timestamp.c +autoprofile/comp_uptime.c +autoprofile/gtk_actions.c +autoprofile/gtk_away_msgs.c +autoprofile/gtk_widget.c +autoprofile/preferences.c @@ -8,6 +25,7 @@
@@ -19,6 +37,7 @@
@@ -57,6 +76,7 @@
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/po/POTFILES.skip Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,1 @@
--- a/schedule/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/schedule/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,9 @@
-EXTRA_DIST = .build .pidgin-plugin schedule.h
pidgin_scheduledir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/schedule/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Schedule reminders at specified times. +authors=Sadrul Habib Chowdhury +notes=Renamed from gaim-schedule to schedule after the Pidgin rename.
--- a/sepandtab/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/sepandtab/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .pidgin-plugin Makefile.mingw
sepandtabdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sepandtab/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Adds two placement functions for separating and tabbing +description=Adds two new placement functions. One separates IMs and groups chats in tabs, the other separates chats and groups IMs in tabs.
--- a/showoffline/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/showoffline/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
showofflinedir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/showoffline/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Show specific buddies while offline. +description=Adds the option to show specific buddies in your buddy list when they are offline, even with "Show Offline Buddies" turned off. --- a/showoffline/showoffline.c Mon Mar 24 15:08:23 2008 -0400
+++ b/showoffline/showoffline.c Sun May 04 04:13:52 2008 -0400
@@ -82,6 +82,13 @@
plugin_load(PurplePlugin *plugin)
+ if (purple_version_check(2,3,0) == NULL) { + purple_notify_info(plugin, _("Plugin deprecated"), + _("Show Offline plugin deprecated"), + _("This plugin has been deprecated as of Pidgin 2.3.0 which\n" + "includes the same functionality.")); purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu",
plugin, PURPLE_CALLBACK(showoffline_extended_menu_cb), NULL);
--- a/simfix/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/simfix/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .build .purple-plugin Makefile.mingw
simfixdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/simfix/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,8 @@
+summary=Fix messages from broken SIM clients. +description=Fixes messages received from broken SIM clients by stripping HTML from them. The buddy must be on your list and set as a SIM user.
--- a/slashexec/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/slashexec/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
slashexecdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/slashexec/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=/exec a la UNIX IRC CLI +description=A plugin that adds the /exec command line interpreter like most UNIX/Linux IRC clients have. Also included is the ability to execute commands with an exclamation point (!uptime, for instance) +authors=Gary Kramlich,Peter Lawler,Daniel Atallah,John Bailey,Sadrul Habib Chowdhury
--- a/snpp/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/snpp/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,7 +1,6 @@
libsnppdir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/snpp/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+description=Allows libpurple to send messages over the Simple Network Paging Protocol (SNPP). --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/splitter/ChangeLog Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,71 @@
+Ike Gingerich <ike_@users.sourceforge.net> +2007-05-04 21:21:15 [v0.95 for 2.0.0] + * trimmed a good amount of unnecessary code and made with the + gaim -> pidgin conversion. +2006-04-15 15:55:10 [v0.95] + * now using Pango to split the message appropriately in different languages +2006-04-13 20:33:07 [v0.93] + * fixed a bug where border characters were sometimes eaten as whitespace + * no longer processes empty slices +2006-04-13 16:47:22 [v0.92] + * replaced html slicing algorithm with a modified version of Gaim's + * corrected a non-static function to be static +2006-04-11 09:52:29 [v0.91] + * fixed a bug with escaped HTML characters counting for more than one + character (thanks xx3nvyxx) +2006-04-11 01:25:06 [v0.9] + * added continuing of HTML formatting between splits + * removed "split around whole words" option and made default behavior +2005-10-04 23:39:59 [v0.8] + * fixed a tiny but lethal and frustrating crash related to word wrapping + (big thanks to itchysoft_ant and mgilb81) + * added additional NULL pointer checking +2005-09-23 18:37:24 [v0.7] +2005-09-23 09:37:24 [v0.6] + * you can now specify delay between message sends +2005-09-12 04:40:16 [v0.5] + * splits on whitespace where possible + * preferences option added to mediate splitting on whitespace +2005-07-27 00:19:21 [v0.4] + * sends messages in the same manner as gaim: + - emits "sent-im-msg" signal + - takes into consideration HTML preferences + * much more robust error checking +2005-07-22 07:44:06 [v0.3] + * big memory allocation bug fixed that could cause a crash in certain situations +2005-07-21 20:29:44 [v0.2] + * alias is displayed in conversation window instead of username +2005-07-21 03:50:14 [v0.1] + * initial release of plugin --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/splitter/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,28 @@
+splitterdir = $(PURPLE_LIBDIR) +splitter_la_LDFLAGS = -module -avoid-version +splitter_LTLIBRARIES = splitter.la + -DLIBDIR=\"$(PURPLE_LIBDIR)\" \ + -DDATADIR=\"$(PURPLE_DATADIR)\" \ + -DPIXMAPSDIR=\"$(PURPLE_PIXMAPSDIR)\" \ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/splitter/Makefile.mingw Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,12 @@
+# Description: Makefile for dice plugin. +include $(PP_TOP)/win_pp.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/splitter/README Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,91 @@
+Message Splitter Plugin v0.95 +Ike Gingerich <ike_@users.sourceforge.net> +This is a simple plugin to split up outgoing messages that are larger +than a specified threshold in characters. + - The split size and delay between messages are configurable from the + plugin preferences menu. + - Splits yield valid and balanced HTML taking into account tags that may + have been opened or closed outside the split itself. + - Splitting is done using Pango to split the message as appropriate + according to the current locale. + - fix conflicts with plugins like Slashexec that don't expect to be + supplied an empty message during the 'sending-im' signal. + - fix bug with characters disappearing when splitting heavily marked-up + - find any remaining bugs and memory leaks. + If you have build problems make sure you have the + appropriate pidgin-dev and build-essential files + Alternately you can copy spliter.c to + (unzipped-source)/pidgin/plugins and + then copy splitter.so to ~/.purple/plugins/ and launch Pidgin. + I try to keep a pre-built current version of the plugin here: + <http://ikebo.hypermart.net/splitter/splitter-current.dll> and + on the Sourceforge message splitter plugin tracker. + Otherwise you must compile it manually with Cygwin: + copy splitter.c to the plugin directory where the Pidgin + source code is extracted to and type: + $ make -f Makefile.mingw splitter.dll + and copy splitter.dll to your plugin directory + (e.x. C:\Program Files\Pidgin\plugins) +xx3nvyxx - caught disappearing text bug in v0.9 +itchysoft_ant - isolated crash in v0.7 and submitted backtrace logs + suggested delay/chat features for v0.6/v0.7 +mgilb81 - notified of crash in v0.7 and filed report +rageboy04 - a number of other issues/feedback throughout + - notified/fixed alias issues for v0.2 +Feel free to contact me at <ike_@users.sourceforge.net> about problems, +suggestions, or contributions. --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/splitter/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Splits a large outgoing message into smaller messages of a specified size. --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/splitter/splitter.c Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,533 @@
+/* Message Splitter Plugin v0.95 + * Splits a large message into smaller messages and sends them away + * Copyright (C) 2005-2007, Ike Gingerich <ike_@users.sourceforge.net> + * 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 the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +#define GETTEXT_PACKAGE "gtk20" +#include <glib/gi18n-lib.h> +#define WEBSITE "http://ikebo.hypermart.net/" +#define PLUGIN_ID "core-ike-splitter" +/* plugin constants and structures */ +static const gint MIN_SPLIT_SIZE = 32; +static const gint DEFAULT_SPLIT_SIZE = 786; +static const gint MAX_SPLIT_SIZE = 8192; +static const gint MIN_DELAY_MS = 0; +static const gint DEFAULT_DELAY_MS = 500; +static const gint MAX_DELAY_MS = 3600000; + char *sender_protocol_id; + PurpleConversationType type; + char *receiver; /* IM username */ +/* plugin preference variables */ +static gint current_split_size; +/* initialize preferences dialog */ +static PurplePluginPrefFrame *get_plugin_pref_frame(PurplePlugin *plugin) + PurplePluginPrefFrame *frame; + PurplePluginPref *ppref; + frame = purple_plugin_pref_frame_new(); + g_return_val_if_fail(frame != NULL, NULL); + ppref = purple_plugin_pref_new_with_label("Message split size"); + g_return_val_if_fail(ppref != NULL, NULL); + purple_plugin_pref_frame_add(frame, ppref); + ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/splitter/split_size", + g_return_val_if_fail(ppref != NULL, NULL); + purple_plugin_pref_set_bounds(ppref, MIN_SPLIT_SIZE, MAX_SPLIT_SIZE); + purple_plugin_pref_frame_add(frame, ppref); + ppref = purple_plugin_pref_new_with_label("Delay between messages"); + g_return_val_if_fail(ppref != NULL, NULL); + purple_plugin_pref_frame_add(frame, ppref); + ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/splitter/delay_ms", + g_return_val_if_fail(ppref != NULL, NULL); + purple_plugin_pref_set_bounds(ppref, MIN_DELAY_MS, MAX_DELAY_MS); + purple_plugin_pref_frame_add(frame, ppref); + * A function to send a chat or im message to the specific conversation + * without emitting "sending-im" or "sending-chat" signal, which would + * cause an infinite loop for this plugin. + * taken from conversation.c with signal emission removed. +static void splitter_common_send(PurpleConversation *conv, const char *message, PurpleMessageFlags msgflags) + PurpleConversationType type; + PurpleAccount *account; + char *displayed = NULL, *sent = NULL; + if (strlen(message) == 0) + account = purple_conversation_get_account(conv); + gc = purple_conversation_get_gc(conv); + g_return_if_fail(account != NULL); + g_return_if_fail(gc != NULL); + type = purple_conversation_get_type(conv); + /* Always linkfy the text for display */ + displayed = purple_markup_linkify(message); + if ((conv->features & PURPLE_CONNECTION_HTML) && + !(msgflags & PURPLE_MESSAGE_RAW)) + sent = g_strdup(displayed); + sent = g_strdup(message); + msgflags |= PURPLE_MESSAGE_SEND; + if (type == PURPLE_CONV_TYPE_IM) { + PurpleConvIm *im = PURPLE_CONV_IM(conv); + if (sent != NULL && sent[0] != '\0') { + err = serv_send_im(gc, purple_conversation_get_name(conv), + if ((err > 0) && (displayed != NULL)) + purple_conv_im_write(im, NULL, displayed, msgflags, time(NULL)); + purple_signal_emit(purple_conversations_get_handle(), "sent-im-msg", + purple_conversation_get_name(conv), sent); + if (sent != NULL && sent[0] != '\0') { + err = serv_chat_send(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), sent, msgflags); + purple_signal_emit(purple_conversations_get_handle(), "sent-chat-msg", + purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv))); + who = purple_conversation_get_name(conv); + msg = _("Unable to send message: The message is too large."); + if (!purple_conv_present_error(who, account, msg)) { + char *msg2 = g_strdup_printf(_("Unable to send message to %s."), who); + purple_notify_error(gc, NULL, msg2, _("The message is too large.")); + else if (err == -ENOTCONN) { + purple_debug(PURPLE_DEBUG_ERROR, "conversation", + "Not yet connected.\n"); + msg = _("Unable to send message."); + if (!purple_conv_present_error(who, account, msg)) { + char *msg2 = g_strdup_printf(_("Unable to send message to %s."), who); + purple_notify_error(gc, NULL, msg2, NULL); +/* a timer based callback function that sends the next message in the queue */ +static gboolean send_message_timer_cb( message_to_conv *msg_to_conv ) + PurpleAccount *account; + PurpleConversation *conv; + g_return_val_if_fail(msg_to_conv != NULL, FALSE); + g_return_val_if_fail(msg_to_conv->messages != NULL, FALSE); + g_return_val_if_fail(msg_to_conv->sender_username != NULL, FALSE); + g_return_val_if_fail(msg_to_conv->sender_protocol_id != NULL, FALSE); + msg = g_queue_pop_head(msg_to_conv->messages); + /* clean up and terminate timer callback */ + g_queue_free(msg_to_conv->messages); + g_free(msg_to_conv->sender_username); + g_free(msg_to_conv->sender_protocol_id); + if( msg_to_conv->type == PURPLE_CONV_TYPE_IM && + msg_to_conv->receiver != NULL ) + g_free(msg_to_conv->receiver); + /* find account info (it may have changed) and try and create a new + conversation window (it may have been closed) or find the existing + chat, and finally send the message */ + account = purple_accounts_find(msg_to_conv->sender_username, + msg_to_conv->sender_protocol_id); + g_return_val_if_fail(account != NULL, FALSE); + if( msg_to_conv->type == PURPLE_CONV_TYPE_IM && msg_to_conv->receiver != NULL ) + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, msg_to_conv->receiver); + else if( msg_to_conv->type == PURPLE_CONV_TYPE_CHAT ) + conv = purple_find_chat(account->gc, msg_to_conv->id); + g_return_val_if_fail(conv != NULL, FALSE); + splitter_common_send(conv, msg, PURPLE_MESSAGE_SEND); +/* finds the first line-breakable character backwards starting from a[last] */ +static int find_last_break(PangoLogAttr *a, int last) + for(; last > 0; last-- ) + if( a[last].is_line_break == 1) + return ( a[last].is_line_break == 1) ? last-1 : -1; +/* uses Pango to find all possible line break locations in a message and returns + a PangoLogAttr array which maps to each byte of the message of length + one larger than the message. This must be g_free()'d */ +static PangoLogAttr* find_all_breaks(const char *message) + g_return_val_if_fail(message != NULL, NULL); + a = g_new0(PangoLogAttr, n_attr); + context = gdk_pango_context_get(); + g_return_val_if_fail(context != NULL, NULL); + list = pango_itemize(context, message, 0, len, NULL, NULL); + if (list != NULL && list->data != NULL) + pango_break(message, -1, &((PangoItem*)(list->data))->analysis, a, n_attr); +/* return a queue of message slices from a plain text message based on current_split_size using + Pango to determine possible line break locations */ +static GQueue* get_message_slices(const char *message) + int current_break_start, last_break_start, break_pos, len; + a = find_all_breaks(message); + g_return_val_if_fail(a != NULL, NULL); + last_break_start = current_break_start = 0; + while(current_break_start + current_split_size < len) + break_pos = find_last_break(a + last_break_start, current_split_size); + if( break_pos > -1 ) current_break_start += break_pos; + else current_break_start += current_split_size; + slice = g_new0( message_slice, 1 ); + slice->start = MAX( last_break_start, 0 ); + slice->end = MIN( current_break_start, len ); + if( slice->end > slice->start ) + g_queue_push_tail(q, slice); + last_break_start = current_break_start; + slice = g_new0( message_slice, 1 ); + slice->start = last_break_start; + g_queue_push_tail(q, slice); +/* takes a message, splits it up based on whitespace (ignoring HTML formatting), + requests HTMLized slices of the splits, and returns a queue of them. The + messages and the queue must be freed */ +static GQueue* create_message_queue(const char *message) + GQueue *slices, *messages; + char *stripped_message, *msg; + stripped_message = purple_markup_strip_html(message); + stripped_len = strlen(stripped_message); + messages = g_queue_new(); + slices = get_message_slices(stripped_message); + g_return_val_if_fail(slices != NULL, NULL); + while( (slice = g_queue_pop_head(slices)) != NULL ) + msg = purple_markup_slice(message, slice->start, slice->end); + g_queue_push_tail(messages, msg); + g_free(stripped_message); +/* create message queue and prepare timer callbacks */ +static void split_and_send(message_to_conv *msg_to_conv, const char **message) + g_return_if_fail( msg_to_conv != NULL ); + g_return_if_fail( message != NULL ); + g_return_if_fail( *message != NULL ); + /* read and validate preferences */ + current_split_size = purple_prefs_get_int("/plugins/core/splitter/split_size"); + if( current_split_size > MAX_SPLIT_SIZE ) current_split_size = MAX_SPLIT_SIZE; + if( current_split_size < MIN_SPLIT_SIZE ) current_split_size = MIN_SPLIT_SIZE; + message_delay_ms = purple_prefs_get_int("/plugins/core/splitter/delay_ms"); + if( message_delay_ms > MAX_DELAY_MS ) message_delay_ms = MAX_DELAY_MS; + if( message_delay_ms < MIN_DELAY_MS ) message_delay_ms = MIN_DELAY_MS; + /* prepare message queue */ + msg_to_conv->messages = create_message_queue(*message); + g_return_if_fail( msg_to_conv->messages != NULL ); + /* initialize message send timer */ + purple_timeout_add( (g_queue_get_length(msg_to_conv->messages) > 1) ? message_delay_ms : 0, + (GSourceFunc)send_message_timer_cb, + /* free the original message and ensure it does not get sent */ + g_free((char*)*message); +/* initialize a chat message to potentially be split */ +static void sending_chat_msg_cb(PurpleAccount *account, const char **message, int id) + message_to_conv *msg_to_conv; + purple_debug(PURPLE_DEBUG_MISC, "purple-splitter", "splitter plugin invoked\n"); + g_return_if_fail(account != NULL); + g_return_if_fail(message != NULL); + g_return_if_fail(*message != NULL); + msg_to_conv = g_new0(message_to_conv, 1); + g_return_if_fail( msg_to_conv != NULL ); + msg_to_conv->sender_username = g_strdup(account->username); + msg_to_conv->sender_protocol_id = g_strdup(account->protocol_id); + msg_to_conv->type = PURPLE_CONV_TYPE_CHAT; + split_and_send(msg_to_conv, message); +/* initialize an IM message to potentially be split */ +static void sending_im_msg_cb(PurpleAccount *account, const char *receiver, + message_to_conv *msg_to_conv; + purple_debug(PURPLE_DEBUG_MISC, "purple-splitter", "splitter plugin invoked\n"); + g_return_if_fail(account != NULL); + g_return_if_fail(receiver != NULL); + g_return_if_fail(message != NULL); + g_return_if_fail(*message != NULL); + msg_to_conv = g_new0(message_to_conv, 1); + g_return_if_fail( msg_to_conv != NULL ); + msg_to_conv->sender_username = g_strdup(account->username); + msg_to_conv->sender_protocol_id = g_strdup(account->protocol_id); + msg_to_conv->receiver = g_strdup(receiver); + msg_to_conv->type = PURPLE_CONV_TYPE_IM; + split_and_send(msg_to_conv, message); +/* register "sending" message signal callback */ +static gboolean plugin_load(PurplePlugin *plugin) + purple_signal_connect(purple_conversations_get_handle(), + PURPLE_CALLBACK(sending_im_msg_cb), + purple_signal_connect(purple_conversations_get_handle(), + PURPLE_CALLBACK(sending_chat_msg_cb), +static gboolean plugin_unload(PurplePlugin *plugin) +static PurplePluginUiInfo prefs_info = { + get_plugin_pref_frame, 0, NULL, NULL, NULL, NULL, NULL +static PurplePluginInfo info = + PURPLE_PLUGIN_STANDARD, /**< type */ + NULL, /**< ui_requirement */ + NULL, /**< dependencies */ + PURPLE_PRIORITY_DEFAULT, /**< priority */ + N_("Message Splitter"), /**< name */ + VERSION, /**< version */ + N_("Splits a large outgoing message into smaller " + "messages of a specified size."), + N_("Splits a large outgoing message into smaller " + "messages of a specified size."), + "Ike Gingerich <ike_@users.sourceforge.net>", /**< author */ + WEBSITE, /**< homepage */ + plugin_load, /**< load */ + plugin_unload, /**< unload */ + NULL, /**< extra_info */ + &prefs_info, /**< prefs_info */ +/* store initial preference values */ +static void init_plugin(PurplePlugin *plugin) + purple_prefs_add_none("/plugins/core/splitter"); + purple_prefs_add_int ("/plugins/core/splitter/split_size", DEFAULT_SPLIT_SIZE); + purple_prefs_add_int ("/plugins/core/splitter/delay_ms", DEFAULT_DELAY_MS); +PURPLE_INIT_PLUGIN(splitter, init_plugin, info)
--- a/sslinfo/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/sslinfo/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,6 @@
-EXTRA_DIST = .purple-plugin .build Makefile.mingw
sslinfodir = $(PURPLE_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sslinfo/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=Displays info about your currently loaded SSL plugin
--- a/stocker/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/stocker/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,9 +1,11 @@
stockerdir = $(PIDGIN_LIBDIR)
stocker_la_LDFLAGS = -module -avoid-version
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stocker/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+description=Adds a stock ticker similar to the one in the Windows AIM client to the bottom of the buddy list. +notes=This plugin partially works but is buggy and in need of TLC. --- a/stocker/stocker_prefs.c Mon Mar 24 15:08:23 2008 -0400
+++ b/stocker/stocker_prefs.c Sun May 04 04:13:52 2008 -0400
@@ -216,6 +216,7 @@
purple_prefs_add_none(PREF_ROOT);
purple_prefs_add_string_list(PREF_SYMBOLS, def_syms);
purple_prefs_add_int(PREF_INTERVAL, 30);
--- a/switchspell/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/switchspell/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,9 +1,12 @@
-EXTRA_DIST = .build .pidgin-plugin Makefile.mingw
switchspelldir = $(PIDGIN_LIBDIR)
-switchspell_la_LDFLAGS = -module -avoid-version
+switchspell_la_LDFLAGS = -module -avoid-version \ @@ -13,9 +16,9 @@
switchspell_la_LIBADD = \
@@ -23,6 +26,7 @@
-DLIBDIR=\"$(PIDGIN_LIBDIR)\" \
-DDATADIR=\"$(PIDGIN_DATADIR)\" \
-DPIXMAPSDIR=\"$(PIDGIN_PIXMAPSDIR)\" \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/switchspell/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+depends=pidgin gtkspell aspell +summary=Switch Spell Checker Language +authors=Sadrul Habib Chowdhury +notes=Requires gtkspell linked against aspell. Will not work with enchant. --- a/switchspell/switchspell.c Mon Mar 24 15:08:23 2008 -0400
+++ b/switchspell/switchspell.c Sun May 04 04:13:52 2008 -0400
@@ -148,7 +148,7 @@
@@ -165,17 +165,20 @@
curlang = g_strdup(g_object_get_data(G_OBJECT(gtkconv->entry), PROP_LANG));
- g_list_foreach(gtk_container_get_children(GTK_CONTAINER(menu)),
+ items = gtk_container_get_children(GTK_CONTAINER(menu)); (GFunc)gtk_check_menu_item_set_active, GINT_TO_POINTER(FALSE));
- for (item = gtk_container_get_children(GTK_CONTAINER(menu));
- item; item = item->next) {
+ items = gtk_container_get_children(GTK_CONTAINER(menu)); + for (item = items; item; item = item->next) { const char *lang = g_object_get_data(G_OBJECT(item->data), "lang");
if (lang && curlang && strcmp(lang, curlang) == 0) {
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item->data), TRUE);
--- a/talkfilters/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/talkfilters/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .build .pidgin-plugin
talkfiltersdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/talkfilters/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Translates text in outgoing messages into humorous dialects. +description=The GNU Talk Filters are filter programs that convert ordinary English text into text that mimics a stereotyped or otherwise humorous dialect. These filters have been in the public domain for many years, and have been made available as a single integrated package. The filters include austro, b1ff, brooklyn, chef, cockney, drawl, dubya, fudd, funetak, jethro, jive, kraut, pansy, pirate, postmodern, redneck, valspeak, and warez. +authors=Mark Lindner,Peter Lawler +notes=Requires GNU Talkfilters
--- a/timelog/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/timelog/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .pidgin-plugin .build
timelogdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/timelog/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=allows the viewing of Pidgin logs within a specific time range
--- a/xchat-chats/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/xchat-chats/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,4 +1,5 @@
-EXTRA_DIST = .pidgin-plugin .build
xchat_chatsdir = $(PIDGIN_LIBDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xchat-chats/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,9 @@
+summary=XChat-like chats with Pidgin +description=You can chat in Pidgin using XChat's indented view. +authors=Sadrul Habib Chowdhury --- a/xchat-chats/xchat-chats.c Mon Mar 24 15:08:23 2008 -0400
+++ b/xchat-chats/xchat-chats.c Sun May 04 04:13:52 2008 -0400
@@ -362,6 +362,7 @@
workaround_for_hidden_convs(PidginConversation *gtkconv)
@@ -372,6 +373,7 @@
purple_conversation_use_xtext(conv);
plugin_load(PurplePlugin *plugin)
@@ -406,8 +408,10 @@
purple_signal_connect(pidgin_conversations_get_handle(), "conversation-displayed",
plugin, G_CALLBACK(workaround_for_hidden_convs), NULL);
@@ -424,9 +428,8 @@
gtk_paned_add1(GTK_PANED(parent), gx->imhtml);
g_object_unref(gx->imhtml);
+ gtk_widget_destroy(frame); gtk_widget_show_all(gx->imhtml);
- gtk_widget_destroy(frame);
--- a/xmmsremote/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ b/xmmsremote/Makefile.am Sun May 04 04:13:52 2008 -0400
@@ -1,6 +1,17 @@
-EXTRA_DIST = .build .pidgin-plugin
+xmmsremoteconfpixdir = $(PIDGIN_PIXMAPSDIR)/plugin_pack/xmmsremote +xmmsremoteconfpix_DATA = $(ICONS) xmmsremotedir = $(PIDGIN_LIBDIR)
Binary file xmmsremote/next.png has changed
Binary file xmmsremote/pause.png has changed
--- a/xmmsremote/pixmaps/Makefile.am Mon Mar 24 15:08:23 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-xmmsremoteconfpixdir = $(PIDGIN_PIXMAPSDIR)/plugin_pack/xmmsremote
-xmmsremoteconfpix_DATA = next.png pause.png play.png previous.png stop.png xmms.png
Binary file xmmsremote/pixmaps/next.png has changed
Binary file xmmsremote/pixmaps/pause.png has changed
Binary file xmmsremote/pixmaps/play.png has changed
Binary file xmmsremote/pixmaps/previous.png has changed
Binary file xmmsremote/pixmaps/stop.png has changed
Binary file xmmsremote/pixmaps/xmms.png has changed
Binary file xmmsremote/play.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xmmsremote/plugins.cfg Sun May 04 04:13:52 2008 -0400
@@ -0,0 +1,10 @@
+summary=Control XMMS from Pidgin conversations +description=A small plugin that adds a menu or buttons to the menu bars of Pidgin conversation windows so that you can control XMMS from within Pidgin. +notes=Renamed from gaim-xmms-remote to xmmsremote in 1.0beta3.1. Binary file xmmsremote/previous.png has changed
Binary file xmmsremote/stop.png has changed
Binary file xmmsremote/xmms.png has changed