Thu, 17 Aug 2000 08:35:34 +0000
[gaim-migrate @ 718]
la la la
| 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
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
8 | If you're going to hack gaim, PLEASE, PLEASE PLEASE PLEASE send patches |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
9 | against the absolute latest CVS. I get really annoyed when I get patches |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
10 | against the last released version, especially since I don't usually have |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
11 | a copy of it on my computer, and gaim tends to change a lot between |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
12 | versions. (I sometimes get annoyed when they're against CVS from 3 days |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
13 | ago, but can't complain because it's usually my fault that I haven't |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
14 | looked at the patch yet.) To get gaim from CVS (if you haven't already), |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
15 | run the following commands: |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
16 | |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
17 | $ export CVSROOT=anonymous@cvs.gaim.sourceforge.net:/cvsroot/gaim |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
18 | $ cvs login |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
19 | (hit enter as the password) |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
20 | $ cvs co gaim |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
21 | (you'll see it getting all of the files) |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
22 | $ cd gaim |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
23 | $ ./gen |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
24 | |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
25 | You'll now have your normal gaim tree with ./configure and all. (If you |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
26 | want to make your life really simple, learn how CVS works. CVS is your |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
27 | friend.) |
|
c4285ce27acc
[gaim-migrate @ 718]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
706
diff
changeset
|
28 | |
| 639 | 29 | There's one little thing that's just a pet peeve, and it's really stupid. |
|
706
6eb097e6cc24
[gaim-migrate @ 716]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
85f0ef25fe51
[gaim-migrate @ 694]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
639
diff
changeset
|
37 | This was written around August 8, 2000. It's now August 15, 2000, and I'm |
|
85f0ef25fe51
[gaim-migrate @ 694]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
639
diff
changeset
|
38 | sure a lot of it is already out of date. |
|
85f0ef25fe51
[gaim-migrate @ 694]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
6eb097e6cc24
[gaim-migrate @ 716]
Eric Warmenhoven <warmenhoven@yahoo.com>
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 | |
| 146 | global variable to TRUE. | |
| 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 :) |