changeset 15940:2b8d4fabc103

merge of '479ec3bc42bb56e872fb1e8d5975ee5cc73f9cb8' and 'af97194f292b3a82f2a36fc3094f579a3dfc2841'
author Richard Laager <rlaager@wiktel.com>
date Mon, 26 Mar 2007 03:01:33 +0000
parents 4a7a13521709 (current diff) 5f9b7e2652f0 (diff)
children 5d9e85f2eba4
files doc/gaims_funniest_home_convos.txt gaim.apspec.in libpurple/gconf/gaim.schemas.in libpurple/plugin.c libpurple/plugins/gaim.pl m4macros/gaim.m4 pidgin/pixmaps/gaim.ico pidgin/pixmaps/gaim.png pidgin/pixmaps/gaim.svg pidgin/pixmaps/pidgin.png pidgin/plugins/crazychat/cc_gaim_plugin.c pidgin/plugins/gaimrc.c
diffstat 56 files changed, 2724 insertions(+), 2629 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -10,16 +10,16 @@
 		README.SVN \
 		README.dbus \
 		README.mingw \
+		config.h.mingw \
 		gaim.pc.in \
 		gaim-uninstalled.pc.in \
-		gaim.apspec.in \
 		gaim.service.in \
-		pidgin.spec.in \
-		pidgin.desktop.in \
 		intltool-extract.in \
 		intltool-merge.in \
 		intltool-update.in \
-		config.h.mingw \
+		pidgin.apspec.in \
+		pidgin.spec.in \
+		pidgin.desktop.in \
 		po/Makefile.mingw
 
 noinst_HEADERS = config.h
@@ -66,7 +66,7 @@
 distuninstallcheck_listfiles = \
 	find . -type f -print | grep -v perl | grep -v Purple.3pm
 
-DISTCLEANFILES= pidgin.desktop libpurple/gconf/gaim.schemas intltool-extract \
+DISTCLEANFILES= pidgin.desktop libpurple/gconf/purple.schemas intltool-extract \
 			intltool-merge intltool-update
 
 ACLOCAL_AMFLAGS = -I m4
--- a/configure.ac	Sat Mar 24 20:25:01 2007 +0000
+++ b/configure.ac	Mon Mar 26 03:01:33 2007 +0000
@@ -883,7 +883,7 @@
 fi
 AC_SUBST(CFLAGS)
 
-AC_PATH_PROG(gaimpath, gaim)
+AC_PATH_PROG(pidginpath, pidgin)
 
 dnl #######################################################################
 dnl # Check for D-Bus libraries
@@ -1895,12 +1895,12 @@
 
 AC_OUTPUT([Makefile
 		   Doxyfile
-		   gaim.apspec
 		   gaim.service
 		   doc/Makefile
 		   doc/pidgin.1
 		   doc/finch.1
 		   m4macros/Makefile
+		   pidgin.apspec
 		   pidgin/Makefile
 		   pidgin/pidgin.pc
 		   pidgin/pidgin-uninstalled.pc
@@ -2031,8 +2031,8 @@
 echo Assertions are fatal.......... : $enable_fatal_asserts
 echo
 eval eval echo Pidgin will be installed in $bindir.
-if test "x$gaimpath" != "x" ; then
-	echo Warning: You have an old copy of gaim at $gaimpath.
+if test "x$pidginpath" != "x" ; then
+	echo Warning: You have an old copy of Pidgin at $pidginpath.
 fi
 echo
 echo configure complete, now type \'make\'
--- a/doc/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/doc/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -12,7 +12,7 @@
 	conversation-signals.dox \
 	core-signals.dox \
 	dbus-server-signals.dox \
-	gaims_funniest_home_convos.txt \
+	funniest_home_convos.txt \
 	finch.1.in \
 	gtkaccount-signals.dox \
 	gtkblist-signals.dox \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/funniest_home_convos.txt	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,453 @@
+All IM names have been changed, so we don't get sued or nothing.  We get some 
+interesting convos....
+
+17:58:27 Luser: You do any GTK programming?
+17:58:43 Zilding: You mean, work on GTK itself?
+17:58:56 Luser: no program stuff using GTK
+17:59:37 Zilding: Hrm.  How do you know me, again? :)
+17:59:54 Luser: haha.......i saw your handle in the help part of gaim
+18:00:01 Zilding: yes.
+18:00:05 Luser: Didnt mean to freak you out
+18:00:16 Zilding: Iz okay, I figured that was the answer.
+18:00:26 Zilding: Is gaim written with Athena, Motif, or Xforms?
+18:00:29 Zilding: or GTK? :)
+18:00:39 Luser: GTK :)
+18:00:50 Zilding: I believe you have answered your own question. :)
+
+
+15:40:14 SomeGuy: hey you there?
+15:40:28 Zilding: nope
+15:40:33 SomeGuy: :-)
+15:40:43 SomeGuy: ah there was a little bug in my code.
+15:40:46 SomeGuy: did you notice it?
+15:41:28 Zilding:  uh....jim ain't here...well...not at the keyboard at
+least...this is alissa...
+15:41:38 Zilding: and uh...i am not wearing a bra
+15:41:46 SomeGuy: hi alissa
+15:41:46 Zilding: i have him tied up at the moment
+15:41:51 SomeGuy: ah
+15:41:52 Zilding: hello
+15:42:01 SomeGuy: I hope he is having fun.
+15:42:05 Zilding: yeah....we're kinda busy righ tnow
+15:42:09 Zilding: know..err
+15:42:22 Zilding: hehe....
+15:42:24 SomeGuy: should I let you two love bird go?
+15:43:09 Zilding: uh...well...yeah i  guess...he really isn't in any sort of
+position to help you right now...
+15:43:42 Zilding: THREE CHEERS FOR A WIRELESS KEYBOARD
+15:43:44 Zilding: WOOHOO
+15:43:54 SomeGuy: tell him I said... compared to the current situation what
+I was going to ask him is microscopic.
+15:44:00 SomeGuy: have fun guys.
+
+
+16:24:41 JailBait: Hello How are you?
+16:24:48 JailBait: stats?
+16:25:00 Zilding: pretty good, who is this?
+16:25:54 JailBait: I got your name from the hotmail webCourier...i'm Abi   13/f
+16:26:39 Zilding: Hotmail webcourier?
+16:26:51 JailBait: yeah
+16:26:59 Zilding: Interesting.
+16:27:17 Zilding: Well, I'm 18 years old, male, and I still haven't a clue how you got my IM :)
+16:28:28 JailBait: yes it was under the thing where people were asking Questions and you anwered them....someone ask if they could IM you and you put in this s/n
+16:28:59 Zilding: Hmm.. what kind of questions was I answering?
+16:29:38 JailBait: normal one's you were ansering   holdon
+16:29:54 JailBait: hey mom is home talk to you later
+16:29:56 JailBait: bye bye]
+16:30:02 Zilding: uh.. okay :)
+16:31:58 Zilding: hey can you send me the URL to where you got my screen name?  I'm just curious :)
+
+
+19:05:45 ZFriend: waddle waddle waddle
+19:15:34 ZFriend: *waddle waddle waddle*
+19:15:45 ZFriend: (pssttt)
+19:16:07 ZFriend: (the penguins are coming...)
+19:16:12 ZFriend: (they are coming to dance with you...)
+19:45:16 Zilding: Really?  Coming to dance with ME?
+19:45:22 ZFriend: yes!
+19:45:49 Zilding: Cool! Why?
+19:46:01 ZFriend: they like you
+19:47:12 Zilding: wooohooo!
+19:47:14 Zilding: How'd you find this out?
+19:47:22 ZFriend: ...........they told me.......
+19:47:58 Zilding: Do you have secret meetings with them?  And what kind of dancng will we be doing?
+19:48:17 ZFriend: i cannot release any more information..... they do the mambo
+19:49:13 Zilding: hehe sounds like fun.  When are they coming?
+19:49:24 ZFriend: after their tea time
+19:49:55 Zilding: Okay.  Are they bringing the herring or should I make a run?
+19:50:10 ZFriend: the herring is not provided 
+19:50:31 Zilding: Ok cool.  Well thank you, Miss Mander Oracle :)
+19:50:54 ZFriend: :)
+
+
+16:57:30 L0s3R: u help write tik?
+16:57:54 Zilding: No, I'm the author and maintainer of gaim, and I spell correctly.
+16:58:25 L0s3R: gud gohd eyem sohry ashole
+16:58:36 Zilding: Fuck off.
+16:59:44 L0s3R: eheh
+16:59:46 L0s3R: i bet you have awin98 box too dont you fag
+16:59:46 L0s3R: tik owns
+16:59:46 L0s3R: eheh
+16:59:46 L0s3R: actually all this aol shit sucks
+16:59:46 L0s3R: eheh
+17:00:36 Zilding: Pardon me.  I've written Linux device drivers, and I'm on the XFree development team.  What have you given to the community?
+17:01:27 L0s3R: Nothing you've heard about mr uppity. =)
+17:02:17 Zilding: I'm sure not.  So forgive me when I'm not in a very good mood and I have a little contempt for people who use phrases like 'owns', can't spell correctly, and feel the need to capitalize every other letter in their name.  Are you a hax0r too?
+17:02:26 L0s3R: you ego is taknig up alot of space btw
+17:02:29 L0s3R: taking
+17:02:29 L0s3R: if you will
+17:02:32 L0s3R: lol
+17:02:39 L0s3R: goddamn
+17:02:50 L0s3R: im sure you use office software too
+17:03:31 Zilding: Get outta my face, ya script kiddie, and go back to your quake game.
+
+13:35:35 WinFreak: could u help me out with gaim..i kno i'm retarded  ROFL
+13:35:54 WinFreak : after you unzip it what do u do?
+13:36:36 RobFlynn: You have gaim-0.9.5.tar.gz?
+13:36:40 WinFreak : yeah 
+13:36:43 RobFlynn: first do: tar xvzf gaim-0.9.5.tar.gz
+13:36:47 RobFlynn: then go into that directory and type:
+13:36:49 RobFlynn: ./configure                                                 
+13:36:52 RobFlynn: then type: make
+13:37:10 WinFreak : tar xvzf...is that on ur webpage?
+13:40:00 RobFlynn: Umm ...
+13:45:00 WinFreak : Where can I download tar xvzf gaim-0.9.5.tar.gz?  Is this for windows?
+
+
+*** This is what happens when Gaim Developers get bored.
+
+22:39:18 RobFlynn: Umm
+22:39:19 RobFlynn: My brain is dead.
+22:39:39 Flyn Orange: *hooks up electrodes to Rob's brain and connects the battery*
+22:39:47 Flyn Orange: kaZAP!
+22:39:53 RobFlynn: EEpepEPAPEPAEppaep BBrRERERFFFF EPEPEPPEPpeppepape
+22:39:58 RobFlynn: *waddle jerk waddle waddle twitch*
+22:40:14 Flyn Orange: Its alive! Its ALIIIIIIIIIIIVE!!
+22:40:25 Flyn Orange: *maniacal laugh*
+22:40:26 RobFlynn: *twitch twitch waddle convulse*
+22:40:41 Flyn Orange: *disconnects battery*
+22:40:52 RobFlynn: *** The sun slowly fades away as a giant penguin towers above the remains of a small, wooden table***
+22:41:13 Flyn Orange: ** storm clouds rise **
+22:41:25 Flyn Orange: *thunder crack*
+22:41:26 RobFlynn: *** With an eerie, almost mechanical qualling, the penguin marches its way over to its creator ***
+22:41:56 Flyn Orange: Well, hello lit...er...big fella. Would you like some HERRING?
+22:42:19 Flyn Orange: How about some FREE BEER?
+22:42:44 RobFlynn: *** A booming voice echos through the hallways ***
+22:42:47 RobFlynn: *** PIPE GREP MORE ***
+22:43:20 RobFlynn: *** With a low, rumbling sound the last syllable of the mysterious phrase shakes the very foundation of the decrepit laboratory***
+22:43:22 Flyn Orange: ** the mad scientists terminal suddenly crashes, and a vaguely familiar blue screen shows on it's display **
+22:44:08 Flyn Orange: Damn the fates! How can I face my peers now when I TOLD them proprietary was better!
+!
+22:45:19 RobFlynn: *** THE PENGUIN BALKS: CTRL-ALT-DELETE ***
+
+
+hungryguy: Were you the one who ate the 1lbs hamburger?
+Flyn Orange: hehe... Well, I tried to. I was feeling kinda sick. :)
+Flyn Orange: Flyn Orange: Would've finished that sucker off if I'd have been feeling better!
+hungryguy: I'm proud of you still.
+Flyn Orange: PsyAssasin: That's quite impressive.
+Flyn Orange: *grin*  Thanks!
+hungryguy: I'm motivated to have a 1lbs hamburger party here.
+hungryguy: That would be sweet.
+Flyn Orange: haha!  That would rock!
+Flyn Orange: Good idea.
+Flyn Orange: Think I might do that sometime too!
+Flyn Orange: There are some truly cool people out there.
+
+--- If you guys havent learned yet, Jer is a smartass :-) ---
+
+00:03:43 Flyn Orange: *shoots you with silly string*
+00:03:55 RobFlynn: HELP! I AM COVERED IN NEONG REEN STRING
+00:06:54 Flyn Orange: NEONG REEN, Taiwan (AP) -
+                      Despite the recent economical collapses suffered due to 
+                      massive geological activity over the last month, the very
+                      profitable gag-manufacturer of Silly String has 
+                      maintained production through the turmoil. Still 
+                      employing 324 workers and a management team of 15 
+                      Slinkies, there is no risk of a price hike in cans of
+                      Silly String over the next few months...
+
+--- heheh Jeramey is a jackass :-) ---
+
+14:44:28 Flyn Orange: You should see gimp try and swim. She goes in circles
+'cause she's only got three legs. ;)
+14:44:34 RobFlynn: *giggles*
+14:44:39 RobFlynn: Ive seen my cars swim before
+14:44:44 RobFlynn: They doggie paddle :)
+14:44:51 Flyn Orange: cats you mean? :)
+14:44:56 RobFlynn: Woops!
+14:44:57 RobFlynn: Yeah.
+14:44:59 RobFlynn: Cars sink.
+14:45:01 Flyn Orange: hehe
+14:45:07 Flyn Orange: Yeah. Cars suck at swimming.
+14:45:15 RobFlynn: heheh
+
+
+---
+Eric and I were a little weird this night hehe
+
+
+03:31:43 RobFlynn: "No Bite", she rebuked.
+03:31:46 RobFlynn: Rebuked is a fun word.
+03:31:51 RobFlynn: I don't know if I used it properly, but it is still fun.
+03:31:55 Eric Warmenhoven: i like idiosyncratic
+03:32:01 RobFlynn: I like sesquipedalian
+03:32:14 Eric Warmenhoven: variations on idiosyncracy are my favorite words.
+03:32:20 Eric Warmenhoven: i like them.
+03:32:22 RobFlynn: I like sesquipedalian because it is polysylabic by
+defination and practice.
+03:32:25 Eric Warmenhoven: that's one of my idiosyncracies.
+03:32:40 RobFlynn: Idiosyncracy is a sesquipedalian.
+03:32:48 Eric Warmenhoven: holy crap
+03:33:00 RobFlynn: Sesquipedalians such as idiosyncracy are often times
+considered ambiguous.  Why use a large word when a dimunitve one will suffice?
+
+
+--
+
+(14:54:25) SeanEgan: are you coding now?
+(14:55:33) RobFlynn: Nah I gotta go buy pants.
+(14:55:37) SeanEgan: haha
+(14:55:40) SeanEgan: that was so random
+
+---
+
+(13:51:10) wizardof___: can we have a memorable conversation?
+(13:51:19) RobFlynn: i think we just did
+
+---
+
+(22:39:02) KingAnt: I'll try to find someone with ichat to test it with (ie. get one of the guys I live with to install it)
+(22:48:12) Paco-Paco: KingAnt: I have iChat
+(22:48:34) KingAnt: Paco-Paco: Does it suck?
+(22:48:42) Paco-Paco: yes
+(22:48:47) Paco-Paco: it's hard to use
+(22:48:47) KingAnt: Cool
+
+---
+
+(22:33:31) CopyMe: ok, how do I copy a file and paste into another directory
+(22:33:47) Zilding: cp <filename> <other filename>
+(22:34:04) CopyMe: what does that do
+(22:34:06) CopyMe: copy?
+(22:36:05) Zilding: yeah
+(22:37:27) CopyMe: then how do you paste it?
+
+---
+
+(02:08:12) gobblegobble: whats a chicken head
+(02:08:24) RobFlynn: your mom
+
+---
+
+<KingAnt> I dislike the random capitalization utilized by fortunes
+<Paco-Paco> those aren't fortunes
+<Paco-Paco> those are yows
+<Paco-Paco> I don't know why lunix fortune gives back yows
+<KingAnt> Paco-Paco: I understand everything you just said
+<Paco-Paco> does it scare you?
+<KingAnt> Paco-Paco: You have no idea
+
+---
+
+(18:45:00) SuperNewbie entered the room.
+(18:51:07) SuperNewbie: I'm new and I dont understand how to get into a chat.
+(18:51:19) faceprint: you're in a chat now
+(18:51:30) SuperNewbie: Oh OK
+
+---
+
+23:39 <@LSchiere> try the grammer again
+23:40 <SeanEgan> LSchiere, you can try the spelling again, too ;)
+23:40 <@LSchiere> SeanEgan: you know by now that i'm incorigible
+
+---
+
+(20:53:30) idiot1: im havn problems with my sound in gaim can any1 help me
+(20:54:59) LSchiere2: have you read the faq?
+(21:03:35) idiot1: no and im not reading it
+(21:03:45) idiot1: cuz it wont help anyways
+(21:03:47) LSchiere2: then you will have no help
+(21:03:54) LSchiere2: because i wrote it and i know it would help
+(21:04:27) LSchiere2: since you already know everything though, you obviously don't need any help idiot1
+(21:05:38) idiot1: nope
+(21:05:42) idiot1: opps
+
+
+---
+
+(20:37:03) marv: nosnilmot: I can just try tweaking gtk_imhtml_get_markup_range
+(20:38:28) nosnilmot: marv: I know you can, because you know what's going on in there, but is there any point in me trying?...
+(20:38:57) marv: nosnilmot: I could explain it to you I guess. Sure why not.
+(20:39:44) nosnilmot: marv: I'd like to know (I think?), but now probably isn't the best time, I shouldn't have asked
+(20:40:11) marv: The buffer is composed to unescaped (no entities) text, with a certain unicode character representing images or smileys or widgets.
+(20:40:26) marv: nosnilmot: oh. well let me know when you feel like listening
+(20:41:10) nosnilmot: marv: don't worry, I will. I need to learn C first.
+(20:41:27) marv: um, you don't know C?
+(20:41:31) nosnilmot: no
+(20:41:44) marv: then what were those patches i applied from you earlier?
+(20:42:05) nosnilmot: you don't need to know C to write patches
+(20:42:12) marv: oh okay
+
+---
+
+-!- seanegan [~sean@...] has quit [Remote closed the connection]
+-!- seanegan [~sean@...] has joined #gaim
+<seanegan> Someone should fix that bug where if you click on the user list
+	in an IRC channel, it crashes.
+-!- LSchiere2 [~luke@...] has quit [Remote closed the connection]
+<seanegan> I guess that was "reproducing"
+
+---
+
+18:33:26 <NoName> hello there
+18:34:03 <NoName> I just wanted to share some bevavior that I think its kinda of
+                  unsafe when using GAIM with yahoo messenges accounts
+18:34:43 <NoName> Whenever you transfer files between users, no receiving
+                  confirmation is requested, the file gets transfered
+                  automatically
+18:37:32 <Paco-Paco> surely you have to accept file transfers
+18:37:57 <NoName> Paco-Paco, nope, Whenever people sends me files, I get no
+                  confirmation request
+18:38:30 <NoName> Paco-Paco, and the files gets right through my home directory
+18:39:00 <deryni> I find this a bit hard to believe since most people come in here
+                  asking for some way to auto-accept.
+18:39:48 <NoName> deryni, I just installed fc3 , fully updated it, no extra
+                  configuration was done and that's the default behavior
+18:40:06 <NoName> deryni, I searched the settings and there is no configuration
+                  on this issue
+18:40:29 <deryni> I know there's no configuration on it, that's what everyone keeps
+                  asking for.
+18:41:08 <NoName> deryni, sometimes I get pictures of naked girls in my computer
+                  and I guess that GAIM is the one responsible for that since it
+                  does not ask for file transfer confirmation
+
+---
+
+(16:35:01) noname2: hello gaim is new port ?
+(16:35:08) noname2: msn
+(16:35:17) LSchiere2: what in the world are you trying to ask
+
+---
+
+(00:22:45) user:         hi
+(00:22:47) user:         can you help me?
+(00:22:56) richielaager: I don't know.
+(00:23:02) user:         can i borrow a pencil?
+(00:24:13) richielaager: Only if you're willing to pay transportation costs
+                         to get you the pencil, plus $60/hour for the time it
+                         takes me to transport said pencil to you, plus a pencil
+                         rental fee of $1/day, plus a one time pencil sharpening
+                         service charge of $5.
+(00:24:37) user:         I have a 100$ in paypal, where do i send it to?
+(00:25:10) richielaager: I hear some guys in Nigeria are looking for account
+                         information?
+(00:25:32) user:         or can you put a pencil feature into gaim? to create a
+                         physical pencil out of a rubber reconstruction machine?
+(00:25:50) user:         those guys only sent wood- no lead :(
+(00:26:10) user:         they told me it was "invisible" lead.
+(00:28:27) richielaager: Interesting... They sent me plenty of visible lead,
+                         they said, it's just waiting for me at a holding company
+                         in Moscow or some place like that.
+(00:28:53) user:         Seems you've been had.
+(00:29:09) user:         The invisible lead works quite well.
+(00:29:28) user:         Anyways, I'm here to ask a question.
+(00:29:29) richielaager: Damn!
+(00:29:42) richielaager: Damn to that too. :)
+
+21:26 <An_Idiot> I was considering just making a remote control program
+21:26 <An_Idiot> where you type in a password, send it via gaim, and
+                 gaim becomes a text terminal
+      [time passes ...]
+21:38 <An_Idiot>  I'm terribly conservative when it comes to security
+
+19:47 <someusr> hey
+19:48 <someusr> how do i set aim to block all users except those on my
+                buddy list?
+19:48 <someusr> don't tell me i have to log in with the regular AIM :(
+19:48 <Paco-Paco> I wouldn't tell you that, because it's wrong
+19:48 <Paco-Paco> how about you look in privacy
+19:49 <someusr> where?
+19:49 <someusr> i can't find it
+19:49 <SimGuy> in Privacy
+19:49 <someusr> OH!
+19:49 <someusr> haha
+19:49 <someusr> thanks!
+
+14:12 <colorshape> Is it possible for me to see my friends webcam via
+                   msn in gaim?
+14:12 <Paco-Paco> no
+14:13 <colorshape> not voice either then i guess?
+14:13 <Paco-Paco> correct
+14:13 <colorshape> ok, then not much to do.
+14:13 <Err> there's always seppuku
+14:14 <Paco-Paco> so true
+14:14 <colorshape> ok, is that another client?
+14:14 <Err> something like that
+
+(17:44:15) elb: what's that one song that's always played at weddings that's not the processional or recessional
+(17:44:37) tehfox: bridal choral or something?
+(17:45:04) seanegan: elb: The Chicken Dance
+(17:45:12) elb: seanegan: oh that's the one
+(17:45:34) ***LSchiere boggles
+(17:45:56) elb: it's the one that goes
+(17:46:31) elb: dunnn dunnnn dunnnnn dunnnn dunnn DUUNN duun DUUUNNN, dun da-da-di da-da-di da-da-da-di-di-di dunn da-da-di dun-da-di-di-diii-di
+(17:49:13) seanegan: Pachelbel's canon?
+(17:49:18) elb: seanegan: YES
+(17:49:25) seanegan: hell yeah!
+(17:49:25) elb: awesome, thanks
+(17:49:28) elb: Kanon in D
+
+edited for brevity, and name changed.
+(13:51:31) l33t_h4x0r: Is there such thing as a gaim ip sniffer for linux?
+(13:51:40) LSchiere: no
+(13:51:46) l33t_h4x0r: You sure?
+(13:51:50) LSchiere: though if there were, I'd still say no
+(13:51:55) l33t_h4x0r: Why?
+(13:52:00) LSchiere: since there's no good reason to be looking for one
+(13:55:12) l33t_h4x0r: Is...this a sensitive subject?
+(13:55:29) seanegan: l33t_h4x0r: not as sensitive as someone's IP address, apparently.
+(13:55:31) Err: no, "needing" to know what someone's IP is without asking them is totally sane, rational, and socially normal
+(13:55:42) l33t_h4x0r: I want to use it for destruive purposes?
+(13:55:50) l33t_h4x0r: Morally wrong.
+(13:56:01) l33t_h4x0r: I'll admit, but a valid reason.
+(13:57:04) l33t_h4x0r: Asking someone would give away my position...
+(13:57:33) l33t_h4x0r: Arlight, nevermind.
+(13:57:36) l33t_h4x0r left the room ("Leaving").
+(13:58:58) LSchiere: *amused* that's the first time in a while that the requester has *agreed* that there is no legit reason to want the feature
+(13:59:19) Err: he was not the sharpest knife in the drawer
+
+14:57 <itchypants> [blah blah blah simple question]
+      [other traffic]
+14:57 <itchypants> [retransmit simple question]
+14:59 <seanegan> itchypants: you need to chill the hell out
+14:59 <itchypants> seanegan, ah okay thanks
+15:00 <seanegan> no problem
+
+(15:57:11) sadrul: the files (at least a couple) in the tar.bz2 are different
+(15:57:23) datallah: right.. that is the problem - the code in svn is fine
+(15:57:31) seanegan: oh, what the hell?
+(15:57:41) seanegan: don't tell me I make dist'ed the wrong tree
+(15:57:46) LSchiere: how does the code in svn differ except in gaim's
+funniest and the spec.in?
+(15:57:50) LSchiere: seanegan: sounds like it
+(15:57:53) datallah: you are such a screw up!
+(15:58:12) seanegan: I sure am
+(15:58:32) seanegan: Ugh!
+(15:58:37) datallah: you must have been distracted by um... plugins
+(15:58:45) seanegan: Don't I test these things?
+(15:58:51) LSchiere: you test things?
+(15:59:06) SimGuy: seanegan: by experience, I think we've determined you do
+not :)
+
+(07:52:07 PM) clueless21: are you one of the gaim makers?
+(07:52:14 PM) Nathan Walp: yes
+(07:52:24 PM) clueless21:  cool
+(07:52:37 PM) clueless21:  if your busy, i can leave you alone...
+(07:53:03 PM) Nathan Walp: if you have a question I can answer it
+(07:53:34 PM) clueless21:  umm... well i don't exactly know what gaim does and what it's for. i don't know if i should get it
+(07:53:46 PM) Nathan Walp: it is an IM client
+(07:53:57 PM) clueless21:  o. what's it do?
+(07:54:03 PM) clueless21:  what's an im client?
+(07:54:25 PM) Nathan Walp: it lets you chat with other people, like we are chatting now
+(07:54:45 PM) clueless21:  oooooooooo... thanks
--- a/doc/gaims_funniest_home_convos.txt	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,453 +0,0 @@
-All IM names have been changed, so we don't get sued or nothing.  We get some 
-interesting convos....
-
-17:58:27 Luser: You do any GTK programming?
-17:58:43 Zilding: You mean, work on GTK itself?
-17:58:56 Luser: no program stuff using GTK
-17:59:37 Zilding: Hrm.  How do you know me, again? :)
-17:59:54 Luser: haha.......i saw your handle in the help part of gaim
-18:00:01 Zilding: yes.
-18:00:05 Luser: Didnt mean to freak you out
-18:00:16 Zilding: Iz okay, I figured that was the answer.
-18:00:26 Zilding: Is gaim written with Athena, Motif, or Xforms?
-18:00:29 Zilding: or GTK? :)
-18:00:39 Luser: GTK :)
-18:00:50 Zilding: I believe you have answered your own question. :)
-
-
-15:40:14 SomeGuy: hey you there?
-15:40:28 Zilding: nope
-15:40:33 SomeGuy: :-)
-15:40:43 SomeGuy: ah there was a little bug in my code.
-15:40:46 SomeGuy: did you notice it?
-15:41:28 Zilding:  uh....jim ain't here...well...not at the keyboard at
-least...this is alissa...
-15:41:38 Zilding: and uh...i am not wearing a bra
-15:41:46 SomeGuy: hi alissa
-15:41:46 Zilding: i have him tied up at the moment
-15:41:51 SomeGuy: ah
-15:41:52 Zilding: hello
-15:42:01 SomeGuy: I hope he is having fun.
-15:42:05 Zilding: yeah....we're kinda busy righ tnow
-15:42:09 Zilding: know..err
-15:42:22 Zilding: hehe....
-15:42:24 SomeGuy: should I let you two love bird go?
-15:43:09 Zilding: uh...well...yeah i  guess...he really isn't in any sort of
-position to help you right now...
-15:43:42 Zilding: THREE CHEERS FOR A WIRELESS KEYBOARD
-15:43:44 Zilding: WOOHOO
-15:43:54 SomeGuy: tell him I said... compared to the current situation what
-I was going to ask him is microscopic.
-15:44:00 SomeGuy: have fun guys.
-
-
-16:24:41 JailBait: Hello How are you?
-16:24:48 JailBait: stats?
-16:25:00 Zilding: pretty good, who is this?
-16:25:54 JailBait: I got your name from the hotmail webCourier...i'm Abi   13/f
-16:26:39 Zilding: Hotmail webcourier?
-16:26:51 JailBait: yeah
-16:26:59 Zilding: Interesting.
-16:27:17 Zilding: Well, I'm 18 years old, male, and I still haven't a clue how you got my IM :)
-16:28:28 JailBait: yes it was under the thing where people were asking Questions and you anwered them....someone ask if they could IM you and you put in this s/n
-16:28:59 Zilding: Hmm.. what kind of questions was I answering?
-16:29:38 JailBait: normal one's you were ansering   holdon
-16:29:54 JailBait: hey mom is home talk to you later
-16:29:56 JailBait: bye bye]
-16:30:02 Zilding: uh.. okay :)
-16:31:58 Zilding: hey can you send me the URL to where you got my screen name?  I'm just curious :)
-
-
-19:05:45 ZFriend: waddle waddle waddle
-19:15:34 ZFriend: *waddle waddle waddle*
-19:15:45 ZFriend: (pssttt)
-19:16:07 ZFriend: (the penguins are coming...)
-19:16:12 ZFriend: (they are coming to dance with you...)
-19:45:16 Zilding: Really?  Coming to dance with ME?
-19:45:22 ZFriend: yes!
-19:45:49 Zilding: Cool! Why?
-19:46:01 ZFriend: they like you
-19:47:12 Zilding: wooohooo!
-19:47:14 Zilding: How'd you find this out?
-19:47:22 ZFriend: ...........they told me.......
-19:47:58 Zilding: Do you have secret meetings with them?  And what kind of dancng will we be doing?
-19:48:17 ZFriend: i cannot release any more information..... they do the mambo
-19:49:13 Zilding: hehe sounds like fun.  When are they coming?
-19:49:24 ZFriend: after their tea time
-19:49:55 Zilding: Okay.  Are they bringing the herring or should I make a run?
-19:50:10 ZFriend: the herring is not provided 
-19:50:31 Zilding: Ok cool.  Well thank you, Miss Mander Oracle :)
-19:50:54 ZFriend: :)
-
-
-16:57:30 L0s3R: u help write tik?
-16:57:54 Zilding: No, I'm the author and maintainer of gaim, and I spell correctly.
-16:58:25 L0s3R: gud gohd eyem sohry ashole
-16:58:36 Zilding: Fuck off.
-16:59:44 L0s3R: eheh
-16:59:46 L0s3R: i bet you have awin98 box too dont you fag
-16:59:46 L0s3R: tik owns
-16:59:46 L0s3R: eheh
-16:59:46 L0s3R: actually all this aol shit sucks
-16:59:46 L0s3R: eheh
-17:00:36 Zilding: Pardon me.  I've written Linux device drivers, and I'm on the XFree development team.  What have you given to the community?
-17:01:27 L0s3R: Nothing you've heard about mr uppity. =)
-17:02:17 Zilding: I'm sure not.  So forgive me when I'm not in a very good mood and I have a little contempt for people who use phrases like 'owns', can't spell correctly, and feel the need to capitalize every other letter in their name.  Are you a hax0r too?
-17:02:26 L0s3R: you ego is taknig up alot of space btw
-17:02:29 L0s3R: taking
-17:02:29 L0s3R: if you will
-17:02:32 L0s3R: lol
-17:02:39 L0s3R: goddamn
-17:02:50 L0s3R: im sure you use office software too
-17:03:31 Zilding: Get outta my face, ya script kiddie, and go back to your quake game.
-
-13:35:35 WinFreak: could u help me out with gaim..i kno i'm retarded  ROFL
-13:35:54 WinFreak : after you unzip it what do u do?
-13:36:36 RobFlynn: You have gaim-0.9.5.tar.gz?
-13:36:40 WinFreak : yeah 
-13:36:43 RobFlynn: first do: tar xvzf gaim-0.9.5.tar.gz
-13:36:47 RobFlynn: then go into that directory and type:
-13:36:49 RobFlynn: ./configure                                                 
-13:36:52 RobFlynn: then type: make
-13:37:10 WinFreak : tar xvzf...is that on ur webpage?
-13:40:00 RobFlynn: Umm ...
-13:45:00 WinFreak : Where can I download tar xvzf gaim-0.9.5.tar.gz?  Is this for windows?
-
-
-*** This is what happens when Gaim Developers get bored.
-
-22:39:18 RobFlynn: Umm
-22:39:19 RobFlynn: My brain is dead.
-22:39:39 Flyn Orange: *hooks up electrodes to Rob's brain and connects the battery*
-22:39:47 Flyn Orange: kaZAP!
-22:39:53 RobFlynn: EEpepEPAPEPAEppaep BBrRERERFFFF EPEPEPPEPpeppepape
-22:39:58 RobFlynn: *waddle jerk waddle waddle twitch*
-22:40:14 Flyn Orange: Its alive! Its ALIIIIIIIIIIIVE!!
-22:40:25 Flyn Orange: *maniacal laugh*
-22:40:26 RobFlynn: *twitch twitch waddle convulse*
-22:40:41 Flyn Orange: *disconnects battery*
-22:40:52 RobFlynn: *** The sun slowly fades away as a giant penguin towers above the remains of a small, wooden table***
-22:41:13 Flyn Orange: ** storm clouds rise **
-22:41:25 Flyn Orange: *thunder crack*
-22:41:26 RobFlynn: *** With an eerie, almost mechanical qualling, the penguin marches its way over to its creator ***
-22:41:56 Flyn Orange: Well, hello lit...er...big fella. Would you like some HERRING?
-22:42:19 Flyn Orange: How about some FREE BEER?
-22:42:44 RobFlynn: *** A booming voice echos through the hallways ***
-22:42:47 RobFlynn: *** PIPE GREP MORE ***
-22:43:20 RobFlynn: *** With a low, rumbling sound the last syllable of the mysterious phrase shakes the very foundation of the decrepit laboratory***
-22:43:22 Flyn Orange: ** the mad scientists terminal suddenly crashes, and a vaguely familiar blue screen shows on it's display **
-22:44:08 Flyn Orange: Damn the fates! How can I face my peers now when I TOLD them proprietary was better!
-!
-22:45:19 RobFlynn: *** THE PENGUIN BALKS: CTRL-ALT-DELETE ***
-
-
-hungryguy: Were you the one who ate the 1lbs hamburger?
-Flyn Orange: hehe... Well, I tried to. I was feeling kinda sick. :)
-Flyn Orange: Flyn Orange: Would've finished that sucker off if I'd have been feeling better!
-hungryguy: I'm proud of you still.
-Flyn Orange: PsyAssasin: That's quite impressive.
-Flyn Orange: *grin*  Thanks!
-hungryguy: I'm motivated to have a 1lbs hamburger party here.
-hungryguy: That would be sweet.
-Flyn Orange: haha!  That would rock!
-Flyn Orange: Good idea.
-Flyn Orange: Think I might do that sometime too!
-Flyn Orange: There are some truly cool people out there.
-
---- If you guys havent learned yet, Jer is a smartass :-) ---
-
-00:03:43 Flyn Orange: *shoots you with silly string*
-00:03:55 RobFlynn: HELP! I AM COVERED IN NEONG REEN STRING
-00:06:54 Flyn Orange: NEONG REEN, Taiwan (AP) -
-                      Despite the recent economical collapses suffered due to 
-                      massive geological activity over the last month, the very
-                      profitable gag-manufacturer of Silly String has 
-                      maintained production through the turmoil. Still 
-                      employing 324 workers and a management team of 15 
-                      Slinkies, there is no risk of a price hike in cans of
-                      Silly String over the next few months...
-
---- heheh Jeramey is a jackass :-) ---
-
-14:44:28 Flyn Orange: You should see gimp try and swim. She goes in circles
-'cause she's only got three legs. ;)
-14:44:34 RobFlynn: *giggles*
-14:44:39 RobFlynn: Ive seen my cars swim before
-14:44:44 RobFlynn: They doggie paddle :)
-14:44:51 Flyn Orange: cats you mean? :)
-14:44:56 RobFlynn: Woops!
-14:44:57 RobFlynn: Yeah.
-14:44:59 RobFlynn: Cars sink.
-14:45:01 Flyn Orange: hehe
-14:45:07 Flyn Orange: Yeah. Cars suck at swimming.
-14:45:15 RobFlynn: heheh
-
-
----
-Eric and I were a little weird this night hehe
-
-
-03:31:43 RobFlynn: "No Bite", she rebuked.
-03:31:46 RobFlynn: Rebuked is a fun word.
-03:31:51 RobFlynn: I don't know if I used it properly, but it is still fun.
-03:31:55 Eric Warmenhoven: i like idiosyncratic
-03:32:01 RobFlynn: I like sesquipedalian
-03:32:14 Eric Warmenhoven: variations on idiosyncracy are my favorite words.
-03:32:20 Eric Warmenhoven: i like them.
-03:32:22 RobFlynn: I like sesquipedalian because it is polysylabic by
-defination and practice.
-03:32:25 Eric Warmenhoven: that's one of my idiosyncracies.
-03:32:40 RobFlynn: Idiosyncracy is a sesquipedalian.
-03:32:48 Eric Warmenhoven: holy crap
-03:33:00 RobFlynn: Sesquipedalians such as idiosyncracy are often times
-considered ambiguous.  Why use a large word when a dimunitve one will suffice?
-
-
---
-
-(14:54:25) SeanEgan: are you coding now?
-(14:55:33) RobFlynn: Nah I gotta go buy pants.
-(14:55:37) SeanEgan: haha
-(14:55:40) SeanEgan: that was so random
-
----
-
-(13:51:10) wizardof___: can we have a memorable conversation?
-(13:51:19) RobFlynn: i think we just did
-
----
-
-(22:39:02) KingAnt: I'll try to find someone with ichat to test it with (ie. get one of the guys I live with to install it)
-(22:48:12) Paco-Paco: KingAnt: I have iChat
-(22:48:34) KingAnt: Paco-Paco: Does it suck?
-(22:48:42) Paco-Paco: yes
-(22:48:47) Paco-Paco: it's hard to use
-(22:48:47) KingAnt: Cool
-
----
-
-(22:33:31) CopyMe: ok, how do I copy a file and paste into another directory
-(22:33:47) Zilding: cp <filename> <other filename>
-(22:34:04) CopyMe: what does that do
-(22:34:06) CopyMe: copy?
-(22:36:05) Zilding: yeah
-(22:37:27) CopyMe: then how do you paste it?
-
----
-
-(02:08:12) gobblegobble: whats a chicken head
-(02:08:24) RobFlynn: your mom
-
----
-
-<KingAnt> I dislike the random capitalization utilized by fortunes
-<Paco-Paco> those aren't fortunes
-<Paco-Paco> those are yows
-<Paco-Paco> I don't know why lunix fortune gives back yows
-<KingAnt> Paco-Paco: I understand everything you just said
-<Paco-Paco> does it scare you?
-<KingAnt> Paco-Paco: You have no idea
-
----
-
-(18:45:00) SuperNewbie entered the room.
-(18:51:07) SuperNewbie: I'm new and I dont understand how to get into a chat.
-(18:51:19) faceprint: you're in a chat now
-(18:51:30) SuperNewbie: Oh OK
-
----
-
-23:39 <@LSchiere> try the grammer again
-23:40 <SeanEgan> LSchiere, you can try the spelling again, too ;)
-23:40 <@LSchiere> SeanEgan: you know by now that i'm incorigible
-
----
-
-(20:53:30) idiot1: im havn problems with my sound in gaim can any1 help me
-(20:54:59) LSchiere2: have you read the faq?
-(21:03:35) idiot1: no and im not reading it
-(21:03:45) idiot1: cuz it wont help anyways
-(21:03:47) LSchiere2: then you will have no help
-(21:03:54) LSchiere2: because i wrote it and i know it would help
-(21:04:27) LSchiere2: since you already know everything though, you obviously don't need any help idiot1
-(21:05:38) idiot1: nope
-(21:05:42) idiot1: opps
-
-
----
-
-(20:37:03) marv: nosnilmot: I can just try tweaking gtk_imhtml_get_markup_range
-(20:38:28) nosnilmot: marv: I know you can, because you know what's going on in there, but is there any point in me trying?...
-(20:38:57) marv: nosnilmot: I could explain it to you I guess. Sure why not.
-(20:39:44) nosnilmot: marv: I'd like to know (I think?), but now probably isn't the best time, I shouldn't have asked
-(20:40:11) marv: The buffer is composed to unescaped (no entities) text, with a certain unicode character representing images or smileys or widgets.
-(20:40:26) marv: nosnilmot: oh. well let me know when you feel like listening
-(20:41:10) nosnilmot: marv: don't worry, I will. I need to learn C first.
-(20:41:27) marv: um, you don't know C?
-(20:41:31) nosnilmot: no
-(20:41:44) marv: then what were those patches i applied from you earlier?
-(20:42:05) nosnilmot: you don't need to know C to write patches
-(20:42:12) marv: oh okay
-
----
-
--!- seanegan [~sean@...] has quit [Remote closed the connection]
--!- seanegan [~sean@...] has joined #gaim
-<seanegan> Someone should fix that bug where if you click on the user list
-	in an IRC channel, it crashes.
--!- LSchiere2 [~luke@...] has quit [Remote closed the connection]
-<seanegan> I guess that was "reproducing"
-
----
-
-18:33:26 <NoName> hello there
-18:34:03 <NoName> I just wanted to share some bevavior that I think its kinda of
-                  unsafe when using GAIM with yahoo messenges accounts
-18:34:43 <NoName> Whenever you transfer files between users, no receiving
-                  confirmation is requested, the file gets transfered
-                  automatically
-18:37:32 <Paco-Paco> surely you have to accept file transfers
-18:37:57 <NoName> Paco-Paco, nope, Whenever people sends me files, I get no
-                  confirmation request
-18:38:30 <NoName> Paco-Paco, and the files gets right through my home directory
-18:39:00 <deryni> I find this a bit hard to believe since most people come in here
-                  asking for some way to auto-accept.
-18:39:48 <NoName> deryni, I just installed fc3 , fully updated it, no extra
-                  configuration was done and that's the default behavior
-18:40:06 <NoName> deryni, I searched the settings and there is no configuration
-                  on this issue
-18:40:29 <deryni> I know there's no configuration on it, that's what everyone keeps
-                  asking for.
-18:41:08 <NoName> deryni, sometimes I get pictures of naked girls in my computer
-                  and I guess that GAIM is the one responsible for that since it
-                  does not ask for file transfer confirmation
-
----
-
-(16:35:01) noname2: hello gaim is new port ?
-(16:35:08) noname2: msn
-(16:35:17) LSchiere2: what in the world are you trying to ask
-
----
-
-(00:22:45) user:         hi
-(00:22:47) user:         can you help me?
-(00:22:56) richielaager: I don't know.
-(00:23:02) user:         can i borrow a pencil?
-(00:24:13) richielaager: Only if you're willing to pay transportation costs
-                         to get you the pencil, plus $60/hour for the time it
-                         takes me to transport said pencil to you, plus a pencil
-                         rental fee of $1/day, plus a one time pencil sharpening
-                         service charge of $5.
-(00:24:37) user:         I have a 100$ in paypal, where do i send it to?
-(00:25:10) richielaager: I hear some guys in Nigeria are looking for account
-                         information?
-(00:25:32) user:         or can you put a pencil feature into gaim? to create a
-                         physical pencil out of a rubber reconstruction machine?
-(00:25:50) user:         those guys only sent wood- no lead :(
-(00:26:10) user:         they told me it was "invisible" lead.
-(00:28:27) richielaager: Interesting... They sent me plenty of visible lead,
-                         they said, it's just waiting for me at a holding company
-                         in Moscow or some place like that.
-(00:28:53) user:         Seems you've been had.
-(00:29:09) user:         The invisible lead works quite well.
-(00:29:28) user:         Anyways, I'm here to ask a question.
-(00:29:29) richielaager: Damn!
-(00:29:42) richielaager: Damn to that too. :)
-
-21:26 <An_Idiot> I was considering just making a remote control program
-21:26 <An_Idiot> where you type in a password, send it via gaim, and
-                 gaim becomes a text terminal
-      [time passes ...]
-21:38 <An_Idiot>  I'm terribly conservative when it comes to security
-
-19:47 <someusr> hey
-19:48 <someusr> how do i set aim to block all users except those on my
-                buddy list?
-19:48 <someusr> don't tell me i have to log in with the regular AIM :(
-19:48 <Paco-Paco> I wouldn't tell you that, because it's wrong
-19:48 <Paco-Paco> how about you look in privacy
-19:49 <someusr> where?
-19:49 <someusr> i can't find it
-19:49 <SimGuy> in Privacy
-19:49 <someusr> OH!
-19:49 <someusr> haha
-19:49 <someusr> thanks!
-
-14:12 <colorshape> Is it possible for me to see my friends webcam via
-                   msn in gaim?
-14:12 <Paco-Paco> no
-14:13 <colorshape> not voice either then i guess?
-14:13 <Paco-Paco> correct
-14:13 <colorshape> ok, then not much to do.
-14:13 <Err> there's always seppuku
-14:14 <Paco-Paco> so true
-14:14 <colorshape> ok, is that another client?
-14:14 <Err> something like that
-
-(17:44:15) elb: what's that one song that's always played at weddings that's not the processional or recessional
-(17:44:37) tehfox: bridal choral or something?
-(17:45:04) seanegan: elb: The Chicken Dance
-(17:45:12) elb: seanegan: oh that's the one
-(17:45:34) ***LSchiere boggles
-(17:45:56) elb: it's the one that goes
-(17:46:31) elb: dunnn dunnnn dunnnnn dunnnn dunnn DUUNN duun DUUUNNN, dun da-da-di da-da-di da-da-da-di-di-di dunn da-da-di dun-da-di-di-diii-di
-(17:49:13) seanegan: Pachelbel's canon?
-(17:49:18) elb: seanegan: YES
-(17:49:25) seanegan: hell yeah!
-(17:49:25) elb: awesome, thanks
-(17:49:28) elb: Kanon in D
-
-edited for brevity, and name changed.
-(13:51:31) l33t_h4x0r: Is there such thing as a gaim ip sniffer for linux?
-(13:51:40) LSchiere: no
-(13:51:46) l33t_h4x0r: You sure?
-(13:51:50) LSchiere: though if there were, I'd still say no
-(13:51:55) l33t_h4x0r: Why?
-(13:52:00) LSchiere: since there's no good reason to be looking for one
-(13:55:12) l33t_h4x0r: Is...this a sensitive subject?
-(13:55:29) seanegan: l33t_h4x0r: not as sensitive as someone's IP address, apparently.
-(13:55:31) Err: no, "needing" to know what someone's IP is without asking them is totally sane, rational, and socially normal
-(13:55:42) l33t_h4x0r: I want to use it for destruive purposes?
-(13:55:50) l33t_h4x0r: Morally wrong.
-(13:56:01) l33t_h4x0r: I'll admit, but a valid reason.
-(13:57:04) l33t_h4x0r: Asking someone would give away my position...
-(13:57:33) l33t_h4x0r: Arlight, nevermind.
-(13:57:36) l33t_h4x0r left the room ("Leaving").
-(13:58:58) LSchiere: *amused* that's the first time in a while that the requester has *agreed* that there is no legit reason to want the feature
-(13:59:19) Err: he was not the sharpest knife in the drawer
-
-14:57 <itchypants> [blah blah blah simple question]
-      [other traffic]
-14:57 <itchypants> [retransmit simple question]
-14:59 <seanegan> itchypants: you need to chill the hell out
-14:59 <itchypants> seanegan, ah okay thanks
-15:00 <seanegan> no problem
-
-(15:57:11) sadrul: the files (at least a couple) in the tar.bz2 are different
-(15:57:23) datallah: right.. that is the problem - the code in svn is fine
-(15:57:31) seanegan: oh, what the hell?
-(15:57:41) seanegan: don't tell me I make dist'ed the wrong tree
-(15:57:46) LSchiere: how does the code in svn differ except in gaim's
-funniest and the spec.in?
-(15:57:50) LSchiere: seanegan: sounds like it
-(15:57:53) datallah: you are such a screw up!
-(15:58:12) seanegan: I sure am
-(15:58:32) seanegan: Ugh!
-(15:58:37) datallah: you must have been distracted by um... plugins
-(15:58:45) seanegan: Don't I test these things?
-(15:58:51) LSchiere: you test things?
-(15:59:06) SimGuy: seanegan: by experience, I think we've determined you do
-not :)
-
-(07:52:07 PM) clueless21: are you one of the gaim makers?
-(07:52:14 PM) Nathan Walp: yes
-(07:52:24 PM) clueless21:  cool
-(07:52:37 PM) clueless21:  if your busy, i can leave you alone...
-(07:53:03 PM) Nathan Walp: if you have a question I can answer it
-(07:53:34 PM) clueless21:  umm... well i don't exactly know what gaim does and what it's for. i don't know if i should get it
-(07:53:46 PM) Nathan Walp: it is an IM client
-(07:53:57 PM) clueless21:  o. what's it do?
-(07:54:03 PM) clueless21:  what's an im client?
-(07:54:25 PM) Nathan Walp: it lets you chat with other people, like we are chatting now
-(07:54:45 PM) clueless21:  oooooooooo... thanks
--- a/finch/libgnt/gntfilesel.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/finch/libgnt/gntfilesel.c	Mon Mar 26 03:01:33 2007 +0000
@@ -28,6 +28,10 @@
 {
 	GntFileSel *sel = GNT_FILE_SEL(widget);
 	g_free(sel->current);
+	if (sel->tags) {
+		g_list_foreach(sel->tags, (GFunc)g_free, NULL);
+		g_list_free(sel->tags);
+	}
 }
 
 static char *
