Mercurial > pidgin.yaz
annotate HACKING @ 936:311b3f72e7b9
[gaim-migrate @ 946]
Sha la la la la la la, mmm, uh huh
Was down at the linux expo, starin' at this blue octane,
Mr. Flynn strikes up a conversation, with a black haired CS Major.
She codes in C while her father hacks, oh, she's suddenly geeky.
We all want something geeky, man I wish I was geeky.
So come hack in silence down through the morning,
sha la la la la la la la, yeah, uhh huh, yeah.
Cut up Mark Spencer, show me some of that free software, and pass
me a laptop, Mr. Flynn!
Believe in me! Help me believe in anything, cuz, I wanna be someone
geeky! Mr. Flynn and Me, tell each other linux tales, and we stare
at the beautiful penguins, it's lookin' at you, oh no no, it's looking
at me. Smiling in the CRT, Mp3's on the stero, when everyone's geeky,
you can never be lonely. Well I'm gonna hack a program, syntax highlighting
in blue and red and black and grey. All of the beautiful colours are very
very meaningingful.
Well you know C is my favorite language, I felt
so symbolic yesterday. If I knew R. Stallman, I'd buy myself a grey keyboard
and hack! Mr. Flynn and me look into the future! We stare at the beautiful
Penguins, it's lookin at me, I dont think so, It's looking at me. Hacking in
the CRT, I bought myself a grey keyboard, When everbody's geeky, I will never
be lonely. I will never be lonely. I'm never gonna be .. loonely.
I wanna be a penguin. Eeh -- everybody wanna pass as birds, they all wanna be
big big birds, but we got different reasons for that. Believe in me, cuz I
don't believe in anything. And I, wanna be someone, geeky, geeky, geeky,
yeaaaah! Mr. Flynn and me, storming through the expo, and we stare at the
beautiful penguin! It's coming for you, man there's got to be one for me!
I wanna be L. Torvalds, Mr. Flynn wishes he was someone just a little more
geeky, when everybody loves you, oh son! It's just about as geeky as you can
be! Mr. Flynn and me .. starin' at the penguins, when I look at slashdot I
wanna see me, staring right back at me. We all wanna be big geeks, but we
dont know why and we don't know how .. when everybody loves me I'll be just
about as geeky as I can be ... Mr. Flynn and me.. gonna be big geeks.
**bows and cheers**
Thank You, Thank You.
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Sun, 24 Sep 2000 22:48:54 +0000 |
parents | b61607d6c2af |
children | df664ea5eced |
rev | line source |
---|---|
639 | 1 A lot of people have tried to hack gaim, but haven't been able to because |
2 the code is just so horrid. Well, the code isn't getting better anytime | |
3 soon, so to help all you would-be hackers help out gaim, here's a brief | |
4 tutorial on how gaim works. I'll quickly describe the logical flow of | |
5 things, then what you'll find in each of the source files. Hopefully | |
6 that's enough to get most of you going. | |
7 | |
708
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
8 If you're going to hack gaim, PLEASE, PLEASE PLEASE PLEASE send patches |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
9 against the absolute latest CVS. I get really annoyed when I get patches |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
10 against the last released version, especially since I don't usually have |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
11 a copy of it on my computer, and gaim tends to change a lot between |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
12 versions. (I sometimes get annoyed when they're against CVS from 3 days |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
13 ago, but can't complain because it's usually my fault that I haven't |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
14 looked at the patch yet.) To get gaim from CVS (if you haven't already), |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
15 run the following commands: |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
16 |
774
b61607d6c2af
[gaim-migrate @ 784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
749
diff
changeset
|
17 $ export CVSROOT=:pserver:anonymous@cvs.gaim.sourceforge.net:/cvsroot/gaim |
708
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
18 $ cvs login |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
19 (hit enter as the password) |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
20 $ cvs co gaim |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
21 (you'll see it getting all of the files) |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
22 $ cd gaim |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
23 $ ./gen |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
24 |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
25 You'll now have your normal gaim tree with ./configure and all. (If you |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
26 want to make your life really simple, learn how CVS works. CVS is your |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
27 friend.) |
3ff8b997cd37
[gaim-migrate @ 718]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
706
diff
changeset
|
28 |
639 | 29 There's one little thing that's just a pet peeve, and it's really stupid. |
706
a9758452f3c4
[gaim-migrate @ 716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
684
diff
changeset
|
30 In ./configure there's an --enable-debug option. This does two things: |
639 | 31 compiles with -Wall, and prints debugging information to stdout. The |
32 debugging information is printed to the debug window (which can be turned | |
33 on in the preferences) whether or not --enable-debug was selected. Most | |
34 of the information that's printed is useless anyway though; so the | |
35 --enable-debug option really doesn't do a whole lot. | |
36 | |
684
b29c92be568b
[gaim-migrate @ 694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
639
diff
changeset
|
37 This was written around August 8, 2000. It's now August 15, 2000, and I'm |
b29c92be568b
[gaim-migrate @ 694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
639
diff
changeset
|
38 sure a lot of it is already out of date. |
b29c92be568b
[gaim-migrate @ 694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
639
diff
changeset
|
39 |
639 | 40 |
41 PROGRAM FLOW | |
42 ============ | |
43 | |
44 Before gaim does anything you can see, it initializes itself, which is | |
45 mostly just reading .gaimrc (handled by the functions in gaimrc.c). It | |
46 then draws the login window by calling show_login, and waits for input. | |
47 | |
48 At the login window, when "signon" is clicked, dologin() is called. This | |
49 in turn calls serv_login, which checks to see if you want to use Oscar or | |
50 TOC, and calls oscar_login or toc_login appropriately. We'll assume TOC | |
51 for the rest of this discussion; Oscar has a lot of bad hacks to get it | |
52 working that I don't even want to think about. | |
53 | |
54 After you're signed in (I'll skip that discussion - I doubt many people | |
706
a9758452f3c4
[gaim-migrate @ 716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
684
diff
changeset
|
55 are going to change the login process, since it pretty much just follows |
639 | 56 PROTOCOL), Gaim draws the buddy list by calling show_buddy_list, and |
57 waits for input from two places: the server and the user. The first place | |
58 it gets input from after signon is invariably the server, when the server | |
59 tells Gaim which buddies are signed on. | |
60 | |
61 When there is information ready to be read from the server, toc_callback | |
62 is called (by GDK) to parse the incoming information. On an UPDATE, | |
63 serv_got_update is called, which takes care of things like notifying | |
64 conversation windows of the update if need be; notifying the plugins; | |
65 and finally, calling set_buddy. | |
66 | |
67 set_buddy is one of the most frequently called functions in gaim, one of | |
68 the largest functions in gaim, and probably one of the buggiest functions | |
69 in gaim. It is responsible for updating the pixmaps in the buddy list; | |
70 notifying plugins of various events; updating the tooltips for buddies; | |
71 making sounds; and updating the ticker. It's also called once per online | |
72 buddy every 20 seconds (by GTK through update_all_buddies). | |
73 | |
74 When the user opens a new conversation window, new_conversation is called. | |
75 That's easy enough. If there isn't a conversation with the person already | |
76 open (checked by calling find_conversation), show_conv is called to | |
77 create the new window. All sorts of neat things happen there, but it's | |
78 mostly drawing the window. show_conv is the best place to edit the UI. Be | |
79 prepared for some incredibly bad GTK programming. (Rob's fixing this as | |
80 we speak no doubt.) | |
81 | |
82 That's pretty much it for the quick tutorial. I know it wasn't much but | |
83 it's enough to get you started. Make sure you know GTK before you get too | |
84 involved. Most of the back-end stuff is pretty basic; most of gaim is GTK. | |
85 | |
86 | |
87 SOURCE FILES | |
88 ============ | |
89 | |
90 about.c: | |
91 Not much to say here, just a few basic functions. | |
92 | |
93 aim.c: | |
94 This is where the main() function is. It takes care of a lot of the | |
95 initialization stuff, and showing the login window. It's pretty tiny | |
96 and there's not really much to edit in it. Watch out for bad Oscar | |
97 sign in hacks. | |
98 | |
99 away.c: | |
100 This takes care of most of the away stuff: setting the away message | |
101 (do_im_away); coming back (do_im_back); drawing the away window; | |
102 etc. To be honest I haven't looked at this file in months. | |
103 | |
104 browser.c: | |
105 Code for opening a browser window. Most of the code is trying to deal | |
106 with Netscape. The most important function here is open_url. Have fun. | |
107 | |
108 buddy.c: | |
109 This takes care of not only nearly everything buddy-related (the buddy | |
110 list, the permit/deny lists, and the window), but also a lot of the | |
111 code flow and util functions. Look for good things like find_buddy, | |
112 set_buddy, and signoff() here. | |
113 | |
114 buddy_chat.c: | |
115 This takes care of the buddy chat stuff. This used to be a lot bigger | |
116 until the chat and IM windows got merged in the code. Now it mostly | |
117 just takes care of chat-specific stuff, like ignoring people and | |
118 keeping track of who's in the room. This is also where the chat window | |
119 is created. | |
120 | |
121 conversation.c: | |
122 This is where most of the functions dealing with the IM and chat windows | |
123 are hidden. It tries to abstract things as much as possible, but doesn't | |
124 do a very good job. This is also where things like "Enter sends" and | |
125 "Ctrl-{B/I/U/S}" options get carried out (look for send_callback). The | |
126 chat and IM toolbar (with the B/I/U/S buttons) are both built from the | |
127 same function, build_conv_toolbar. | |
128 | |
129 dialogs.c: | |
130 A massive file with a lot of little utility functions. This is where | |
131 all of those little dialog windows are created. Things like the warn | |
132 dialog and the add buddy dialog are here. Not all of the dialogs in | |
133 gaim are in this file, though. But most of them are. This is also | |
134 where do_import is housed, to import buddy lists. | |
135 | |
136 gaimrc.c: | |
137 This controls everything about the .gaimrc file. There's not really much | |
138 to say about it; this is probably one of the better designed and easier | |
139 to follow files in gaim. The important functions are towards the bottom. | |
140 | |
141 gnome_applet_mgr.c: | |
142 A hideous creation from the days before I started working on gaim. Most | |
143 of it works, but it has functionsLikeThis. I hate looking at this | |
144 file, but I'm too lazy to change the functions. The best functions | |
145 are things like set_applet_draw_open, whose sole purpose is to set a | |
749
94edd99b7302
[gaim-migrate @ 759]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
708
diff
changeset
|
146 global variable to TRUE. [ note 8/22/00 - I finally changed this file. ] |
639 | 147 |
148 gtkhtml.c: | |
149 This is really just one big hack. It started off as an HTML widget that | |
150 was written for Gnome as far as I can tell. The current version is | |
151 huge, requires way too many libs, and is too hard to upgrade to. But | |
152 we've managed to hack this poor old version into basically what we | |
153 need it for. I recommend not looking at this file if you want to save | |
154 your sanity. | |
155 | |
156 gtkticker.c: | |
157 Syd, our resident GTK God, wrote a GtkWidget, GtkTicker. This is that | |
158 widget. It's cool, and it's tiny. | |
159 | |
160 html.c: | |
161 Don't ask my why this is called html.c. Most of it is just grab_url, | |
162 which does like the name says; it downloads a URL to show in the | |
163 GtkHTML widget. http.c would be a more appropriate name, but that's OK. | |
164 | |
165 idle.c: | |
166 There is a very good reason why this file is still on version 1.1 | |
167 in CVS. The entire thing is #if 0'd out. I haven't ever really taken | |
168 a good look at it, but I think what it was supposed to have done is | |
169 set you as being away when a screensaver came on. | |
170 | |
171 network.c: | |
172 This has two functions: get_address and connect_address, both of which | |
173 call proxy functions. If you want to see how these are used, look at | |
174 toc.c and/or rvous.c. These are really just front-ends to the proxy | |
175 stuff; use these instead of calling the proxy functions. | |
176 | |
177 oscar.c: | |
178 One big hack of copied code. This is supposed to be the libfaim tie-in | |
179 in gaim. Most of it is just copied straight from faimtest, the small | |
180 program that comes with libfaim. I'm not even sure how half of it works, | |
181 if that makes you feel any better. | |
182 | |
183 perl.c: | |
184 This was basically copied straight from X-Chat through the power of | |
185 the GPL. Perl is the biggest, most confusing piece of C code I've ever | |
186 seen in my life (and keep in mind I'm a gaim hacker). I have a basic | |
187 idea of what's going on in it, but I couldn't tell you exactly. The | |
188 top half sets up perl and tells it what's going on and the bottom half | |
189 implements the AIM module. | |
190 | |
191 plugins.c: | |
192 This is the "plugin plug", as the file states. This file is probably | |
193 the only file in all of gaim that at the top has all of the functions | |
194 and global and static variables named out for you. It makes reading | |
195 it a little easier, but not by much. A lot of the code in here deals | |
196 with the plugin window rather than the plugins themselves. | |
197 | |
198 prefs.c: | |
199 The important function in here is build_prefs, but the most useful | |
200 function is gaim_button. build_prefs draws the window, and calls | |
201 gaim_button probably 30 or 40 times. (I don't really wanna run grep | |
202 | wc to count.) This is where you add the toggle button for gaim | |
203 preferences. It's very simple, and if you look at a couple of the | |
204 calls to gaim_button you'll figure it out right away. | |
205 | |
206 proxy.c: | |
207 This is where the bulk of the actual networking code is done. The big | |
208 function here is proxy_connect, which will connect through the proxy | |
209 setup you've chosen (most of which don't work...) or just regularly. | |
210 | |
211 rvous.c: | |
212 This was originally going to be the stuff for all of the Buddy Icon | |
213 and Voice Chat stuff, but I got really sick of protocol hacking really | |
214 quick. Now it only houses the file transfer stuff, which only works | |
215 for TOC. | |
216 | |
217 server.c: | |
218 This is where all of the differentiation between TOC and Oscar is | |
219 done. Nearly everything that's network related goes through here | |
220 at one point or another. This has good things like serv_send_im and | |
221 serv_got_update. Most of it should be pretty self-explanatory. | |
222 | |
223 sound.c: | |
224 The big important function is play_sound, which plays one of 4 (actually | |
225 6) sounds. One of the sounds is called in 3 different events, which | |
226 is why there are actually 6 sounds. This then calls play which then | |
227 checks for esd, then nas if that's not available, then falls back | |
228 to /dev/audio. | |
229 | |
230 ticker.c: | |
231 Syd is just so cool. I really can't get over it. He let me come | |
232 visit him at Netscape one day, and I got to see all of their toys | |
233 (don't worry, I'm under an NDA). Anyway, this file is for the buddy | |
234 ticker. This is also a damn cool file because it's got all of the | |
235 functions that you'd want right up at the top. Someday I want to be | |
236 as cool as Syd. | |
237 | |
238 toc.c: | |
239 This handles everything TOC-related, including parsing gaim's buddy | |
240 list. Most of this file is toc_callback, which parses the incoming | |
241 information from the server. I really don't like TOC though. | |
242 | |
243 util.c: | |
244 There's not really a lot of cohesion to this file; it's just a lot of | |
245 stuff that happened to be thrown into it for no apparent reason. None | |
246 of it is particularly tasty; it's all just utility functions. Just | |
247 like the name says. | |
248 | |
249 | |
250 So that's our little tour of the internals of Gaim. It's really not | |
251 difficult to figure out if you've spent any time with GTK. I'm looking | |
252 forward to getting all of your patches :) |