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
|
|
8 There's one little thing that's just a pet peeve, and it's really stupid.
|
|
9 In ./configure there's and --enable-debug option. This does two things:
|
|
10 compiles with -Wall, and prints debugging information to stdout. The
|
|
11 debugging information is printed to the debug window (which can be turned
|
|
12 on in the preferences) whether or not --enable-debug was selected. Most
|
|
13 of the information that's printed is useless anyway though; so the
|
|
14 --enable-debug option really doesn't do a whole lot.
|
|
15
|
|
16
|
|
17 PROGRAM FLOW
|
|
18 ============
|
|
19
|
|
20 Before gaim does anything you can see, it initializes itself, which is
|
|
21 mostly just reading .gaimrc (handled by the functions in gaimrc.c). It
|
|
22 then draws the login window by calling show_login, and waits for input.
|
|
23
|
|
24 At the login window, when "signon" is clicked, dologin() is called. This
|
|
25 in turn calls serv_login, which checks to see if you want to use Oscar or
|
|
26 TOC, and calls oscar_login or toc_login appropriately. We'll assume TOC
|
|
27 for the rest of this discussion; Oscar has a lot of bad hacks to get it
|
|
28 working that I don't even want to think about.
|
|
29
|
|
30 After you're signed in (I'll skip that discussion - I doubt many people
|
|
31 are going to change the login process, since it pretty much just folows
|
|
32 PROTOCOL), Gaim draws the buddy list by calling show_buddy_list, and
|
|
33 waits for input from two places: the server and the user. The first place
|
|
34 it gets input from after signon is invariably the server, when the server
|
|
35 tells Gaim which buddies are signed on.
|
|
36
|
|
37 When there is information ready to be read from the server, toc_callback
|
|
38 is called (by GDK) to parse the incoming information. On an UPDATE,
|
|
39 serv_got_update is called, which takes care of things like notifying
|
|
40 conversation windows of the update if need be; notifying the plugins;
|
|
41 and finally, calling set_buddy.
|
|
42
|
|
43 set_buddy is one of the most frequently called functions in gaim, one of
|
|
44 the largest functions in gaim, and probably one of the buggiest functions
|
|
45 in gaim. It is responsible for updating the pixmaps in the buddy list;
|
|
46 notifying plugins of various events; updating the tooltips for buddies;
|
|
47 making sounds; and updating the ticker. It's also called once per online
|
|
48 buddy every 20 seconds (by GTK through update_all_buddies).
|
|
49
|
|
50 When the user opens a new conversation window, new_conversation is called.
|
|
51 That's easy enough. If there isn't a conversation with the person already
|
|
52 open (checked by calling find_conversation), show_conv is called to
|
|
53 create the new window. All sorts of neat things happen there, but it's
|
|
54 mostly drawing the window. show_conv is the best place to edit the UI. Be
|
|
55 prepared for some incredibly bad GTK programming. (Rob's fixing this as
|
|
56 we speak no doubt.)
|
|
57
|
|
58 That's pretty much it for the quick tutorial. I know it wasn't much but
|
|
59 it's enough to get you started. Make sure you know GTK before you get too
|
|
60 involved. Most of the back-end stuff is pretty basic; most of gaim is GTK.
|
|
61
|
|
62
|
|
63 SOURCE FILES
|
|
64 ============
|
|
65
|
|
66 about.c:
|
|
67 Not much to say here, just a few basic functions.
|
|
68
|
|
69 aim.c:
|
|
70 This is where the main() function is. It takes care of a lot of the
|
|
71 initialization stuff, and showing the login window. It's pretty tiny
|
|
72 and there's not really much to edit in it. Watch out for bad Oscar
|
|
73 sign in hacks.
|
|
74
|
|
75 away.c:
|
|
76 This takes care of most of the away stuff: setting the away message
|
|
77 (do_im_away); coming back (do_im_back); drawing the away window;
|
|
78 etc. To be honest I haven't looked at this file in months.
|
|
79
|
|
80 browser.c:
|
|
81 Code for opening a browser window. Most of the code is trying to deal
|
|
82 with Netscape. The most important function here is open_url. Have fun.
|
|
83
|
|
84 buddy.c:
|
|
85 This takes care of not only nearly everything buddy-related (the buddy
|
|
86 list, the permit/deny lists, and the window), but also a lot of the
|
|
87 code flow and util functions. Look for good things like find_buddy,
|
|
88 set_buddy, and signoff() here.
|
|
89
|
|
90 buddy_chat.c:
|
|
91 This takes care of the buddy chat stuff. This used to be a lot bigger
|
|
92 until the chat and IM windows got merged in the code. Now it mostly
|
|
93 just takes care of chat-specific stuff, like ignoring people and
|
|
94 keeping track of who's in the room. This is also where the chat window
|
|
95 is created.
|
|
96
|
|
97 conversation.c:
|
|
98 This is where most of the functions dealing with the IM and chat windows
|
|
99 are hidden. It tries to abstract things as much as possible, but doesn't
|
|
100 do a very good job. This is also where things like "Enter sends" and
|
|
101 "Ctrl-{B/I/U/S}" options get carried out (look for send_callback). The
|
|
102 chat and IM toolbar (with the B/I/U/S buttons) are both built from the
|
|
103 same function, build_conv_toolbar.
|
|
104
|
|
105 dialogs.c:
|
|
106 A massive file with a lot of little utility functions. This is where
|
|
107 all of those little dialog windows are created. Things like the warn
|
|
108 dialog and the add buddy dialog are here. Not all of the dialogs in
|
|
109 gaim are in this file, though. But most of them are. This is also
|
|
110 where do_import is housed, to import buddy lists.
|
|
111
|
|
112 gaimrc.c:
|
|
113 This controls everything about the .gaimrc file. There's not really much
|
|
114 to say about it; this is probably one of the better designed and easier
|
|
115 to follow files in gaim. The important functions are towards the bottom.
|
|
116
|
|
117 gnome_applet_mgr.c:
|
|
118 A hideous creation from the days before I started working on gaim. Most
|
|
119 of it works, but it has functionsLikeThis. I hate looking at this
|
|
120 file, but I'm too lazy to change the functions. The best functions
|
|
121 are things like set_applet_draw_open, whose sole purpose is to set a
|
|
122 global variable to TRUE.
|
|
123
|
|
124 gtkhtml.c:
|
|
125 This is really just one big hack. It started off as an HTML widget that
|
|
126 was written for Gnome as far as I can tell. The current version is
|
|
127 huge, requires way too many libs, and is too hard to upgrade to. But
|
|
128 we've managed to hack this poor old version into basically what we
|
|
129 need it for. I recommend not looking at this file if you want to save
|
|
130 your sanity.
|
|
131
|
|
132 gtkticker.c:
|
|
133 Syd, our resident GTK God, wrote a GtkWidget, GtkTicker. This is that
|
|
134 widget. It's cool, and it's tiny.
|
|
135
|
|
136 html.c:
|
|
137 Don't ask my why this is called html.c. Most of it is just grab_url,
|
|
138 which does like the name says; it downloads a URL to show in the
|
|
139 GtkHTML widget. http.c would be a more appropriate name, but that's OK.
|
|
140
|
|
141 idle.c:
|
|
142 There is a very good reason why this file is still on version 1.1
|
|
143 in CVS. The entire thing is #if 0'd out. I haven't ever really taken
|
|
144 a good look at it, but I think what it was supposed to have done is
|
|
145 set you as being away when a screensaver came on.
|
|
146
|
|
147 network.c:
|
|
148 This has two functions: get_address and connect_address, both of which
|
|
149 call proxy functions. If you want to see how these are used, look at
|
|
150 toc.c and/or rvous.c. These are really just front-ends to the proxy
|
|
151 stuff; use these instead of calling the proxy functions.
|
|
152
|
|
153 oscar.c:
|
|
154 One big hack of copied code. This is supposed to be the libfaim tie-in
|
|
155 in gaim. Most of it is just copied straight from faimtest, the small
|
|
156 program that comes with libfaim. I'm not even sure how half of it works,
|
|
157 if that makes you feel any better.
|
|
158
|
|
159 perl.c:
|
|
160 This was basically copied straight from X-Chat through the power of
|
|
161 the GPL. Perl is the biggest, most confusing piece of C code I've ever
|
|
162 seen in my life (and keep in mind I'm a gaim hacker). I have a basic
|
|
163 idea of what's going on in it, but I couldn't tell you exactly. The
|
|
164 top half sets up perl and tells it what's going on and the bottom half
|
|
165 implements the AIM module.
|
|
166
|
|
167 plugins.c:
|
|
168 This is the "plugin plug", as the file states. This file is probably
|
|
169 the only file in all of gaim that at the top has all of the functions
|
|
170 and global and static variables named out for you. It makes reading
|
|
171 it a little easier, but not by much. A lot of the code in here deals
|
|
172 with the plugin window rather than the plugins themselves.
|
|
173
|
|
174 prefs.c:
|
|
175 The important function in here is build_prefs, but the most useful
|
|
176 function is gaim_button. build_prefs draws the window, and calls
|
|
177 gaim_button probably 30 or 40 times. (I don't really wanna run grep
|
|
178 | wc to count.) This is where you add the toggle button for gaim
|
|
179 preferences. It's very simple, and if you look at a couple of the
|
|
180 calls to gaim_button you'll figure it out right away.
|
|
181
|
|
182 proxy.c:
|
|
183 This is where the bulk of the actual networking code is done. The big
|
|
184 function here is proxy_connect, which will connect through the proxy
|
|
185 setup you've chosen (most of which don't work...) or just regularly.
|
|
186
|
|
187 rvous.c:
|
|
188 This was originally going to be the stuff for all of the Buddy Icon
|
|
189 and Voice Chat stuff, but I got really sick of protocol hacking really
|
|
190 quick. Now it only houses the file transfer stuff, which only works
|
|
191 for TOC.
|
|
192
|
|
193 server.c:
|
|
194 This is where all of the differentiation between TOC and Oscar is
|
|
195 done. Nearly everything that's network related goes through here
|
|
196 at one point or another. This has good things like serv_send_im and
|
|
197 serv_got_update. Most of it should be pretty self-explanatory.
|
|
198
|
|
199 sound.c:
|
|
200 The big important function is play_sound, which plays one of 4 (actually
|
|
201 6) sounds. One of the sounds is called in 3 different events, which
|
|
202 is why there are actually 6 sounds. This then calls play which then
|
|
203 checks for esd, then nas if that's not available, then falls back
|
|
204 to /dev/audio.
|
|
205
|
|
206 ticker.c:
|
|
207 Syd is just so cool. I really can't get over it. He let me come
|
|
208 visit him at Netscape one day, and I got to see all of their toys
|
|
209 (don't worry, I'm under an NDA). Anyway, this file is for the buddy
|
|
210 ticker. This is also a damn cool file because it's got all of the
|
|
211 functions that you'd want right up at the top. Someday I want to be
|
|
212 as cool as Syd.
|
|
213
|
|
214 toc.c:
|
|
215 This handles everything TOC-related, including parsing gaim's buddy
|
|
216 list. Most of this file is toc_callback, which parses the incoming
|
|
217 information from the server. I really don't like TOC though.
|
|
218
|
|
219 util.c:
|
|
220 There's not really a lot of cohesion to this file; it's just a lot of
|
|
221 stuff that happened to be thrown into it for no apparent reason. None
|
|
222 of it is particularly tasty; it's all just utility functions. Just
|
|
223 like the name says.
|
|
224
|
|
225
|
|
226 So that's our little tour of the internals of Gaim. It's really not
|
|
227 difficult to figure out if you've spent any time with GTK. I'm looking
|
|
228 forward to getting all of your patches :)
|