@@ -73,6 +77,15 @@
 }
 
 static gboolean
+is_tagged(GntFileSel *sel, const char *f)
+{
+	char *ret = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", f);
+	gboolean find = g_list_find_custom(sel->tags, ret, (GCompareFunc)g_utf8_collate) != NULL;
+	g_free(ret);
+	return find;
+}
+
+static gboolean
 location_changed(GntFileSel *sel, GError **err)
 {
 	GDir *dir;
@@ -109,15 +122,19 @@
 		if (stat(fp, &st)) {
 			g_printerr("Error stating location %s\n", fp);
 		} else {
-			if (S_ISDIR(st.st_mode))
+			if (S_ISDIR(st.st_mode)) {
 				gnt_tree_add_row_after(GNT_TREE(sel->dirs), g_strdup(str),
 						gnt_tree_create_row(GNT_TREE(sel->dirs), str), NULL, NULL);
-			else if (!sel->dirsonly) {
+				if (sel->multiselect && sel->dirsonly && is_tagged(sel, str))
+					gnt_tree_set_row_flags(GNT_TREE(sel->dirs), (gpointer)str, GNT_TEXT_FLAG_BOLD);
+			} else if (!sel->dirsonly) {
 				char size[128];
 				snprintf(size, sizeof(size), "%ld", (long)st.st_size);
 
 				gnt_tree_add_row_after(GNT_TREE(sel->files), g_strdup(str),
 						gnt_tree_create_row(GNT_TREE(sel->files), str, size, ""), NULL, NULL);
+				if (sel->multiselect && is_tagged(sel, str))
+					gnt_tree_set_row_flags(GNT_TREE(sel->files), (gpointer)str, GNT_TEXT_FLAG_BOLD);
 			}
 		}
 		g_free(fp);
@@ -131,7 +148,6 @@
 dir_key_pressed(GntTree *tree, const char *key, GntFileSel *sel)
 {
 	if (strcmp(key, "\r") == 0) {
-		/* XXX: if we are moving up the tree, make sure the current node is selected after the redraw */
 		char *str = g_strdup(gnt_tree_get_selection_data(tree));
 		char *path = g_build_filename(sel->current, str, NULL);
 		char *dir = g_path_get_basename(sel->current);
@@ -225,7 +241,7 @@
 
 	vbox = gnt_vbox_new(FALSE);
 	gnt_box_set_pad(GNT_BOX(vbox), 0);
-	gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_LEFT);
+	gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_MID);
 
 	/* The dir. and files list */
 	hbox = gnt_hbox_new(FALSE);
@@ -253,9 +269,64 @@
 	update_location(sel);
 }
 
+static gboolean
+toggle_tag_selection(GntBindable *bind, GList *null)
+{
+	GntFileSel *sel = GNT_FILE_SEL(bind);
+	char *str;
+	GList *find;
+	char *file;
+	GntWidget *tree;
+
+	if (!sel->multiselect)
+		return FALSE;
+	tree = sel->dirsonly ? sel->dirs : sel->files;
+	if (!gnt_widget_has_focus(tree))
+		return FALSE;
+
+	file = gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files));
+
+	str = gnt_file_sel_get_selected_file(sel);
+	if ((find = g_list_find_custom(sel->tags, str, (GCompareFunc)g_utf8_collate)) != NULL) {
+		g_free(find->data);
+		sel->tags = g_list_delete_link(sel->tags, find);
+		gnt_tree_set_row_flags(GNT_TREE(tree), file, GNT_TEXT_FLAG_NORMAL);
+		g_free(str);
+	} else {
+		sel->tags = g_list_prepend(sel->tags, str);
+		gnt_tree_set_row_flags(GNT_TREE(tree), file, GNT_TEXT_FLAG_BOLD);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+clear_tags(GntBindable *bind, GList *null)
+{
+	GntFileSel *sel = GNT_FILE_SEL(bind);
+	GntWidget *tree;
+	GList *iter;
+
+	if (!sel->multiselect)
+		return FALSE;
+	tree = sel->dirsonly ? sel->dirs : sel->files;
+	if (!gnt_widget_has_focus(tree))
+		return FALSE;
+
+	g_list_foreach(sel->tags, (GFunc)g_free, NULL);
+	g_list_free(sel->tags);
+	sel->tags = NULL;
+
+	for (iter = GNT_TREE(tree)->list; iter; iter = iter->next)
+		gnt_tree_set_row_flags(GNT_TREE(tree), iter->data, GNT_TEXT_FLAG_NORMAL);
+
+	return TRUE;
+}
+
 static void
 gnt_file_sel_class_init(GntFileSelClass *klass)
 {
+	GntBindableClass *bindable = GNT_BINDABLE_CLASS(klass);
 	GntWidgetClass *kl = GNT_WIDGET_CLASS(klass);
 	parent_class = GNT_WINDOW_CLASS(klass);
 	kl->destroy = gnt_file_sel_destroy;
@@ -270,6 +341,9 @@
 					 NULL, NULL,
 					 gnt_closure_marshal_VOID__STRING_STRING,
 					 G_TYPE_NONE, 0);
+
+	gnt_bindable_class_register_action(bindable, "toggle-tag", toggle_tag_selection, "t", NULL);
+	gnt_bindable_class_register_action(bindable, "clear-tags", clear_tags, "c", NULL);
 	gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass));
 
 	GNTDEBUG;
@@ -312,7 +386,7 @@
 	return type;
 }
 
-GntWidget *gnt_file_sel_new()
+GntWidget *gnt_file_sel_new(void)
 {
 	GntWidget *widget = g_object_new(GNT_TYPE_FILE_SEL, NULL);
 	GntFileSel *sel = GNT_FILE_SEL(widget);
@@ -375,3 +449,46 @@
 	return sel->dirsonly;
 }
 
