pidgin/purple-plugin-pack

propagate from branch 'org.guifications.plugins.smartear' (head 7c1dbd0927a24b34c7c8423181b88a5032cc558d)
to branch 'org.guifications.plugins' (head df7eace8c31b0afd1bf8f2ce5cce1c0ace3bf4d8)
  • +2 -1
    .mtn-ignore
  • +2 -0
    AUTHORS
  • +6 -0
    ChangeLog
  • +11 -24
    Makefile.am
  • +6 -4
    album/Makefile.am
  • +2 -1
    album/album.c
  • +9 -0
    album/plugins.cfg
  • +25 -7
    autogen.sh
  • +1 -2
    autoprofile/Makefile.am
  • +9 -0
    autoprofile/plugins.cfg
  • +3 -1
    autoreply/Makefile.am
  • +9 -0
    autoreply/plugins.cfg
  • +2 -1
    awaynotify/Makefile.am
  • +9 -0
    awaynotify/plugins.cfg
  • +2 -3
    bash/Makefile.am
  • +9 -0
    bash/plugins.cfg
  • +3 -1
    bit/Makefile.am
  • +9 -0
    bit/plugins.cfg
  • +3 -1
    blistops/Makefile.am
  • +9 -0
    blistops/plugins.cfg
  • +2 -1
    buddytime/Makefile.am
  • +18 -0
    buddytime/plugins.cfg
  • +2 -1
    chronic/Makefile.am
  • +9 -0
    chronic/plugins.cfg
  • +28 -0
    colorize/Makefile.am
  • +12 -0
    colorize/Makefile.mingw
  • +298 -0
    colorize/colorize.c
  • +9 -0
    colorize/plugins.cfg
  • +67 -86
    configure.ac
  • +2 -3
    convbadger/Makefile.am
  • +6 -6
    convbadger/convbadger.c
  • +10 -0
    convbadger/plugins.cfg
  • +3 -1
    dewysiwygification/Makefile.am
  • +2 -2
    dewysiwygification/dewysiwygification.c
  • +9 -0
    dewysiwygification/plugins.cfg
  • +3 -1
    dice/Makefile.am
  • +9 -0
    dice/plugins.cfg
  • +3 -1
    difftopic/Makefile.am
  • +9 -0
    difftopic/plugins.cfg
  • +3 -1
    eight_ball/Makefile.am
  • +9 -0
    eight_ball/plugins.cfg
  • +2 -3
    enhancedhist/Makefile.am
  • +9 -0
    enhancedhist/plugins.cfg
  • +3 -1
    findip/Makefile.am
  • +9 -0
    findip/plugins.cfg
  • +3 -1
    flip/Makefile.am
  • +10 -0
    flip/plugins.cfg
  • +3 -1
    gRIM/Makefile.am
  • +9 -0
    gRIM/plugins.cfg
  • +28 -0
    google/Makefile.am
  • +12 -0
    google/Makefile.mingw
  • +325 -0
    google/google.c
  • +8 -0
    google/plugins.cfg
  • +3 -1
    groupmsg/Makefile.am
  • +9 -0
    groupmsg/plugins.cfg
  • +3 -1
    hideconv/Makefile.am
  • +10 -0
    hideconv/plugins.cfg
  • +3 -1
    highlight/Makefile.am
  • +9 -0
    highlight/plugins.cfg
  • +6 -4
    ignorance/Makefile.am
  • +10 -0
    ignorance/plugins.cfg
  • +3 -1
    ignore/Makefile.am
  • +9 -0
    ignore/plugins.cfg
  • +1 -2
    infopane/Makefile.am
  • +10 -0
    infopane/plugins.cfg
  • +3 -1
    irc-more/Makefile.am
  • +12 -7
    irc-more/irc-more.c
  • +10 -0
    irc-more/plugins.cfg
  • +3 -1
    irchelper/Makefile.am
  • +9 -0
    irchelper/plugins.cfg
  • +6 -4
    irssi/Makefile.am
  • +10 -0
    irssi/plugins.cfg
  • +1 -1
    irssi/textfmt.c
  • +3 -1
    lastseen/Makefile.am
  • +10 -0
    lastseen/plugins.cfg
  • +6 -4
    listhandler/Makefile.am
  • +9 -0
    listhandler/plugins.cfg
  • +0 -2
    m4/Makefile.am
  • +0 -212
    m4/pluginpack.m4
  • +27 -0
    manualsize/Makefile.am
  • +12 -0
    manualsize/Makefile.mingw
  • +329 -0
    manualsize/manualsize.c
  • +27 -0
    msglen/Makefile.am
  • +12 -0
    msglen/Makefile.mingw
  • +217 -0
    msglen/msglen.c
  • +8 -0
    msglen/plugins.cfg
  • +3 -1
    mystatusbox/Makefile.am
  • +9 -0
    mystatusbox/plugins.cfg
  • +6 -4
    napster/Makefile.am
  • +10 -0
    napster/plugins.cfg
  • +3 -1
    nicksaid/Makefile.am
  • +4 -1
    nicksaid/nicksaid.c
  • +9 -0
    nicksaid/plugins.cfg
  • +3 -1
    oldlogger/Makefile.am
  • +5 -3
    oldlogger/oldlogger.c
  • +8 -0
    oldlogger/plugins.cfg
  • +2 -1
    plonkers/Makefile.am
  • +9 -0
    plonkers/plugins.cfg
  • +504 -0
    plugin_pack.py
  • +20 -0
    po/POTFILES.in
  • +1 -0
    po/POTFILES.skip
  • +6 -1
    schedule/Makefile.am
  • +10 -0
    schedule/plugins.cfg
  • +3 -1
    sepandtab/Makefile.am
  • +9 -0
    sepandtab/plugins.cfg
  • +3 -1
    showoffline/Makefile.am
  • +9 -0
    showoffline/plugins.cfg
  • +7 -0
    showoffline/showoffline.c
  • +3 -1
    simfix/Makefile.am
  • +8 -0
    simfix/plugins.cfg
  • +3 -1
    slashexec/Makefile.am
  • +9 -0
    slashexec/plugins.cfg
  • +2 -3
    snpp/Makefile.am
  • +9 -0
    snpp/plugins.cfg
  • +71 -0
    splitter/ChangeLog
  • +28 -0
    splitter/Makefile.am
  • +12 -0
    splitter/Makefile.mingw
  • +91 -0
    splitter/README
  • +9 -0
    splitter/plugins.cfg
  • +533 -0
    splitter/splitter.c
  • +3 -1
    sslinfo/Makefile.am
  • +9 -0
    sslinfo/plugins.cfg
  • +5 -3
    stocker/Makefile.am
  • +10 -0
    stocker/plugins.cfg
  • +1 -0
    stocker/stocker_prefs.c
  • +8 -4
    switchspell/Makefile.am
  • +10 -0
    switchspell/plugins.cfg
  • +7 -4
    switchspell/switchspell.c
  • +2 -1
    talkfilters/Makefile.am
  • +10 -0
    talkfilters/plugins.cfg
  • +2 -1
    timelog/Makefile.am
  • +9 -0
    timelog/plugins.cfg
  • +2 -1
    xchat-chats/Makefile.am
  • +9 -0
    xchat-chats/plugins.cfg
  • +5 -2
    xchat-chats/xchat-chats.c
  • +13 -2
    xmmsremote/Makefile.am
  • +0 -0
    xmmsremote/next.png
  • +0 -0
    xmmsremote/pause.png
  • +0 -11
    xmmsremote/pixmaps/Makefile.am
  • +0 -0
    xmmsremote/pixmaps/next.png
  • +0 -0
    xmmsremote/pixmaps/pause.png
  • +0 -0
    xmmsremote/pixmaps/play.png
  • +0 -0
    xmmsremote/pixmaps/previous.png
  • +0 -0
    xmmsremote/pixmaps/stop.png
  • +0 -0
    xmmsremote/pixmaps/xmms.png
  • +0 -0
    xmmsremote/play.png
  • +10 -0
    xmmsremote/plugins.cfg
  • +0 -0
    xmmsremote/previous.png
  • +0 -0
    xmmsremote/stop.png
  • +0 -0
    xmmsremote/xmms.png
  • --- 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 @@
    local.mak
    ltmain.sh
    missing
    +^plugin_pack.m4$
    po/Makefile.in.in
    po/missing
    po/notexist
    -po/POTFILES
    +po/POTFILES$
    po/stamp-it
    po/.+\.pot
    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 @@
    Special Thanks
    ==============
    +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 @@
    Version 2.4.0mtn:
    * 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
    Version 2.3.0: 03/17/08
    * 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 @@
    README \
    VERSION \
    VERSION.in \
    - pp_config.h.mingw \
    + plugin_pack.m4 \
    + plugin_pack.py \
    plugin_pack.spec \
    menuconfig \
    win_pp.mak \
    @@ -22,9 +23,13 @@
    po/Makefile.in.in \
    po/Makefile.mingw
    -DIST_SUBDIRS = common doc m4 po $(PP_PURPLE) $(PP_PIDGIN) $(PP_FINCH)
    +if INSTALL_I18N
    +PO_DIR=po
    +endif
    -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)
    DISTCLEANFILES=\
    pp_config.h \
    @@ -48,25 +53,7 @@
    echo $(DIST_ARCHIVES) | xargs -n 1 gpg -a -b
    info:
    - @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 "Finch Plugins:"
    - @echo " Available..: $(PP_FINCH)"
    - @echo " Abusive....: $(PP_FINCH_ABUSIVE)"
    - @echo " Incomplete.: $(PP_FINCH_INCOMPLETE)"
    - @echo " Building...: $(PP_FINCH_BUILD)"
    - @echo "---------------------------------------"
    + @echo $(PP_DIST_DIRS)
    +stats:
    + @$(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 @@
    -EXTRA_DIST = \
    - .build \
    - .pidgin-plugin \
    - Makefile.mingw \
    +HEADER_FILES = \
    album.h \
    album-ui.h
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg \
    + $(HEADER_FILES)
    +
    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)
    {
    - const char *icon_path;
    + char *icon_path;
    char *filename;
    char *path;
    char *dir;
    @@ -194,6 +194,7 @@
    }
    }
    #endif
    + g_free(icon_path);
    g_free(path);
    }
    --- /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 @@
    +[Album]
    +type=default
    +depends=pidgin
    +provides=album
    +summary=Archives buddy icons
    +description=%(summary)s
    +authors=Richard Laager,Sadrul Habib Chowdhury
    +introduced=2.0.0
    +
    --- 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 @@
    ###############################################################################
    check () {
    CMD=$1
    + shift
    + ARGS=$@
    echo -n "checking for ${CMD}... "
    - BIN=`which ${CMD}`
    + BIN=`which ${CMD} $@ 2>/dev/null`
    if [ x"${BIN}" = x"" ] ; then
    echo "not found."
    @@ -70,17 +72,23 @@
    CMD=$1
    shift
    + OUTPUT=`mktemp autogen-XXXX`
    +
    echo -n "running ${CMD} ${@}... "
    - OUTPUT=`${CMD} ${@} 2>&1`
    + ${CMD} ${@} >${OUTPUT} 2>&1
    +
    if [ $? != 0 ] ; then
    echo "failed."
    - echo ${OUTPUT}
    + cat ${OUTPUT}
    + rm -f ${OUTPUT}
    exit 1
    else
    echo "done."
    - if [ x"${OUTPUT}" != x"" ] ; then
    - echo ${OUTPUT}
    + if [ `stat --printf="%s" ${OUTPUT}` -ge 0 ] ; then
    + cat ${OUTPUT}
    fi
    +
    + rm -f ${OUTPUT}
    fi
    }
    @@ -102,7 +110,7 @@
    if [ -f ${ARGS_FILE} ] ; then
    echo "found."
    echo -n "sourcing ${ARGS_FILE}: "
    - . autogen.args
    + . ${ARGS_FILE}
    echo "done."
    else
    echo "not found."
    @@ -117,13 +125,23 @@
    check "autoheader"; AUTOHEADER=${BIN};
    check "automake"; AUTOMAKE=${BIN};
    check "autoconf"; AUTOCONF=${BIN};
    +check "python" -V; PYTHON=${BIN};
    +
    +###############################################################################
    +# Build pluginpack.m4
    +###############################################################################
    +CONFIG_FILE="plugin_pack.m4"
    +
    +echo -n "creating ${CONFIG_FILE} ..."
    +${PYTHON} plugin_pack.py config_file > ${CONFIG_FILE} 2>/dev/null
    +echo " done."
    ###############################################################################
    # Run all of our helpers
    ###############################################################################
    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 @@
    EXTRA_DIST = \
    - .build \
    - .pidgin-plugin
    + plugins.cfg
    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 @@
    +[AutoProfile]
    +type=default
    +depends=pidgin
    +provides=autoprofile
    +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
    +authors=Casey Ho
    +introduced=2.4.0
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Autoreply]
    +type=default
    +depends=purple
    +provides=autoreply
    +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
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + plugins.cfg
    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]
    +type=incomplete
    +depends=purple
    +provides=awaynotify
    +summary=Notifies in a conversation window when a buddy goes or returns from away
    +description=%(summary)s
    +authors=Matt Perry
    +introduced=1.0beta6
    +
    --- 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 @@
    EXTRA_DIST = \
    - .purple-plugin \
    - .build \
    - Makefile.mingw
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[bash.org]
    +type=default
    +depends=purple
    +provides=bash
    +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.
    +authors=John Bailey
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Buddy Icon Tools]
    +type=incomplete
    +depends=pidgin
    +provides=bit
    +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.
    +authors=Peter Lawler
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Buddy List Options]
    +type=default
    +depends=pidgin
    +provides=blistops
    +summary=Gives extended options to the buddy list
    +description=%(summary)s
    +authors=Gary Kramlich
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + plugins.cfg
    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 @@
    +[Buddy Time]
    +type=incomplete
    +depends=purple
    +provides=buddytime
    +summary=Quickly see the local time of a buddy
    +description=%(summary)s
    +authors=Gary Kramlich,Richard Laager
    +introduced=2.2.0
    +
    +[Buddy Time (Pidgin UI)]
    +type=incomplete
    +depends=pidgin buddytime
    +provides=gtkbuddytime
    +summary=Pidgin user interface for the Buddy Time plugin.
    +description=%(summary)s
    +authors=Gary Kramlich,Richard Laager
    +introduced=2.2.0
    +
    --- 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
    +EXTRA_DIST = \
    + plugins.cfg
    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 @@
    +[Chronic]
    +type=incomplete
    +depends=purple
    +provides=chronic
    +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!
    +authors=John Bailey
    +introduced=1.0beta3.1
    +
    --- /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 @@
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    +
    +colorizedir = $(PURPLE_LIBDIR)
    +
    +colorize_la_LDFLAGS = -module -avoid-version
    +
    +if HAVE_PURPLE
    +
    +colorize_LTLIBRARIES = colorize.la
    +
    +colorize_la_SOURCES = \
    + colorize.c
    +
    +colorize_la_LIBADD = \
    + $(GLIB_LIBS) \
    + $(PURPLE_LIBS)
    +
    +endif
    +
    +AM_CPPFLAGS = \
    + -DLIBDIR=\"$(PURPLE_LIBDIR)\" \
    + -DDATADIR=\"$(PURPLE_DATADIR)\" \
    + -DPIXMAPSDIR=\"$(PURPLE_PIXMAPSDIR)\" \
    + $(DEBUG_CFLAGS) \
    + $(PURPLE_CFLAGS)
    +
    --- /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 @@
    +#
    +# Makefile.mingw
    +#
    +# Description: Makefile for dice plugin.
    +#
    +
    +PP_TOP := ..
    +
    +PP = colorize
    +
    +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
    + * and ending values.
    + *
    + * TODO:
    + * - 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
    + * 02111-1307, USA.
    + */
    +
    +#include "../common/pp_internal.h"
    +
    +#include <version.h>
    +#include <plugin.h>
    +#include <util.h>
    +#include <debug.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();
    +
    + /* initial color */
    + 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);
    +
    + /* target color */
    + 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);
    +
    + return frame;
    +}
    +
    +inline static guint8
    +round_gfloat_to_guint8(gfloat f) {
    + return ((guchar)(f + 0.5f));
    +}
    +
    +inline static gint32
    +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]) );
    +}
    +
    +static void
    +colorize_message(char **message) {
    + guint i, len;
    + 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]),
    + *(*message));
    +
    + /* 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);
    + g_free(new_msg);
    +
    + new_msg = tmp;
    +
    + /* format each character one by one:
    + * (if it is not a space) AND
    + * (if it is not the same color as the last character)
    + */
    + for(i=1; i<len; i++)
    + {
    + /* store last color */
    + 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 */
    + grad[0] += d_grad[0];
    + grad[1] += d_grad[1];
    + grad[2] += d_grad[2];
    +
    + /* format next character appropriately */
    + if( g_ascii_isspace ( *(*message+i) ) ||
    + rgb_equals(last_rgb, grad) )
    + formatted_char = g_strdup_printf("%c", *(*message+i));
    + else
    + 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]),
    + *(*message+i));
    +
    +
    + /* 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);
    + g_free(new_msg);
    +
    + new_msg = tmp;
    + }
    +
    + /* close final font tag */
    + new_msg = g_strconcat(new_msg, "</font>", NULL);
    +
    + /* return result */
    + g_free(*message);
    + *message = new_msg;
    +}
    +
    +/* respond to a sending-im signal by replacing outgoing text
    + * with colorized version
    + */
    +static void
    +sending_im_msg(PurpleAccount *account, gchar *receiver, gchar **message) {
    + gchar *stripped_message;
    +
    + /* strip any existing HTML */
    + stripped_message = purple_markup_strip_html(*message);
    + g_free(*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 */
    +static gboolean
    +plugin_load(PurplePlugin *plugin) {
    + purple_signal_connect(purple_conversations_get_handle(), "sending-im-msg",
    + plugin, PURPLE_CALLBACK(sending_im_msg), NULL);
    +
    + return TRUE;
    +}
    +
    +static gboolean
    +plugin_unload(PurplePlugin *plugin) {
    + return TRUE;
    +}
    +
    +static PurplePluginUiInfo prefs_info = {
    + init_pref_frame
    +};
    +
    +static PurplePluginInfo info =
    +{
    + PURPLE_PLUGIN_MAGIC,
    + PURPLE_MAJOR_VERSION,
    + PURPLE_MINOR_VERSION,
    + PURPLE_PLUGIN_STANDARD,
    + NULL,
    + 0,
    + NULL,
    + PURPLE_PRIORITY_DEFAULT,
    +
    + PLUGIN_ID,
    + NULL,
    + PP_VERSION,
    + NULL,
    + NULL,
    + PLUGIN_AUTHOR,
    + PP_WEBSITE,
    +
    + plugin_load,
    + plugin_unload,
    + NULL,
    +
    + NULL,
    + NULL,
    + &prefs_info,
    + NULL
    +};
    +
    +/* initialize default preferences */
    +static void
    +init_plugin(PurplePlugin *plugin) {
    +#ifdef ENABLE_NLS
    + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR);
    + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
    +#endif /* ENABLE_NLS */
    +
    + 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.");
    +
    + /* prefs */
    + 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 @@
    +[Colorize]
    +type=default
    +depends=purple
    +provides=colorize
    +summary=Colorizes outgoing message text.
    +description=Colorizes outgoing message text to a gradient of specified starting and ending RGB values.
    +authors=Ike Gingerich
    +introduced=2.4.0
    +
    --- 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)
    AC_DISABLE_STATIC
    -dnl This disables check of libtool for these compilers
    -CXX=no
    -F77=no
    -GCJ=no
    +dnl #######################################################################
    +dnl # Initialize some variables that get passed to plugin_pack.py
    +dnl #######################################################################
    +DEPENDENCIES=""
    dnl #######################################################################
    dnl # Setup libtool
    @@ -77,6 +77,7 @@
    HAVE_PURPLE="yes"
    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.])
    HAVE_PIDGIN="yes"
    AM_CONDITIONAL(HAVE_PIDGIN, true)
    + DEPENDENCIES="$DEPENDENCIES,pidgin"
    ], [
    AC_MSG_RESULT([no])
    HAVE_PIDGIN="no"
    @@ -157,6 +159,7 @@
    AC_DEFINE(HAVE_FINCH, 1, [Define if we've found finch.])
    HAVE_FINCH="yes"
    AM_CONDITIONAL(HAVE_FINCH, true)
    + DEPENDENCIES="$DEPENDENCIES,finch"
    ], [
    AC_MSG_RESULT([no])
    HAVE_FINCH="no"
    @@ -217,10 +220,8 @@
    AC_SUBST(GNT_CFLAGS)
    dnl #######################################################################
    -dnl # Plugin dependency checking
    +dnl # Check for talkfilters
    dnl #######################################################################
    -
    -# talkfilters
    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"
    fi
    -# switchspell
    +dnl #######################################################################
    +dnl # Check for switchspell
    +dnl #######################################################################
    gtkspell=yes
    PKG_CHECK_MODULES(GTKSPELL, gtkspell-2.0 >= 2.0.2, [], [gtkspell=no])
    AC_SUBST(GTKSPELL_CFLAGS)
    @@ -250,9 +254,31 @@
    BUILD_SWITCH_SPELL=no
    fi
    fi
    +
    +# check for aspell
    +ASPELL_CFLAGS=""
    +ASPELL_LIBS=""
    +AC_CHECK_HEADER([aspell.h], HAVE_ASPELL_H=yes, AC_MSG_WARN([
    +*** libaspell is required to build the switchspell plugin.])
    +HAVE_ASPELL_H=no
    +)
    +
    +if test x"$HAVE_ASPELL_H" = x"yes" ; then
    + AC_CHECK_LIB([aspell], [new_aspell_config], ASPELL_LIBS="-laspell", BUILD_SWITCH_SPELL=no)
    +fi
    +
    +AC_SUBST(ASPELL_CFLAGS)
    +AC_SUBST(ASPELL_LIBS)
    +
    AM_CONDITIONAL(BUILD_SWITCH_SPELL, test x"$BUILD_SWITCH_SPELL" = x"yes")
    -# xmmsremote
    +if test x"$BUILD_SWITCH_SPELL" = x"yes" ; then
    + DEPENDENCIES="$DEPENDENCIES,gtkspell,aspell"
    +fi
    +
    +dnl #######################################################################
    +dnl # Check for xmms
    +dnl #######################################################################
    XMMS_LIBS=""
    XMMS_CFLAGS=""
    HAVE_XMMS="no"
    @@ -276,6 +302,8 @@
    if test x"$HAVE_XMMS" = x"yes" ; then
    AC_MSG_RESULT([yes])
    +
    + DEPENDENCIES="$DEPENDENCIES,xmms"
    else
    AC_MSG_RESULT([no])
    fi
    @@ -284,12 +312,17 @@
    AC_SUBST(XMMS_LIBS)
    AC_SUBST(XMMS_CFLAGS)
    +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 #######################################################################
    -AM_BUILD_PLUGIN_LIST()
    +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 #######################################################################
    dnl # Version stuff
    @@ -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 # Finish up
    dnl #######################################################################
    -AC_OUTPUT([
    - Makefile
    - common/Makefile
    - doc/Makefile
    - m4/Makefile
    - po/Makefile.in
    - VERSION
    - plugin_pack.spec
    - album/Makefile
    - autoprofile/Makefile
    - autoreply/Makefile
    - awaynotify/Makefile
    - bash/Makefile
    - bit/Makefile
    - blistops/Makefile
    - buddytime/Makefile
    - chronic/Makefile
    - convbadger/Makefile
    - dewysiwygification/Makefile
    - dice/Makefile
    - difftopic/Makefile
    - eight_ball/Makefile
    - enhancedhist/Makefile
    - findip/Makefile
    - flip/Makefile
    - groupmsg/Makefile
    - gRIM/Makefile
    - hideconv/Makefile
    - highlight/Makefile
    - ignorance/Makefile
    - ignore/Makefile
    - infopane/Makefile
    - irc-more/Makefile
    - irchelper/Makefile
    - irssi/Makefile
    - lastseen/Makefile
    - listhandler/Makefile
    - mystatusbox/Makefile
    - napster/Makefile
    - nicksaid/Makefile
    - oldlogger/Makefile
    - plonkers/Makefile
    - schedule/Makefile
    - sepandtab/Makefile
    - showoffline/Makefile
    - simfix/Makefile
    - slashexec/Makefile
    - snpp/Makefile
    - smartear/Makefile
    - sslinfo/Makefile
    - stocker/Makefile
    - switchspell/Makefile
    - talkfilters/Makefile
    - timelog/Makefile
    - xchat-chats/Makefile
    - xmmsremote/Makefile
    - xmmsremote/pixmaps/Makefile
    +AC_OUTPUT([Makefile
    + common/Makefile
    + doc/Makefile
    + po/Makefile.in
    + VERSION
    + plugin_pack.spec
    ])
    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
    - else
    - echo Purple plugins to be built.......:
    - echo $PP_PURPLE_BUILD | xargs -n 4 echo " "
    - fi
    + echo Purple plugins to be built.......:
    + eval $PP_PURPLE_BUILD
    fi
    echo;
    @@ -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
    - else
    - echo Pidgin plugins to be built.......:
    - echo $PP_PIDGIN_BUILD | xargs -n 4 echo " "
    - fi
    + echo Pidgin plugins to be built.......:
    + eval $PP_PIDGIN_BUILD
    fi
    echo;
    @@ -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
    - else
    - echo Finch plugins to be built........:
    - echo $PP_FINCH_BUILD | xargs -n 4 echo " "
    - fi
    + echo Finch plugins to be built........: none - THIS IS NORMAL
    + # uncomment this when we have finch plugins
    + # eval $PP_FINCH_BUILD
    fi
    echo;
    --- 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 @@
    EXTRA_DIST = \
    - .build \
    - .pidgin-plugin \
    - Makefile.mingw
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    * Callbacks
    *****************************************************************************/
    static void
    -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 @@
    }
    static void
    -convbadger_conv_destroyed_cb(PurpleConversation *conv, gpointer data) {
    +conv_badger_conv_destroyed_cb(PurpleConversation *conv, gpointer data) {
    }
    static void
    -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 @@
    NULL, NULL);
    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);
    return TRUE;
    }
    --- /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 @@
    +[Conversation Badger]
    +type=default
    +depends=pidgin
    +provides=convbadger
    +summary=Badges conversations with the protocol icon.
    +description=%(summary)s
    +authors=Gary Kramlich
    +introduced=2.0.0
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    g_free(*message);
    *message = tmp;
    - purple_debug_misc("dewysiwygification", "it's now: %s", tmp);
    + purple_debug_misc("dewysiwygification", "it's now: %s\n", tmp);
    return FALSE;
    }
    @@ -67,7 +67,7 @@
    g_free(*message);
    *message = tmp;
    - purple_debug_misc("dewysiwygification", "it's now: %s", tmp);
    + purple_debug_misc("dewysiwygification", "it's now: %s\n", tmp);
    return FALSE;
    }
    --- /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]
    +type=default
    +depends=purple
    +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 "&lt;" for a literal "<".
    +authors=Tim Ringenbach
    +introduced=2.2.0
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Dice]
    +type=default
    +depends=purple
    +provides=dice
    +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
    +authors=Gary Kramlich
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[DiffTopic]
    +type=default
    +depends=pidgin
    +provides=difftopic
    +summary=Show the old topic when the topic in a chat room changes.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=1.0beta4
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Magic 8 Ball]
    +type=default
    +depends=purple
    +provides=eight_ball
    +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.
    +authors=John Bailey
    +introduced=1.0beta1
    +
    --- 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 @@
    EXTRA_DIST = \
    - .build \
    - .pidgin-plugin \
    - Makefile.mingw
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Enhanced History]
    +type=default
    +depends=pidgin
    +provides=enhancedhist
    +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.
    +authors=Andrew Pangborn
    +introduced=2.3.0
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Find IP]
    +type=abusive
    +depends=purple
    +provides=findip
    +summary=Find the IP of a person in the buddylist.
    +description=%(summary)s This doesn't really work.
    +authors=Sadrul Habib Chowdhury
    +introduced=2.2.0
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Coin Flip]
    +name=Coin Flip
    +type=default
    +depends=purple
    +provides=flip
    +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
    +authors=Gary Kramlich
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[gRIM]
    +type=default
    +depends=pidgin
    +provides=gRIM
    +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
    +introduced=1.0beta1
    +
    --- /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 @@
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    +
    +googledir = $(PURPLE_LIBDIR)
    +
    +google_la_LDFLAGS = -module -avoid-version
    +
    +if HAVE_PURPLE
    +
    +google_LTLIBRARIES = google.la
    +
    +google_la_SOURCES = \
    + google.c
    +
    +google_la_LIBADD = \
    + $(GLIB_LIBS) \
    + $(PURPLE_LIBS)
    +
    +endif
    +
    +AM_CPPFLAGS = \
    + -DLIBDIR=\"$(PURPLE_LIBDIR)\" \
    + -DDATADIR=\"$(PURPLE_DATADIR)\" \
    + -DPIXMAPSDIR=\"$(PURPLE_PIXMAPSDIR)\" \
    + $(DEBUG_CFLAGS) \
    + $(PURPLE_CFLAGS)
    +
    --- /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 @@
    +#
    +# Makefile.mingw
    +#
    +# Description: Makefile for the google plugin.
    +#
    +
    +PP_TOP := ..
    +
    +PP = google
    +
    +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 <errno.h>
    +#include <string.h>
    +
    +#include <cmds.h>
    +#include <conversation.h>
    +#include <debug.h>
    +#include <plugin.h>
    +#include <proxy.h>
    +#include <util.h>
    +
    +static PurpleCmdId google_cmd_id = 0;
    +
    +#define GOOGLE_URL_FORMAT "http://%s/search?q=%s&btnI=I%%27m+Feeling+Lucky"
    +
    +/******************************************************************************
    + * Structs
    + *****************************************************************************/
    +typedef struct {
    + PurpleConversation *conv;
    + gchar *host;
    + gint port;
    + gchar *path;
    +
    + gchar *request;
    + gsize request_written;
    +
    + gint fd;
    + gint inpa;
    +
    + GString *response;
    +
    + PurpleProxyConnectData *conn_data;
    +} GoogleFetchUrlData;
    +
    +/******************************************************************************
    + * 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,
    + NULL))
    + {
    + g_free(gfud);
    + return NULL;
    + }
    +
    + gfud->response = g_string_new("");
    +
    + return gfud;
    +}
    +
    +static void
    +google_fetch_url_data_free(GoogleFetchUrlData *gfud) {
    + g_free(gfud->host);
    + g_free(gfud->path);
    +
    + g_free(gfud->request);
    +
    + g_string_free(gfud->response, TRUE);
    +
    + if(gfud->inpa > 0)
    + purple_input_remove(gfud->inpa);
    +
    + if(gfud->fd >= 0)
    + close(gfud->fd);
    +
    + if(gfud->conn_data)
    + purple_proxy_connect_cancel(gfud->conn_data);
    +
    + g_free(gfud);
    +}
    +
    +/******************************************************************************
    + * The final result (hiding in the middle, very sneaky)
    + *****************************************************************************/
    +static void
    +google_output_url(GoogleFetchUrlData *gfud) {
    + gchar *str = NULL, *url_s = NULL, *url_e = NULL;
    + gsize len = 0;
    + const gchar *needle = "Location: ";
    +
    + /* if our conv has disappeared from under us, drop out */
    + if(!gfud->conv)
    + return;
    +
    + str = gfud->response->str;
    + len = gfud->response->len;
    +
    + url_s = g_strstr_len(str, len, needle);
    + if(!url_s)
    + return;
    +
    + len = strlen(url_s);
    + url_s += strlen(needle);
    +
    + url_e = g_strstr_len(url_s, len, "\r\n");
    + if(!url_e)
    + return;
    +
    + *url_e = '\0';
    +
    + 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);
    +}
    +
    +/******************************************************************************
    + * URL Stuff
    + *****************************************************************************/
    +static void
    +im_feeling_lucky_recv_cb(gpointer data, gint source, PurpleInputCondition c) {
    + GoogleFetchUrlData *gfud = (GoogleFetchUrlData *)data;
    + gint len;
    + gchar buff[4096];
    +
    + while((len = read(source, buff, sizeof(buff))) > 0)
    + gfud->response = g_string_append_len(gfud->response, buff, len);
    +
    + if(len < 0) {
    + if(errno == EAGAIN)
    + return;
    +
    + /* need to die here */
    +
    + return;
    + }
    +
    + if(len == 0) {
    + google_output_url(gfud);
    + google_fetch_url_data_free(gfud);
    + }
    +}
    +
    +static void
    +im_feeling_lucky_send_cb(gpointer data, gint source, PurpleInputCondition c) {
    + GoogleFetchUrlData *gfud = (GoogleFetchUrlData *)data;
    + gint len, total_len;
    +
    + total_len = strlen(gfud->request);
    +
    + len = write(gfud->fd, gfud->request + gfud->request_written,
    + total_len - gfud->request_written);
    +
    + if(len < 0) {
    + if(errno == EAGAIN)
    + return;
    +
    + /* need to die here */
    +
    + return;
    + }
    +
    + gfud->request_written += len;
    +
    + if(gfud->request_written < total_len)
    + return;
    +
    + /* 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);
    +}
    +
    +static void
    +im_feeling_lucky_cb(gpointer data, gint source, const gchar *e) {
    + GoogleFetchUrlData *gfud = (GoogleFetchUrlData *)data;
    +
    + gfud->conn_data = NULL;
    +
    + if(source == -1) {
    + purple_debug_error("google", "unable to connect to %s: %s\n",
    + gfud->host, gfud->path);
    +
    + google_fetch_url_data_free(gfud);
    +
    + return;
    + }
    +
    + gfud->fd = source;
    +
    + gfud->request = g_strdup_printf(
    + "GET /%s HTTP/1.1\r\n"
    + "Host: %s\r\n"
    + "User-Agent: Purple/%u.%u.%u\r\n"
    + "Accept: */*\r\n"
    + "Connection: close\r\n"
    + "Referer: %s\r\n"
    + "\r\n",
    + gfud->path,
    + gfud->host,
    + purple_major_version, purple_minor_version, purple_micro_version,
    + gfud->host);
    +
    + 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);
    +}
    +
    +/******************************************************************************
    + * Command stuff
    + *****************************************************************************/
    +static PurpleCmdRet
    +im_feeling_lucky(PurpleConversation *conv, const gchar *cmd, gchar **args,
    + gchar *error, void *data)
    +{
    + GoogleFetchUrlData *gfud = NULL;
    + PurplePlugin *plugin = (PurplePlugin *)data;
    + gchar *url = NULL;
    +
    + url = g_strdup_printf(GOOGLE_URL_FORMAT, "www.google.com",
    + purple_url_encode(args[0]));
    + gfud = google_fetch_url_data_new(url);
    + g_free(url);
    +
    + if(!gfud)
    + return PURPLE_CMD_RET_FAILED;
    +
    + gfud->conv = conv;
    +
    + /* now make the connection */
    + gfud->conn_data =
    + purple_proxy_connect(plugin, NULL, gfud->host, gfud->port,
    + im_feeling_lucky_cb, gfud);
    +
    + if(!gfud->conn_data) {
    + google_fetch_url_data_free(gfud);
    +
    + return PURPLE_CMD_RET_FAILED;
    + }
    +
    + return PURPLE_CMD_RET_OK;
    +}
    +
    +/******************************************************************************
    + * Plugin Stuff
    + *****************************************************************************/
    +static gboolean
    +plugin_load(PurplePlugin *plugin) {
    + google_cmd_id =
    + 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 "
    + "search"),
    + plugin);
    +
    + return TRUE;
    +}
    +
    +static gboolean
    +plugin_unload(PurplePlugin *plugin) {
    + purple_cmd_unregister(google_cmd_id);
    +
    + return TRUE;
    +}
    +
    +static PurplePluginInfo info = {
    + PURPLE_PLUGIN_MAGIC,
    + PURPLE_MAJOR_VERSION,
    + PURPLE_MINOR_VERSION,
    + PURPLE_PLUGIN_STANDARD,
    + NULL,
    + 0,
    + NULL,
    + PURPLE_PRIORITY_DEFAULT,
    +
    + "core-plugin_pack-google",
    + NULL,
    + PP_VERSION,
    + NULL,
    + NULL,
    + "Gary Kramlich <grim@reaperworld.com>",
    + PP_WEBSITE,
    +
    + plugin_load,
    + plugin_unload,
    + NULL,
    +
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    +};
    +
    +static void
    +init_plugin(PurplePlugin *plugin) {
    +#ifdef ENABLE_NLS
    + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR);
    + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
    +#endif /* ENABLE_NLS */
    +
    + 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 @@
    +[Google]
    +type=default
    +depends=purple
    +provides=google
    +summary=Writes the url for a Google I'm feeling lucky search to the active conversation
    +description=%(summary)s
    +authors=Gary Kramlich
    +introduced=2.4.0
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Group IM]
    +type=abusive
    +depends=purple
    +provides=groupmsg
    +summary=Send an IM to a group of buddies.
    +description=Adds the option to send an IM to every online buddy in a group.
    +authors=Stu Tomlinson
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Hide Conversation]
    +type=incomplete
    +depends=pidgin
    +provides=hideconv
    +summary=Hide conversations without closing them.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=1.0
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Highlight]
    +type=default
    +depends=purple
    +provides=highlight
    +summary=Support for highlighting words.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=2.0.0
    +
    --- 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 @@
    -EXTRA_DIST = \
    - .pidgin-plugin \
    - .incomplete \
    +INCLUDES = \
    callbacks.h \
    - ignorance.conf \
    ignorance.h \
    ignorance_denizen.h \
    ignorance_internal.h \
    @@ -13,6 +10,11 @@
    regex.h \
    support.h
    +EXTRA_DIST = \
    + plugins.cfg \
    + ignorance.conf \
    + $(INCLUDES)
    +
    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 @@
    +[Ignorance]
    +type=incomplete
    +depends=pidgin
    +provides=ignorance
    +summary=Allows you to manage lists of users with various levels of allowable activity.
    +description=%(summary)s
    +authors=Levi Bard
    +introduced=1.0beta7
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Ignore]
    +type=default
    +depends=purple
    +provides=ignore
    +summary=Flexible plugin to selectively ignore people. Please do not use if you have amnesia.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=2.0.0
    +
    --- 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 @@
    EXTRA_DIST = \
    - .pidgin-plugin \
    Makefile.mingw \
    - .build
    + plugins.cfg
    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 @@
    +[Infopane Options]
    +type=default
    +depends=pidgin
    +provides=infopane
    +summary=Allow customizing the details information in conversation windows.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=2.2.0
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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);
    - char *error = NULL;
    - purple_cmd_do_command(conv, command, markup, &error); /* Do anything with the return value? */
    - g_free(command);
    - g_free(markup);
    - g_free(error);
    + char *conv_name = NULL, *command = NULL, *markup = NULL, *error = NULL;
    +
    + if(conv_name) {
    + command = g_strdup_printf("join %s", conv_name);
    + markup = g_markup_escape_text(command, -1);
    + error = NULL;
    + purple_cmd_do_command(conv, command, markup, &error); /* Do anything with the return value? */
    + g_free(command);
    + g_free(markup);
    + g_free(error);
    + }
    +
    return FALSE;
    }
    --- /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 @@
    +[IRC More]
    +type=default
    +depends=purple
    +provides=ircmore
    +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
    +introduced=2.2.0
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[IRC Helper]
    +type=default
    +depends=purple
    +provides=irchelper
    +summary=Handles the rough edges of the IRC protocol.
    +description=Provides transparent authentication with a variety of services and suppresses various useless messages
    +authors=Richard Laager
    +introduced=1.0beta7
    +
    --- 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 @@
    -EXTRA_DIST=\
    - .pidgin-plugin \
    - .build \
    - Makefile.mingw \
    +HEADER_FILES = \
    datechange.h \
    lastlog.h \
    layout.h \
    textfmt.h \
    window.h
    +EXTRA_DIST=\
    + Makefile.mingw \
    + plugins.cfg \
    + $(HEADER_FILES)
    +
    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 @@
    +[Irssi Features]
    +type=default
    +depends=pidgin
    +provides=irssi
    +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
    +introduced=1.0beta1
    +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) \
    return FALSE; \
    \
    - if(!(account)->gc->flags & PURPLE_CONNECTION_HTML) \
    + if(!((account)->gc->flags & PURPLE_CONNECTION_HTML)) \
    return FALSE; \
    \
    if(!(message)) \
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Last Seen]
    +type=default
    +depends=pidgin
    +provides=lastseen
    +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.
    +authors=Stu Tomlinson
    +introduced=1.0beta1
    +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 @@
    -EXTRA_DIST=\
    - .build \
    - .purple-plugin \
    - Makefile.mingw \
    +HEADER_FILES = \
    aim_blt_files.h \
    alias_xml_files.h \
    gen_xml_files.h \
    @@ -10,6 +7,11 @@
    migrate.h \
    purple_blist_xml.h
    +EXTRA_DIST=\
    + Makefile.mingw \
    + plugins.cfg \
    + $(HEADER_FILES)
    +
    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 @@
    +[List Handler]
    +type=default
    +depends=purple
    +provides=listhandler
    +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.
    +authors=John Bailey
    +introduced=1.0beta1
    +
    --- 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 @@
    -EXTRA_DIST = \
    - pluginpack.m4
    --- 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 #
    -dnl # awk foo and other sanity graciously provided by Caleb Gilmour
    -dnl #
    -dnl ###########################################################################
    -dnl # AM_BUILD_PLUGIN_LIST
    -dnl #
    -dnl # Searches a dir, for subdir's which have a .plugin file defining them
    -dnl # as plugins for the plugin pack.
    -dnl #
    -dnl ###########################################################################
    -
    -AC_DEFUN([AM_BUILD_PLUGIN_LIST],
    -[dnl
    - PP_PURPLE=""
    - PP_PURPLE_ABUSIVE=""
    - PP_PURPLE_INCOMPLETE=""
    - PP_PURPLE_BUILD=""
    -
    - PP_PIDGIN=""
    - PP_PIDGIN_ABUSIVE=""
    - PP_PIDGIN_INCOMPLETE=""
    - PP_PIDGIN_BUILD=""
    -
    - PP_FINCH=""
    - PP_FINCH_ABUSIVE=""
    - PP_FINCH_INCOMPLETE=""
    - PP_FINCH_BUILD=""
    -
    - dnl #######################################################################
    - dnl # Build a list of all the available plugins
    - dnl #######################################################################
    - for d in $srcdir/*; do
    - if ! test -d "$d"; then
    - continue
    - fi
    -
    - 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
    - AC_ERROR(
    -[
    -*** 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.
    -])
    - fi
    -
    - base=`basename $d`
    -
    - 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"
    - fi
    -
    - if test -f "$d/.incomplete" ; then
    - PP_PURPLE_INCOMPLETE="$PP_PURPLE_INCOMPLETE $base"
    - fi
    -
    - PP_PURPLE="$PP_PURPLE $base"
    - fi
    -
    - 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"
    - fi
    -
    - if test -f "$d/.incomplete" ; then
    - PP_PIDGIN_INCOMPLETE="$PP_PIDGIN_INCOMPLETE $base"
    - fi
    -
    - PP_PIDGIN="$PP_PIDGIN $base"
    - fi
    -
    - 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"
    - fi
    -
    - if test -f "$d/.incomplete" ; then
    - PP_FINCH_INCOMPLETE="$PP_FINCH_INCOMPLETE $base"
    - fi
    -
    - PP_FINCH="$PP_FINCH $base"
    - fi
    - done;
    -
    - dnl #######################################################################
    - dnl # Add our argument
    - dnl #######################################################################
    - AC_ARG_WITH(plugins,
    - AC_HELP_STRING([--with-plugins], [what plugins to build]),
    - ,with_plugins=default)
    -
    - dnl #######################################################################
    - dnl # Now determine which ones have been selected
    - dnl #######################################################################
    - case "$with_plugins" in
    - all)
    - 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"
    - ;;
    - default)
    - dnl # we don't do anything if the defaults are selected, they're
    - dnl # already set up :)
    - ;;
    - *)
    - dnl # clear out the build variables
    - PP_FINCH_BUILD=""
    - PP_PIDGIN_BUILD=""
    - PP_PURPLE_BUILD=""
    -
    - 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.
    - for w in $exp_plugins
    - do
    - for p in $PP_FINCH
    - do
    - if test x"$w" = x"$p"
    - then
    - PP_FINCH_BUILD="$PP_FINCH_BUILD $p"
    - fi
    - done
    -
    - for p in $PP_PIDGIN
    - do
    - if test x"$w" = x"$p"
    - then
    - PP_PIDGIN_BUILD="$PP_PIDGIN_BUILD $p"
    - fi
    - done
    -
    - for p in $PP_PURPLE
    - do
    - if test x"$w" = x"$p"
    - then
    - PP_PURPLE_BUILD="$PP_PURPLE_BUILD $p"
    - fi
    - done
    - done
    - esac
    -
    - dnl # sort everything
    - 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)
    - AC_SUBST(PP_PURPLE_ABUSIVE)
    - AC_SUBST(PP_PURPLE_INCOMPLETE)
    - AC_SUBST(PP_PURPLE_BUILD)
    -
    - AC_SUBST(PP_PIDGIN)
    - AC_SUBST(PP_PIDGIN_ABUSIVE)
    - AC_SUBST(PP_PIDGIN_INCOMPLETE)
    - AC_SUBST(PP_PIDGIN_BUILD)
    -
    - AC_SUBST(PP_FINCH)
    - 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
    +
    +if HAVE_PIDGIN
    +
    +manualsize_LTLIBRARIES = manualsize.la
    +
    +manualsize_la_SOURCES = \
    + manualsize.c
    +
    +manualsize_la_LIBADD = \
    + $(GTK_LIBS) \
    + $(PIDGIN_LIBS)
    +
    +endif
    +
    +AM_CPPFLAGS = \
    + -DLIBDIR=\"$(PIDGIN_LIBDIR)\" \
    + -DDATADIR=\"$(PIDGIN_DATADIR)\" \
    + -DPIXMAPSDIR=\"$(PIDGIN_PIXMAPSDIR)\" \
    + $(DEBUG_CFLAGS) \
    + $(PIDGIN_CFLAGS) \
    + $(GTK_CFLAGS)
    +
    --- /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 @@
    +#
    +# Makefile.mingw
    +#
    +# Description: Makefile for manualsize plugin.
    +#
    +
    +PP_TOP := ..
    +
    +PP = manualsize
    +
    +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 <pidgin.h>
    +#include <gtkprefs.h>
    +
    +#include <conversation.h>
    +#include <prefs.h>
    +#include <signals.h>
    +#include <version.h>
    +#include <debug.h>
    +
    +#include <gtkplugin.h>
    +#include <gtkutils.h>
    +#include <gtkimhtml.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
    + */
    +static GtkWidget *
    +find_placed_object(GtkWidget *w, gint *client_height) {
    + GtkWidget * ret;
    + gint border_width;
    +
    + 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;
    + return w;
    + } else {
    + ret = find_placed_object(gtk_widget_get_parent(w), client_height);
    + *client_height = *client_height - border_width + 2;
    + return ret;
    + }
    +}
    +
    +/*
    + * 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
    + */
    +static GtkWidget *
    +get_notebook(GtkWidget * w) {
    + const gchar *name = NULL;
    +
    + name = G_OBJECT_TYPE_NAME(w);
    +
    + if (name && strcmp("GtkNotebook", name) == 0)
    + return w;
    +
    + if(gtk_widget_get_parent(w) == NULL)
    + return NULL;
    +
    + return get_notebook(gtk_widget_get_parent(w));
    +}
    +
    +/*
    + * Signal handler. Triggers a page_added flag.
    + */
    +static void
    +on_page_add(GtkNotebook *book, GtkWidget *widget, guint page_num,
    + gpointer user_data)
    +{
    + page_added = TRUE;
    + return;
    +}
    +
    +/*
    + * When removing last page, forget this notebook
    + */
    +static void
    +on_page_remove(GtkNotebook *book, GtkWidget *widget, guint page_num,
    + gpointer user_data)
    +{
    + if(gtk_notebook_get_n_pages(book) == 0) {
    + books_connected = g_list_remove(books_connected, book);
    + printf("Removed!\n");
    + }
    +}
    +
    +/*
    + * Attach a handlers on a notebook if it is not already attached
    + * Adds a notebook into a tracked objects list
    + */
    +static void
    +connect_notebook_handler(GtkNotebook * notebook) {
    + GList * item = g_list_find(books_connected, notebook);
    +
    + if(!item) {
    + 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 );
    + printf("Added!\n");
    + }
    +}
    +
    +/*
    + * 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
    + */
    +static void
    +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));
    + gint handle_size = 0;
    + gint parent_area = 0;
    + gint border_size = 0;
    + gint new_pos;
    + GtkPositionType tabpos = -1;
    + GValue v = {0, };
    + 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);
    + else
    + stored_height = purple_prefs_get_int(PREF_IM_ENTRY_HEIGHT);
    +
    + if (stored_height < 0) stored_height = 128;
    +
    + if (notebook) {
    + 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 );
    +
    + g_value_unset( &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));
    +
    + new_pos =
    + parent_area -
    + stored_height -
    + handle_size -
    + border_size * 2 -
    + (((page_added==TRUE)&&((tabpos==GTK_POS_TOP)||(tabpos==GTK_POS_BOTTOM)))?24:0);
    +
    + gtk_paned_set_position( GTK_PANED(vpaned), new_pos );
    +
    + page_added = FALSE;
    +
    + gtk_widget_grab_focus( conv->entry );
    +
    +}
    +
    +/*
    + * Store input area size depending on a conversation type
    + */
    +static void
    +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);
    + } else {
    + purple_prefs_set_int(PREF_IM_ENTRY_HEIGHT,
    + gtkconv->lower_hbox->allocation.height);
    + }
    + }
    +}
    +
    +/*
    + * Signal handler. Called when conversation created, and rebuilds a conversation pane
    + */
    +static void
    +on_display(gpointer data) {
    + PidginConversation *gtkconv = (PidginConversation *)data;
    +
    + if(gtkconv)
    + rebuild_container(gtkconv);
    +}
    +
    +/*
    + * Signal handler. Called when conversation destroyed, to store an input area size
    + */
    +static void
    +on_destroy(void * data) {
    + PurpleConversation *conv = (PurpleConversation*)data;
    + if(conv) {
    + PidginConversation * gtkconv = PIDGIN_CONVERSATION(conv);
    + if (gtkconv)
    + store_area_size(gtkconv);
    + }
    +}
    +
    +/*
    + * Traverse connected notebooks and remove our signal handler
    + */
    +static void
    +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 );
    +}
    +
    +static gboolean
    +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);
    +
    + return TRUE;
    +}
    +
    +static gboolean
    +plugin_unload(PurplePlugin *plugin) {
    + g_list_foreach(books_connected, cleanup_callback, NULL);
    + g_list_free(books_connected);
    +
    + return TRUE;
    +}
    +
    +static PurplePluginInfo info =
    +{
    + PURPLE_PLUGIN_MAGIC,
    + PURPLE_MAJOR_VERSION,
    + PURPLE_MINOR_VERSION,
    + PURPLE_PLUGIN_STANDARD, /**< type */
    + PIDGIN_PLUGIN_TYPE, /**< ui_requirement */
    + 0, /**< flags */
    + NULL, /**< dependencies */
    + PURPLE_PRIORITY_DEFAULT, /**< priority */
    +
    + NOTIFY_PLUGIN_ID, /**< id */
    + NULL, /**< name */
    + PP_VERSION, /**< version */
    +
    + NULL, /** summary */
    + NULL, /** description */
    +
    + "Artemy Kapitula <dalt74@gmail.com>", /**< author */
    + PP_WEBSITE, /**< homepage */
    +
    + plugin_load, /**< load */
    + plugin_unload, /**< unload */
    + NULL, /**< destroy */
    +
    + NULL, /**< ui_info */
    + NULL, /**< extra_info */
    + NULL,
    + NULL,
    +
    + /* padding */
    + NULL,
    + NULL,
    + NULL,
    + NULL
    +};
    +
    +static void
    +init_plugin(PurplePlugin *plugin) {
    +#ifdef ENABLE_NLS
    + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR);
    + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
    +#endif /* ENABLE_NLS */
    +
    + 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
    +
    +if HAVE_PIDGIN
    +
    +msglen_LTLIBRARIES = msglen.la
    +
    +msglen_la_SOURCES = \
    + msglen.c
    +
    +msglen_la_LIBADD = \
    + $(GTK_LIBS) \
    + $(PIDGIN_LIBS)
    +
    +endif
    +
    +AM_CPPFLAGS = \
    + -DLIBDIR=\"$(PIDGIN_LIBDIR)\" \
    + -DDATADIR=\"$(PIDGIN_DATADIR)\" \
    + -DPIXMAPSDIR=\"$(PIDGIN_PIXMAPSDIR)\" \
    + $(DEBUG_CFLAGS) \
    + $(PIDGIN_CFLAGS) \
    + $(GTK_CFLAGS)
    +
    --- /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 @@
    +#
    +# Makefile.mingw
    +#
    +# Description: Makefile for convbadger plugin.
    +#
    +
    +PP_TOP := ..
    +
    +PP = msglen
    +
    +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 <gtk/gtk.h>
    +
    +#include <conversation.h>
    +#include <signals.h>
    +
    +#include <gtkconv.h>
    +#include <gtkmenutray.h>
    +#include <gtkplugin.h>
    +#include <gtkutils.h>
    +
    +/******************************************************************************
    + * Structs
    + *****************************************************************************/
    +typedef struct {
    + PurpleConversation *conv;
    + PidginWindow *win;
    + GtkWidget *label;
    +} MsgLenData;
    +
    +/******************************************************************************
    + * Globals
    + *****************************************************************************/
    +static GHashTable *data = NULL;
    +
    +/******************************************************************************
    + * helpers
    + *****************************************************************************/
    +static void
    +msg_len_data_free(MsgLenData *mld) {
    + mld->win = NULL;
    + mld->conv = NULL;
    +
    + if(mld->label && GTK_IS_LABEL(mld->label))
    + gtk_widget_destroy(mld->label);
    +
    + g_free(mld);
    +
    + mld = NULL;
    +}
    +
    +static void
    +msg_len_data_free_helper(gpointer k, gpointer v, gpointer d) {
    + MsgLenData *mld = (MsgLenData *)v;
    +
    + msg_len_data_free(mld);
    +}
    +
    +static void
    +msg_len_update(PidginWindow *win, PurpleConversation *conv) {
    + PidginConversation *gtkconv = NULL;
    + MsgLenData *mld = NULL;
    + gchar *text = NULL;
    + gint count = 0;
    +
    + g_return_if_fail(win);
    + g_return_if_fail(conv);
    +
    + mld = g_hash_table_lookup(data, conv);
    +
    + if(mld == NULL) {
    + mld = g_new0(MsgLenData, 1);
    +
    + mld->win = win;
    + mld->conv
    +
    + mld->label = gtk_label_new("");
    + pidgin_menu_tray_append(PIDGIN_MENU_TRAY(win->menu.tray), mld->label,
    + NULL);
    + gtk_widget_show(mld->label);
    +
    + g_signal_connect_swapped(G_OBJECT(mld->label), "destroy",
    + G_CALLBACK(g_nullify_pointer), &mld->label);
    + }
    +
    + mld->conv = conv;
    +
    + 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_free(text);
    +
    + g_hash_table_insert(data, win, mld);
    +}
    +
    +/******************************************************************************
    + * Callbacks
    + *****************************************************************************/
    +static void
    +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);
    +}
    +
    +static void
    +msg_len_conv_destroyed_cb(PurpleConversation *conv, gpointer data) {
    + purple_debug_info("msglen", "destroyed\n");
    +}
    +
    +static void
    +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 Stuff
    + *****************************************************************************/
    +static gboolean
    +plugin_load(PurplePlugin *plugin) {
    + void *conv_handle = purple_conversations_get_handle();
    +
    + data = g_hash_table_new_full(g_direct_hash, g_direct_equal,
    + NULL, NULL);
    +
    + 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);
    +
    + return TRUE;
    +}
    +
    +static gboolean
    +plugin_unload(PurplePlugin *plugin) {
    + g_hash_table_foreach(data, msg_len_data_free_helper, NULL);
    +
    + g_hash_table_destroy(data);
    +
    + data = NULL;
    +
    + return TRUE;
    +}
    +
    +static PurplePluginInfo info = {
    + PURPLE_PLUGIN_MAGIC,
    + PURPLE_MAJOR_VERSION,
    + PURPLE_MINOR_VERSION,
    + PURPLE_PLUGIN_STANDARD,
    + PIDGIN_PLUGIN_TYPE,
    + 0,
    + NULL,
    + PURPLE_PRIORITY_DEFAULT,
    +
    + "gtk-plugin_pack-msglen",
    + NULL,
    + PP_VERSION,
    + NULL,
    + NULL,
    + "Gary Kramlich <grim@reaperworld.com>",
    + PP_WEBSITE,
    +
    + plugin_load,
    + plugin_unload,
    + NULL,
    +
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    +
    + NULL,
    + NULL,
    + NULL,
    + NULL
    +};
    +
    +
    +static void
    +init_plugin(PurplePlugin *plugin) {
    +#ifdef ENABLE_NLS
    + bindtextdomain(GETTEXT_PACKAGE, PP_LOCALEDIR);
    + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
    +#endif /* ENABLE_NLS */
    +
    + info.name = _("Message Length");
    + info.summary = _("Shows the length of your current message in the menu "
    + "tray");
    + 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 @@
    +[Message Length]
    +type=incomplete
    +depends=pidgin
    +provides=msglen
    +summary=Shows the length of your current message in the menu tray
    +description=%(summary)s
    +authors=Gary Kramlich
    +introduced=2.4.0
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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)]
    +type=default
    +depends=pidgin
    +provides=mystatusbox
    +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
    +introduced=1.0beta1
    +
    --- 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 @@
    -EXTRA_DIST=\
    - .build \
    - .purple-plugin \
    - Makefile.mingw \
    +PIXMAPS = \
    16/napster.png \
    22/napster.png \
    48/napster.png
    +
    +EXTRA_DIST=\
    + Makefile.mingw \
    + plugins.cfg \
    + $(PIXMAPS)
    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 @@
    +[Napster]
    +type=default
    +depends=purple
    +provides=napster
    +summary=NAPSTER Protocol Plugin
    +description=%(summary)s
    +authors=Rob Flynn
    +introduced=1.0beta6
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    static void
    clear_list(GtkWidget *w, PidginConversation *gtkconv)
    {
    - GList *list = g_object_get_data(G_OBJECT(gtkconv->imhtml), "nicksaid:list");
    + GList *ll, *list;
    +
    + ll = list = g_object_get_data(G_OBJECT(gtkconv->imhtml), "nicksaid:list");
    while (list)
    {
    @@ -209,6 +211,7 @@
    g_free(said);
    list = list->next;
    }
    + g_list_free(ll);
    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 @@
    +[Nicksaid]
    +type=default
    +depends=pidgin
    +provides=nicksaid
    +summary=Record when someone said your nick in a chat.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    struct stat st;
    char *index_path;
    char *index_data;
    - GError *error;
    + GError *error = NULL;
    int index_fd;
    char *index_tmp;
    FILE *index;
    @@ -146,7 +146,6 @@
    if ((index_fd = g_mkstemp(index_tmp)) == -1) {
    purple_debug_error("log", "Failed to open index temp file: %s\n",
    strerror(errno));
    - g_error_free(error);
    g_free(index_path);
    g_free(index_data);
    g_free(index_tmp);
    @@ -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));
    g_unlink(index_tmp);
    - g_free(index_tmp);
    }
    +
    + g_free(index_tmp);
    + g_free(index_path);
    + g_free(index_data);
    }
    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 @@
    +[Old Logger]
    +type=default
    +depends=purple
    +provides=oldlogger
    +summary=Re-implements the legacy, deficient, logging
    +description=%(summary)s
    +authors=Stu Tomlinson
    +introduced=1.0beta1
    --- 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
    +EXTRA_DIST = \
    + plugins.cfg
    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 @@
    +[Plonkers]
    +type=default
    +depends=pidgin
    +provides=plonkers
    +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.'
    +authors=Peter Lawler
    +introduced=1.0beta2
    +
    --- /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 @@
    +#!/usr/bin/python
    +
    +# 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
    +
    +Flags:
    +
    + -a Load abusive plugins
    + -d Load default plugins
    + -f Load finch plugins
    + -i Load incomplate plugins
    + -p Load purple plugins
    + -P Load pidgin plugins
    +
    +Commands:
    +"""
    +
    +import ConfigParser
    +import getopt
    +import glob
    +import os.path
    +import string
    +import sys
    +
    +def printerr(msg):
    + print >> sys.stderr, msg
    +
    +class Plugin:
    + name = ''
    + directory = ''
    + type = ''
    + depends = []
    + provides = ''
    + summary = ''
    + description = ''
    + authors = []
    + introduced = ''
    + notes = ''
    +
    + def __init__(self, directory, name, parser):
    + self.name = name
    +
    + 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))
    +
    + def __str__(self):
    + 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
    +
    + if self.notes:
    + output += 'notes: %s\n' % self.notes
    +
    + return output
    +
    +class PluginPack:
    + commands = {}
    + plugins = {}
    +
    + def load_plugins(self, types, depends):
    + if len(types) == 0:
    + types = None
    +
    + if len(depends) == 0:
    + depends = None
    +
    + for file in glob.glob('*/plugins.cfg'):
    + parser = ConfigParser.ConfigParser()
    +
    + try:
    + parser.read(file)
    + except ConfigParser.ParsingError, msg:
    + printerr('Failed to parse \'%s\':\n%s' % (file, msg))
    + continue
    +
    + 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:
    + continue
    +
    + # now we check if the give plugins depends match the search
    + # depends
    + if depends:
    + if len(set(depends).intersection(set(p.depends))) == 0:
    + continue
    +
    + self.plugins[p.provides] = p
    +
    + def list_type(self, type):
    + list = []
    +
    + for name in self.plugins.keys():
    + plugin = self.plugins[name]
    + if plugin.type == type:
    + list.append(plugin)
    +
    + list.sort()
    +
    + return list
    +
    + def list_dep(self, dep):
    + list = []
    +
    + for name in self.plugins.keys():
    + plugin = self.plugins[name]
    +
    + if dep in plugin.depends:
    + list.append(plugin)
    +
    + list.sort()
    +
    + return list
    +
    + def print_names(self, list):
    + names = []
    +
    + for plugin in 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')
    +
    + def unique_dirs(self):
    + dirs = {}
    + for name in self.plugins.keys():
    + dirs[self.plugins[name].directory] = 1
    +
    + dirs = dirs.keys()
    + dirs.sort()
    +
    + return dirs
    +
    + def help(self, args):
    + """Displays information about other commands"""
    + try:
    + cmd = self.commands[args[0]]
    + print cmd.__doc__
    + except KeyError:
    + print 'command \'%s\' was not found' % args[0]
    + except IndexError:
    + pass
    + 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"""
    + if len(args) != 2:
    + printerr('build_dirs expects 2 arguments:')
    + printerr('\ta comma separated list of dependencies')
    + printerr('\ta comma separated list of plugins to build')
    + sys.exit(1)
    +
    + # store the external depedencies
    + externals = args[0].split(',')
    +
    + deps = {}
    +
    + # run through the provided dependencies, setting their dependencies to
    + # nothing since we know we already have them
    + for d in externals:
    + deps[d] = []
    +
    + # 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
    + check = []
    + for provides in args[1].split(','):
    + try:
    + if provides == 'all':
    + defaults = []
    + for p in self.default_plugins():
    + defaults.append(p.provides)
    +
    + check += defaults
    +
    + continue
    +
    + plugin = self.plugins[provides]
    + check.append(plugin.provides)
    + except KeyError:
    + continue
    +
    + # convert our list of plugins to check into a set to remove dupes
    + #check = set(check)
    +
    + # create our list of plugins to build
    + build = []
    +
    + # now define a function to check our deps
    + def has_deps(provides):
    + # don't add anything to build more than once
    + if provides in build:
    + return True
    +
    + try:
    + dep_list = deps[provides]
    + except KeyError:
    + return False
    +
    + # now check the dependencies
    + for dep in dep_list:
    + if not has_deps(dep):
    + return False
    +
    + # make sure the provides isn't an external
    + if not provides in externals:
    + build.append(provides)
    +
    + # everything checks out!
    + return True
    +
    + # check all the plugins we were told to for their dependencies
    + for c in check:
    + has_deps(c)
    +
    + # now create a list of all directories to build
    + output = []
    +
    + for provides in build:
    + plugin = self.plugins[provides]
    +
    + output.append(plugin.directory)
    +
    + output.sort()
    +
    + 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
    + print 'AC_CONFIG_FILES(['
    + for dir in uniqdirs:
    + print '\t%s/Makefile' % (dir)
    + print '])'
    + print
    +
    + # 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
    + print 'PP_BUILD_DIRS=`echo $PP_BUILD | sed \'s/,/\ /g\'`'
    + print 'AC_SUBST(PP_BUILD_DIRS)'
    + print
    + 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('-', '_')
    + label = plugin.name
    +
    + return node, label
    +
    + def print_plugins(list):
    + for plugin in list:
    + node, label = node_label(plugin)
    +
    + print '\t%s[label="%s"];' % (node, label)
    +
    + print 'digraph {'
    + print '\tlabel="Dependency Graph";'
    + print '\tlabelloc="t";'
    + print '\tsplines=TRUE;'
    + print '\toverlap=FALSE;'
    + print
    + print '\tnode[fontname="sans", fontsize="8", style="filled"];'
    + print
    +
    + # run through the default plugins
    + print '\t/* default plugins */'
    + print '\tnode[fillcolor="palegreen",shape="tab"];'
    + print_plugins(self.default_plugins())
    + print
    +
    + # run through the incomplete plugins
    + print '\t/* incomplete plugins */'
    + print '\tnode[fillcolor="lightyellow1",shape="note"];'
    + print_plugins(self.incomplete_plugins())
    + print
    +
    + # run through the abusive plugins
    + print '\t/* abusive plugins */'
    + print '\tnode[fillcolor="lightpink",shape="octagon"];'
    + print_plugins(self.abusive_plugins())
    + print
    +
    + # 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 '\t */'
    + 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)
    +
    + print '}'
    + 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(',')
    + if len(provides) == 0:
    + print "none"
    +
    + line = " "
    +
    + for provide in provides:
    + if not provide in self.plugins:
    + continue
    +
    + name = self.plugins[provide].name
    +
    + if len(line) + len(name) + 2 > 75:
    + print line.rstrip(',')
    + line = ' '
    +
    + line += ' %s,' % name
    +
    + if len(line) > 1:
    + print line.rstrip(',')
    + commands['show_names'] = show_names
    +
    + def info(self, args):
    + """Displays all information about the given plugins"""
    + for p in args:
    + try:
    + print self.plugins[p].__str__().strip()
    + except KeyError:
    + print 'Failed to find a plugin that provides \'%s\'' % (p)
    +
    + print
    + commands['info'] = info
    +
    + def stats(self, args):
    + """Displays stats about the plugin pack"""
    + counts = {}
    +
    + 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())
    +
    + def value(val):
    + return "%3d (%0.2f%%)" % (val, (float(val) / float(counts['total'])) * 100.0)
    +
    + print "Purple Plugin Pack Stats"
    + print ""
    + print "%d plugins in total" % (counts['total'])
    + print
    + print "Status:"
    + print " complete: %s" % (value(counts['default']))
    + print " incomplete: %s" % (value(counts['incomplete']))
    + print " abusive: %s" % (value(counts['abusive']))
    + print ""
    + print "Type:"
    + 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):
    + print __doc__
    +
    + cmds = pp.commands.keys()
    + cmds.sort()
    +
    + for cmd in cmds:
    + print " %-20s %s" % (cmd, pp.commands[cmd].__doc__)
    +
    + print ""
    +
    + sys.exit(exitcode)
    +
    +def main():
    + # create our main instance
    + pp = PluginPack()
    +
    + types = []
    + depends = []
    +
    + try:
    + shortopts = 'adfiPp'
    +
    + opts, args = getopt.getopt(sys.argv[1:], shortopts)
    + except getopt.error, msg:
    + print msg
    + show_usage(pp, 1)
    +
    + for o, a in opts:
    + if o == '-a':
    + types.append('abusive')
    + elif o == '-d':
    + types.append('default')
    + elif o == '-i':
    + types.append('incomplete')
    + elif o == '-f':
    + depends.append('finch')
    + elif o == '-P':
    + depends.append('pidgin')
    + elif o == '-p':
    + depends.append('purple')
    +
    + # load the plugins that have been requested, if both lists are empty, all
    + # plugins are loaded
    + pp.load_plugins(types, depends)
    +
    + if(len(args) == 0):
    + show_usage(pp, 1)
    +
    + cmd = args[0]
    + args = args[1:]
    +
    + try:
    + pp.commands[cmd](pp, args)
    + except KeyError:
    + printerr('\'%s\' command not found' % (cmd))
    +
    +if __name__ == '__main__':
    + 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 @@
    album/album.c
    album/album-ui.c
    +autoprofile/autoaway.c
    +autoprofile/autoprofile.c
    +autoprofile/autoreply.c
    +autoprofile/comp_countdownup.c
    +autoprofile/comp_executable.c
    +autoprofile/comp_http.c
    +autoprofile/comp_logstats.c
    +autoprofile/comp_logstats_gtk.c
    +autoprofile/comp_quotation.c
    +autoprofile/comp_rss.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
    autoreply/autoreply.c
    awaynotify/awaynotify.c
    bash/bash.c
    @@ -8,6 +25,7 @@
    buddytime/buddytime.c
    buddytime/gtkbuddytime.c
    chronic/chronic.c
    +colorize/colorize.c
    common/purple_template.c
    common/gtk_template.c
    convbadger/convbadger.c
    @@ -19,6 +37,7 @@
    findip/findip.c
    findip/findip.c
    flip/flip.c
    +google/google.c
    gRIM/gRIM.c
    groupmsg/groupmsg.c
    hideconv/hideconv.c
    @@ -57,6 +76,7 @@
    simfix/simfix.c
    slashexec/slashexec.c
    snpp/snpp.c
    +splitter/splitter.c
    sslinfo/sslinfo.c
    stocker/stocker.c
    stocker/stocker_prefs.c
    --- /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 @@
    +plugin_pack.py
    --- 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
    +HEADER_FILES = \
    + schedule.h
    +
    +EXTRA_DIST = \
    + plugins.cfg \
    + $(HEADER_FILES)
    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 @@
    +[Schedule]
    +type=default
    +depends=pidgin
    +provides=schedule
    +summary=Schedule reminders at specified times.
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=1.0beta1
    +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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Separate And Tab]
    +type=default
    +depends=pidgin
    +provides=sepandtab
    +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.
    +authors=Gary Kramlich
    +introduced=1.0beta1
    +
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[Show Offline]
    +type=default
    +depends=purple
    +provides=showoffline
    +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.
    +authors=Stu Tomlinson
    +introduced=1.0beta1
    +
    --- 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."));
    + return FALSE;
    + }
    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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[SIM-fix]
    +type=default
    +depends=purple
    +provides=simfix
    +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.
    +authors=Stu Tomlinson
    +introduced=1.0beta1
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[/exec]
    +type=default
    +depends=purple
    +provides=slashexec
    +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
    +introduced=1.0beta3
    +
    --- 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 @@
    EXTRA_DIST = \
    - .build \
    - .purple-plugin \
    - Makefile.mingw
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[SNPP]
    +type=default
    +depends=purple
    +provides=snpp
    +summary=SNPP Plugin
    +description=Allows libpurple to send messages over the Simple Network Paging Protocol (SNPP).
    +authors=Don Seiler
    +introduced=2.1.0
    +
    --- /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 @@
    +splitter v0.95
    +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
    + * internal refactoring
    +
    +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]
    +
    + * chat support added
    +
    +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
    + (thanks rageboy04)
    +
    +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 @@
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    +
    +splitterdir = $(PURPLE_LIBDIR)
    +
    +splitter_la_LDFLAGS = -module -avoid-version
    +
    +if HAVE_PURPLE
    +
    +splitter_LTLIBRARIES = splitter.la
    +
    +splitter_la_SOURCES = \
    + splitter.c
    +
    +splitter_la_LIBADD = \
    + $(GLIB_LIBS) \
    + $(PURPLE_LIBS)
    +
    +endif
    +
    +AM_CPPFLAGS = \
    + -DLIBDIR=\"$(PURPLE_LIBDIR)\" \
    + -DDATADIR=\"$(PURPLE_DATADIR)\" \
    + -DPIXMAPSDIR=\"$(PURPLE_PIXMAPSDIR)\" \
    + $(DEBUG_CFLAGS) \
    + $(PURPLE_CFLAGS)
    +
    --- /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 @@
    +#
    +# Makefile.mingw
    +#
    +# Description: Makefile for dice plugin.
    +#
    +
    +PP_TOP := ..
    +
    +PP = splitter
    +
    +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>
    +
    +
    +------------
    +INTRODUCTION
    +------------
    +
    +This is a simple plugin to split up outgoing messages that are larger
    +than a specified threshold in characters.
    +
    +
    +--------
    +FEATURES
    +--------
    +
    + - 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.
    +
    +
    +----
    +TODO
    +----
    +
    + - 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
    + lines.
    + - find any remaining bugs and memory leaks.
    +
    +------------
    +INSTALLATION
    +------------
    +
    + - *NIX users:
    + $ make install
    +
    + If you have build problems make sure you have the
    + appropriate pidgin-dev and build-essential files
    + installed.
    +
    + Alternately you can copy spliter.c to
    + (unzipped-source)/pidgin/plugins and
    + after building Pidgin:
    +
    + $ make splitter.so
    +
    + then copy splitter.so to ~/.purple/plugins/ and launch Pidgin.
    +
    +
    + - Windows users:
    + 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)
    +
    +
    +------------
    +CONTRIBUTORS
    +------------
    +
    +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
    +
    +
    +-------
    +CONTACT
    +-------
    +
    +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 @@
    +[Message Splitter]
    +type=incomplete
    +depends=purple pango
    +provides=splitter
    +summary=Splits a large outgoing message into smaller messages of a specified size.
    +description=%(summary)s
    +authors=Ike Gingerich
    +introduced=2.4.0
    +
    --- /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
    + * in its place.
    + *
    + * 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
    + * 02111-1307, USA.
    + */
    +
    +#define GETTEXT_PACKAGE "gtk20"
    +#include <glib/gi18n-lib.h>
    +
    +#include <gtk/gtk.h>
    +
    +#include <string.h>
    +#include <errno.h>
    +
    +#ifndef PURPLE_PLUGINS
    +#define PURPLE_PLUGINS
    +#endif
    +
    +#include <debug.h>
    +#include <notify.h>
    +#include <version.h>
    +#include <util.h>
    +
    +#define WEBSITE "http://ikebo.hypermart.net/"
    +#define PLUGIN_ID "core-ike-splitter"
    +
    +/* grr */
    +#ifndef ENOTCONN
    +#define ENOTCONN 107
    +#endif
    +
    +/* 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;
    +
    +typedef struct
    +{
    + char *sender_username;
    + char *sender_protocol_id;
    + GQueue *messages;
    +
    + PurpleConversationType type;
    + union {
    + char *receiver; /* IM username */
    + int id; /* chat ID */
    + };
    +} message_to_conv;
    +
    +typedef struct {
    + int start, end;
    +} message_slice;
    +
    +/* 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",
    + "Letter count: ");
    + 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",
    + "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);
    +
    + return frame;
    +}
    +
    +/**
    + * 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;
    + PurpleConnection *gc;
    + char *displayed = NULL, *sent = NULL;
    + int err = 0;
    +
    + if (strlen(message) == 0)
    + return;
    +
    + 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);
    + }
    + else
    + 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),
    + sent, msgflags);
    +
    + 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",
    + account,
    + purple_conversation_get_name(conv), sent);
    + }
    + }
    + else {
    + 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",
    + account, sent,
    + purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)));
    + }
    + }
    +
    + if (err < 0) {
    + const char *who;
    + const char *msg;
    +
    + who = purple_conversation_get_name(conv);
    +
    + if (err == -E2BIG) {
    + 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."));
    + g_free(msg2);
    + }
    + }
    + else if (err == -ENOTCONN) {
    + purple_debug(PURPLE_DEBUG_ERROR, "conversation",
    + "Not yet connected.\n");
    + }
    + else {
    + 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);
    + g_free(msg2);
    + }
    + }
    + }
    +
    + g_free(displayed);
    + g_free(sent);
    +}
    +
    +/* 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;
    + gchar *msg;
    +
    + 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);
    +
    + if( msg == NULL )
    + {
    + /* 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);
    +
    + g_free(msg_to_conv);
    +
    + return FALSE;
    + }
    + else
    + {
    + /* 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);
    + else
    + conv = NULL;
    +
    + g_return_val_if_fail(conv != NULL, FALSE);
    +
    + splitter_common_send(conv, msg, PURPLE_MESSAGE_SEND);
    + g_free(msg);
    +
    + return TRUE;
    + }
    +}
    +
    +/* 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)
    + break;
    +
    + 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)
    +{
    + PangoContext *context;
    + PangoLogAttr *a;
    + GList *list;
    + int len, n_attr;
    +
    + g_return_val_if_fail(message != NULL, NULL);
    +
    + len = strlen(message);
    + n_attr = len+1;
    + a = g_new0(PangoLogAttr, n_attr);
    +
    + /* init Pango */
    + 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;
    +}
    +
    +/* 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;
    + message_slice *slice;
    + PangoLogAttr *a;
    + GQueue *q;
    +
    + q = g_queue_new();
    + len = strlen(message);
    + 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);
    + else g_free(slice);
    +
    + if( break_pos > -1 )
    + current_break_start++;
    +
    + last_break_start = current_break_start;
    + }
    +
    + slice = g_new0( message_slice, 1 );
    + slice->start = last_break_start;
    + slice->end = len;
    + g_queue_push_tail(q, slice);
    +
    + /* cleanup */
    + g_free(a);
    +
    + return q;
    +
    +}
    +
    +/* 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;
    + message_slice *slice;
    + char *stripped_message, *msg;
    + int stripped_len;
    +
    + 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);
    +
    + if( msg != NULL )
    + g_queue_push_tail(messages, msg);
    +
    + g_free(slice);
    + }
    +
    + g_queue_free(slices);
    +
    + /* cleanup */
    + g_free(stripped_message);
    +
    + return messages;
    +}
    +
    +/* create message queue and prepare timer callbacks */
    +static void split_and_send(message_to_conv *msg_to_conv, const char **message)
    +{
    + gint message_delay_ms;
    +
    + 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,
    + msg_to_conv);
    +
    + /* free the original message and ensure it does not get sent */
    + g_free((char*)*message);
    + *message = NULL;
    +}
    +
    +/* 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->id = 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,
    + const char **message)
    +{
    + 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(),
    + "sending-im-msg",
    + plugin,
    + PURPLE_CALLBACK(sending_im_msg_cb),
    + NULL);
    + purple_signal_connect(purple_conversations_get_handle(),
    + "sending-chat-msg",
    + plugin,
    + PURPLE_CALLBACK(sending_chat_msg_cb),
    + NULL);
    +
    + return TRUE;
    +}
    +
    +
    +static gboolean plugin_unload(PurplePlugin *plugin)
    +{
    + return TRUE;
    +}
    +
    +static PurplePluginUiInfo prefs_info = {
    + get_plugin_pref_frame, 0, NULL, NULL, NULL, NULL, NULL
    +};
    +
    +static PurplePluginInfo info =
    +{
    + PURPLE_PLUGIN_MAGIC,
    + PURPLE_MAJOR_VERSION,
    + PURPLE_MINOR_VERSION,
    + PURPLE_PLUGIN_STANDARD, /**< type */
    + NULL, /**< ui_requirement */
    + 0, /**< flags */
    + NULL, /**< dependencies */
    + PURPLE_PRIORITY_DEFAULT, /**< priority */
    +
    + PLUGIN_ID, /**< id */
    + N_("Message Splitter"), /**< name */
    + VERSION, /**< version */
    + /** summary */
    + N_("Splits a large outgoing message into smaller "
    + "messages of a specified size."),
    + /** description */
    + 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, /**< destroy */
    +
    + NULL, /**< ui_info */
    + NULL, /**< extra_info */
    + &prefs_info, /**< prefs_info */
    + NULL,
    + NULL,
    + NULL,
    + NULL,
    + NULL
    +};
    +
    +/* 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    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 @@
    +[SSL Info]
    +type=default
    +depends=purple
    +provides=sslinfo
    +summary=Displays info about your currently loaded SSL plugin
    +description=%(summary)s
    +authors=Gary Kramlich
    +introduced=1.0beta1
    +
    --- 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 @@
    -EXTRA_DIST = \
    - .incomplete \
    - .pidgin-plugin \
    +INCLUDES = \
    gtkticker.h \
    stocker_prefs.h
    +EXTRA_DIST = \
    + plugins.cfg \
    + $(INCLUDES)
    +
    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 @@
    +[Stocker]
    +type=incomplete
    +depends=pidgin
    +provides=stocker
    +summary=A stock ticker
    +description=Adds a stock ticker similar to the one in the Windows AIM client to the bottom of the buddy list.
    +authors=Gary Kramlich
    +introduced=1.0beta1
    +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);
    + g_list_free(def_syms);
    }
    GtkWidget *
    --- 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
    +EXTRA_DIST = \
    + Makefile.mingw \
    + plugins.cfg
    if BUILD_SWITCH_SPELL
    switchspelldir = $(PIDGIN_LIBDIR)
    -switchspell_la_LDFLAGS = -module -avoid-version
    +switchspell_la_LDFLAGS = -module -avoid-version \
    + $(GTKSPELL_LIBS)
    if HAVE_PIDGIN
    @@ -13,9 +16,9 @@
    switchspell.c
    switchspell_la_LIBADD = \
    - $(PIDGIN_LIBS) \
    + $(ASPELL_LIBS) \
    $(GTK_LIBS) \
    - $(GTKSPELL_LIBS)
    + $(PIDGIN_LIBS)
    endif # PIDGIN
    @@ -23,6 +26,7 @@
    -DLIBDIR=\"$(PIDGIN_LIBDIR)\" \
    -DDATADIR=\"$(PIDGIN_DATADIR)\" \
    -DPIXMAPSDIR=\"$(PIDGIN_PIXMAPSDIR)\" \
    + $(ASPELL_CFLAGS) \
    $(GTK_CFLAGS) \
    $(DEBUG_CFLAGS) \
    $(PIDGIN_CFLAGS) \
    --- /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 @@
    +[Switch Spell]
    +type=default
    +depends=pidgin gtkspell aspell
    +provides=switchspell
    +summary=Switch Spell Checker Language
    +description=%(summary)s
    +authors=Sadrul Habib Chowdhury
    +introduced=1.0beta7
    +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 @@
    {
    PidginWindow *win;
    GtkWidget *menu;
    - GList *item;
    + GList *item, *items;
    char *curlang;
    if (gtkconv == NULL)
    @@ -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));
    + g_list_foreach(items,
    (GFunc)gtk_check_menu_item_set_active, GINT_TO_POINTER(FALSE));
    + g_list_free(items);
    - 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);
    break;
    }
    }
    + g_list_free(items);
    g_free(curlang);
    }
    --- 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
    +EXTRA_DIST = \
    + plugins.cfg
    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 @@
    +[GNU Talk Filters]
    +type=default
    +depends=pidgin
    +provides=talkfilters
    +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
    +introduced=1.0beta1
    +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
    +EXTRA_DIST = \
    + plugins.cfg
    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 @@
    +[TimeLog]
    +type=default
    +depends=pidgin
    +provides=timelog
    +summary=allows the viewing of Pidgin logs within a specific time range
    +description=%(summary)s
    +authors=Jon Oberheide
    +introduced=2.2.0
    +
    --- 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
    +EXTRA_DIST = \
    + plugins.cfg
    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 @@
    +[XChat Chats]
    +type=default
    +depends=pidgin
    +provides=xchat-chats
    +summary=XChat-like chats with Pidgin
    +description=You can chat in Pidgin using XChat's indented view.
    +authors=Sadrul Habib Chowdhury
    +introduced=1.0beta1
    +
    --- 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 @@
    }
    }
    +#if 0
    static void
    workaround_for_hidden_convs(PidginConversation *gtkconv)
    {
    @@ -372,6 +373,7 @@
    return;
    purple_conversation_use_xtext(conv);
    }
    +#endif
    static gboolean
    plugin_load(PurplePlugin *plugin)
    @@ -406,8 +408,10 @@
    list = list->next;
    }
    +#if 0
    purple_signal_connect(pidgin_conversations_get_handle(), "conversation-displayed",
    plugin, G_CALLBACK(workaround_for_hidden_convs), NULL);
    +#endif
    return TRUE;
    }
    @@ -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);
    }
    static gboolean
    --- 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
    +ICONS = \
    + next.png \
    + pause.png \
    + play.png \
    + previous.png \
    + stop.png \
    + xmms.png
    -SUBDIRS = pixmaps
    +EXTRA_DIST = \
    + $(ICONS) \
    + plugins.cfg
    +
    +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 @@
    -EXTRA_DIST = \
    - next.png \
    - pause.png \
    - play.png \
    - previous.png \
    - stop.png \
    - xmms.png
    -
    -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 @@
    +[XMMS Remote Control]
    +type=default
    +depends=pidgin xmms
    +provides=xmmsremote
    +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.
    +authors=Gary Kramlich
    +introduced=1.0beta3
    +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