Mercurial > pidgin.yaz
changeset 15927: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 <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 @-)
--- 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>
--- /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