+char *gnt_file_sel_get_selected_file(GntFileSel *sel)
+{
+	char *ret;
+	const char *tmp;
+	tmp = (const char*)gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files));
+	ret = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", tmp ? tmp : "");
+	return ret;
+}
+
+void gnt_file_sel_set_must_exist(GntFileSel *sel, gboolean must)
+{
+	/*XXX: What do I do with this? */
+	sel->must_exist = must;
+}
+
+gboolean gnt_file_sel_get_must_exist(GntFileSel *sel)
+{
+	return sel->must_exist;
+}
+
+void gnt_file_sel_set_multi_select(GntFileSel *sel, gboolean set)
+{
+	sel->multiselect = set;
+}
+
+GList *gnt_file_sel_get_selected_multi_files(GntFileSel *sel)
+{
+	GList *list = NULL, *iter;
+	char *str = gnt_file_sel_get_selected_file(sel);
+
+	for (iter = sel->tags; iter; iter = iter->next) {
+		list = g_list_prepend(list, g_strdup(iter->data));
+		if (g_utf8_collate(str, iter->data)) {
+			g_free(str);
+			str = NULL;
+		}
+	}
+	if (str)
+		list = g_list_prepend(list, str);
+	list = g_list_reverse(list);
+	return list;
+}
+
--- a/finch/libgnt/gntfilesel.h	Sat Mar 24 20:25:01 2007 +0000
+++ b/finch/libgnt/gntfilesel.h	Mon Mar 26 03:01:33 2007 +0000
@@ -17,11 +17,11 @@
 #define GNT_FILE_SEL_SET_FLAGS(obj, flags)		(GNT_FILE_SEL_FLAGS(obj) |= flags)
 #define GNT_FILE_SEL_UNSET_FLAGS(obj, flags)	(GNT_FILE_SEL_FLAGS(obj) &= ~(flags))
 
-typedef struct _GnFileSel			GntFileSel;
-typedef struct _GnFileSelPriv		GntFileSelPriv;
-typedef struct _GnFileSelClass		GntFileSelClass;
+typedef struct _GntFileSel			GntFileSel;
+typedef struct _GntFileSelPriv		GntFileSelPriv;
+typedef struct _GntFileSelClass		GntFileSelClass;
 
-struct _GnFileSel
+struct _GntFileSel
 {
 	GntWindow parent;
 
@@ -36,9 +36,11 @@
 	/* XXX: someone should make these useful */
 	gboolean must_exist; /* Make sure the selected file (the name entered in 'location') exists */
 	gboolean dirsonly;   /* Show only directories */
+    gboolean multiselect;
+    GList *tags;         /* List of tagged files when multiselect is set */
 };
 
-struct _GnFileSelClass
+struct _GntFileSelClass
 {
 	GntWindowClass parent;
 
@@ -53,16 +55,24 @@
 
 GType gnt_file_sel_get_gtype(void);
 
-GntWidget *gnt_file_sel_new();
+GntWidget *gnt_file_sel_new(void);
 
 gboolean gnt_file_sel_set_current_location(GntFileSel *sel, const char *path);
 
-const char *gnt_file_sel_get_current_location(GntFileSel *sel);
-
 void gnt_file_sel_set_dirs_only(GntFileSel *sel, gboolean dirs);
 
 gboolean gnt_file_sel_get_dirs_only(GntFileSel *sel);
 
+void gnt_file_sel_set_must_exist(GntFileSel *sel, gboolean must);
+
+gboolean gnt_file_sel_get_must_exist(GntFileSel *sel);
+
+char *gnt_file_sel_get_selected_file(GntFileSel *sel);  /* The returned value should be free'd */
+
+GList *gnt_file_sel_get_selected_multi_files(GntFileSel *sel);
+
+void gnt_file_sel_set_multi_select(GntFileSel *sel, gboolean set);
+
 G_END_DECLS
 
 #endif /* GNT_FILE_SEL_H */
--- a/finch/plugins/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/finch/plugins/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -1,3 +1,4 @@
+gntclipboard_la_LDFLAGS = -module -avoid-version
 gntgf_la_LDFLAGS      = -module -avoid-version
 gnthistory_la_LDFLAGS = -module -avoid-version
 gntlastlog_la_LDFLAGS    = -module -avoid-version
@@ -5,18 +6,21 @@
 if PLUGINS
 
 plugin_LTLIBRARIES = \
+	gntclipboard.la \
 	gntgf.la \
 	gnthistory.la \
 	gntlastlog.la
 
 plugindir = $(libdir)/finch
 
+gntclipboard_la_SOURCES = gntclipboard.c
 gntgf_la_SOURCES      = gntgf.c
 gnthistory_la_SOURCES = gnthistory.c
 gntlastlog_la_SOURCES = lastlog.c
 
 gntgf_la_CFLAGS = $(X11_CFLAGS)
 
+gntclipboard_la_LIBADD = $(GLIB_LIBS)
 gntgf_la_LIBADD       = $(GLIB_LIBS) $(X11_LIBS) $(top_builddir)/finch/libgnt/libgnt.la
 gnthistory_la_LIBADD  = $(GLIB_LIBS)
 gntlastlog_la_LIBADD  = $(GLIB_LIBS)
--- a/finch/plugins/gntclipboard.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/finch/plugins/gntclipboard.c	Mon Mar 26 03:01:33 2007 +0000
@@ -110,10 +110,12 @@
 static gboolean
 plugin_load(PurplePlugin *plugin)
 {
+#ifdef HAVE_X11
 	if (!XOpenDisplay(NULL)) {
 		purple_debug_warning("gntclipboard", "Couldn't find X display\n");
 		return FALSE;
 	}
+#endif
 	if (!getenv("WINDOWID")) {
 		purple_debug_warning("gntclipboard", "Couldn't find window\n");
 		return FALSE;
--- a/gaim.apspec.in	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-# -*-shell-script-*-
-
-[Meta]
-RootName: @gaim.sourceforge.net/gaim:$SOFTWAREVERSION
-DisplayName: Gaim Internet Messenger
-ShortName: gaim
-Maintainer: The Gaim Developers
-URL: http://gaim.sourceforge.net/
-Packager: Tim Ringenbach <marv_sf@users.sourceforge.net>
-Summary: A GTK+ based multiprotocol instant messaging client
-SoftwareVersion: @VERSION@
-InterfaceVersion: 2.0
-PackageVersion: 1
-
-[Description]
-Gaim allows you to talk to anyone using a variety of messaging protocols,
-including AIM (Oscar and TOC), ICQ, IRC, Yahoo!, MSN Messenger, Jabber,
-Gadu-Gadu, and Zephyr. These protocols are implemented using a
-modular, easy to use design. To use a protocol, just add an account using the
-account editor.
-
-Gaim supports many common features of other clients, as well as many unique
-features, such as perl scripting, TCL scripting and C plugins.
-
-Gaim is NOT affiliated with or endorsed by America Online, Inc., Microsoft
-Corporation, Yahoo! Inc., or ICQ Inc.
-
-[BuildPrepare]
-APBUILD_STATIC="Xss startup-notification-1" prepareBuild --enable-nss --enable-gnutls --enable-binreloc --disable-perl --disable-tcl --disable-gtktest --disable-glibtest --disable-vv  --disable-fortify
-#APBUILD_STATIC="Xss startup-notification-1" prepareBuild --enable-nss --enable-gnutls --enable-binreloc --disable-perl --disable-tcl --disable-vv
-
-
-[BuildUnprepare]
-unprepareBuild
-
-[Imports]
-rm -rf include
-rm -rf lib/pkgconfig
-find -name '*.la' | xargs rm
-echo '*' | import
-
-[Prepare]
-# Dependency checking
-require @gtk.org/gtk 2.2
-require @68k.org/libaudiofile 0.0
-require @xiph.org/libao 2.0
-require @gtkspell.sourceforge.net/gtkspell 0.0
-require @gnutls.org/gnutls 11.0 || { require @mozilla.org/nspr 4 && require @mozilla.org/nss 3; }
-
-[Install]
-# Put your installation script here
-installExe ./bin/*
-installLib ./lib/libgaim-remote.so.0.0.0
-# do the plugins
-copyFiles ./lib/gaim "$PREFIX/lib"
-installMan 1 ./man/man1/gaim.1
-installDesktop "Networking/Instant Messaging" ./share/applications/gaim.desktop
-installLocale ./share/locale
-copyFiles ./share/pixmaps "$PREFIX/share"
-copyFiles ./share/sounds "$PREFIX/share"
-installIcon ./share/pixmaps/gaim.png
-# install and fix the .pc file
-# move this to the -devel package when I make one
-# copyFile ./lib/pkgconfig/gaim.pc "$PREFIX/lib/pkgconfig/gaim.pc"
-# safeSed "$PREFIX/lib/pkgconfig/gaim.pc" "s|prefix=/usr/local|prefix=$PREFIX|"
-
-[Uninstall]
-# Usually just the following line is enough to uninstall everything
-uninstallFromLog
--- a/libpurple/gconf/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/gconf/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -1,8 +1,8 @@
 schemadir = @GCONF_SCHEMA_FILE_DIR@
 
-EXTRA_DIST = gaim.schemas.in
+EXTRA_DIST = purple.schemas.in
 
-schema_in_files = gaim.schemas.in
+schema_in_files = purple.schemas.in
 schema_DATA = $(schema_in_files:.schemas.in=.schemas)
 @INTLTOOL_SCHEMAS_RULE@
 
--- a/libpurple/gconf/gaim.schemas.in	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-<?xml version="1.0"?>
-<gconfschemafile>
-  <schemalist>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/aim/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/aim/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "aim" URLs</short>
-        <long>True if the command specified in the "command" key should handle "aim" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/aim/command</key>
-      <applyto>/desktop/gnome/url-handlers/aim/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "aim" URLs</short>
-        <long>The command used to handle "aim" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/aim/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/aim/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/gg/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/gg/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "gg" URLs</short>
-        <long>True if the command specified in the "command" key should handle "gg" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/gg/command</key>
-      <applyto>/desktop/gnome/url-handlers/gg/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "gg" URLs</short>
-        <long>The command used to handle "gg" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/gg/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/gg/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/icq/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/icq/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "icq" URLs</short>
-        <long>True if the command specified in the "command" key should handle "icq" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/icq/command</key>
-      <applyto>/desktop/gnome/url-handlers/icq/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "icq" URLs</short>
-        <long>The command used to handle "icq" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/icq/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/icq/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/irc/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/irc/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "irc" URLs</short>
-        <long>True if the command specified in the "command" key should handle "irc" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/irc/command</key>
-      <applyto>/desktop/gnome/url-handlers/irc/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "irc" URLs</short>
-        <long>The command used to handle "irc" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/irc/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/irc/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/msnim/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/msnim/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "msnim" URLs</short>
-        <long>True if the command specified in the "command" key should handle "msnim" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/msnim/command</key>
-      <applyto>/desktop/gnome/url-handlers/msnim/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "msnim" URLs</short>
-        <long>The command used to handle "msnim" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/msnim/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/msnim/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/sip/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/sip/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "sip" URLs</short>
-        <long>True if the command specified in the "command" key should handle "sip" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/sip/command</key>
-      <applyto>/desktop/gnome/url-handlers/sip/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "sip" URLs</short>
-        <long>The command used to handle "sip" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/sip/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/sip/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/xmpp/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/xmpp/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "xmpp" URLs</short>
-        <long>True if the command specified in the "command" key should handle "xmpp" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/xmpp/command</key>
-      <applyto>/desktop/gnome/url-handlers/xmpp/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "xmpp" URLs</short>
-        <long>The command used to handle "xmpp" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/xmpp/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/xmpp/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/ymsgr/enabled</key>
-      <applyto>/desktop/gnome/url-handlers/ymsgr/enabled</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-        <short>Whether the specified command should handle "ymsgr" URLs</short>
-        <long>True if the command specified in the "command" key should handle "ymsgr" URLs.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/ymsgr/command</key>
-      <applyto>/desktop/gnome/url-handlers/ymsgr/command</applyto>
-      <owner>gaim</owner>
-      <type>string</type>
-      <default>pidgin-url-handler "%s"</default>
-      <locale name="C">
-        <short>The handler for "ymsgr" URLs</short>
-        <long>The command used to handle "ymsgr" URLs, if enabled.</long>
-      </locale>
-    </schema>
-    <schema>
-      <key>/schemas/desktop/gnome/url-handlers/ymsgr/needs_terminal</key>
-      <applyto>/desktop/gnome/url-handlers/ymsgr/needs_terminal</applyto>
-      <owner>gaim</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Run the command in a terminal</short>
-        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
-      </locale>
-    </schema>
-  </schemalist>
-</gconfschemafile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/gconf/purple.schemas.in	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,276 @@
+<?xml version="1.0"?>
+<gconfschemafile>
+  <schemalist>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/aim/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/aim/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "aim" URLs</short>
+        <long>True if the command specified in the "command" key should handle "aim" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/aim/command</key>
+      <applyto>/desktop/gnome/url-handlers/aim/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "aim" URLs</short>
+        <long>The command used to handle "aim" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/aim/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/aim/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/gg/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/gg/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "gg" URLs</short>
+        <long>True if the command specified in the "command" key should handle "gg" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/gg/command</key>
+      <applyto>/desktop/gnome/url-handlers/gg/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "gg" URLs</short>
+        <long>The command used to handle "gg" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/gg/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/gg/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/icq/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/icq/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "icq" URLs</short>
+        <long>True if the command specified in the "command" key should handle "icq" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/icq/command</key>
+      <applyto>/desktop/gnome/url-handlers/icq/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "icq" URLs</short>
+        <long>The command used to handle "icq" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/icq/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/icq/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/irc/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/irc/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "irc" URLs</short>
+        <long>True if the command specified in the "command" key should handle "irc" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/irc/command</key>
+      <applyto>/desktop/gnome/url-handlers/irc/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "irc" URLs</short>
+        <long>The command used to handle "irc" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/irc/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/irc/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/msnim/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/msnim/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "msnim" URLs</short>
+        <long>True if the command specified in the "command" key should handle "msnim" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/msnim/command</key>
+      <applyto>/desktop/gnome/url-handlers/msnim/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "msnim" URLs</short>
+        <long>The command used to handle "msnim" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/msnim/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/msnim/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/sip/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/sip/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "sip" URLs</short>
+        <long>True if the command specified in the "command" key should handle "sip" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/sip/command</key>
+      <applyto>/desktop/gnome/url-handlers/sip/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "sip" URLs</short>
+        <long>The command used to handle "sip" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/sip/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/sip/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/xmpp/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/xmpp/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "xmpp" URLs</short>
+        <long>True if the command specified in the "command" key should handle "xmpp" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/xmpp/command</key>
+      <applyto>/desktop/gnome/url-handlers/xmpp/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "xmpp" URLs</short>
+        <long>The command used to handle "xmpp" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/xmpp/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/xmpp/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/ymsgr/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/ymsgr/enabled</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "ymsgr" URLs</short>
+        <long>True if the command specified in the "command" key should handle "ymsgr" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/ymsgr/command</key>
+      <applyto>/desktop/gnome/url-handlers/ymsgr/command</applyto>
+      <owner>purple</owner>
+      <type>string</type>
+      <default>purple-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "ymsgr" URLs</short>
+        <long>The command used to handle "ymsgr" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/ymsgr/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/ymsgr/needs_terminal</applyto>
+      <owner>purple</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+  </schemalist>
+</gconfschemafile>
--- a/libpurple/log.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/log.c	Mon Mar 26 03:01:33 2007 +0000
@@ -638,7 +638,7 @@
 #else
 #error Unknown size of time_t
 #endif
-	                     purple_value_new(PURPLE_TYPE_STRING), 2,
+	                     purple_value_new(PURPLE_TYPE_STRING), 3,
 	                     purple_value_new(PURPLE_TYPE_SUBTYPE,
 	                                    PURPLE_SUBTYPE_LOG),
 #if SIZEOF_TIME_T == 4
--- a/libpurple/nat-pmp.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/nat-pmp.c	Mon Mar 26 03:01:33 2007 +0000
@@ -31,14 +31,13 @@
 #include "nat-pmp.h"
 #include "debug.h"
 
+#include <arpa/inet.h>
+#include <netinet/in.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 
 #include <net/route.h>
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
 
 #include <netdb.h>
 #include <stdio.h>
@@ -47,13 +46,46 @@
 #include <err.h>
 
 #include <errno.h>
-#include <assert.h>
 #include <sys/types.h>
 #include <net/if.h>
 
 #ifdef NET_RT_DUMP2
 
-#define PMP_DEBUG
+#define PMP_DEBUG	1
+
+typedef struct {
+	uint8_t	version;
+	uint8_t opcode;
+} PurplePmpIpRequest;
+
+typedef struct {
+	uint8_t		version;
+	uint8_t		opcode; // 128 + n
+	uint16_t	resultcode;
+	uint32_t	epoch;
+	uint32_t	address;
+} PurplePmpIpResponse;
+
+typedef struct {
+	uint8_t		version;
+	uint8_t		opcode;
+	char		reserved[2];
+	uint16_t	privateport;
+	uint16_t	publicport;
+	uint32_t	lifetime;
+} PurplePmpMapRequest;
+
+struct _PurplePmpMapResponse {
+	uint8_t		version;
+	uint8_t		opcode;
+	uint16_t	resultcode;
+	uint32_t	epoch;
+	uint16_t	privateport;
+	uint16_t	publicport;
+	uint32_t	lifetime;
+};
+
+typedef struct _PurplePmpMapResponse PurplePmpMapResponse;
 
 /*
  *	Thanks to R. Matthew Emerson for the fixes on this
@@ -64,7 +96,7 @@
 
 #define PMP_VERSION			0
 #define PMP_PORT			5351
-#define PMP_TIMEOUT			250000	//	250000 useconds
+#define PMP_TIMEOUT			250000	/* 250000 useconds */
 
 /* alignment constraint for routing socket */
 #define ROUNDUP(a)			((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
@@ -74,8 +106,8 @@
 get_rtaddrs(int bitmask, struct sockaddr *sa, struct sockaddr *addrs[])
 {
 	int i;
-	
-	for (i = 0; i < RTAX_MAX; i++) 
+
+	for (i = 0; i < RTAX_MAX; i++)
 	{
 		if (bitmask & (1 << i)) 
 		{
@@ -93,10 +125,10 @@
 is_default_route(struct sockaddr *sa, struct sockaddr *mask)
 {
     struct sockaddr_in *sin;
-	
+
     if (sa->sa_family != AF_INET)
 		return 0;
-	
+
     sin = (struct sockaddr_in *)sa;
     if ((sin->sin_addr.s_addr == INADDR_ANY) &&
 		mask &&
@@ -127,29 +159,29 @@
     mib[3] = 0; /* address family - 0 for all addres families */
     mib[4] = NET_RT_DUMP2;
     mib[5] = 0;
-	
+
 	/* Determine the buffer side needed to get the full routing table */
     if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) 
 	{
 		purple_debug_warning("nat-pmp", "sysctl: net.route.0.0.dump estimate");
 		return NULL;
     }
-	
+
     if (!(buf = malloc(needed)))
 	{
 		purple_debug_warning("nat-pmp", "malloc");
 		return NULL;
     }
-	
+
 	/* Read the routing table into buf */
     if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) 
 	{
 		purple_debug_warning("nat-pmp", "sysctl: net.route.0.0.dump");
 		return NULL;
     }
-	
+
     lim = buf + needed;
-	
+
     for (next = buf; next < lim; next += rtm->rtm_msglen) 
 	{
 		rtm = (struct rt_msghdr2 *)next;
@@ -167,15 +199,15 @@
 
 				get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
 				bzero(&addr, sizeof(addr));
-				
+
 				if (rtm->rtm_addrs & RTA_DST)
 					bcopy(rti_info[RTAX_DST], &addr, rti_info[RTAX_DST]->sa_len);
-				
+
 				bzero(&mask, sizeof(mask));
-				
+
 				if (rtm->rtm_addrs & RTA_NETMASK)
 					bcopy(rti_info[RTAX_NETMASK], &mask, rti_info[RTAX_NETMASK]->sa_len);
-				
+
 				if (rtm->rtm_addrs & RTA_GATEWAY &&
 					is_default_route(&addr, &mask)) 
 				{					
@@ -200,26 +232,6 @@
 }
 
 /*!
- * double_timeout(struct timeval *) will handle doubling a timeout for backoffs required by NAT-PMP
- */
-static void
-double_timeout(struct timeval *to)
-{
-	int second = 1000000; // number of useconds
-	
-	to->tv_sec = (to->tv_sec * 2);
-	to->tv_usec = (to->tv_usec * 2);
-	
-	// Overflow useconds if necessary
-	if (to->tv_usec >= second)
-	{
-		int overflow = (to->tv_usec / second);
-		to->tv_usec  = (to->tv_usec - (overflow * second));
-		to->tv_sec = (to->tv_sec + overflow);
-	}
-}
-
-/*!
  *	purple_pmp_get_public_ip() will return the publicly facing IP address of the 
  *	default NAT gateway. The function will return NULL if:
  *		- The gateway doesn't support NAT-PMP
@@ -229,91 +241,88 @@
 purple_pmp_get_public_ip()
 {
 	struct sockaddr_in *gateway = default_gw();
-	
-	if (gateway == NULL)
+
+	if (!gateway)
 	{
 		purple_debug_info("nat-pmp", "Cannot request public IP from a NULL gateway!\n");
 		return NULL;
 	}
+
+	/* Default port for NAT-PMP is 5351 */
 	if (gateway->sin_port != PMP_PORT)
-	{
-		gateway->sin_port = htons(PMP_PORT); //	Default port for NAT-PMP is 5351
-	}
+		gateway->sin_port = htons(PMP_PORT);
 
 	int sendfd;
-	int req_attempts = 1;	
 	struct timeval req_timeout;
-	pmp_ip_request_t req;
-	pmp_ip_response_t resp;
+	PurplePmpIpRequest req;
+	PurplePmpIpResponse resp;
 	struct sockaddr_in *publicsockaddr = NULL;
 
 	req_timeout.tv_sec = 0;
 	req_timeout.tv_usec = PMP_TIMEOUT;
 
 	sendfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-	
-	//	Clean out both req and resp structures
-	bzero(&req, sizeof(pmp_ip_request_t));
-	bzero(&resp, sizeof(pmp_ip_response_t));
+
+	/* Clean out both req and resp structures */
+	bzero(&req, sizeof(PurplePmpIpRequest));
+	bzero(&resp, sizeof(PurplePmpIpResponse));
 	req.version = 0;
 	req.opcode	= 0;
-	
-	//	Attempt to contact NAT-PMP device 9 times as per: draft-cheshire-nat-pmp-02.txt  
-	while (req_attempts < 10)
-	{	
-#ifdef PMP_DEBUG
-		purple_debug_info("nat-pmp", "Attempting to retrieve the public ip address for the NAT device at: %s\n", inet_ntoa(gateway->sin_addr));
-		purple_debug_info("nat-pmp", "\tTimeout: %ds %dus, Request #: %d\n", req_timeout.tv_sec, req_timeout.tv_usec, req_attempts);
-#endif
-		struct sockaddr_in addr;
-		socklen_t len = sizeof(struct sockaddr_in);
 
-		if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0)
-		{
-			purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", strerror(errno));
-			return NULL;
-		}
-		
-		if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0)
-		{
-			purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno));
-			return NULL;
-		}		
-		
-		if (recvfrom(sendfd, &resp, sizeof(pmp_ip_response_t), 0, (struct sockaddr *)(&addr), &len) < 0)
-		{			
-			if ( (errno != EAGAIN) || (req_attempts == 9) )
-			{
-				purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno));
-				return NULL;
-			}
-			else
-			{
-				goto iterate;
-			}
-		}
-		
-		if (addr.sin_addr.s_addr != gateway->sin_addr.s_addr)
-		{
-			purple_debug_info("nat-pmp", "Response was not received from our gateway! Instead from: %s\n", inet_ntoa(addr.sin_addr));
-			goto iterate;
-		}
-		else
-		{
-			publicsockaddr = &addr;
-			break;
-		}
+	/* The NAT-PMP spec says we should attempt to contact the gateway 9 times, doubling the time we wait each time.
+	 * Even starting with a timeout of 0.1 seconds, that means that we have a total waiting of 204.6 seconds.
+	 * With the recommended timeout of 0.25 seconds, we're talking 511.5 seconds (8.5 minutes).
+	 * 
+	 * This seems really silly... if this were nonblocking, a couple retries might be in order, but it's not at present.
+	 * XXX Make this nonblocking.
+	 */
+#ifdef PMP_DEBUG
+	purple_debug_info("nat-pmp", "Attempting to retrieve the public ip address for the NAT device at: %s\n", inet_ntoa(gateway->sin_addr));
+	purple_debug_info("nat-pmp", "\tTimeout: %ds %dus\n", req_timeout.tv_sec, req_timeout.tv_usec);
+#endif
+	struct sockaddr_in addr;
+	socklen_t len = sizeof(struct sockaddr_in);
 
-iterate:
-		++req_attempts;
-		double_timeout(&req_timeout);
-	}
-
-	if (publicsockaddr == NULL) {
+	/* TODO: Non-blocking! */
+	if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0)
+	{
+		purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", strerror(errno));
 		g_free(gateway);
 		return NULL;
 	}
-	
+
+	if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0)
+	{
+		purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno));
+		g_free(gateway);
+		return NULL;
+	}		
+
+	/* TODO: Non-blocking! */
+	if (recvfrom(sendfd, &resp, sizeof(PurplePmpIpResponse), 0, (struct sockaddr *)(&addr), &len) < 0)
+	{			
+		if (errno != EAGAIN)
+		{
+			purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno));
+			g_free(gateway);
+			return NULL;
+		}
+	}
+
+	if (addr.sin_addr.s_addr == gateway->sin_addr.s_addr)
+		publicsockaddr = &addr;
+	else
+	{
+		purple_debug_info("nat-pmp", "Response was not received from our gateway! Instead from: %s\n", inet_ntoa(addr.sin_addr));
+		g_free(gateway);
+		return NULL;
+	}
+
+	if (!publicsockaddr) {
+		g_free(gateway);
+		return NULL;
+	}
+
 #ifdef PMP_DEBUG
 	purple_debug_info("nat-pmp", "Response received from NAT-PMP device:\n");
 	purple_debug_info("nat-pmp", "version: %d\n", resp.version);
@@ -332,126 +341,122 @@
 	return inet_ntoa(publicsockaddr->sin_addr);
 }
 
-/*!
- *	will return NULL on error, or a pointer to the pmp_map_response_t type
- */
-pmp_map_response_t *
-purple_pmp_create_map(PurplePmpType type, uint16_t privateport, uint16_t publicport, uint32_t lifetime)
+gboolean
+purple_pmp_create_map(PurplePmpType type, unsigned short privateport, unsigned short publicport, int lifetime)
 {
-	struct sockaddr_in *gateway = default_gw();
-	
-	if (gateway == NULL)
+	struct sockaddr_in *gateway;
+	gboolean success = TRUE;
+	int sendfd;
+	struct timeval req_timeout;
+	PurplePmpMapRequest req;
+	PurplePmpMapResponse *resp;
+
+	gateway = default_gw();
+
+	if (!gateway)
 	{
 		purple_debug_info("nat-pmp", "Cannot create mapping on a NULL gateway!\n");
-		return NULL;
-	}
-	if (gateway->sin_port != PMP_PORT)
-	{
-		gateway->sin_port = htons(PMP_PORT); //	Default port for NAT-PMP is 5351
+		return FALSE;
 	}
-		
-	int sendfd;
-	int req_attempts = 1;	
-	struct timeval req_timeout;
-	pmp_map_request_t req;
-	pmp_map_response_t *resp = (pmp_map_response_t *)(malloc(sizeof(pmp_map_response_t)));
-	
+
+	/* Default port for NAT-PMP is 5351 */
+	if (gateway->sin_port != PMP_PORT)
+		gateway->sin_port = htons(PMP_PORT);
+
+	resp = g_new0(PurplePmpMapResponse, 1);
+
 	req_timeout.tv_sec = 0;
 	req_timeout.tv_usec = PMP_TIMEOUT;
-	
+
 	sendfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-	
-	//	Clean out both req and resp structures
-	bzero(&req, sizeof(pmp_map_request_t));
-	bzero(resp, sizeof(pmp_map_response_t));
+
+	/* Set up the req */
+	bzero(&req, sizeof(PurplePmpMapRequest));
 	req.version = 0;
 	req.opcode	= ((type == PURPLE_PMP_TYPE_UDP) ? PMP_MAP_OPCODE_UDP : PMP_MAP_OPCODE_TCP);	
 	req.privateport = htons(privateport); //	What a difference byte ordering makes...d'oh!
 	req.publicport = htons(publicport);
 	req.lifetime = htonl(lifetime);
-	
-	//	Attempt to contact NAT-PMP device 9 times as per: draft-cheshire-nat-pmp-02.txt  
-	while (req_attempts < 10)
-	{	
+
+	/* The NAT-PMP spec says we should attempt to contact the gateway 9 times, doubling the time we wait each time.
+	 * Even starting with a timeout of 0.1 seconds, that means that we have a total waiting of 204.6 seconds.
+	 * With the recommended timeout of 0.25 seconds, we're talking 511.5 seconds (8.5 minutes).
+	 * 
+	 * This seems really silly... if this were nonblocking, a couple retries might be in order, but it's not at present.
+	 * XXX Make this nonblocking.
+	 * XXX This code looks like the pmp_get_public_ip() code. Can it be consolidated?
+	 */
 #ifdef PMP_DEBUG
-		purple_debug_info("nat-pmp", "Attempting to create a NAT-PMP mapping the private port %d, and the public port %d\n", privateport, publicport);
-		purple_debug_info("nat-pmp", "\tTimeout: %ds %dus, Request #: %d\n", req_timeout.tv_sec, req_timeout.tv_usec, req_attempts);
+	purple_debug_info("nat-pmp", "Attempting to create a NAT-PMP mapping the private port %d, and the public port %d\n", privateport, publicport);
+	purple_debug_info("nat-pmp", "\tTimeout: %ds %dus\n", req_timeout.tv_sec, req_timeout.tv_usec);
 #endif
 
-		if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0)
-		{
-			purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", strerror(errno));
-			return NULL;
-		}
-		
-		if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0)
-		{
+	/* TODO: Non-blocking! */
+	success = (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) >= 0);
+	if (!success)
+		purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", strerror(errno));
+
+	if (success)
+	{
+		success = (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) >= 0);
+		if (!success)
 			purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno));
-			return NULL;
-		}		
-		
-		if (recvfrom(sendfd, resp, sizeof(pmp_map_response_t), 0, NULL, NULL) < 0)
-		{			
-			if ( (errno != EAGAIN) || (req_attempts == 9) )
-			{
-				purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno));
-				return NULL;
-			}
-			else
-			{
-				goto iterate;
-			}
-		}
-		
-		if (resp->opcode != (req.opcode + 128))
-		{
+	}
+
+	if (success)
+	{
+		/* The original code treats EAGAIN as a reason to iterate.. but I've removed iteration. This may be a problem */
+		/* TODO: Non-blocking! */
+		success = ((recvfrom(sendfd, resp, sizeof(PurplePmpMapResponse), 0, NULL, NULL) >= 0) ||
+				   (errno == EAGAIN));
+		if (!success)
+			purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno));
+	}
+
+	if (success)
+	{
+		success = (resp->opcode == (req.opcode + 128));
+		if (!success)
 			purple_debug_info("nat-pmp", "The opcode for the response from the NAT device does not match the request opcode!\n");
-			goto iterate;
-		}
-		
-		break;
-		
-iterate:
-		++req_attempts;
-		double_timeout(&req_timeout);
 	}
-	
+
 #ifdef PMP_DEBUG
-	purple_debug_info("nat-pmp", "Response received from NAT-PMP device:\n");
-	purple_debug_info("nat-pmp", "version: %d\n", resp->version);
-	purple_debug_info("nat-pmp", "opcode: %d\n", resp->opcode);
-	purple_debug_info("nat-pmp", "resultcode: %d\n", ntohs(resp->resultcode));
-	purple_debug_info("nat-pmp", "epoch: %d\n", ntohl(resp->epoch));
-	purple_debug_info("nat-pmp", "privateport: %d\n", ntohs(resp->privateport));
-	purple_debug_info("nat-pmp", "publicport: %d\n", ntohs(resp->publicport));
-	purple_debug_info("nat-pmp", "lifetime: %d\n", ntohl(resp->lifetime));
-#endif	
+	if (success)
+	{
+		purple_debug_info("nat-pmp", "Response received from NAT-PMP device:\n");
+		purple_debug_info("nat-pmp", "version: %d\n", resp->version);
+		purple_debug_info("nat-pmp", "opcode: %d\n", resp->opcode);
+		purple_debug_info("nat-pmp", "resultcode: %d\n", ntohs(resp->resultcode));
+		purple_debug_info("nat-pmp", "epoch: %d\n", ntohl(resp->epoch));
+		purple_debug_info("nat-pmp", "privateport: %d\n", ntohs(resp->privateport));
+		purple_debug_info("nat-pmp", "publicport: %d\n", ntohs(resp->publicport));
+		purple_debug_info("nat-pmp", "lifetime: %d\n", ntohl(resp->lifetime));
+	}
+#endif
 
+	g_free(resp);
 	g_free(gateway);
 
-	return resp;
+	/* XXX The private port may actually differ from the one we requested, according to the spec.
+	 * We don't handle that situation at present.
+	 *
+	 * TODO: Look at the result and verify it matches what we wanted; either return a failure if it doesn't,
+	 * or change network.c to know what to do if the desired private port shifts as a result of the nat-pmp operation.
+	 */
+	return success;
 }
 
-/*!
- *	pmp_destroy_map(uint8_t,uint16_t) 
- *	will return NULL on error, or a pointer to the pmp_map_response_t type
- */
-pmp_map_response_t *
-purple_pmp_destroy_map(PurplePmpType type, uint16_t privateport)
+gboolean
+purple_pmp_destroy_map(PurplePmpType type, unsigned short privateport)
 {
-	pmp_map_response_t *response;
-	
-	response = purple_pmp_create_map(((type == PURPLE_PMP_TYPE_UDP) ? PMP_MAP_OPCODE_UDP : PMP_MAP_OPCODE_TCP),
+	gboolean success;
+
+	success = purple_pmp_create_map(((type == PURPLE_PMP_TYPE_UDP) ? PMP_MAP_OPCODE_UDP : PMP_MAP_OPCODE_TCP),
 							privateport, 0, 0);
-	if (!response)
-	{
-		purple_debug_info("nat-pmp", "Failed to properly destroy mapping for %d!\n", privateport);
-		return NULL;
-	}
-	else
-	{
-		return response;
-	}
+	if (!success)
+		purple_debug_warning("nat-pmp", "Failed to properly destroy mapping for %d!\n", privateport);
+
+	return success;
 }
 #else /* #ifdef NET_RT_DUMP2 */
 char *
@@ -460,15 +465,15 @@
 	return NULL;
 }
 
-pmp_map_response_t *
-purple_pmp_create_map(PurplePmpType type, uint16_t privateport, uint16_t publicport, uint32_t lifetime)
+gboolean
+purple_pmp_create_map(PurplePmpType type, unsigned short privateport, unsigned short publicport, int lifetime)
 {
-	return NULL;
+	return FALSE;
 }
 
-pmp_map_response_t *
-purple_pmp_destroy_map(PurplePmpType type, uint16_t privateport)
+gboolean
+purple_pmp_destroy_map(PurplePmpType type, unsigned short privateport)
 {
-	return NULL;
+	return FALSE;
 }
 #endif /* #ifndef NET_RT_DUMP2 */
--- a/libpurple/nat-pmp.h	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/nat-pmp.h	Mon Mar 26 03:01:33 2007 +0000
@@ -1,5 +1,5 @@
 /**
-* @file nat-pmp.h NAT-PMP Implementation
+ * @file nat-pmp.h NAT-PMP Implementation
  * @ingroup core
  *
  * purple
@@ -28,20 +28,13 @@
  * OF SUCH DAMAGE.
  */
 
-#ifndef _PMPMAPPER_H
-#define _PMPMAPPER_H
+#ifndef _PURPLE_NAT_PMP_H
+#define _PURPLE_NAT_PMP_H
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-#include <sys/types.h>
-#include <net/if.h>
-#include <net/route.h>
+#include <stdint.h>
+#include <glib.h>
 
-#define PURPLE_PMP_LIFETIME		3600	//	3600 seconds
+#define PURPLE_PMP_LIFETIME	3600	/* 3600 seconds */
 
 /*
  *	uint8_t:	version, opcodes
@@ -54,40 +47,37 @@
 	PURPLE_PMP_TYPE_TCP
 } PurplePmpType;
 
-typedef struct {
-	uint8_t	version;
-	uint8_t opcode;
-} pmp_ip_request_t;
+/**
+ *
+ */
 
-typedef struct {
-	uint8_t		version;
-	uint8_t		opcode; // 128 + n
-	uint16_t	resultcode;
-	uint32_t	epoch;
-	uint32_t	address;
-} pmp_ip_response_t;
+/*
+ * TODO: This should probably cache the result of this lookup requests
+ *       so that subsequent calls to this function do not require a
+ *       round-trip exchange with the local router.
+ */
+char *purple_pmp_get_public_ip();
 
-typedef struct {
-	uint8_t		version;
-	uint8_t		opcode;
-	char		reserved[2];
-	uint16_t	privateport;
-	uint16_t	publicport;
-	uint32_t	lifetime;
-} pmp_map_request_t;
+/**
+ * Remove the NAT-PMP mapping for a specified type on a specified port
+ *
+ * @param type The PurplePmpType
+ * @param privateport The private port on which we are listening locally
+ * @param publicport The public port on which we are expecting a response
+ * @param lifetime The lifetime of the mapping. It is recommended that this be PURPLE_PMP_LIFETIME.
+ *
+ * @returns TRUE if succesful; FALSE if unsuccessful
+ */
+gboolean purple_pmp_create_map(PurplePmpType type, unsigned short privateport, unsigned short publicport, int lifetime);
 
-typedef struct {
-	uint8_t		version;
-	uint8_t		opcode;
-	uint16_t	resultcode;
-	uint32_t	epoch;
-	uint16_t	privateport;
-	uint16_t	publicport;
-	uint32_t	lifetime;
-} pmp_map_response_t;
-
-char *purple_pmp_get_public_ip();
-pmp_map_response_t *purple_pmp_create_map(PurplePmpType type, uint16_t privateport, uint16_t publicport, uint32_t lifetime);
-pmp_map_response_t *purple_pmp_destroy_map(PurplePmpType type, uint16_t privateport);
+/**
+ * Remove the NAT-PMP mapping for a specified type on a specified port
+ *
+ * @param type The PurplePmpType
+ * @param privateport The private port on which the mapping was previously made
+ *
+ * @returns TRUE if succesful; FALSE if unsuccessful
+ */
+gboolean purple_pmp_destroy_map(PurplePmpType type, unsigned short privateport);
 	
 #endif
\ No newline at end of file
--- a/libpurple/network.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/network.c	Mon Mar 26 03:01:33 2007 +0000
@@ -47,7 +47,7 @@
 #include "stun.h"
 #include "upnp.h"
 
-/* #define ENABLE_NAT_PMP */
+/* #define ENABLE_NAT_PMP 1 */
 
 #ifdef ENABLE_NAT_PMP
 #include "nat-pmp.h"
@@ -199,7 +199,7 @@
 	  return ip;
 
 #ifdef ENABLE_NAT_PMP
-	/* Attempt to ge tthe IP from a NAT device using NAT-PMP */
+	/* Attempt to get the IP from a NAT device using NAT-PMP */
 	ip = purple_pmp_get_public_ip();
 	if (ip != NULL)
 		return ip;
@@ -250,13 +250,14 @@
 	purple_network_listen_cancel(listen_data);
 }
 
+#ifdef ENABLE_NAT_PMP
 static gboolean
 purple_network_finish_pmp_map_cb(gpointer data)
 {
 	PurpleNetworkListenData *listen_data;
-	
+
 	listen_data = data;
-	
+
 	if (listen_data->cb)
 		listen_data->cb(listen_data->listenfd, listen_data->cb_data);
 
@@ -264,6 +265,7 @@
 
 	return FALSE;
 }
+#endif
 
 static PurpleNetworkListenData *
 purple_network_do_listen(unsigned short port, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data)
@@ -351,7 +353,7 @@
 	actual_port = purple_network_get_port_from_fd(listenfd);
 
 	purple_debug_info("network", "Listening on port: %hu\n", actual_port);
-	
+
 	listen_data = g_new0(PurpleNetworkListenData, 1);
 	listen_data->listenfd = listenfd;
 	listen_data->adding = TRUE;
--- a/libpurple/plugin.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/plugin.c	Mon Mar 26 03:01:33 2007 +0000
@@ -369,12 +369,12 @@
 		return plugin;
 	}
 
-	/* 
- 	 * Check to make sure a plugin has defined an id.
- 	 * Not having this check caused purple_plugin_unload to
- 	 * enter an infinite loop in certain situations by passing
- 	 * purple_find_plugin_by_id a NULL value. -- ecoffey
- 	 */
+	/*
+	 * Check to make sure a plugin has defined an id.
+	 * Not having this check caused purple_plugin_unload to
+	 * enter an infinite loop in certain situations by passing
+	 * purple_find_plugin_by_id a NULL value. -- ecoffey
+	 */
 	if (plugin->info->id == NULL || *plugin->info->id == '\0')
 	{
 		plugin->error = g_strdup_printf(_("This plugin has not defined an ID."));
@@ -672,12 +672,10 @@
 		{
 			if (!purple_plugin_unload(dep_plugin))
 			{
-				char *translated_name = g_strdup(_(dep_plugin->info->name));
 				char *tmp;
 
 				tmp = g_strdup_printf(_("The dependent plugin %s failed to unload."),
-				                      translated_name);
-				g_free(translated_name);
+				                      _(dep_plugin->info->name));
 
 				purple_notify_error(NULL, NULL,
 				                  _("There were errors unloading the plugin."), tmp);
--- a/libpurple/plugins/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/plugins/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -100,10 +100,10 @@
 
 EXTRA_DIST = \
 	Makefile.mingw \
+	ciphertest.c \
 	dbus-buddyicons-example.py \
 	filectl.c \
 	fortuneprofile.pl \
-	gaim.pl \
 	ipc-test-client.c \
 	ipc-test-server.c \
 	pluginpref_example.c \
--- a/libpurple/plugins/gaim.pl	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-sub description {
-        my($a, $b, $c, $d, $e, $f) = @_;
-        ("Example", "1.0", "An example Gaim perl script that does nothing particularly useful:\n\t-Show a dialog on load\n\t-Set user idle for 6,000 seconds\n\t-Greets people signing on with \"Hello\"\n\t-Informs you when script has been loaded for one minute.", "Eric Warmenhoven &lt;eric\@warmenhoven.org>", "http://gaim.sf.net", "/dev/null");
-}
-
-$handle = GAIM::register("Example", "1.0", "goodbye", "");
-
-GAIM::print("Perl Says", "Handle $handle");
-		
-$ver = GAIM::get_info(0);
-@ids = GAIM::get_info(1);
-
-$msg = "Gaim $ver:";
-foreach $id (@ids) {
-	$pro = GAIM::get_info(7, $id);
-	$nam = GAIM::get_info(3, $id);
-	$msg .= "\n$nam using $pro";
-}
-
-
-GAIM::command("idle", 6000);
-
-GAIM::add_event_handler($handle, "event_buddy_signon", "echo_reply");
-GAIM::add_timeout_handler($handle, 60, "notify");
-
-sub echo_reply {
-	$index = $_[0];
-	$who = $_[1];
-	GAIM::print_to_conv($index, $who, "Hello", 0);
-}
-
-sub notify {
-	GAIM::print("1 minute", "gaim test has been loaded for 1 minute");
-}
-
-sub goodbye {
-	GAIM::print("You Bastard!", "You killed Kenny!");
-}
-
--- a/libpurple/prefs.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/prefs.c	Mon Mar 26 03:01:33 2007 +0000
@@ -87,9 +87,9 @@
 static struct
 purple_pref *find_pref(const char *name)
 {
-	if (!name || name[0] != '/')
-		return NULL;
-	else if (name[1] == '\0')
+	g_return_val_if_fail(name != NULL && name[0] == '/', NULL);
+
+	if (name[1] == '\0')
 		return &prefs;
 	else
 		return g_hash_table_lookup(prefs_hash, name);
--- a/libpurple/protocols/bonjour/bonjour.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/bonjour/bonjour.c	Mon Mar 26 03:01:33 2007 +0000
@@ -58,7 +58,7 @@
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleBuddyList *blist;
-	PurpleBlistNode *gnode, *cnode, *bnode;
+	PurpleBlistNode *gnode, *cnode, *cnodenext, *bnode, *bnodenext;
 	PurpleBuddy *buddy;
 
 	blist = purple_get_blist();
@@ -70,12 +70,14 @@
 	{
 		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
 			continue;
-		for (cnode = gnode->child; cnode; cnode = cnode->next)
+		for (cnode = gnode->child; cnode; cnode = cnodenext)
 		{
+			cnodenext = cnode->next;
 			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
 				continue;
-			for (bnode = cnode->child; bnode; bnode = bnode->next)
+			for (bnode = cnode->child; bnode; bnode = bnodenext)
 			{
+				bnodenext = bnode->next;
 				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
 					continue;
 				buddy = (PurpleBuddy *)bnode;
--- a/libpurple/protocols/jabber/auth.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/jabber/auth.c	Mon Mar 26 03:01:33 2007 +0000
@@ -20,18 +20,20 @@
  */
 #include "internal.h"
 
+#include "account.h"
+#include "debug.h"
+#include "cipher.h"
+#include "conversation.h"
+#include "request.h"
+#include "sslconn.h"
+#include "util.h"
+#include "xmlnode.h"
+
 #include "jutil.h"
 #include "auth.h"
-#include "xmlnode.h"
 #include "jabber.h"
 #include "iq.h"
 
-#include "debug.h"
-#include "util.h"
-#include "cipher.h"
-#include "sslconn.h"
-#include "request.h"
-
 static void auth_old_result_cb(JabberStream *js, xmlnode *packet,
 		gpointer data);
 
--- a/libpurple/protocols/jabber/jabber.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Mon Mar 26 03:01:33 2007 +0000
@@ -25,6 +25,7 @@
 #include "blist.h"
 #include "cmds.h"
 #include "connection.h"
+#include "conversation.h"
 #include "debug.h"
 #include "dnssrv.h"
 #include "message.h"
@@ -36,6 +37,7 @@
 #include "server.h"
 #include "util.h"
 #include "version.h"
+#include "xmlnode.h"
 
 #include "auth.h"
 #include "buddy.h"
@@ -169,12 +171,16 @@
 
 void jabber_process_packet(JabberStream *js, xmlnode *packet)
 {
+	const char *xmlns;
+
 	purple_signal_emit(my_protocol, "jabber-receiving-xmlnode", js->gc, &packet);
 
 	/* if the signal leaves us with a null packet, we're done */
 	if(NULL == packet)
 		return;
 
+	xmlns = xmlnode_get_namespace(packet);
+
 	if(!strcmp(packet->name, "iq")) {
 		jabber_iq_parse(js, packet);
 	} else if(!strcmp(packet->name, "presence")) {
@@ -183,13 +189,13 @@
 		jabber_message_parse(js, packet);
 	} else if(!strcmp(packet->name, "stream:features")) {
 		jabber_stream_features_parse(js, packet);
-	} else if (!strcmp(packet->name, "features") && 
-		   !strcmp(xmlnode_get_namespace(packet), "http://etherx.jabber.org/streams")) {
+	} else if (!strcmp(packet->name, "features") &&
+		   !strcmp(xmlns, "http://etherx.jabber.org/streams")) {
 		jabber_stream_features_parse(js, packet);
-	} else if(!strcmp(packet->name, "stream:error")) {
-		jabber_stream_handle_error(js, packet);
-	} else if (!strcmp(packet->name, "error") &&
-		   !strcmp(xmlnode_get_namespace(packet), "http://etherx.jabber.org/streams")) {
+	} else if(!strcmp(packet->name, "stream:error") ||
+			 (!strcmp(packet->name, "error") &&
+				!strcmp(xmlns, "http://etherx.jabber.org/streams")))
+	{
 		jabber_stream_handle_error(js, packet);
 	} else if(!strcmp(packet->name, "challenge")) {
 		if(js->state == JABBER_STREAM_AUTHENTICATING)
@@ -1526,7 +1532,9 @@
 			js->gc->wants_to_die = TRUE;
 			text = _("Authentication Failure");
 		}
-	} else if(!strcmp(packet->name, "stream:error")) {
+	} else if(!strcmp(packet->name, "stream:error") ||
+			 (!strcmp(packet->name, "error") &&
+				!strcmp(xmlns, "http://etherx.jabber.org/streams"))) {
 		if(xmlnode_get_child(packet, "bad-format")) {
 			text = _("Bad Format");
 		} else if(xmlnode_get_child(packet, "bad-namespace-prefix")) {
--- a/libpurple/protocols/jabber/jutil.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/jabber/jutil.c	Mon Mar 26 03:01:33 2007 +0000
@@ -19,8 +19,11 @@
  *
  */
 #include "internal.h"
+#include "account.h"
+#include "conversation.h"
 #include "server.h"
 #include "util.h"
+#include "xmlnode.h"
 
 #include "chat.h"
 #include "presence.h"
--- a/libpurple/protocols/jabber/jutil.h	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/jabber/jutil.h	Mon Mar 26 03:01:33 2007 +0000
@@ -22,11 +22,6 @@
 #ifndef _PURPLE_JABBER_JUTIL_H_
 #define _PURPLE_JABBER_JUTIL_H_
 
-#include "account.h"
-#include "conversation.h"
-#include "xmlnode.h"
-
-
 typedef struct _JabberID {
 	char *node;
 	char *domain;
--- a/libpurple/protocols/jabber/message.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/jabber/message.c	Mon Mar 26 03:01:33 2007 +0000
@@ -33,7 +33,7 @@
 
 void jabber_message_free(JabberMessage *jm)
 {
-        g_free(jm->from);
+	g_free(jm->from);
 	g_free(jm->to);
 	g_free(jm->id);
 	g_free(jm->subject);
--- a/libpurple/protocols/jabber/presence.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/jabber/presence.c	Mon Mar 26 03:01:33 2007 +0000
@@ -20,20 +20,22 @@
  */
 #include "internal.h"
 
+#include "account.h"
 #include "cipher.h"
+#include "conversation.h"
 #include "debug.h"
 #include "notify.h"
 #include "request.h"
 #include "server.h"
 #include "status.h"
 #include "util.h"
+#include "xmlnode.h"
 
 #include "buddy.h"
 #include "chat.h"
 #include "presence.h"
 #include "iq.h"
 #include "jutil.h"
-#include "xmlnode.h"
 
 
 static void chats_send_presence_foreach(gpointer key, gpointer val,
--- a/libpurple/protocols/oscar/oscar_data.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/oscar/oscar_data.c	Mon Mar 26 03:01:33 2007 +0000
@@ -53,14 +53,14 @@
 	aim__registermodule(od, locate_modfirst);
 	aim__registermodule(od, buddylist_modfirst);
 	aim__registermodule(od, msg_modfirst);
-	aim__registermodule(od, adverts_modfirst);
-	aim__registermodule(od, invite_modfirst);
+	/* aim__registermodule(od, adverts_modfirst); */
+	/* aim__registermodule(od, invite_modfirst); */
 	aim__registermodule(od, admin_modfirst);
 	aim__registermodule(od, popups_modfirst);
 	aim__registermodule(od, bos_modfirst);
 	aim__registermodule(od, search_modfirst);
 	aim__registermodule(od, stats_modfirst);
-	aim__registermodule(od, translate_modfirst);
+	/* aim__registermodule(od, translate_modfirst); */
 	aim__registermodule(od, chatnav_modfirst);
 	aim__registermodule(od, chat_modfirst);
 	aim__registermodule(od, odir_modfirst);
--- a/libpurple/protocols/oscar/peer.h	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/oscar/peer.h	Mon Mar 26 03:01:33 2007 +0000
@@ -278,15 +278,4 @@
  */
 void peer_proxy_connection_established_cb(gpointer data, gint source, const gchar *error_message);
 
-#if 0
-int peer_oft_sendheader(OscarData *od, guint16 type, PeerConnection *peer_connection);
-guint32 peer_oft_checksum_chunk(const guint8 *buffer, int bufferlen, guint32 prevcheck);
-guint32 peer_oft_checksum_file(char *filename);
-int peer_oft_sendheader(OscarData *od, guint16 type, PeerConnection *peer_connection);
-PeerConnection *peer_oft_createinfo(OscarData *od, const guchar *cookie, const char *sn,
-	const char *ip, guint16 port, guint32 size, guint32 modtime, char *filename, int send_or_recv,
-	int method, int stage);
-int peer_oft_destroyinfo(PeerConnection *peer_connection);
-#endif
-
 #endif /* _PEER_H_ */
--- a/libpurple/protocols/yahoo/yahoo_packet.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.c	Mon Mar 26 03:01:33 2007 +0000
@@ -161,6 +161,7 @@
 		}
 
 		if (accept) {
+			/* TODO: strstr() should not be used here because data isn't NULL terminated */
 			delimiter = (const guchar *)strstr((char *)&data[pos], "\xc0\x80");
 			if (delimiter == NULL)
 			{
--- a/libpurple/tests/test_jabber_jutil.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/tests/test_jabber_jutil.c	Mon Mar 26 03:01:33 2007 +0000
@@ -1,6 +1,9 @@
 #include <string.h>
 
 #include "tests.h"
+#include "../account.h"
+#include "../conversation.h"
+#include "../xmlnode.h"
 #include "../protocols/jabber/jutil.h"
 
 START_TEST(test_get_resource)
--- a/libpurple/util.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/util.c	Mon Mar 26 03:01:33 2007 +0000
@@ -2184,8 +2184,8 @@
 #endif
 }
 
-/* returns a string of the form ~/.purple, where ~ is replaced by the user's home
- * dir. Note that there is no trailing slash after .purple. */
+/* returns a string of the form ~/.gaim, where ~ is replaced by the user's home
+ * dir. Note that there is no trailing slash after .gaim. */
 const char *
 purple_user_dir(void)
 {
@@ -2196,7 +2196,7 @@
 
 		if (hd) {
 			g_strlcpy((char*) &home_dir, hd, sizeof(home_dir));
-			g_strlcat((char*) &home_dir, G_DIR_SEPARATOR_S ".purple",
+			g_strlcat((char*) &home_dir, G_DIR_SEPARATOR_S ".gaim",
 					sizeof(home_dir));
 		}
 	}
--- a/libpurple/xmlnode.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/libpurple/xmlnode.c	Mon Mar 26 03:01:33 2007 +0000
@@ -27,6 +27,7 @@
  * write my own stuff.  Also, re-writing this lets me be as lightweight
  * as I want to be.  Thank you libxode for giving me a good starting point */
 
+#include "debug.h"
 #include "internal.h"
 
 #include <libxml/parser.h>
--- a/m4macros/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/m4macros/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -1,4 +1,4 @@
-installed_m4=gaim.m4
+installed_m4=purple.m4
 
 EXTRA_DIST=$(installed_m4)
 
--- a/m4macros/gaim.m4	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-dnl ###########################################################################
-dnl # Configure paths for Gaim
-dnl # Gary Kramlich 2005
-dnl #
-dnl # Based off of glib-2.0.m4 by Owen Taylor
-dnl ###########################################################################
-
-dnl ###########################################################################
-dnl # AM_PATH_GAIM([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
-dnl #
-dnl # Test for gaim and define GAIM_CFLAGS, GAIM_LIBS, GAIM_DATADIR, and
-dnl # GAIM_LIBDIR
-dnl ###########################################################################
-AC_DEFUN([AM_PATH_GAIM],
-[dnl
-	AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
-
-	no_gaim=""
-
-	if test x"$PKG_CONFIG" != x"no" ; then
-		if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
-			:
-		else
-			echo "*** pkg-config is too old;  version 0.7 or newer is required."
-			no_gaim="yes"
-			PKG_CONFIG="no"
-		fi
-	else
-		no_gaim="yes"
-	fi
-
-	min_version=ifelse([$1], ,2.0.0,$1)
-	found_version=""
-	
-	AC_MSG_CHECKING(for gaim - version >= $min_version)
-
-	if test x"$no_gaim" = x"" ; then
-		GAIM_DATADIR=`$PKG_CONFIG --variable=datadir gaim`
-		GAIM_LIBDIR=`$PKG_CONFIG --variable=libdir gaim`
-
-		GAIM_CFLAGS=`$PKG_CONFIG --cflags gaim`
-		GAIM_LIBS=`$PKG_CONFIG --libs gaim`
-
-		gaim_version=`$PKG_CONFIG --modversion gaim`
-		gaim_major_version=`echo $gaim_version | cut -d. -f 1`
-		gaim_minor_version=`echo $gaim_version | cut -d. -f 2`
-		
-		dnl # stash the micro version in a temp variable.  Then stash
-		dnl # the numeric for it in gaim_micro_version and anything
-		dnl # else in gaim_extra_version.
-		gaim_micro_version_temp=`echo $gaim_version | cut -d. -f 3`
-		gaim_micro_version=`echo $gaim_micro_version_temp | sed 's/[[^0-9]]//g'`
-		gaim_extra_version=`echo $gaim_micro_version_temp | sed 's/[[0-9]]//g'`
-
-		dnl # get the major, minor, and macro that the user gave us
-		min_major_version=`echo $min_version | cut -d. -f 1`
-		min_minor_version=`echo $min_version | cut -d. -f 2`
-		min_micro_version=`echo $min_version | cut -d. -f 3`
-
-		dnl # check the users version against the version from pkg-config
-		if test $gaim_major_version -eq $min_major_version -a \
-			$gaim_minor_version -ge $min_minor_version -a \
-			$gaim_micro_version -ge $min_micro_version
-		then
-			:
-		else
-			no_gaim="yes"
-			found_version="$gaim_major_version.$gaim_minor_version.$gaim_micro_version$gaim_extra_version"
-		fi
-
-		dnl # Do we want a compile test here?
-	fi
-
-	if test x"$no_gaim" = x"" ; then
-		AC_MSG_RESULT(yes (version $gaim_major_version.$gaim_minor_version.$gaim_micro_version$gaim_extra_version))
-		ifelse([$2], , :, [$2])
-	else
-		AC_MSG_RESULT(no)
-		if test x"$PKG_CONFIG" = x"no" ; then
-			echo "*** A new enough version of pkg-config was not found."
-			echo "*** See http://www.freedesktop.org/software/pkgconfig/"
-		fi
-
-		if test x"found_version" != x"" ; then
-			echo "*** A new enough version of gaim was not found."
-			echo "*** You have version $found_version"
-			echo "*** See http://gaim.sf.net/"
-		fi
-		
-		GAIM_CFLAGS=""
-		GAIM_LIBS=""
-		GAIM_DATADIR=""
-		GAIM_LIBDIR=""
-
-		ifelse([$3], , :, [$3])
-	fi
-
-	AC_SUBST(GAIM_CFLAGS)
-	AC_SUBST(GAIM_LIBS)
-	AC_SUBST(GAIM_DATADIR)
-	AC_SUBST(GAIM_LIBDIR)
-])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m4macros/purple.m4	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,102 @@
+dnl ###########################################################################
+dnl # Configure paths for libpurple
+dnl # Gary Kramlich 2005
+dnl #
+dnl # Based off of glib-2.0.m4 by Owen Taylor
+dnl ###########################################################################
+
+dnl ###########################################################################
+dnl # AM_PATH_PURPLE([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl #
+dnl # Test for purple and define PURPLE_CFLAGS, PURPLE_LIBS, PURPLE_DATADIR, and
+dnl # PURPLE_LIBDIR
+dnl ###########################################################################
+AC_DEFUN([AM_PATH_PURPLE],
+[dnl
+	AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
+	no_purple=""
+
+	if test x"$PKG_CONFIG" != x"no" ; then
+		if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+			:
+		else
+			echo "*** pkg-config is too old;  version 0.7 or newer is required."
+			no_purple="yes"
+			PKG_CONFIG="no"
+		fi
+	else
+		no_purple="yes"
+	fi
+
+	min_version=ifelse([$1], ,2.0.0,$1)
+	found_version=""
+
+	AC_MSG_CHECKING(for purple - version >= $min_version)
+
+	if test x"$no_purple" = x"" ; then
+		PURPLE_DATADIR=`$PKG_CONFIG --variable=datadir purple`
+		PURPLE_LIBDIR=`$PKG_CONFIG --variable=libdir purple`
+
+		PURPLE_CFLAGS=`$PKG_CONFIG --cflags purple`
+		PURPLE_LIBS=`$PKG_CONFIG --libs purple`
+
+		purple_version=`$PKG_CONFIG --modversion purple`
+		purple_major_version=`echo $purple_version | cut -d. -f 1`
+		purple_minor_version=`echo $purple_version | cut -d. -f 2`
+
+		dnl # stash the micro version in a temp variable.  Then stash
+		dnl # the numeric for it in purple_micro_version and anything
+		dnl # else in purple_extra_version.
+		purple_micro_version_temp=`echo $purple_version | cut -d. -f 3`
+		purple_micro_version=`echo $purple_micro_version_temp | sed 's/[[^0-9]]//g'`
+		purple_extra_version=`echo $purple_micro_version_temp | sed 's/[[0-9]]//g'`
+
+		dnl # get the major, minor, and macro that the user gave us
+		min_major_version=`echo $min_version | cut -d. -f 1`
+		min_minor_version=`echo $min_version | cut -d. -f 2`
+		min_micro_version=`echo $min_version | cut -d. -f 3`
+
+		dnl # check the users version against the version from pkg-config
+		if test $purple_major_version -eq $min_major_version -a \
+			$purple_minor_version -ge $min_minor_version -a \
+			$purple_micro_version -ge $min_micro_version
+		then
+			:
+		else
+			no_purple="yes"
+			found_version="$purple_major_version.$purple_minor_version.$purple_micro_version$purple_extra_version"
+		fi
+
+		dnl # Do we want a compile test here?
+	fi
+
+	if test x"$no_purple" = x"" ; then
+		AC_MSG_RESULT(yes (version $purple_major_version.$purple_minor_version.$purple_micro_version$purple_extra_version))
+		ifelse([$2], , :, [$2])
+	else
+		AC_MSG_RESULT(no)
+		if test x"$PKG_CONFIG" = x"no" ; then
+			echo "*** A new enough version of pkg-config was not found."
+			echo "*** See http://www.freedesktop.org/software/pkgconfig/"
+		fi
+
+		if test x"found_version" != x"" ; then
+			echo "*** A new enough version of purple was not found."
+			echo "*** You have version $found_version"
+			echo "*** See http://pidgin.im/"
+		fi
+
+		PURPLE_CFLAGS=""
+		PURPLE_LIBS=""
+		PURPLE_DATADIR=""
+		PURPLE_LIBDIR=""
+
+		ifelse([$3], , :, [$3])
+	fi
+
+	AC_SUBST(PURPLE_CFLAGS)
+	AC_SUBST(PURPLE_LIBS)
+	AC_SUBST(PURPLE_DATADIR)
+	AC_SUBST(PURPLE_LIBDIR)
+])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin.apspec.in	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,69 @@
+# -*-shell-script-*-
+
+[Meta]
+RootName: @pidgin.im/pidgin:$SOFTWAREVERSION
+DisplayName: Pidgin Internet Messenger
+ShortName: Pidgin
+Maintainer: The Pidgin Developers
+URL: http://pidgin.im/
+Packager: Tim Ringenbach <marv_sf@users.sourceforge.net>
+Summary: A GTK+ based multiprotocol instant messaging client
+SoftwareVersion: @VERSION@
+InterfaceVersion: 2.0
+PackageVersion: 1
+
+[Description]
+Pidgin allows you to talk to anyone using a variety of messaging protocols,
+including AIM (Oscar and TOC), ICQ, IRC, Yahoo!, MSN Messenger, Jabber,
+Gadu-Gadu, and Zephyr. These protocols are implemented using a
+modular, easy to use design. To use a protocol, just add an account using the
+account editor.
+
+Pidgin supports many common features of other clients, as well as many unique
+features, such as perl scripting, TCL scripting and C plugins.
+
+Pidgin is NOT affiliated with or endorsed by America Online, Inc., Microsoft
+Corporation, Yahoo! Inc., or ICQ Inc.
+
+[BuildPrepare]
+APBUILD_STATIC="Xss startup-notification-1" prepareBuild --enable-nss --enable-gnutls --enable-binreloc --disable-perl --disable-tcl --disable-gtktest --disable-glibtest --disable-vv  --disable-fortify
+#APBUILD_STATIC="Xss startup-notification-1" prepareBuild --enable-nss --enable-gnutls --enable-binreloc --disable-perl --disable-tcl --disable-vv
+
+
+[BuildUnprepare]
+unprepareBuild
+
+[Imports]
+rm -rf include
+rm -rf lib/pkgconfig
+find -name '*.la' | xargs rm
+echo '*' | import
+
+[Prepare]
+# Dependency checking
+require @gtk.org/gtk 2.2
+require @68k.org/libaudiofile 0.0
+require @xiph.org/libao 2.0
+require @gtkspell.sourceforge.net/gtkspell 0.0
+require @gnutls.org/gnutls 11.0 || { require @mozilla.org/nspr 4 && require @mozilla.org/nss 3; }
+
+[Install]
+# Put your installation script here
+installExe ./bin/*
+installLib ./lib/libpurple-remote.so.0.0.0
+# do the plugins
+copyFiles ./lib/pidgin "$PREFIX/lib"
+installMan 1 ./man/man1/pidgin.1
+installDesktop "Networking/Instant Messaging" ./share/applications/pidgin.desktop
+installLocale ./share/locale
+copyFiles ./share/pixmaps "$PREFIX/share"
+copyFiles ./share/sounds "$PREFIX/share"
+installIcon ./share/pixmaps/pidgin.png
+# install and fix the .pc file
+# move this to the -devel package when I make one
+# copyFile ./lib/pkgconfig/pidgin.pc "$PREFIX/lib/pkgconfig/pidgin.pc"
+# safeSed "$PREFIX/lib/pkgconfig/pidgin.pc" "s|prefix=/usr/local|prefix=$PREFIX|"
+
+[Uninstall]
+# Usually just the following line is enough to uninstall everything
+uninstallFromLog
--- a/pidgin.spec.in	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin.spec.in	Mon Mar 26 03:01:33 2007 +0000
@@ -354,7 +354,7 @@
 %{_libdir}/pkgconfig/purple.pc
 %{_libdir}/pkgconfig/pidgin.pc
 %{_libdir}/pkgconfig/gnt.pc
-%{_datadir}/aclocal/gaim.m4
+%{_datadir}/aclocal/pidgin.m4
 %if 0%{?_with_dbus:1}
 %{_libdir}/libpurple-client.so
 %endif
--- a/pidgin/gtkblist.c	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin/gtkblist.c	Mon Mar 26 03:01:33 2007 +0000
@@ -2279,6 +2279,7 @@
 	else
 		tmp = g_markup_escape_text(purple_chat_get_name((PurpleChat*)node), -1);
 	node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp);
+	g_free(tmp);
 
 	pango_layout_set_markup(td->layout, tooltip_text, -1);
 	pango_layout_set_wrap(td->layout, PANGO_WRAP_WORD);
--- a/pidgin/pixmaps/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin/pixmaps/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -9,7 +9,7 @@
 		connect.png			\
 		edit.png			\
 		pidgin.png			\
-		gaim.svg			\
+		pidgin.svg			\
 		info.png			\
 		insert-image.png		\
 		insert-image-small.png		\
@@ -48,7 +48,7 @@
 		typing.png			\
 		window-icon.png			\
 		Makefile.mingw			\
-		gaim.ico
+		pidgin.ico
 
 
 pidginbuttonpixdir = $(datadir)/pixmaps/pidgin/buttons
@@ -62,5 +62,4 @@
 
 
 distpixmapdir = $(datadir)/pixmaps
-distpixmap_DATA = pidgin.png gaim.svg
-
+distpixmap_DATA = pidgin.png pidgin.svg
\ No newline at end of file
--- a/pidgin/pixmaps/emotes/default/22/theme	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin/pixmaps/emotes/default/22/theme	Mon Mar 26 03:01:33 2007 +0000
@@ -234,7 +234,7 @@
 cowboy.png		<):)
 dance.png		\\:D/ \\:d/
 rose.png		@};-
-don't-know.png		:-L :-l
+dont-know.png		:-L :-l
 ghost.png		8-X 8-x
 hug-left.png		>:D< >:d<
 hypnotized.png		@-)
Binary file pidgin/pixmaps/gaim.ico has changed
Binary file pidgin/pixmaps/gaim.png has changed
--- a/pidgin/pixmaps/gaim.svg	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="38.400002pt"
-   height="38.400002pt"
-   id="svg1494"
-   sodipodi:version="0.32"
-   inkscape:version="0.43"
-   sodipodi:docbase="/home/dude/code-gaim-head/pixmaps"
-   sodipodi:docname="gaim.svg"
-   inkscape:export-filename="/opt/kde/share/apps/kxdocker/themes/icons/gaim.png"
-   inkscape:export-xdpi="256.16339"
-   inkscape:export-ydpi="256.16339"
-   version="1.0">
-  <defs
-     id="defs1496">
-    <linearGradient
-       id="linearGradient2102">
-      <stop
-         style="stop-color:#f8f0b6;stop-opacity:1;"
-         offset="0"
-         id="stop2104" />
-      <stop
-         id="stop2110"
-         offset="0.5"
-         style="stop-color:#e5bb13;stop-opacity:1;" />
-      <stop
-         style="stop-color:#bf5600;stop-opacity:1;"
-         offset="1"
-         id="stop2106" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2094">
-      <stop
-         style="stop-color:#de8b02;stop-opacity:1;"
-         offset="0"
-         id="stop2096" />
-      <stop
-         style="stop-color:#de8b02;stop-opacity:0;"
-         offset="1"
-         id="stop2098" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2102"
-       id="radialGradient2108"
-       cx="-9.9956121"
-       cy="1019.0612"
-       fx="-9.9956121"
-       fy="1019.0612"
-       r="8.5848799"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.199386,1.136882,-0.809907,-0.854435,803.3602,1901.146)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2102"
-       id="linearGradient4718"
-       x1="14.143999"
-       y1="1024.514"
-       x2="29.989687"
-       y2="1039.6663"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-0.126267,-0.631345)" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2102"
-       id="radialGradient1334"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.199386,1.136882,-0.809907,-0.854435,803.3602,1901.146)"
-       cx="-9.9956121"
-       cy="1019.0612"
-       fx="-9.9956121"
-       fy="1019.0612"
-       r="8.5848799" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2102"
-       id="linearGradient1338"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.03334,-0.126267,-1037.821)"
-       x1="14.143999"
-       y1="1024.514"
-       x2="29.989687"
-       y2="1039.6663" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2102"
-       id="linearGradient3107"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.03334,-0.126267,-1037.821)"
-       x1="14.143999"
-       y1="1024.514"
-       x2="29.989687"
-       y2="1039.6663" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2102"
-       id="radialGradient3109"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.199386,1.136882,-0.809907,-0.854435,803.3602,1901.146)"
-       cx="-9.9956121"
-       cy="1019.0612"
-       fx="-9.9956121"
-       fy="1019.0612"
-       r="8.5848799" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.6568542"
-     inkscape:cx="26.602156"
-     inkscape:cy="30.958631"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     gridempspacing="20"
-     inkscape:grid-bbox="false"
-     inkscape:showpageshadow="false"
-     inkscape:window-width="750"
-     inkscape:window-height="542"
-     inkscape:window-x="382"
-     inkscape:window-y="54" />
-  <metadata
-     id="metadata1499">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g3988">
-      <path
-         id="path4728"
-         d="M 25.009137,4.2393924 C 19.333416,4.2394904 14.702823,8.8679822 14.702823,14.541064 C 14.702823,17.243438 15.81669,19.665705 17.52479,21.500873 C 17.329683,21.473305 17.235059,21.469478 17.034013,21.439555 C 16.523458,21.370778 16.065243,21.688953 15.899092,21.8994 C 15.73294,22.110144 15.671117,22.278306 15.62303,22.420665 C 15.526854,22.705286 15.479403,22.958412 15.438988,23.279138 C 15.358159,23.920589 15.329513,24.778472 15.316294,25.793237 C 15.289857,27.822764 15.393381,30.518957 15.62303,33.335531 C 15.852678,36.152107 16.203578,39.0716 16.727278,41.521631 C 17.250977,43.971958 17.775769,45.916815 19.058468,47.101802 C 19.281272,47.311072 19.581153,47.419878 19.886654,47.408301 C 20.192154,47.396822 20.477799,47.265942 20.684166,47.040384 C 23.06267,44.419541 24.879957,42.814736 26.297427,41.950966 C 27.714896,41.087097 28.627332,40.950036 29.456803,41.123103 C 31.115744,41.469241 32.957983,43.674779 36.051617,46.028661 C 36.476845,46.371069 37.075037,46.379507 37.493274,46.028661 C 37.91151,45.677816 38.032943,45.065701 37.769336,44.587606 C 36.43377,42.035341 35.339621,37.876802 34.886022,34.500601 C 34.659222,32.812501 34.584551,31.284223 34.671307,30.330877 C 34.695959,30.059992 34.724591,29.996711 34.763327,29.840321 C 35.069106,29.92558 35.339187,30.002303 35.836902,30.177628 C 36.574995,30.437425 37.425896,30.750498 38.260113,31.0361 C 39.094329,31.321604 39.886506,31.556777 40.591303,31.679906 C 40.943701,31.741421 41.276753,31.815691 41.695551,31.741225 C 41.90495,31.704041 42.174465,31.611326 42.431716,31.404017 C 42.539588,31.316894 42.565086,31.165214 42.646431,31.0361 L 42.677104,31.066711 C 42.70801,31.028252 42.682559,30.960064 42.707778,30.913461 C 42.78144,30.768453 42.904108,30.659943 42.922493,30.514835 L 42.769125,30.484126 C 42.807857,30.244637 42.923381,30.005344 42.861146,29.840321 C 42.742477,29.525581 42.606772,29.39833 42.493063,29.288446 C 42.265645,29.068579 42.066122,28.963306 41.818245,28.79789 C 41.322492,28.46706 40.657411,28.027816 39.855137,27.418154 C 38.250589,26.19922 36.126138,24.249556 34.18053,20.948999 C 33.97327,20.594523 33.570312,20.457952 33.168303,20.458443 C 34.401302,18.763376 35.284778,16.795659 35.284778,14.541064 C 35.284778,8.8679822 30.68486,4.2394904 25.009137,4.2393924 z "
-         style="fill:#000000;fill-opacity:0.3137255;stroke:none;stroke-width:0.91975927;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <g
-         id="g3086">
-        <path
-           style="fill:url(#linearGradient3107);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.71700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="M 30.94516,19.174802 C 27.976637,20.120205 25.443829,21.972053 14.316353,20.259499 C 13.294668,20.117208 14.007054,42.055016 17.330403,45.2283 C 27.180184,34.007881 28.517649,39.260245 34.559917,44.013092 C 31.608553,38.182368 30.17769,26.236441 32.19516,26.555743 C 33.792426,26.808498 39.55591,29.603992 39.69516,28.468145 C 40.10545,27.940935 35.082679,26.431019 30.94516,19.174802 z "
-           id="path2112"
-           sodipodi:nodetypes="ccccscc" />
-        <path
-           sodipodi:type="arc"
-           style="fill:url(#radialGradient3109);fill-opacity:1;stroke:#000000;stroke-width:0.64874142;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path1364"
-           sodipodi:cx="-6.875"
-           sodipodi:cy="1021.1964"
-           sodipodi:rx="8.125"
-           sodipodi:ry="8.125"
-           d="M 1.25 1021.1964 A 8.125 8.125 0 1 1  -15,1021.1964 A 8.125 8.125 0 1 1  1.25 1021.1964 z"
-           transform="matrix(1.087241,0,0,1.12349,30.06407,-1135.503)" />
-      </g>
-    </g>
-  </g>
-</svg>
Binary file pidgin/pixmaps/pidgin.ico has changed
Binary file pidgin/pixmaps/pidgin.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/pidgin.svg	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="38.400002pt"
+   height="38.400002pt"
+   id="svg1494"
+   sodipodi:version="0.32"
+   inkscape:version="0.43"
+   sodipodi:docbase="/home/dude/code-gaim-head/pixmaps"
+   sodipodi:docname="gaim.svg"
+   inkscape:export-filename="/opt/kde/share/apps/kxdocker/themes/icons/gaim.png"
+   inkscape:export-xdpi="256.16339"
+   inkscape:export-ydpi="256.16339"
+   version="1.0">
+  <defs
+     id="defs1496">
+    <linearGradient
+       id="linearGradient2102">
+      <stop
+         style="stop-color:#f8f0b6;stop-opacity:1;"
+         offset="0"
+         id="stop2104" />
+      <stop
+         id="stop2110"
+         offset="0.5"
+         style="stop-color:#e5bb13;stop-opacity:1;" />
+      <stop
+         style="stop-color:#bf5600;stop-opacity:1;"
+         offset="1"
+         id="stop2106" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2094">
+      <stop
+         style="stop-color:#de8b02;stop-opacity:1;"
+         offset="0"
+         id="stop2096" />
+      <stop
+         style="stop-color:#de8b02;stop-opacity:0;"
+         offset="1"
+         id="stop2098" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2102"
+       id="radialGradient2108"
+       cx="-9.9956121"
+       cy="1019.0612"
+       fx="-9.9956121"
+       fy="1019.0612"
+       r="8.5848799"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.199386,1.136882,-0.809907,-0.854435,803.3602,1901.146)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2102"
+       id="linearGradient4718"
+       x1="14.143999"
+       y1="1024.514"
+       x2="29.989687"
+       y2="1039.6663"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.126267,-0.631345)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2102"
+       id="radialGradient1334"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.199386,1.136882,-0.809907,-0.854435,803.3602,1901.146)"
+       cx="-9.9956121"
+       cy="1019.0612"
+       fx="-9.9956121"
+       fy="1019.0612"
+       r="8.5848799" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2102"
+       id="linearGradient1338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.03334,-0.126267,-1037.821)"
+       x1="14.143999"
+       y1="1024.514"
+       x2="29.989687"
+       y2="1039.6663" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2102"
+       id="linearGradient3107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.03334,-0.126267,-1037.821)"
+       x1="14.143999"
+       y1="1024.514"
+       x2="29.989687"
+       y2="1039.6663" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2102"
+       id="radialGradient3109"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.199386,1.136882,-0.809907,-0.854435,803.3602,1901.146)"
+       cx="-9.9956121"
+       cy="1019.0612"
+       fx="-9.9956121"
+       fy="1019.0612"
+       r="8.5848799" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6568542"
+     inkscape:cx="26.602156"
+     inkscape:cy="30.958631"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     gridempspacing="20"
+     inkscape:grid-bbox="false"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="750"
+     inkscape:window-height="542"
+     inkscape:window-x="382"
+     inkscape:window-y="54" />
+  <metadata
+     id="metadata1499">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g3988">
+      <path
+         id="path4728"
+         d="M 25.009137,4.2393924 C 19.333416,4.2394904 14.702823,8.8679822 14.702823,14.541064 C 14.702823,17.243438 15.81669,19.665705 17.52479,21.500873 C 17.329683,21.473305 17.235059,21.469478 17.034013,21.439555 C 16.523458,21.370778 16.065243,21.688953 15.899092,21.8994 C 15.73294,22.110144 15.671117,22.278306 15.62303,22.420665 C 15.526854,22.705286 15.479403,22.958412 15.438988,23.279138 C 15.358159,23.920589 15.329513,24.778472 15.316294,25.793237 C 15.289857,27.822764 15.393381,30.518957 15.62303,33.335531 C 15.852678,36.152107 16.203578,39.0716 16.727278,41.521631 C 17.250977,43.971958 17.775769,45.916815 19.058468,47.101802 C 19.281272,47.311072 19.581153,47.419878 19.886654,47.408301 C 20.192154,47.396822 20.477799,47.265942 20.684166,47.040384 C 23.06267,44.419541 24.879957,42.814736 26.297427,41.950966 C 27.714896,41.087097 28.627332,40.950036 29.456803,41.123103 C 31.115744,41.469241 32.957983,43.674779 36.051617,46.028661 C 36.476845,46.371069 37.075037,46.379507 37.493274,46.028661 C 37.91151,45.677816 38.032943,45.065701 37.769336,44.587606 C 36.43377,42.035341 35.339621,37.876802 34.886022,34.500601 C 34.659222,32.812501 34.584551,31.284223 34.671307,30.330877 C 34.695959,30.059992 34.724591,29.996711 34.763327,29.840321 C 35.069106,29.92558 35.339187,30.002303 35.836902,30.177628 C 36.574995,30.437425 37.425896,30.750498 38.260113,31.0361 C 39.094329,31.321604 39.886506,31.556777 40.591303,31.679906 C 40.943701,31.741421 41.276753,31.815691 41.695551,31.741225 C 41.90495,31.704041 42.174465,31.611326 42.431716,31.404017 C 42.539588,31.316894 42.565086,31.165214 42.646431,31.0361 L 42.677104,31.066711 C 42.70801,31.028252 42.682559,30.960064 42.707778,30.913461 C 42.78144,30.768453 42.904108,30.659943 42.922493,30.514835 L 42.769125,30.484126 C 42.807857,30.244637 42.923381,30.005344 42.861146,29.840321 C 42.742477,29.525581 42.606772,29.39833 42.493063,29.288446 C 42.265645,29.068579 42.066122,28.963306 41.818245,28.79789 C 41.322492,28.46706 40.657411,28.027816 39.855137,27.418154 C 38.250589,26.19922 36.126138,24.249556 34.18053,20.948999 C 33.97327,20.594523 33.570312,20.457952 33.168303,20.458443 C 34.401302,18.763376 35.284778,16.795659 35.284778,14.541064 C 35.284778,8.8679822 30.68486,4.2394904 25.009137,4.2393924 z "
+         style="fill:#000000;fill-opacity:0.3137255;stroke:none;stroke-width:0.91975927;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <g
+         id="g3086">
+        <path
+           style="fill:url(#linearGradient3107);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.71700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 30.94516,19.174802 C 27.976637,20.120205 25.443829,21.972053 14.316353,20.259499 C 13.294668,20.117208 14.007054,42.055016 17.330403,45.2283 C 27.180184,34.007881 28.517649,39.260245 34.559917,44.013092 C 31.608553,38.182368 30.17769,26.236441 32.19516,26.555743 C 33.792426,26.808498 39.55591,29.603992 39.69516,28.468145 C 40.10545,27.940935 35.082679,26.431019 30.94516,19.174802 z "
+           id="path2112"
+           sodipodi:nodetypes="ccccscc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:url(#radialGradient3109);fill-opacity:1;stroke:#000000;stroke-width:0.64874142;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           id="path1364"
+           sodipodi:cx="-6.875"
+           sodipodi:cy="1021.1964"
+           sodipodi:rx="8.125"
+           sodipodi:ry="8.125"
+           d="M 1.25 1021.1964 A 8.125 8.125 0 1 1  -15,1021.1964 A 8.125 8.125 0 1 1  1.25 1021.1964 z"
+           transform="matrix(1.087241,0,0,1.12349,30.06407,-1135.503)" />
+      </g>
+    </g>
+  </g>
+</svg>
--- a/pidgin/plugins/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin/plugins/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -28,11 +28,11 @@
 
 convcolors_la_LDFLAGS       = -module -avoid-version
 extplacement_la_LDFLAGS     = -module -avoid-version
-gaimrc_la_LDFLAGS           = -module -avoid-version
 history_la_LDFLAGS          = -module -avoid-version
 iconaway_la_LDFLAGS         = -module -avoid-version
 markerline_la_LDFLAGS       = -module -avoid-version
 notify_la_LDFLAGS           = -module -avoid-version
+pidginrc_la_LDFLAGS           = -module -avoid-version
 relnot_la_LDFLAGS           = -module -avoid-version
 spellchk_la_LDFLAGS         = -module -avoid-version
 timestamp_la_LDFLAGS        = -module -avoid-version
@@ -44,11 +44,11 @@
 plugin_LTLIBRARIES = \
 	convcolors.la       \
 	extplacement.la     \
-	gaimrc.la           \
 	history.la          \
 	iconaway.la         \
 	markerline.la       \
 	notify.la           \
+	pidginrc.la           \
 	relnot.la           \
 	spellchk.la         \
 	timestamp.la        \
@@ -57,11 +57,11 @@
 
 convcolors_la_SOURCES       = convcolors.c
 extplacement_la_SOURCES     = extplacement.c
-gaimrc_la_SOURCES           = gaimrc.c
 history_la_SOURCES          = history.c
 iconaway_la_SOURCES         = iconaway.c
 markerline_la_SOURCES       = markerline.c
 notify_la_SOURCES           = notify.c
+pidginrc_la_SOURCES         = pidginrc.c
 relnot_la_SOURCES           = relnot.c
 spellchk_la_SOURCES         = spellchk.c
 timestamp_la_SOURCES        = timestamp.c
@@ -70,11 +70,11 @@
 
 convcolors_la_LIBADD        = $(GTK_LIBS)
 extplacement_la_LIBADD      = $(GTK_LIBS)
-gaimrc_la_LIBADD            = $(GTK_LIBS)
 history_la_LIBADD           = $(GTK_LIBS)
 iconaway_la_LIBADD          = $(GTK_LIBS)
 markerline_la_LIBADD        = $(GTK_LIBS)
 notify_la_LIBADD            = $(GTK_LIBS)
+pidginrc_la_LIBADD          = $(GTK_LIBS)
 relnot_la_LIBADD            = $(GLIB_LIBS)
 spellchk_la_LIBADD          = $(GTK_LIBS)
 timestamp_la_LIBADD         = $(GTK_LIBS)
--- a/pidgin/plugins/crazychat/Makefile.am	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin/plugins/crazychat/Makefile.am	Mon Mar 26 03:01:33 2007 +0000
@@ -1,8 +1,8 @@
-plugindir = $(libdir)/gaim
+plugindir = $(libdir)/pidgin
 
 if ENABLE_DEBUG
 DEBUG_CPPFLAGS = -g -pg
-# DEBUG_CPPFLAGS = -D_DEBUG_ -g -pg 
+# DEBUG_CPPFLAGS = -D_DEBUG_ -g -pg
 DEBUG_LFLAGS = -pg
 else
 DEBUG_CPPFLAGS = -O2
@@ -18,7 +18,7 @@
 endif
 
 crazychat_la_LDFLAGS = -module -avoid-version $(GTK_LIBS) $(DEBUG_LFLAGS)
-crazychat_la_SOURCES = cc_gaim_plugin.c cc_gtk_gl.c cc_gtk_gl.h \
+crazychat_la_SOURCES = cc_pidgin_plugin.c cc_gtk_gl.c cc_gtk_gl.h \
 	cc_interface.h crazychat.c crazychat.h util.h\
 	cc_network.c cc_network.h filter.c filter.h\
 	cc_output.c face.c face.h doggy.c doggy.h glm.h glm.c sharky.h sharky.c models.h models.c
@@ -31,9 +31,9 @@
 #$(GTKGLEXT_CFLAGS) \
 #-I$(top_srcdir)/include
 
-AM_CPPFLAGS = -DGAIM_PLUGINS \
-	-I$(top_srcdir)/libgaim \
-	-I$(top_srcdir)/gtk \
+AM_CPPFLAGS = -DPURPLE_PLUGINS \
+	-I$(top_srcdir)/libpurple \
+	-I$(top_srcdir)/pidgin \
 	$(GTK_CFLAGS) \
 	$(GTKGLEXT_CFLAGS) \
 	$(DEBUG_CPPFLAGS) \
--- a/pidgin/plugins/crazychat/cc_gaim_plugin.c	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,485 +0,0 @@
-#include <stdio.h>
-#include <assert.h>
-
-#include "internal.h"
-#include "plugin.h"
-#include "gtkplugin.h"
-#include "gtkblist.h"
-#include "gtkutils.h"
-#include "connection.h"
-#include "conversation.h"
-#include "network.h"
-
-#include <gtk/gtkgl.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
-
-#include "crazychat.h"
-#include "cc_network.h"
-#include "cc_interface.h"
-#include "cc_gtk_gl.h"
-#include "util.h"
-
-/* --- begin type and global variable definitions --- */
-
-static struct crazychat cc_info;
-
-/* --- begin function declarations --- */
-
-/**
- * Called by purple plugin to start CrazyChat
- * @param cc	the crazychat struct
- */
-static void cc_init(struct crazychat *cc);
-
-/**
- * Called by purple plugin to destroy CrazyChat
- * @param cc	the crazychat struct
- */
-static void cc_destroy(struct crazychat *cc);
-
-
-/**
- * Buddy menu drawing callback.  Adds a CrazyChat menuitem.
- * @param menu	the buddy menu widget
- * @param b	the buddy whose menu this is
- */
-static gboolean cc_buddy_menu(GtkWidget *menu, PurpleBuddy *b);
-
-/**
- * Buddy menu callback.  Initiates the CrazyChat session.
- * @param item	the gtk buddy menu item
- * @param b	the buddy whose menu the item was in
- */
-static void cc_menu_cb(GtkMenuItem *item, PurpleBuddy *b);
-
-/**
- * IM callback.  Handles receiving a CrazyChat session request.
- * @param account	the account we received the IM on
- * @param sender	the buddy who we received the message from
- * @param message	the message we received
- * @param flags		IM flags
- * @param data		user data
- */
-static gboolean receive_im_cb(PurpleAccount *account, char **sender,
-		char **message,	int *flags, void *data);
-
-/**
- * Displaying IM callback.  Drops CrazyChat messages from IM window.
- * @param account	the account we are displaying the IM on
- * @param conv		the conversation we are displaying the IM on
- * @param message	the message we are displaying
- * @param data		user data
- */
-static gboolean display_im_cb(PurpleAccount *account, const char *who, char **message,
-			PurpleConnection *conv, PurpleMessageFlags flags, void *data);
-
-/**
- * Callback for CrazyChat plugin configuration frame
- * @param plugin	the plugin data
- * @return	the configuration frame
- */
-static GtkWidget *get_config_frame(PurplePlugin *plugin);
-
-/**
- * TCP port callback.  Changes the port used to listen for new CC sessions
- * @param spin		the spinner button whose value changed
- * @param data		user data
- */
-static void tcp_port_cb(GtkSpinButton *spin, struct crazychat *cc);
-
-/**
- * UDP port callback.  Changes the port used to send/recv CC session frames
- * @param spin		the spinner button whose value changed
- * @param data		user data
- */
-static void udp_port_cb(GtkSpinButton *spin, struct crazychat *cc);
-
-/**
- * Features enabling/disabling callback.  Initializes the input processing
- * or shuts it down.
- * @param data		user data
- */
-static void features_enable_cb(struct crazychat *cc);
-
-/**
- * User signed on callback.  Now we have a buddy list to connect a signal
- * handler to.
- * @param gc		the purple connection we are signed on
- * @param plugin	our plugin struct
- */
-static gboolean cc_signed_on(PurpleConnection *gc, void *plugin);
-
-/**
- * Plugin loading callback.  If a buddy list exists, connect our buddy menu
- * drawing callback to the signal handler, otherwise, connect a signed on
- * signal handler so we know when we get a buddy list.
- * @param plugin	our plugin struct
- */
-static gboolean plugin_load(PurplePlugin *plugin);
-
-/**
- * Plugin unloading callback.  Disconnect all handlers and free data.
- * @param plugin	our plugin struct
- */
-static gboolean plugin_unload(PurplePlugin *plugin);
-
-
-/* --- end function declarations --- */
-
-
-#define CRAZYCHAT_PLUGIN_ID "gtk-crazychat"
-
-static PidginPluginUiInfo ui_info = {
-	get_config_frame				/**< get_config_frame */
-};
-
-static PurplePluginInfo info = {
-	2,						  /**< api_version    */
-	PURPLE_PLUGIN_STANDARD,				  /**< type           */
-	PIDGIN_PLUGIN_TYPE,				  /**< ui_requirement */
-	0,						  /**< flags          */
-	NULL,						  /**< dependencies   */
-	PURPLE_PRIORITY_DEFAULT,				  /**< priority       */
-
-	CRAZYCHAT_PLUGIN_ID,				  /**< id             */
-	N_("Crazychat"),				  /**< name           */
-	VERSION,					  /**< version        */
-							  /**  summary        */
-	N_("Plugin to establish a Crazychat session."),
-							  /**  description    */
-	N_("Uses Purple to obtain buddy ips to connect for a Crazychat session"),
-	"\n"
-	"William Chan <chanman@stanford.edu>\n"
-	"Ian Spiro <ispiro@stanford.edu>\n"
-	"Charlie Stockman<stockman@stanford.edu>\n"
-	"Steve Yelderman<scy@stanford.edu>",		  /**< author         */
-	PURPLE_WEBSITE,					  /**< homepage       */
-
-	plugin_load,					  /**< load           */
-	plugin_unload,					  /**< unload         */
-	NULL,						  /**< destroy        */
-
-	&ui_info,					  /**< ui_info        */
-	&cc_info					  /**< extra_info     */
-};
-
-/* --- end plugin struct definition --- */
-
-static void cc_init(struct crazychat *cc)
-{
-	/* initialize main crazychat thread */
-	
-	assert(cc);
-	memset(cc, 0, sizeof(*cc));
-
-	/* initialize network configuration */
-	cc->tcp_port = DEFAULT_CC_PORT;
-	cc->udp_port = DEFAULT_CC_PORT;
-
-	/* disable input subsystem */
-	//cc->features_state = 0;
-
-	/* initialize input subsystem */
-	cc->features_state = 1;
-	cc->input_data = init_input(cc);
-}
-
-static void cc_destroy(struct crazychat *cc)
-{
-	assert(cc);
-
-	if (cc->features_state) {
-		destroy_input(cc->input_data);
-	}
-	memset(cc, 0, sizeof(*cc));
-}
-
-static gboolean cc_buddy_menu(GtkWidget *menu, PurpleBuddy *b)
-{
-	GtkWidget *menuitem;
-
-	menuitem = gtk_menu_item_new_with_mnemonic("CrazyChat");
-	g_signal_connect(G_OBJECT(menuitem), "activate",
-			G_CALLBACK(cc_menu_cb), b);
-	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-	return FALSE;
-}
-
-static void cc_menu_cb(GtkMenuItem *item, PurpleBuddy *b)
-{
-	assert(item);
-	assert(b);
-
-	/* send the invite */
-	cc_net_send_invite(&cc_info, b->name, b->account);
-}
-
-static gboolean receive_im_cb(PurpleAccount *account, char **sender,
-		char **message,	int *flags, void *data)
-{
-	struct crazychat *cc;
-
-	cc = (struct crazychat*)data;
-	assert(cc);
-	if (!strncmp(*message, CRAZYCHAT_INVITE_CODE,
-				strlen(CRAZYCHAT_INVITE_CODE))) {
-		Debug(*message);
-		char *split = strchr(*message, '!');
-		assert(split);
-		*split = 0;
-		split++;
-		cc_net_recv_invite(account, cc, *sender,
-				&(*message)[strlen(CRAZYCHAT_INVITE_CODE)],
-				split);
-		return TRUE;
-	} else if (!strncmp(*message, CRAZYCHAT_ACCEPT_CODE,
-				strlen(CRAZYCHAT_ACCEPT_CODE))) {
-		cc_net_recv_accept(account, cc, *sender,
-				&(*message)[strlen(CRAZYCHAT_ACCEPT_CODE)]);
-		return TRUE;
-	} else if (!strncmp(*message, CRAZYCHAT_READY_CODE,
-				strlen(CRAZYCHAT_READY_CODE))) {
-		cc_net_recv_ready(account, cc, *sender);
-		return TRUE;
-	}
-	
-	return FALSE;
-}
-
-static gboolean display_im_cb(PurpleAccount *account, PurpleConversation *conv,
-		char **message, void *data)
-{
-	struct crazychat *cc;
-
-	cc = (struct crazychat*)data;
-	assert(cc);
-	if (!strncmp(*message, CRAZYCHAT_INVITE_CODE,
-				strlen(CRAZYCHAT_INVITE_CODE))) {
-		return TRUE;
-	} else if (!strncmp(*message, CRAZYCHAT_ACCEPT_CODE,
-				strlen(CRAZYCHAT_ACCEPT_CODE))) {
-		return TRUE;
-	} else if (!strncmp(*message, CRAZYCHAT_READY_CODE,
-				strlen(CRAZYCHAT_READY_CODE))) {
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-static GtkWidget *get_config_frame(PurplePlugin *plugin)
-{
-	GtkWidget *ret;
-	GtkWidget *frame;
-	GtkWidget *vbox, *hbox;
-	GtkWidget *drawing_area;
-	GtkWidget *label;
-	GtkAdjustment *adj;
-	GtkWidget *spinner;
-	GtkWidget *button, *button1, *button2;
-	GSList *group;
-	struct draw_info *info;
-	struct crazychat *cc;
-
-	cc = (struct crazychat*)plugin->info->extra_info;
-	assert(cc);
-
-	/* create widgets */
-
-	/* creating the config frame */
-	ret = gtk_vbox_new(FALSE, 18);
-	gtk_container_set_border_width(GTK_CONTAINER(ret), 12);
-
-	/* make the network configuration frame */
-	frame = pidgin_make_frame(ret, _("Network Configuration"));
-	gtk_widget_show(frame);
-
-	/* add boxes for packing purposes */
-	vbox = gtk_vbox_new(FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(frame), vbox, TRUE, TRUE, 0);
-	gtk_widget_show(vbox);
-
-	/* add widgets to row 1 */
-	hbox = gtk_hbox_new(FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-	gtk_widget_show(hbox);
-	label = gtk_label_new(_("TCP port"));
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15);
-	gtk_widget_show(label);
-	adj = (GtkAdjustment*)gtk_adjustment_new(DEFAULT_CC_PORT, 1,
-			G_MAXUSHORT, 1, 1000, 0);
-	spinner = gtk_spin_button_new(adj, 1, 0);
-	g_signal_connect(G_OBJECT(spinner), "value_changed",
-			G_CALLBACK(tcp_port_cb), cc);
-	gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
-	gtk_widget_show(spinner);
-	label = gtk_label_new(_("UDP port"));
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15);
-	gtk_widget_show(label);
-	adj = (GtkAdjustment*)gtk_adjustment_new(DEFAULT_CC_PORT, 1,
-			G_MAXUSHORT, 1, 1000, 0);
-	spinner = gtk_spin_button_new(adj, 1, 0);
-	g_signal_connect(G_OBJECT(spinner), "value_changed",
-			G_CALLBACK(udp_port_cb), cc);
-	gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
-	gtk_widget_show(spinner);
-
-	/* make the feature configuration frame */
-	frame = pidgin_make_frame(ret, _("Feature Calibration"));
-	gtk_widget_show(frame);
-
-	/* add hbox for packing purposes */
-	hbox = gtk_hbox_new(TRUE, 40);
-	gtk_box_pack_start(GTK_BOX(frame), hbox, TRUE, TRUE, 0);
-	gtk_widget_show(hbox);
-
-	/* add feature calibration options */
-
-	/* add vbox for packing purposes */
-	vbox = gtk_vbox_new(TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
-	gtk_widget_show(vbox);
-
-	/* add enabled / disabled */
-	button1 = gtk_radio_button_new_with_label(NULL, _("Enabled"));
-	gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0);
-	gtk_widget_show(button1);
-	
-	group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
-	button2 = gtk_radio_button_new_with_label(group, _("Disabled"));
-	gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE, TRUE, 0);
-	gtk_widget_show(button2);
-
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button1),
-			cc->features_state);
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2),
-			!cc->features_state);
-	g_signal_connect_swapped(G_OBJECT(button1), "toggled",
-			G_CALLBACK(features_enable_cb), cc);
-
-	/* add vbox for packing purposes */
-	vbox = gtk_vbox_new(TRUE, 0);
-	gtk_box_pack_end(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
-	gtk_widget_show(vbox);
-
-	/* add calibrate button */
-	button = gtk_button_new_with_label("Calibrate");
-	gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0);
-	gtk_widget_show(button);
-	
-	gtk_widget_show(ret);
-	
-	return ret;
-}
-
-static void tcp_port_cb(GtkSpinButton *spin, struct crazychat *cc)
-{
-	assert(spin);
-	assert(cc);
-	cc->tcp_port = gtk_spin_button_get_value_as_int(spin);
-	Debug("New tcp port: %d\n", cc->tcp_port);
-}
-
-static void udp_port_cb(GtkSpinButton *spin, struct crazychat *cc)
-{
-	assert(spin);
-	assert(cc);
-	cc->udp_port = gtk_spin_button_get_value_as_int(spin);
-	Debug("New udp port: %d\n", cc->udp_port);
-}
-
-static void features_enable_cb(struct crazychat *cc)
-{
-	Debug("Changing features state\n");
-	cc->features_state = !cc->features_state;
-	if (cc->features_state) {
-		cc->input_data = init_input(cc);
-	} else {
-		if (cc->input_data) {
-			gtk_widget_destroy(cc->input_data->widget);
-		}
-	}
-}
-
-static gboolean cc_signed_on(PurpleConnection *gc, void *plugin)
-{
-	struct crazychat *extra;
-	void *conv_handle;
-
-	assert(plugin);
-	extra = (struct crazychat*)((PurplePlugin*)plugin)->info->extra_info;
-	purple_signal_disconnect
-	    (purple_connections_get_handle(), "signed-on",
-	     plugin, PURPLE_CALLBACK(cc_signed_on));
-	purple_signal_connect(PIDGIN_BLIST
-			    (purple_get_blist()),
-			    "drawing-menu", plugin,
-			    PURPLE_CALLBACK(cc_buddy_menu), NULL);
-	conv_handle = purple_conversations_get_handle();
-	purple_signal_connect(conv_handle, "received-im-msg", plugin,
-		PURPLE_CALLBACK(receive_im_cb), extra);
-	purple_signal_connect(conv_handle, "displaying-im-msg", plugin,
-		PURPLE_CALLBACK(display_im_cb), extra);
-	return FALSE;
-}
-
-static gboolean plugin_load(PurplePlugin *plugin)
-{
-	PurpleBuddyList *buddy_list;
-	void *conv_handle;
-
-	if (cc_init_gtk_gl())
-		return FALSE;
-
-	cc_init(&cc_info);
-	buddy_list = purple_get_blist();
-	if (buddy_list) {
-		purple_signal_connect(PIDGIN_BLIST
-				    (buddy_list),
-				    "drawing-menu", plugin,
-				    PURPLE_CALLBACK(cc_buddy_menu), NULL);
-		conv_handle = purple_conversations_get_handle();
-		purple_signal_connect(conv_handle, "received-im-msg", plugin,
-			PURPLE_CALLBACK(receive_im_cb), &cc_info);
-		purple_signal_connect(conv_handle, "displaying-im-msg", plugin,
-			PURPLE_CALLBACK(display_im_cb), &cc_info);
-	} else {
-		purple_signal_connect
-		    (purple_connections_get_handle(), "signed-on",
-		     plugin, PURPLE_CALLBACK(cc_signed_on), plugin);
-	}
-
-	Debug("CrazyChat plugin loaded.\n");
-	
-	return TRUE;
-}
-
-static gboolean plugin_unload(PurplePlugin *plugin)
-{
-	void *conv_handle;
-	struct crazychat *extra;
-	assert(plugin);
-	extra = (struct crazychat*) plugin->info->extra_info;
-	cc_destroy(extra);
-	conv_handle = purple_conversations_get_handle();
-	purple_signal_disconnect(PIDGIN_BLIST
-			       (purple_get_blist()),
-			       "drawing-menu", plugin,
-			       PURPLE_CALLBACK(cc_buddy_menu));
-	purple_signal_disconnect(conv_handle, "received-im", plugin,
-			       PURPLE_CALLBACK(receive_im_cb));
-	purple_signal_disconnect(conv_handle, "displaying-im-msg", plugin,
-			       PURPLE_CALLBACK(display_im_cb));
-	Debug("CrazyChat plugin unloaded.\n");
-	return TRUE;
-}
-
-static void init_plugin(PurplePlugin *plugin)
-{
-	gtk_gl_init(NULL, NULL);
-	memset(&cc_info, 0, sizeof(cc_info));
-	Debug("CrazyChat plugin initialized\n");
-}
-
-PURPLE_INIT_PLUGIN(crazychat, init_plugin, info)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/crazychat/cc_pidgin_plugin.c	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,485 @@
+#include <stdio.h>
+#include <assert.h>
+
+#include "internal.h"
+#include "plugin.h"
+#include "gtkplugin.h"
+#include "gtkblist.h"
+#include "gtkutils.h"
+#include "connection.h"
+#include "conversation.h"
+#include "network.h"
+
+#include <gtk/gtkgl.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include "crazychat.h"
+#include "cc_network.h"
+#include "cc_interface.h"
+#include "cc_gtk_gl.h"
+#include "util.h"
+
+/* --- begin type and global variable definitions --- */
+
+static struct crazychat cc_info;
+
+/* --- begin function declarations --- */
+
+/**
+ * Called by purple plugin to start CrazyChat
+ * @param cc	the crazychat struct
+ */
+static void cc_init(struct crazychat *cc);
+
+/**
+ * Called by purple plugin to destroy CrazyChat
+ * @param cc	the crazychat struct
+ */
+static void cc_destroy(struct crazychat *cc);
+
+
+/**
+ * Buddy menu drawing callback.  Adds a CrazyChat menuitem.
+ * @param menu	the buddy menu widget
+ * @param b	the buddy whose menu this is
+ */
+static gboolean cc_buddy_menu(GtkWidget *menu, PurpleBuddy *b);
+
+/**
+ * Buddy menu callback.  Initiates the CrazyChat session.
+ * @param item	the gtk buddy menu item
+ * @param b	the buddy whose menu the item was in
+ */
+static void cc_menu_cb(GtkMenuItem *item, PurpleBuddy *b);
+
+/**
+ * IM callback.  Handles receiving a CrazyChat session request.
+ * @param account	the account we received the IM on
+ * @param sender	the buddy who we received the message from
+ * @param message	the message we received
+ * @param flags		IM flags
+ * @param data		user data
+ */
+static gboolean receive_im_cb(PurpleAccount *account, char **sender,
+		char **message,	int *flags, void *data);
+
+/**
+ * Displaying IM callback.  Drops CrazyChat messages from IM window.
+ * @param account	the account we are displaying the IM on
+ * @param conv		the conversation we are displaying the IM on
+ * @param message	the message we are displaying
+ * @param data		user data
+ */
+static gboolean display_im_cb(PurpleAccount *account, const char *who, char **message,
+			PurpleConnection *conv, PurpleMessageFlags flags, void *data);
+
+/**
+ * Callback for CrazyChat plugin configuration frame
+ * @param plugin	the plugin data
+ * @return	the configuration frame
+ */
+static GtkWidget *get_config_frame(PurplePlugin *plugin);
+
+/**
+ * TCP port callback.  Changes the port used to listen for new CC sessions
+ * @param spin		the spinner button whose value changed
+ * @param data		user data
+ */
+static void tcp_port_cb(GtkSpinButton *spin, struct crazychat *cc);
+
+/**
+ * UDP port callback.  Changes the port used to send/recv CC session frames
+ * @param spin		the spinner button whose value changed
+ * @param data		user data
+ */
+static void udp_port_cb(GtkSpinButton *spin, struct crazychat *cc);
+
+/**
+ * Features enabling/disabling callback.  Initializes the input processing
+ * or shuts it down.
+ * @param data		user data
+ */
+static void features_enable_cb(struct crazychat *cc);
+
+/**
+ * User signed on callback.  Now we have a buddy list to connect a signal
+ * handler to.
+ * @param gc		the purple connection we are signed on
+ * @param plugin	our plugin struct
+ */
+static gboolean cc_signed_on(PurpleConnection *gc, void *plugin);
+
+/**
+ * Plugin loading callback.  If a buddy list exists, connect our buddy menu
+ * drawing callback to the signal handler, otherwise, connect a signed on
+ * signal handler so we know when we get a buddy list.
+ * @param plugin	our plugin struct
+ */
+static gboolean plugin_load(PurplePlugin *plugin);
+
+/**
+ * Plugin unloading callback.  Disconnect all handlers and free data.
+ * @param plugin	our plugin struct
+ */
+static gboolean plugin_unload(PurplePlugin *plugin);
+
+
+/* --- end function declarations --- */
+
+
+#define CRAZYCHAT_PLUGIN_ID "gtk-crazychat"
+
+static PidginPluginUiInfo ui_info = {
+	get_config_frame				/**< get_config_frame */
+};
+
+static PurplePluginInfo info = {
+	2,						  /**< api_version    */
+	PURPLE_PLUGIN_STANDARD,				  /**< type           */
+	PIDGIN_PLUGIN_TYPE,				  /**< ui_requirement */
+	0,						  /**< flags          */
+	NULL,						  /**< dependencies   */
+	PURPLE_PRIORITY_DEFAULT,				  /**< priority       */
+
+	CRAZYCHAT_PLUGIN_ID,				  /**< id             */
+	N_("Crazychat"),				  /**< name           */
+	VERSION,					  /**< version        */
+							  /**  summary        */
+	N_("Plugin to establish a Crazychat session."),
+							  /**  description    */
+	N_("Uses Purple to obtain buddy ips to connect for a Crazychat session"),
+	"\n"
+	"William Chan <chanman@stanford.edu>\n"
+	"Ian Spiro <ispiro@stanford.edu>\n"
+	"Charlie Stockman<stockman@stanford.edu>\n"
+	"Steve Yelderman<scy@stanford.edu>",		  /**< author         */
+	PURPLE_WEBSITE,					  /**< homepage       */
+
+	plugin_load,					  /**< load           */
+	plugin_unload,					  /**< unload         */
+	NULL,						  /**< destroy        */
+
+	&ui_info,					  /**< ui_info        */
+	&cc_info					  /**< extra_info     */
+};
+
+/* --- end plugin struct definition --- */
+
+static void cc_init(struct crazychat *cc)
+{
+	/* initialize main crazychat thread */
+	
+	assert(cc);
+	memset(cc, 0, sizeof(*cc));
+
+	/* initialize network configuration */
+	cc->tcp_port = DEFAULT_CC_PORT;
+	cc->udp_port = DEFAULT_CC_PORT;
+
+	/* disable input subsystem */
+	//cc->features_state = 0;
+
+	/* initialize input subsystem */
+	cc->features_state = 1;
+	cc->input_data = init_input(cc);
+}
+
+static void cc_destroy(struct crazychat *cc)
+{
+	assert(cc);
+
+	if (cc->features_state) {
+		destroy_input(cc->input_data);
+	}
+	memset(cc, 0, sizeof(*cc));
+}
+
+static gboolean cc_buddy_menu(GtkWidget *menu, PurpleBuddy *b)
+{
+	GtkWidget *menuitem;
+
+	menuitem = gtk_menu_item_new_with_mnemonic("CrazyChat");
+	g_signal_connect(G_OBJECT(menuitem), "activate",
+			G_CALLBACK(cc_menu_cb), b);
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+	return FALSE;
+}
+
+static void cc_menu_cb(GtkMenuItem *item, PurpleBuddy *b)
+{
+	assert(item);
+	assert(b);
+
+	/* send the invite */
+	cc_net_send_invite(&cc_info, b->name, b->account);
+}
+
+static gboolean receive_im_cb(PurpleAccount *account, char **sender,
+		char **message,	int *flags, void *data)
+{
+	struct crazychat *cc;
+
+	cc = (struct crazychat*)data;
+	assert(cc);
+	if (!strncmp(*message, CRAZYCHAT_INVITE_CODE,
+				strlen(CRAZYCHAT_INVITE_CODE))) {
+		Debug(*message);
+		char *split = strchr(*message, '!');
+		assert(split);
+		*split = 0;
+		split++;
+		cc_net_recv_invite(account, cc, *sender,
+				&(*message)[strlen(CRAZYCHAT_INVITE_CODE)],
+				split);
+		return TRUE;
+	} else if (!strncmp(*message, CRAZYCHAT_ACCEPT_CODE,
+				strlen(CRAZYCHAT_ACCEPT_CODE))) {
+		cc_net_recv_accept(account, cc, *sender,
+				&(*message)[strlen(CRAZYCHAT_ACCEPT_CODE)]);
+		return TRUE;
+	} else if (!strncmp(*message, CRAZYCHAT_READY_CODE,
+				strlen(CRAZYCHAT_READY_CODE))) {
+		cc_net_recv_ready(account, cc, *sender);
+		return TRUE;
+	}
+	
+	return FALSE;
+}
+
+static gboolean display_im_cb(PurpleAccount *account, PurpleConversation *conv,
+		char **message, void *data)
+{
+	struct crazychat *cc;
+
+	cc = (struct crazychat*)data;
+	assert(cc);
+	if (!strncmp(*message, CRAZYCHAT_INVITE_CODE,
+				strlen(CRAZYCHAT_INVITE_CODE))) {
+		return TRUE;
+	} else if (!strncmp(*message, CRAZYCHAT_ACCEPT_CODE,
+				strlen(CRAZYCHAT_ACCEPT_CODE))) {
+		return TRUE;
+	} else if (!strncmp(*message, CRAZYCHAT_READY_CODE,
+				strlen(CRAZYCHAT_READY_CODE))) {
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static GtkWidget *get_config_frame(PurplePlugin *plugin)
+{
+	GtkWidget *ret;
+	GtkWidget *frame;
+	GtkWidget *vbox, *hbox;
+	GtkWidget *drawing_area;
+	GtkWidget *label;
+	GtkAdjustment *adj;
+	GtkWidget *spinner;
+	GtkWidget *button, *button1, *button2;
+	GSList *group;
+	struct draw_info *info;
+	struct crazychat *cc;
+
+	cc = (struct crazychat*)plugin->info->extra_info;
+	assert(cc);
+
+	/* create widgets */
+
+	/* creating the config frame */
+	ret = gtk_vbox_new(FALSE, 18);
+	gtk_container_set_border_width(GTK_CONTAINER(ret), 12);
+
+	/* make the network configuration frame */
+	frame = pidgin_make_frame(ret, _("Network Configuration"));
+	gtk_widget_show(frame);
+
+	/* add boxes for packing purposes */
+	vbox = gtk_vbox_new(FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(frame), vbox, TRUE, TRUE, 0);
+	gtk_widget_show(vbox);
+
+	/* add widgets to row 1 */
+	hbox = gtk_hbox_new(FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+	gtk_widget_show(hbox);
+	label = gtk_label_new(_("TCP port"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15);
+	gtk_widget_show(label);
+	adj = (GtkAdjustment*)gtk_adjustment_new(DEFAULT_CC_PORT, 1,
+			G_MAXUSHORT, 1, 1000, 0);
+	spinner = gtk_spin_button_new(adj, 1, 0);
+	g_signal_connect(G_OBJECT(spinner), "value_changed",
+			G_CALLBACK(tcp_port_cb), cc);
+	gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
+	gtk_widget_show(spinner);
+	label = gtk_label_new(_("UDP port"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15);
+	gtk_widget_show(label);
+	adj = (GtkAdjustment*)gtk_adjustment_new(DEFAULT_CC_PORT, 1,
+			G_MAXUSHORT, 1, 1000, 0);
+	spinner = gtk_spin_button_new(adj, 1, 0);
+	g_signal_connect(G_OBJECT(spinner), "value_changed",
+			G_CALLBACK(udp_port_cb), cc);
+	gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
+	gtk_widget_show(spinner);
+
+	/* make the feature configuration frame */
+	frame = pidgin_make_frame(ret, _("Feature Calibration"));
+	gtk_widget_show(frame);
+
+	/* add hbox for packing purposes */
+	hbox = gtk_hbox_new(TRUE, 40);
+	gtk_box_pack_start(GTK_BOX(frame), hbox, TRUE, TRUE, 0);
+	gtk_widget_show(hbox);
+
+	/* add feature calibration options */
+
+	/* add vbox for packing purposes */
+	vbox = gtk_vbox_new(TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+	gtk_widget_show(vbox);
+
+	/* add enabled / disabled */
+	button1 = gtk_radio_button_new_with_label(NULL, _("Enabled"));
+	gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0);
+	gtk_widget_show(button1);
+	
+	group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
+	button2 = gtk_radio_button_new_with_label(group, _("Disabled"));
+	gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE, TRUE, 0);
+	gtk_widget_show(button2);
+
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button1),
+			cc->features_state);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2),
+			!cc->features_state);
+	g_signal_connect_swapped(G_OBJECT(button1), "toggled",
+			G_CALLBACK(features_enable_cb), cc);
+
+	/* add vbox for packing purposes */
+	vbox = gtk_vbox_new(TRUE, 0);
+	gtk_box_pack_end(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+	gtk_widget_show(vbox);
+
+	/* add calibrate button */
+	button = gtk_button_new_with_label("Calibrate");
+	gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0);
+	gtk_widget_show(button);
+	
+	gtk_widget_show(ret);
+	
+	return ret;
+}
+
+static void tcp_port_cb(GtkSpinButton *spin, struct crazychat *cc)
+{
+	assert(spin);
+	assert(cc);
+	cc->tcp_port = gtk_spin_button_get_value_as_int(spin);
+	Debug("New tcp port: %d\n", cc->tcp_port);
+}
+
+static void udp_port_cb(GtkSpinButton *spin, struct crazychat *cc)
+{
+	assert(spin);
+	assert(cc);
+	cc->udp_port = gtk_spin_button_get_value_as_int(spin);
+	Debug("New udp port: %d\n", cc->udp_port);
+}
+
+static void features_enable_cb(struct crazychat *cc)
+{
+	Debug("Changing features state\n");
+	cc->features_state = !cc->features_state;
+	if (cc->features_state) {
+		cc->input_data = init_input(cc);
+	} else {
+		if (cc->input_data) {
+			gtk_widget_destroy(cc->input_data->widget);
+		}
+	}
+}
+
+static gboolean cc_signed_on(PurpleConnection *gc, void *plugin)
+{
+	struct crazychat *extra;
+	void *conv_handle;
+
+	assert(plugin);
+	extra = (struct crazychat*)((PurplePlugin*)plugin)->info->extra_info;
+	purple_signal_disconnect
+	    (purple_connections_get_handle(), "signed-on",
+	     plugin, PURPLE_CALLBACK(cc_signed_on));
+	purple_signal_connect(PIDGIN_BLIST
+			    (purple_get_blist()),
+			    "drawing-menu", plugin,
+			    PURPLE_CALLBACK(cc_buddy_menu), NULL);
+	conv_handle = purple_conversations_get_handle();
+	purple_signal_connect(conv_handle, "received-im-msg", plugin,
+		PURPLE_CALLBACK(receive_im_cb), extra);
+	purple_signal_connect(conv_handle, "displaying-im-msg", plugin,
+		PURPLE_CALLBACK(display_im_cb), extra);
+	return FALSE;
+}
+
+static gboolean plugin_load(PurplePlugin *plugin)
+{
+	PurpleBuddyList *buddy_list;
+	void *conv_handle;
+
+	if (cc_init_gtk_gl())
+		return FALSE;
+
+	cc_init(&cc_info);
+	buddy_list = purple_get_blist();
+	if (buddy_list) {
+		purple_signal_connect(PIDGIN_BLIST
+				    (buddy_list),
+				    "drawing-menu", plugin,
+				    PURPLE_CALLBACK(cc_buddy_menu), NULL);
+		conv_handle = purple_conversations_get_handle();
+		purple_signal_connect(conv_handle, "received-im-msg", plugin,
+			PURPLE_CALLBACK(receive_im_cb), &cc_info);
+		purple_signal_connect(conv_handle, "displaying-im-msg", plugin,
+			PURPLE_CALLBACK(display_im_cb), &cc_info);
+	} else {
+		purple_signal_connect
+		    (purple_connections_get_handle(), "signed-on",
+		     plugin, PURPLE_CALLBACK(cc_signed_on), plugin);
+	}
+
+	Debug("CrazyChat plugin loaded.\n");
+	
+	return TRUE;
+}
+
+static gboolean plugin_unload(PurplePlugin *plugin)
+{
+	void *conv_handle;
+	struct crazychat *extra;
+	assert(plugin);
+	extra = (struct crazychat*) plugin->info->extra_info;
+	cc_destroy(extra);
+	conv_handle = purple_conversations_get_handle();
+	purple_signal_disconnect(PIDGIN_BLIST
+			       (purple_get_blist()),
+			       "drawing-menu", plugin,
+			       PURPLE_CALLBACK(cc_buddy_menu));
+	purple_signal_disconnect(conv_handle, "received-im", plugin,
+			       PURPLE_CALLBACK(receive_im_cb));
+	purple_signal_disconnect(conv_handle, "displaying-im-msg", plugin,
+			       PURPLE_CALLBACK(display_im_cb));
+	Debug("CrazyChat plugin unloaded.\n");
+	return TRUE;
+}
+
+static void init_plugin(PurplePlugin *plugin)
+{
+	gtk_gl_init(NULL, NULL);
+	memset(&cc_info, 0, sizeof(cc_info));
+	Debug("CrazyChat plugin initialized\n");
+}
+
+PURPLE_INIT_PLUGIN(crazychat, init_plugin, info)
--- a/pidgin/plugins/gaimrc.c	Sat Mar 24 20:25:01 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,676 +0,0 @@
-/**
- * @file purplerc.c Purple gtk resource control plugin.
- *
- * Copyright (C) 2005 Etan Reisner <deryni@eden.rutgers.edu>
- *
- * 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 "internal.h"
-#include "gtkplugin.h"
-#include "gtkprefs.h"
-#include "gtkutils.h"
-#include "util.h"
-#include "version.h"
-
-static guint pref_callback;
-
-static const char *color_prefs[] = {
-	"/plugins/gtk/purplerc/color/GtkWidget::cursor-color",
-	"/plugins/gtk/purplerc/color/GtkWidget::secondary-cursor-color",
-	"/plugins/gtk/purplerc/color/GtkIMHtml::hyperlink-color"
-};
-static const char *color_prefs_set[] = {
-	"/plugins/gtk/purplerc/set/color/GtkWidget::cursor-color",
-	"/plugins/gtk/purplerc/set/color/GtkWidget::secondary-cursor-color",
-	"/plugins/gtk/purplerc/set/color/GtkIMHtml::hyperlink-color"
-};
-static const char *color_names[] = {
-	N_("Cursor Color"),
-	N_("Secondary Cursor Color"),
-	N_("Hyperlink Color")
-};
-static GtkWidget *color_widgets[G_N_ELEMENTS(color_prefs)];
-
-static const char *widget_size_prefs[] = {
-	"/plugins/gtk/purplerc/size/GtkTreeView::expander_size",
-	"/plugins/gtk/purplerc/size/GtkTreeView::horizontal_separator"
-};
-static const char *widget_size_prefs_set[] = {
-	"/plugins/gtk/purplerc/set/size/GtkTreeView::expander_size",
-	"/plugins/gtk/purplerc/set/size/GtkTreeView::horizontal_separator"
-};
-static const char *widget_size_names[] = {
-	N_("GtkTreeView Expander Size"),
-	N_("GtkTreeView Horizontal Separation")
-};
-static GtkWidget *widget_size_widgets[G_N_ELEMENTS(widget_size_prefs)];
-
-static const char *font_prefs[] = {
-	"/plugins/gtk/purplerc/font/*pidgin_conv_entry",
-	"/plugins/gtk/purplerc/font/*pidgin_conv_imhtml",
-	"/plugins/gtk/purplerc/font/*pidginlog_imhtml",
-	"/plugins/gtk/purplerc/font/*pidginrequest_imhtml",
-	"/plugins/gtk/purplerc/font/*pidginnotify_imhtml",
-};
-static const char *font_prefs_set[] = {
-	"/plugins/gtk/purplerc/set/font/*pidgin_conv_entry",
-	"/plugins/gtk/purplerc/set/font/*pidgin_conv_imhtml",
-	"/plugins/gtk/purplerc/set/font/*pidginlog_imhtml",
-	"/plugins/gtk/purplerc/set/font/*pidginrequest_imhtml",
-	"/plugins/gtk/purplerc/set/font/*pidginnotify_imhtml",
-};
-static const char *font_names[] = {
-	N_("Conversation Entry"),
-	N_("Conversation History"),
-	N_("Log Viewer"),
-	N_("Request Dialog"),
-	N_("Notify Dialog")
-};
-static GtkWidget *font_widgets[G_N_ELEMENTS(font_prefs)];
-
-static const char *widget_bool_prefs[] = {
-	"/plugins/gtk/purplerc/bool/GtkTreeView::indent_expanders",
-};
-static const char *widget_bool_prefs_set[] = {
-	"/plugins/gtk/purplerc/set/bool/GtkTreeView::indent_expanders",
-};
-static const char *widget_bool_names[] = {
-	N_("GtkTreeView Indent Expanders"),
-};
-static GtkWidget *widget_bool_widgets[G_N_ELEMENTS(widget_bool_prefs)];
-
-static void
-purplerc_make_changes()
-{
-	int i;
-	char *prefbase = NULL;
-#if GTK_CHECK_VERSION(2,4,0)
-	GtkSettings *setting = NULL;
-#endif
-	GString *style_string = g_string_new("");
-
-	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name")) {
-		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name");
-
-		if (pref != NULL && strcmp(pref, ""))
-			g_string_append_printf(style_string, "gtk-font-name = \"%s\"\n", pref);
-	}
-
-	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name")) {
-		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name");
-
-		if (pref != NULL && strcmp(pref, ""))
-			g_string_append_printf(style_string, "gtk-key-theme-name = \"%s\"\n", pref);
-	}
-
-	g_string_append(style_string, "style \"purplerc_style\" {\n");
-
-	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
-		if (purple_prefs_get_bool(color_prefs_set[i])) {
-			const char *pref;
-
-			prefbase = g_path_get_basename(color_prefs[i]);
-			pref = purple_prefs_get_string(color_prefs[i]);
-
-			if (pref != NULL && strcmp(pref, ""))
-			    g_string_append_printf(style_string,
-			                           "%s = \"%s\"\n",
-			                           prefbase, pref);
-			g_free(prefbase);
-		}
-	}
-
-	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
-		if (purple_prefs_get_bool(widget_size_prefs_set[i])) {
-			prefbase = g_path_get_basename(widget_size_prefs[i]);
-			g_string_append_printf(style_string,
-			                       "%s = %d\n", prefbase,
-			                       purple_prefs_get_int(widget_size_prefs[i]));
-			g_free(prefbase);
-		}
-	}
-
-	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-		if (purple_prefs_get_bool(widget_bool_prefs_set[i])) {
-			prefbase = g_path_get_basename(widget_bool_prefs[i]);
-			g_string_append_printf(style_string,
-			                       "%s = %d\n", prefbase,
-			                       purple_prefs_get_bool(widget_bool_prefs[i]));
-			g_free(prefbase);
-		}
-	}
-
-	g_string_append(style_string, "}");
-	g_string_append(style_string, "widget_class \"*\" style \"purplerc_style\"\n");
-
-	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
-		if (purple_prefs_get_bool(font_prefs_set[i])) {
-			const char *pref;
-
-			prefbase = g_path_get_basename(font_prefs[i]);
-			pref = purple_prefs_get_string(font_prefs[i]);
-
-			if (pref != NULL && strcmp(pref, ""))
-				g_string_append_printf(style_string,
-				                       "style \"%s_style\"\n"
-				                       "{font_name = \"%s\"}\n"
-				                       "widget \"%s\""
-				                       "style \"%s_style\"\n",
-				                       prefbase, pref,
-				                       prefbase, prefbase);
-			g_free(prefbase);
-		}
-	}
-
-	gtk_rc_parse_string(style_string->str);
-	g_string_free(style_string, TRUE);
-
-#if GTK_CHECK_VERSION(2,4,0)
-	setting = gtk_settings_get_default();
-	gtk_rc_reset_styles(setting);
-#endif
-}
-
-static void
-purplerc_write(GtkWidget *widget, gpointer data)
-{
-	int i;
-	GString *style_string = g_string_new("");
-	char *prefbase = NULL;
-
-	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name")) {
-		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name");
-
-		if (pref != NULL && strcmp(pref, ""))
-			g_string_append_printf(style_string,
-			                       "gtk-font-name = \"%s\"\n",
-			                       pref);
-	}
-
-	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name")) {
-		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name");
-
-		if (pref != NULL && strcmp(pref, ""))
-			g_string_append_printf(style_string,
-			                       "gtk-key-theme-name = \"%s\"\n",
-			                       pref);
-	}
-
-	g_string_append(style_string, "style \"purplerc_style\" {\n");
-
-	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
-		if (purple_prefs_get_bool(color_prefs_set[i])) {
-			const char *pref;
-
-			prefbase = g_path_get_basename(color_prefs[i]);
-			pref = purple_prefs_get_string(color_prefs[i]);
-
-			if (pref != NULL && strcmp(pref, ""))
-			    g_string_append_printf(style_string,
-			                           "%s = \"%s\"\n",
-			                           prefbase, pref);
-			g_free(prefbase);
-		}
-	}
-
-	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
-		if (purple_prefs_get_bool(widget_size_prefs_set[i])) {
-			prefbase = g_path_get_basename(widget_size_prefs[i]);
-			g_string_append_printf(style_string,
-			                       "%s = %d\n", prefbase,
-			                       purple_prefs_get_int(widget_size_prefs[i]));
-			g_free(prefbase);
-		}
-	}
-
-	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-		if (purple_prefs_get_bool(widget_bool_prefs_set[i])) {
-			prefbase = g_path_get_basename(widget_bool_prefs[i]);
-			g_string_append_printf(style_string,
-			                       "%s = %d\n", prefbase,
-			                       purple_prefs_get_bool(widget_bool_prefs[i]));
-			g_free(prefbase);
-		}
-	}
-
-	g_string_append(style_string, "}");
-	g_string_append(style_string, "widget_class \"*\" style \"purplerc_style\"\n");
-
-	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
-		if (purple_prefs_get_bool(font_prefs_set[i])) {
-			const char *pref;
-
-			prefbase = g_path_get_basename(font_prefs[i]);
-			pref = purple_prefs_get_string(font_prefs[i]);
-
-			if (pref != NULL && strcmp(pref, ""))
-				g_string_append_printf(style_string,
-				                       "style \"%s_style\"\n"
-				                       "{font_name = \"%s\"}\n"
-				                       "widget \"%s\""
-				                       "style \"%s_style\"\n",
-				                       prefbase, pref,
-				                       prefbase, prefbase);
-			g_free(prefbase);
-		}
-	}
-
-	purple_util_write_data_to_file("gtkrc-2.0", style_string->str, -1);
-
-	g_string_free(style_string, TRUE);
-}
-
-static void
-purplerc_reread(GtkWidget *widget, gpointer data)
-{
-	gtk_rc_reparse_all();
-	/* I don't know if this is necessary but if not it shouldn't hurt. */
-	purplerc_make_changes();
-}
-
-static void
-purplerc_pref_changed_cb(const char *name, PurplePrefType type,
-                       gconstpointer value, gpointer data)
-{
-	purplerc_make_changes();
-}
-
-static void
-purplerc_color_response(GtkDialog *color_dialog, gint response, gpointer data)
-{
-	int subscript = GPOINTER_TO_INT(data);
-
-	if (response == GTK_RESPONSE_OK) {
-		GtkWidget *colorsel = GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel;
-		GdkColor color;
-		char colorstr[8];
-
-		gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(colorsel), &color);
-
-		g_snprintf(colorstr, sizeof(colorstr), "#%02X%02X%02X",
-		           color.red/256, color.green/256, color.blue/256);
-
-		purple_prefs_set_string(color_prefs[subscript], colorstr);
-	}
-	gtk_widget_destroy(GTK_WIDGET(color_dialog));
-}
-
-static void
-purplerc_set_color(GtkWidget *widget, gpointer data)
-{
-	GtkWidget *color_dialog = NULL;
-	GdkColor color;
-	char title[128];
-	const char *pref = NULL;
-	int subscript = GPOINTER_TO_INT(data);
-
-	g_snprintf(title, sizeof(title), _("Select Color for %s"),
-	           _(color_names[GPOINTER_TO_INT(data)]));
-	color_dialog = gtk_color_selection_dialog_new(_("Select Color"));
-	g_signal_connect(G_OBJECT(color_dialog), "response",
-	                 G_CALLBACK(purplerc_color_response), data);
-
-	pref = purple_prefs_get_string(color_prefs[subscript]);
-
-	if (pref != NULL && strcmp(pref, "")) {
-		if (gdk_color_parse(pref, &color)) {
-			gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel), &color);
-		}
-	}
-
-	gtk_window_present(GTK_WINDOW(color_dialog));
-}
-
-static void
-purplerc_font_response(GtkDialog *font_dialog, gint response, gpointer data)
-{
-	int subscript = GPOINTER_TO_INT(data);
-
-	if (response == GTK_RESPONSE_OK) {
-		char *fontname = NULL;
-
-		fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_dialog));
-
-		purple_prefs_set_string(font_prefs[subscript], fontname);
-		g_free(fontname);
-	}
-	gtk_widget_destroy(GTK_WIDGET(font_dialog));
-}
-
-static void
-purplerc_set_font(GtkWidget *widget, gpointer data)
-{
-	GtkWidget *font_dialog = NULL;
-	char title[128];
-	const char *pref = NULL;
-	int subscript = GPOINTER_TO_INT(data);
-
-	g_snprintf(title, sizeof(title), _("Select Font for %s"),
-	           _(font_names[subscript]));
-	font_dialog = gtk_font_selection_dialog_new(title);
-	g_signal_connect(G_OBJECT(font_dialog), "response",
-	                 G_CALLBACK(purplerc_font_response), data);
-
-	pref = purple_prefs_get_string(font_prefs[subscript]);
-
-	if (pref != NULL && strcmp(pref, "")) {
-		gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font_dialog)->fontsel), pref);
-	}
-
-	gtk_window_present(GTK_WINDOW(font_dialog));
-}
-
-static void
-purplerc_font_response_special(GtkDialog *font_dialog, gint response,
-                             gpointer data)
-{
-	if (response == GTK_RESPONSE_OK) {
-		char *fontname = NULL;
-
-		fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_dialog));
-
-		purple_prefs_set_string("/plugins/gtk/purplerc/gtk-font-name",
-		                      fontname);
-		g_free(fontname);
-	}
-	gtk_widget_destroy(GTK_WIDGET(font_dialog));
-}
-
-static void
-purplerc_set_font_special(GtkWidget *widget, gpointer data)
-{
-	GtkWidget *font_dialog = NULL;
-	const char *pref = NULL;
-
-	font_dialog = gtk_font_selection_dialog_new(_("Select Interface Font"));
-	g_signal_connect(G_OBJECT(font_dialog), "response",
-	                 G_CALLBACK(purplerc_font_response_special), NULL);
-
-	pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name");
-
-	if (pref != NULL && strcmp(pref, "")) {
-		gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font_dialog)->fontsel), pref);
-	}
-
-	gtk_window_present(GTK_WINDOW(font_dialog));
-}
-
-static gboolean
-purplerc_plugin_load(PurplePlugin *plugin)
-{
-	purplerc_make_changes();
-
-	pref_callback = purple_prefs_connect_callback(plugin, "/plugins/gtk/purplerc",
-	                                            purplerc_pref_changed_cb, NULL);
-
-	return TRUE;
-}
-
-static gboolean
-purplerc_plugin_unload(PurplePlugin *plugin)
-{
-	purple_prefs_disconnect_callback(pref_callback);
-
-	return TRUE;
-}
-
-static GtkWidget *
-purplerc_get_config_frame(PurplePlugin *plugin)
-{
-	/* Note: Intentionally not using the size group argument to the
-	 * pidgin_prefs_labeled_* functions they only add the text label to
-	 * the size group not the whole thing, which isn't what I want. */
-	int i;
-	char *tmp;
-	GtkWidget *check = NULL, *widget = NULL;
-	GtkSizeGroup *labelsg = NULL, *widgetsg = NULL;
-	GtkWidget *ret = NULL, *frame = NULL, *hbox = NULL, *vbox = NULL;
-
-	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER);
-
-	labelsg  = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-	widgetsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
-	frame = pidgin_make_frame(ret, _("General"));
-	/* interface font */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-	check = pidgin_prefs_checkbox(_("GTK+ Interface Font"),
-	                                "/plugins/gtk/purplerc/set/gtk-font-name",
-	                                hbox);
-	gtk_size_group_add_widget(labelsg, check);
-
-	widget = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT,
-	                                       PIDGIN_BUTTON_HORIZONTAL);
-	gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(widgetsg, widget);
-	gtk_widget_set_sensitive(widget,
-	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name"));
-	g_signal_connect(G_OBJECT(check), "toggled",
-	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
-	g_signal_connect(G_OBJECT(widget), "clicked",
-	                 G_CALLBACK(purplerc_set_font_special), NULL);
-
-	/* key theme name */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-	check = pidgin_prefs_checkbox(_("GTK+ Text Shortcut Theme"),
-	                                "/plugins/gtk/purplerc/set/gtk-key-theme-name",
-	                                hbox);
-	gtk_size_group_add_widget(labelsg, check);
-
-	widget = pidgin_prefs_labeled_entry(hbox, "",
-	                                      "/plugins/gtk/purplerc/gtk-key-theme-name",
-	                                      NULL);
-	/*
-	gtk_size_group_add_widget(widgetsg, widget);
-	*/
-	gtk_widget_set_sensitive(widget,
-	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name"));
-	g_signal_connect(G_OBJECT(check), "toggled",
-	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
-
-	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-		check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
-		                                widget_bool_prefs_set[i], hbox);
-		gtk_size_group_add_widget(labelsg, check);
-
-		widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
-		/*
-		gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
-		*/
-		gtk_widget_set_sensitive(widget_bool_widgets[i],
-		                         purple_prefs_get_bool(widget_bool_prefs_set[i]));
-		g_signal_connect(G_OBJECT(check), "toggled",
-		                 G_CALLBACK(pidgin_toggle_sensitive),
-		                 widget_bool_widgets[i]);
-	}
-
-	frame = pidgin_make_frame(ret, _("Interface colors"));
-	/* imhtml stuff */
-	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
-		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-		check = pidgin_prefs_checkbox(_(color_names[i]),
-		                                color_prefs_set[i], hbox);
-		gtk_size_group_add_widget(labelsg, check);
-
-		color_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_COLOR, PIDGIN_BUTTON_HORIZONTAL);
-		gtk_size_group_add_widget(widgetsg, color_widgets[i]);
-		gtk_box_pack_start(GTK_BOX(hbox), color_widgets[i], FALSE,
-		                   FALSE, 0);
-		gtk_widget_set_sensitive(color_widgets[i],
-		                         purple_prefs_get_bool(color_prefs_set[i]));
-		g_signal_connect(G_OBJECT(check), "toggled",
-		                 G_CALLBACK(pidgin_toggle_sensitive),
-		                 color_widgets[i]);
-		g_signal_connect(G_OBJECT(color_widgets[i]), "clicked",
-		                 G_CALLBACK(purplerc_set_color),
-		                 GINT_TO_POINTER(i));
-	}
-
-	frame = pidgin_make_frame(ret, _("Widget Sizes"));
-	/* widget size stuff */
-	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
-		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-		check = pidgin_prefs_checkbox(_(widget_size_names[i]),
-		                                widget_size_prefs_set[i], hbox);
-		gtk_size_group_add_widget(labelsg, check);
-
-		widget_size_widgets[i] = pidgin_prefs_labeled_spin_button(hbox, "", widget_size_prefs[i], 0, 50, NULL);
-		/*
-		gtk_size_group_add_widget(widgetsg, widget_size_widgets[i]);
-		*/
-		gtk_widget_set_sensitive(widget_size_widgets[i],
-		                         purple_prefs_get_bool(widget_size_prefs_set[i]));
-		g_signal_connect(G_OBJECT(check), "toggled",
-		                 G_CALLBACK(pidgin_toggle_sensitive),
-		                 widget_size_widgets[i]);
-	}
-
-	frame = pidgin_make_frame(ret, _("Fonts"));
-	/* imhtml font stuff */
-	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
-		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-		check = pidgin_prefs_checkbox(_(font_names[i]),
-		                                font_prefs_set[i], hbox);
-		gtk_size_group_add_widget(labelsg, check);
-
-		font_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT, PIDGIN_BUTTON_HORIZONTAL);
-		gtk_size_group_add_widget(widgetsg, font_widgets[i]);
-		gtk_box_pack_start(GTK_BOX(hbox), font_widgets[i], FALSE,
-		                   FALSE, 0);
-		gtk_widget_set_sensitive(font_widgets[i],
-		                         purple_prefs_get_bool(font_prefs_set[i]));
-		g_signal_connect(G_OBJECT(check), "toggled",
-		                 G_CALLBACK(pidgin_toggle_sensitive),
-		                 font_widgets[i]);
-		g_signal_connect(G_OBJECT(font_widgets[i]), "clicked",
-		                 G_CALLBACK(purplerc_set_font), GINT_TO_POINTER(i));
-	}
-
-	frame = pidgin_make_frame(ret, _("Tools"));
-
-	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_box_pack_start(GTK_BOX(frame), vbox, FALSE, FALSE, 0);
-
-	tmp = g_strdup_printf(_("Write settings to %s%sgtkrc-2.0"), purple_user_dir(), G_DIR_SEPARATOR_S);
-	check = gtk_button_new_with_label(tmp);
-	g_free(tmp);
-	gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(labelsg, check);
-	g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(purplerc_write),
-	                 NULL);
-
-	check = gtk_button_new_with_label(_("Re-read gtkrc files"));
-	gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(labelsg, check);
-	g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(purplerc_reread),
-	                 NULL);
-
-	gtk_widget_show_all(ret);
-	return ret;
-}
-
-static PidginPluginUiInfo purplerc_ui_info =
-{
-	purplerc_get_config_frame,
-	0 /* page_num (Reserved) */
-};
-
-static PurplePluginInfo purplerc_info =
-{
-	PURPLE_PLUGIN_MAGIC,
-	PURPLE_MAJOR_VERSION,
-	PURPLE_MINOR_VERSION,
-	PURPLE_PLUGIN_STANDARD,
-	PIDGIN_PLUGIN_TYPE,
-	0,
-	NULL,
-	PURPLE_PRIORITY_DEFAULT,
-	"purplerc",
-	N_(PIDGIN_NAME " GTK+ Theme Control"),
-	VERSION,
-	N_("Provides access to commonly used gtkrc settings."),
-	N_("Provides access to commonly used gtkrc settings."),
-	"Etan Reisner <deryni@eden.rutgers.edu>",
-	PURPLE_WEBSITE,
-	purplerc_plugin_load,
-	purplerc_plugin_unload,
-	NULL,
-	&purplerc_ui_info,
-	NULL,
-	NULL,
-	NULL
-};
-
-static void
-purplerc_init(PurplePlugin *plugin)
-{
-	int i;
-
-	purple_prefs_add_none("/plugins");
-	purple_prefs_add_none("/plugins/gtk");
-	purple_prefs_add_none("/plugins/gtk/purplerc");
-	purple_prefs_add_none("/plugins/gtk/purplerc/set");
-
-	purple_prefs_add_string("/plugins/gtk/purplerc/gtk-font-name", "");
-	purple_prefs_add_bool("/plugins/gtk/purplerc/set/gtk-font-name", FALSE);
-
-	purple_prefs_add_string("/plugins/gtk/purplerc/gtk-key-theme-name", "");
-	purple_prefs_add_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name", FALSE);
-
-	purple_prefs_add_none("/plugins/gtk/purplerc/color");
-	purple_prefs_add_none("/plugins/gtk/purplerc/set/color");
-	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
-		purple_prefs_add_string(color_prefs[i], "");
-		purple_prefs_add_bool(color_prefs_set[i], FALSE);
-	}
-
-	purple_prefs_add_none("/plugins/gtk/purplerc/size");
-	purple_prefs_add_none("/plugins/gtk/purplerc/set/size");
-	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
-		purple_prefs_add_int(widget_size_prefs[i], 0);
-		purple_prefs_add_bool(widget_size_prefs_set[i], FALSE);
-	}
-
-	purple_prefs_add_none("/plugins/gtk/purplerc/font");
-	purple_prefs_add_none("/plugins/gtk/purplerc/set/font");
-	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
-		purple_prefs_add_string(font_prefs[i], "");
-		purple_prefs_add_bool(font_prefs_set[i], FALSE);
-	}
-
-	purple_prefs_add_none("/plugins/gtk/purplerc/bool");
-	purple_prefs_add_none("/plugins/gtk/purplerc/set/bool");
-	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-		purple_prefs_add_bool(widget_bool_prefs[i], TRUE);
-		purple_prefs_add_bool(widget_bool_prefs_set[i], FALSE);
-	}
-}
-
-PURPLE_INIT_PLUGIN(purplerc, purplerc_init, purplerc_info)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/pidginrc.c	Mon Mar 26 03:01:33 2007 +0000
@@ -0,0 +1,676 @@
+/**
+ * @file purplerc.c Purple gtk resource control plugin.
+ *
+ * Copyright (C) 2005 Etan Reisner <deryni@eden.rutgers.edu>
+ *
+ * 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 "internal.h"
+#include "gtkplugin.h"
+#include "gtkprefs.h"
+#include "gtkutils.h"
+#include "util.h"
+#include "version.h"
+
+static guint pref_callback;
+
+static const char *color_prefs[] = {
+	"/plugins/gtk/purplerc/color/GtkWidget::cursor-color",
+	"/plugins/gtk/purplerc/color/GtkWidget::secondary-cursor-color",
+	"/plugins/gtk/purplerc/color/GtkIMHtml::hyperlink-color"
+};
+static const char *color_prefs_set[] = {
+	"/plugins/gtk/purplerc/set/color/GtkWidget::cursor-color",
+	"/plugins/gtk/purplerc/set/color/GtkWidget::secondary-cursor-color",
+	"/plugins/gtk/purplerc/set/color/GtkIMHtml::hyperlink-color"
+};
+static const char *color_names[] = {
+	N_("Cursor Color"),
+	N_("Secondary Cursor Color"),
+	N_("Hyperlink Color")
+};
+static GtkWidget *color_widgets[G_N_ELEMENTS(color_prefs)];
+
+static const char *widget_size_prefs[] = {
+	"/plugins/gtk/purplerc/size/GtkTreeView::expander_size",
+	"/plugins/gtk/purplerc/size/GtkTreeView::horizontal_separator"
+};
+static const char *widget_size_prefs_set[] = {
+	"/plugins/gtk/purplerc/set/size/GtkTreeView::expander_size",
+	"/plugins/gtk/purplerc/set/size/GtkTreeView::horizontal_separator"
+};
+static const char *widget_size_names[] = {
+	N_("GtkTreeView Expander Size"),
+	N_("GtkTreeView Horizontal Separation")
+};
+static GtkWidget *widget_size_widgets[G_N_ELEMENTS(widget_size_prefs)];
+
+static const char *font_prefs[] = {
+	"/plugins/gtk/purplerc/font/*pidgin_conv_entry",
+	"/plugins/gtk/purplerc/font/*pidgin_conv_imhtml",
+	"/plugins/gtk/purplerc/font/*pidginlog_imhtml",
+	"/plugins/gtk/purplerc/font/*pidginrequest_imhtml",
+	"/plugins/gtk/purplerc/font/*pidginnotify_imhtml",
+};
+static const char *font_prefs_set[] = {
+	"/plugins/gtk/purplerc/set/font/*pidgin_conv_entry",
+	"/plugins/gtk/purplerc/set/font/*pidgin_conv_imhtml",
+	"/plugins/gtk/purplerc/set/font/*pidginlog_imhtml",
+	"/plugins/gtk/purplerc/set/font/*pidginrequest_imhtml",
+	"/plugins/gtk/purplerc/set/font/*pidginnotify_imhtml",
+};
+static const char *font_names[] = {
+	N_("Conversation Entry"),
+	N_("Conversation History"),
+	N_("Log Viewer"),
+	N_("Request Dialog"),
+	N_("Notify Dialog")
+};
+static GtkWidget *font_widgets[G_N_ELEMENTS(font_prefs)];
+
+static const char *widget_bool_prefs[] = {
+	"/plugins/gtk/purplerc/bool/GtkTreeView::indent_expanders",
+};
+static const char *widget_bool_prefs_set[] = {
+	"/plugins/gtk/purplerc/set/bool/GtkTreeView::indent_expanders",
+};
+static const char *widget_bool_names[] = {
+	N_("GtkTreeView Indent Expanders"),
+};
+static GtkWidget *widget_bool_widgets[G_N_ELEMENTS(widget_bool_prefs)];
+
+static void
+purplerc_make_changes()
+{
+	int i;
+	char *prefbase = NULL;
+#if GTK_CHECK_VERSION(2,4,0)
+	GtkSettings *setting = NULL;
+#endif
+	GString *style_string = g_string_new("");
+
+	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name")) {
+		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name");
+
+		if (pref != NULL && strcmp(pref, ""))
+			g_string_append_printf(style_string, "gtk-font-name = \"%s\"\n", pref);
+	}
+
+	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name")) {
+		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name");
+
+		if (pref != NULL && strcmp(pref, ""))
+			g_string_append_printf(style_string, "gtk-key-theme-name = \"%s\"\n", pref);
+	}
+
+	g_string_append(style_string, "style \"purplerc_style\" {\n");
+
+	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
+		if (purple_prefs_get_bool(color_prefs_set[i])) {
+			const char *pref;
+
+			prefbase = g_path_get_basename(color_prefs[i]);
+			pref = purple_prefs_get_string(color_prefs[i]);
+
+			if (pref != NULL && strcmp(pref, ""))
+			    g_string_append_printf(style_string,
+			                           "%s = \"%s\"\n",
+			                           prefbase, pref);
+			g_free(prefbase);
+		}
+	}
+
+	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
+		if (purple_prefs_get_bool(widget_size_prefs_set[i])) {
+			prefbase = g_path_get_basename(widget_size_prefs[i]);
+			g_string_append_printf(style_string,
+			                       "%s = %d\n", prefbase,
+			                       purple_prefs_get_int(widget_size_prefs[i]));
+			g_free(prefbase);
+		}
+	}
+
+	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+		if (purple_prefs_get_bool(widget_bool_prefs_set[i])) {
+			prefbase = g_path_get_basename(widget_bool_prefs[i]);
+			g_string_append_printf(style_string,
+			                       "%s = %d\n", prefbase,
+			                       purple_prefs_get_bool(widget_bool_prefs[i]));
+			g_free(prefbase);
+		}
+	}
+
+	g_string_append(style_string, "}");
+	g_string_append(style_string, "widget_class \"*\" style \"purplerc_style\"\n");
+
+	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
+		if (purple_prefs_get_bool(font_prefs_set[i])) {
+			const char *pref;
+
+			prefbase = g_path_get_basename(font_prefs[i]);
+			pref = purple_prefs_get_string(font_prefs[i]);
+
+			if (pref != NULL && strcmp(pref, ""))
+				g_string_append_printf(style_string,
+				                       "style \"%s_style\"\n"
+				                       "{font_name = \"%s\"}\n"
+				                       "widget \"%s\""
+				                       "style \"%s_style\"\n",
+				                       prefbase, pref,
+				                       prefbase, prefbase);
+			g_free(prefbase);
+		}
+	}
+
+	gtk_rc_parse_string(style_string->str);
+	g_string_free(style_string, TRUE);
+
+#if GTK_CHECK_VERSION(2,4,0)
+	setting = gtk_settings_get_default();
+	gtk_rc_reset_styles(setting);
+#endif
+}
+
+static void
+purplerc_write(GtkWidget *widget, gpointer data)
+{
+	int i;
+	GString *style_string = g_string_new("");
+	char *prefbase = NULL;
+
+	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name")) {
+		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name");
+
+		if (pref != NULL && strcmp(pref, ""))
+			g_string_append_printf(style_string,
+			                       "gtk-font-name = \"%s\"\n",
+			                       pref);
+	}
+
+	if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name")) {
+		const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name");
+
+		if (pref != NULL && strcmp(pref, ""))
+			g_string_append_printf(style_string,
+			                       "gtk-key-theme-name = \"%s\"\n",
+			                       pref);
+	}
+
+	g_string_append(style_string, "style \"purplerc_style\" {\n");
+
+	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
+		if (purple_prefs_get_bool(color_prefs_set[i])) {
+			const char *pref;
+
+			prefbase = g_path_get_basename(color_prefs[i]);
+			pref = purple_prefs_get_string(color_prefs[i]);
+
+			if (pref != NULL && strcmp(pref, ""))
+			    g_string_append_printf(style_string,
+			                           "%s = \"%s\"\n",
+			                           prefbase, pref);
+			g_free(prefbase);
+		}
+	}
+
+	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
+		if (purple_prefs_get_bool(widget_size_prefs_set[i])) {
+			prefbase = g_path_get_basename(widget_size_prefs[i]);
+			g_string_append_printf(style_string,
+			                       "%s = %d\n", prefbase,
+			                       purple_prefs_get_int(widget_size_prefs[i]));
+			g_free(prefbase);
+		}
+	}
+
+	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+		if (purple_prefs_get_bool(widget_bool_prefs_set[i])) {
+			prefbase = g_path_get_basename(widget_bool_prefs[i]);
+			g_string_append_printf(style_string,
+			                       "%s = %d\n", prefbase,
+			                       purple_prefs_get_bool(widget_bool_prefs[i]));
+			g_free(prefbase);
+		}
+	}
+
+	g_string_append(style_string, "}");
+	g_string_append(style_string, "widget_class \"*\" style \"purplerc_style\"\n");
+
+	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
+		if (purple_prefs_get_bool(font_prefs_set[i])) {
+			const char *pref;
+
+			prefbase = g_path_get_basename(font_prefs[i]);
+			pref = purple_prefs_get_string(font_prefs[i]);
+
+			if (pref != NULL && strcmp(pref, ""))
+				g_string_append_printf(style_string,
+				                       "style \"%s_style\"\n"
+				                       "{font_name = \"%s\"}\n"
+				                       "widget \"%s\""
+				                       "style \"%s_style\"\n",
+				                       prefbase, pref,
+				                       prefbase, prefbase);
+			g_free(prefbase);
+		}
+	}
+
+	purple_util_write_data_to_file("gtkrc-2.0", style_string->str, -1);
+
+	g_string_free(style_string, TRUE);
+}
+
+static void
+purplerc_reread(GtkWidget *widget, gpointer data)
+{
+	gtk_rc_reparse_all();
+	/* I don't know if this is necessary but if not it shouldn't hurt. */
+	purplerc_make_changes();
+}
+
+static void
+purplerc_pref_changed_cb(const char *name, PurplePrefType type,
+                       gconstpointer value, gpointer data)
+{
+	purplerc_make_changes();
+}
+
+static void
+purplerc_color_response(GtkDialog *color_dialog, gint response, gpointer data)
+{
+	int subscript = GPOINTER_TO_INT(data);
+
+	if (response == GTK_RESPONSE_OK) {
+		GtkWidget *colorsel = GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel;
+		GdkColor color;
+		char colorstr[8];
+
+		gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(colorsel), &color);
+
+		g_snprintf(colorstr, sizeof(colorstr), "#%02X%02X%02X",
+		           color.red/256, color.green/256, color.blue/256);
+
+		purple_prefs_set_string(color_prefs[subscript], colorstr);
+	}
+	gtk_widget_destroy(GTK_WIDGET(color_dialog));
+}
+
+static void
+purplerc_set_color(GtkWidget *widget, gpointer data)
+{
+	GtkWidget *color_dialog = NULL;
+	GdkColor color;
+	char title[128];
+	const char *pref = NULL;
+	int subscript = GPOINTER_TO_INT(data);
+
+	g_snprintf(title, sizeof(title), _("Select Color for %s"),
+	           _(color_names[GPOINTER_TO_INT(data)]));
+	color_dialog = gtk_color_selection_dialog_new(_("Select Color"));
+	g_signal_connect(G_OBJECT(color_dialog), "response",
+	                 G_CALLBACK(purplerc_color_response), data);
+
+	pref = purple_prefs_get_string(color_prefs[subscript]);
+
+	if (pref != NULL && strcmp(pref, "")) {
+		if (gdk_color_parse(pref, &color)) {
+			gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel), &color);
+		}
+	}
+
+	gtk_window_present(GTK_WINDOW(color_dialog));
+}
+
+static void
+purplerc_font_response(GtkDialog *font_dialog, gint response, gpointer data)
+{
+	int subscript = GPOINTER_TO_INT(data);
+
+	if (response == GTK_RESPONSE_OK) {
+		char *fontname = NULL;
+
+		fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_dialog));
+
+		purple_prefs_set_string(font_prefs[subscript], fontname);
+		g_free(fontname);
+	}
+	gtk_widget_destroy(GTK_WIDGET(font_dialog));
+}
+
+static void
+purplerc_set_font(GtkWidget *widget, gpointer data)
+{
+	GtkWidget *font_dialog = NULL;
+	char title[128];
+	const char *pref = NULL;
+	int subscript = GPOINTER_TO_INT(data);
+
+	g_snprintf(title, sizeof(title), _("Select Font for %s"),
+	           _(font_names[subscript]));
+	font_dialog = gtk_font_selection_dialog_new(title);
+	g_signal_connect(G_OBJECT(font_dialog), "response",
+	                 G_CALLBACK(purplerc_font_response), data);
+
+	pref = purple_prefs_get_string(font_prefs[subscript]);
+
+	if (pref != NULL && strcmp(pref, "")) {
+		gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font_dialog)->fontsel), pref);
+	}
+
+	gtk_window_present(GTK_WINDOW(font_dialog));
+}
+
+static void
+purplerc_font_response_special(GtkDialog *font_dialog, gint response,
+                             gpointer data)
+{
+	if (response == GTK_RESPONSE_OK) {
+		char *fontname = NULL;
+
+		fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_dialog));
+
+		purple_prefs_set_string("/plugins/gtk/purplerc/gtk-font-name",
+		                      fontname);
+		g_free(fontname);
+	}
+	gtk_widget_destroy(GTK_WIDGET(font_dialog));
+}
+
+static void
+purplerc_set_font_special(GtkWidget *widget, gpointer data)
+{
+	GtkWidget *font_dialog = NULL;
+	const char *pref = NULL;
+
+	font_dialog = gtk_font_selection_dialog_new(_("Select Interface Font"));
+	g_signal_connect(G_OBJECT(font_dialog), "response",
+	                 G_CALLBACK(purplerc_font_response_special), NULL);
+
+	pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name");
+
+	if (pref != NULL && strcmp(pref, "")) {
+		gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font_dialog)->fontsel), pref);
+	}
+
+	gtk_window_present(GTK_WINDOW(font_dialog));
+}
+
+static gboolean
+purplerc_plugin_load(PurplePlugin *plugin)
+{
+	purplerc_make_changes();
+
+	pref_callback = purple_prefs_connect_callback(plugin, "/plugins/gtk/purplerc",
+	                                            purplerc_pref_changed_cb, NULL);
+
+	return TRUE;
+}
+
+static gboolean
+purplerc_plugin_unload(PurplePlugin *plugin)
+{
+	purple_prefs_disconnect_callback(pref_callback);
+
+	return TRUE;
+}
+
+static GtkWidget *
+purplerc_get_config_frame(PurplePlugin *plugin)
+{
+	/* Note: Intentionally not using the size group argument to the
+	 * pidgin_prefs_labeled_* functions they only add the text label to
+	 * the size group not the whole thing, which isn't what I want. */
+	int i;
+	char *tmp;
+	GtkWidget *check = NULL, *widget = NULL;
+	GtkSizeGroup *labelsg = NULL, *widgetsg = NULL;
+	GtkWidget *ret = NULL, *frame = NULL, *hbox = NULL, *vbox = NULL;
+
+	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER);
+
+	labelsg  = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+	widgetsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+	frame = pidgin_make_frame(ret, _("General"));
+	/* interface font */
+	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+
+	check = pidgin_prefs_checkbox(_("GTK+ Interface Font"),
+	                                "/plugins/gtk/purplerc/set/gtk-font-name",
+	                                hbox);
+	gtk_size_group_add_widget(labelsg, check);
+
+	widget = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT,
+	                                       PIDGIN_BUTTON_HORIZONTAL);
+	gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
+	gtk_size_group_add_widget(widgetsg, widget);
+	gtk_widget_set_sensitive(widget,
+	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name"));
+	g_signal_connect(G_OBJECT(check), "toggled",
+	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
+	g_signal_connect(G_OBJECT(widget), "clicked",
+	                 G_CALLBACK(purplerc_set_font_special), NULL);
+
+	/* key theme name */
+	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+
+	check = pidgin_prefs_checkbox(_("GTK+ Text Shortcut Theme"),
+	                                "/plugins/gtk/purplerc/set/gtk-key-theme-name",
+	                                hbox);
+	gtk_size_group_add_widget(labelsg, check);
+
+	widget = pidgin_prefs_labeled_entry(hbox, "",
+	                                      "/plugins/gtk/purplerc/gtk-key-theme-name",
+	                                      NULL);
+	/*
+	gtk_size_group_add_widget(widgetsg, widget);
+	*/
+	gtk_widget_set_sensitive(widget,
+	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name"));
+	g_signal_connect(G_OBJECT(check), "toggled",
+	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
+
+	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+
+		check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
+		                                widget_bool_prefs_set[i], hbox);
+		gtk_size_group_add_widget(labelsg, check);
+
+		widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
+		/*
+		gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
+		*/
+		gtk_widget_set_sensitive(widget_bool_widgets[i],
+		                         purple_prefs_get_bool(widget_bool_prefs_set[i]));
+		g_signal_connect(G_OBJECT(check), "toggled",
+		                 G_CALLBACK(pidgin_toggle_sensitive),
+		                 widget_bool_widgets[i]);
+	}
+
+	frame = pidgin_make_frame(ret, _("Interface colors"));
+	/* imhtml stuff */
+	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
+		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+
+		check = pidgin_prefs_checkbox(_(color_names[i]),
+		                                color_prefs_set[i], hbox);
+		gtk_size_group_add_widget(labelsg, check);
+
+		color_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_COLOR, PIDGIN_BUTTON_HORIZONTAL);
+		gtk_size_group_add_widget(widgetsg, color_widgets[i]);
+		gtk_box_pack_start(GTK_BOX(hbox), color_widgets[i], FALSE,
+		                   FALSE, 0);
+		gtk_widget_set_sensitive(color_widgets[i],
+		                         purple_prefs_get_bool(color_prefs_set[i]));
+		g_signal_connect(G_OBJECT(check), "toggled",
+		                 G_CALLBACK(pidgin_toggle_sensitive),
+		                 color_widgets[i]);
+		g_signal_connect(G_OBJECT(color_widgets[i]), "clicked",
+		                 G_CALLBACK(purplerc_set_color),
+		                 GINT_TO_POINTER(i));
+	}
+
+	frame = pidgin_make_frame(ret, _("Widget Sizes"));
+	/* widget size stuff */
+	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
+		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+
+		check = pidgin_prefs_checkbox(_(widget_size_names[i]),
+		                                widget_size_prefs_set[i], hbox);
+		gtk_size_group_add_widget(labelsg, check);
+
+		widget_size_widgets[i] = pidgin_prefs_labeled_spin_button(hbox, "", widget_size_prefs[i], 0, 50, NULL);
+		/*
+		gtk_size_group_add_widget(widgetsg, widget_size_widgets[i]);
+		*/
+		gtk_widget_set_sensitive(widget_size_widgets[i],
+		                         purple_prefs_get_bool(widget_size_prefs_set[i]));
+		g_signal_connect(G_OBJECT(check), "toggled",
+		                 G_CALLBACK(pidgin_toggle_sensitive),
+		                 widget_size_widgets[i]);
+	}
+
+	frame = pidgin_make_frame(ret, _("Fonts"));
+	/* imhtml font stuff */
+	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
+		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+
+		check = pidgin_prefs_checkbox(_(font_names[i]),
+		                                font_prefs_set[i], hbox);
+		gtk_size_group_add_widget(labelsg, check);
+
+		font_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT, PIDGIN_BUTTON_HORIZONTAL);
+		gtk_size_group_add_widget(widgetsg, font_widgets[i]);
+		gtk_box_pack_start(GTK_BOX(hbox), font_widgets[i], FALSE,
+		                   FALSE, 0);
+		gtk_widget_set_sensitive(font_widgets[i],
+		                         purple_prefs_get_bool(font_prefs_set[i]));
+		g_signal_connect(G_OBJECT(check), "toggled",
+		                 G_CALLBACK(pidgin_toggle_sensitive),
+		                 font_widgets[i]);
+		g_signal_connect(G_OBJECT(font_widgets[i]), "clicked",
+		                 G_CALLBACK(purplerc_set_font), GINT_TO_POINTER(i));
+	}
+
+	frame = pidgin_make_frame(ret, _("Tools"));
+
+	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_box_pack_start(GTK_BOX(frame), vbox, FALSE, FALSE, 0);
+
+	tmp = g_strdup_printf(_("Write settings to %s%sgtkrc-2.0"), purple_user_dir(), G_DIR_SEPARATOR_S);
+	check = gtk_button_new_with_label(tmp);
+	g_free(tmp);
+	gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
+	gtk_size_group_add_widget(labelsg, check);
+	g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(purplerc_write),
+	                 NULL);
+
+	check = gtk_button_new_with_label(_("Re-read gtkrc files"));
+	gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
+	gtk_size_group_add_widget(labelsg, check);
+	g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(purplerc_reread),
+	                 NULL);
+
+	gtk_widget_show_all(ret);
+	return ret;
+}
+
+static PidginPluginUiInfo purplerc_ui_info =
+{
+	purplerc_get_config_frame,
+	0 /* page_num (Reserved) */
+};
+
+static PurplePluginInfo purplerc_info =
+{
+	PURPLE_PLUGIN_MAGIC,
+	PURPLE_MAJOR_VERSION,
+	PURPLE_MINOR_VERSION,
+	PURPLE_PLUGIN_STANDARD,
+	PIDGIN_PLUGIN_TYPE,
+	0,
+	NULL,
+	PURPLE_PRIORITY_DEFAULT,
+	"purplerc",
+	N_(PIDGIN_NAME " GTK+ Theme Control"),
+	VERSION,
+	N_("Provides access to commonly used gtkrc settings."),
+	N_("Provides access to commonly used gtkrc settings."),
+	"Etan Reisner <deryni@eden.rutgers.edu>",
+	PURPLE_WEBSITE,
+	purplerc_plugin_load,
+	purplerc_plugin_unload,
+	NULL,
+	&purplerc_ui_info,
+	NULL,
+	NULL,
+	NULL
+};
+
+static void
+purplerc_init(PurplePlugin *plugin)
+{
+	int i;
+
+	purple_prefs_add_none("/plugins");
+	purple_prefs_add_none("/plugins/gtk");
+	purple_prefs_add_none("/plugins/gtk/purplerc");
+	purple_prefs_add_none("/plugins/gtk/purplerc/set");
+
+	purple_prefs_add_string("/plugins/gtk/purplerc/gtk-font-name", "");
+	purple_prefs_add_bool("/plugins/gtk/purplerc/set/gtk-font-name", FALSE);
+
+	purple_prefs_add_string("/plugins/gtk/purplerc/gtk-key-theme-name", "");
+	purple_prefs_add_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name", FALSE);
+
+	purple_prefs_add_none("/plugins/gtk/purplerc/color");
+	purple_prefs_add_none("/plugins/gtk/purplerc/set/color");
+	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
+		purple_prefs_add_string(color_prefs[i], "");
+		purple_prefs_add_bool(color_prefs_set[i], FALSE);
+	}
+
+	purple_prefs_add_none("/plugins/gtk/purplerc/size");
+	purple_prefs_add_none("/plugins/gtk/purplerc/set/size");
+	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
+		purple_prefs_add_int(widget_size_prefs[i], 0);
+		purple_prefs_add_bool(widget_size_prefs_set[i], FALSE);
+	}
+
+	purple_prefs_add_none("/plugins/gtk/purplerc/font");
+	purple_prefs_add_none("/plugins/gtk/purplerc/set/font");
+	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
+		purple_prefs_add_string(font_prefs[i], "");
+		purple_prefs_add_bool(font_prefs_set[i], FALSE);
+	}
+
+	purple_prefs_add_none("/plugins/gtk/purplerc/bool");
+	purple_prefs_add_none("/plugins/gtk/purplerc/set/bool");
+	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+		purple_prefs_add_bool(widget_bool_prefs[i], TRUE);
+		purple_prefs_add_bool(widget_bool_prefs_set[i], FALSE);
+	}
+}
+
+PURPLE_INIT_PLUGIN(purplerc, purplerc_init, purplerc_info)
--- a/pidgin/win32/pidgin_exe_rc.rc.in	Sat Mar 24 20:25:01 2007 +0000
+++ b/pidgin/win32/pidgin_exe_rc.rc.in	Mon Mar 26 03:01:33 2007 +0000
@@ -33,4 +33,4 @@
     END
   END
 
-PURPLE_ICON			ICON PIXMAPDIR "gaim.ico"
+PURPLE_ICON			ICON PIXMAPDIR "pidgin.ico"
--- a/po/POTFILES.in	Sat Mar 24 20:25:01 2007 +0000
+++ b/po/POTFILES.in	Mon Mar 26 03:01:33 2007 +0000
@@ -38,7 +38,7 @@
 libpurple/desktopitem.c
 libpurple/dnsquery.c
 libpurple/ft.c
-libpurple/gconf/gaim.schemas.in
+libpurple/gconf/purple.schemas.in
 libpurple/log.c
 libpurple/plugin.c
 libpurple/plugins/autoaccept.c
@@ -181,7 +181,6 @@
 pidgin/plugins/convcolors.c
 pidgin/plugins/extplacement.c
 pidgin/plugins/gaiminc.c
-pidgin/plugins/gaimrc.c
 pidgin/plugins/gestures/gestures.c
 pidgin/plugins/gevolution/add_buddy_dialog.c
 pidgin/plugins/gevolution/assoc-buddy.c
@@ -196,6 +195,7 @@
 pidgin/plugins/markerline.c
 pidgin/plugins/musicmessaging/musicmessaging.c
 pidgin/plugins/notify.c
+pidgin/plugins/pidginrc.c
 pidgin/plugins/raw.c
 pidgin/plugins/relnot.c
 pidgin/plugins/spellchk.c