comparison doc/C-HOWTO.dox @ 10469:51b87da4e9f0

[gaim-migrate @ 11751] Documentation updates committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Tue, 04 Jan 2005 01:38:26 +0000
parents 87d2f1a7f984
children 8f910263b4bb
comparison
equal deleted inserted replaced
10468:87d2f1a7f984 10469:51b87da4e9f0
4 C plugins are native plugins. They have complete access to all of the api, 4 C plugins are native plugins. They have complete access to all of the api,
5 and can do basically whatever they want. All of the protocol plugins, as 5 and can do basically whatever they want. All of the protocol plugins, as
6 well as the perl and tcl loader plugins are written in C. 6 well as the perl and tcl loader plugins are written in C.
7 7
8 @section getting_started Getting Started 8 @section getting_started Getting Started
9 To develop a plugin you need to have the gaim source code. It is generally a 9 To develop a plugin you need to have the Gaim source code. It is generally a
10 good idea to compile against the same version of gaim that you are running. 10 good idea to compile against the same version of Gaim that you are running.
11 You may also want to develop against CVS. While we do NOT recomend this for 11 You may also want to develop against CVS. While we do NOT recomend this for
12 normal users, but there is an exception for developers. A lot tends to 12 normal users, it makes sense for plugin developers to use CVS to ensure their
13 plugins works with the most recent changes in Gaim. A lot tends to
13 change between versions and it's much easier to fix your plugin as things 14 change between versions and it's much easier to fix your plugin as things
14 change rather than waiting until the release. But please do not abuse CVS. 15 change rather than waiting until the release. But please do not abuse CVS.
15 Gaim puts a lot of strain on Source Forge's servers, and we do not need to 16 Gaim puts a lot of strain on Source Forge's servers, and we do not need to
16 add anymore to it. 17 add anymore to it.
17 18
18 If you choose not to head my warnings and develop against a version of gaim 19 If you choose not to head my warnings and develop against a version of Gaim
19 that is different from what you're running, then you're gaim source must at 20 that is different from what you're running, then your Gaim source must at
20 the very least be configured. Note that just running configure will 21 the very least be configured. Note that just running configure will
21 generally set the prefix to /usr/local. This shouldn't be a problem, except 22 generally set the prefix to /usr/local. This shouldn't be a problem, except
22 that most packages compile and install gaim with /usr as the prefix. 23 that most packages compile and install Gaim with /usr as the prefix.
23 24
24 All plugins must have @c GAIM_PLUGINS defined. You can choose to include 25 All plugins must have @c GAIM_PLUGINS defined. You can choose to include
25 @c internal.h to do this, but if you choose to do it this way it must be 26 @c internal.h to do this, but if you choose to do it this way it must be
26 included before any other gaim files. Likewise, if you choose to manually 27 included before any other Gaim files. Likewise, if you choose to manually
27 define @c GAIM_PLUGINS, the definition must be before including any gaim 28 define @c GAIM_PLUGINS, the definition must be before including any Gaim
28 files. Failure to do so will produce the 'plugin foo could not be loaded for 29 files. Failure to do so will produce the 'plugin foo could not be loaded for
29 an unknown reason'. This is one of the hardest unknown reasons to track 30 an unknown reason'. This is one of the hardest unknown reasons to track
30 down, so let's try to avoid it at all costs ;) 31 down, so let's try to avoid it at all costs ;)
31 32
32 @section hello_world Hello World! 33 @section hello_world Hello World!
33 I know every tutorial has a hello world, so why should gaim be any different? 34 I know every tutorial has a hello world, so why should Gaim be any different?
34 35
35 @code 36 @code
36 #define GAIM_PLUGINS 37 #define GAIM_PLUGINS
37 38
38 #include <glib.h> 39 #include <glib.h>
87 @endcode 88 @endcode
88 89
89 Okay, so what does all this mean? We start off by defining @c GAIM_PLUGINS 90 Okay, so what does all this mean? We start off by defining @c GAIM_PLUGINS
90 like described before. Next we include glib.h, mainly for gboolean and the 91 like described before. Next we include glib.h, mainly for gboolean and the
91 glib wrappers of the standard c types. We could just use stdio and use 92 glib wrappers of the standard c types. We could just use stdio and use
92 an int for the gboolean but since gaim uses glib internally, we might as 93 an int for the gboolean but since Gaim uses glib internally, we might as
93 well do the same. 94 well do the same.
94 95
95 Next, we include plugin.h which has all the plugin specific stuff that we 96 Next, we include plugin.h which has all the plugin specific stuff that we
96 need. For example @c GaimPlugin, @c GaimPluginInfo, @c GAIM_PLUGIN_MAGIC, 97 need. For example @c GaimPlugin, @c GaimPluginInfo, @c GAIM_PLUGIN_MAGIC,
97 and @c GAIM_INIT_PLUGIN(). 98 and @c GAIM_INIT_PLUGIN().
98 99
99 Our last include is version.h which defines @c GAIM_MAJOR_VERSION, and 100 Our last include is version.h which defines @c GAIM_MAJOR_VERSION, and
100 @c GAIM_MINOR_VERSION. Theres not much you need to know about these, except 101 @c GAIM_MINOR_VERSION. There is not much you need to know about these,
101 that they are required and will stop your plugin from crashing Gaim when 102 except that they are required and will stop your plugin from crashing Gaim
102 something has changed that you plugin does not know about yet. 103 when something has changed that you plugin does not know about yet.
103 104
104 plugin_load is not required. It is called when the plugin is loaded, so you 105 plugin_load is not required. It is called when the plugin is loaded so that
105 can initialize any variables and so on. But in this plugin we'll just use it 106 you can initialize any variables and so on. But in this plugin we'll just
106 to display a message. 107 use it to display a message.
107 108
108 Next we have the @c GaimPluginInfo structure. Every plugin MUST have one of 109 Next we have the @c GaimPluginInfo structure. Every plugin MUST have one of
109 these. Below is a code snipet of the same struct used in @c hello_world with 110 these. Below is a code snipet of the same struct used in @c hello_world with
110 comments describing what each is. 111 comments describing what each is.
111 112
112 @code 113 @code
113 static GaimPluginInfo info = { 114 static GaimPluginInfo info = {
114 GAIM_PLUGIN_MAGIC, /* Plugin magic, this should always be 115 GAIM_PLUGIN_MAGIC, /* Plugin magic, this should always be
115 GAIM_PLUGIN_MAGIC. This value gets 116 GAIM_PLUGIN_MAGIC. This value gets
116 incremented inside of gaim so that plugins 117 incremented inside of Gaim so that plugins
117 that haven't been updated yet, will fail to 118 that haven't been updated yet will fail to
118 load and avoid potential crashes while 119 load and avoid potential crashes while
119 loading old plugins. 120 loading old plugins.
120 */ 121 */
121 GAIM_MAJOR_VERSION, /* This is also define in gaim. It helps 122 GAIM_MAJOR_VERSION, /* This is also defined in Gaim. It helps
122 Gaim's plugin system tell what version of 123 Gaim's plugin system determine what version
123 this plugin was compiled for, and whether 124 of Gaim this plugin was compiled for, and
124 or not loading it will cause problems 125 whether loading it will cause problems.
125 */ 126 */
126 GAIM_MINOR_VERSION, /* See previous */ 127 GAIM_MINOR_VERSION, /* See previous */
127 GAIM_PLUGIN_STANDARD, /* GaimPluginType, there are 4 different values 128 GAIM_PLUGIN_STANDARD, /* GaimPluginType, there are 4 different values
128 for this field. The first is 129 for this field. The first is
129 GAIM_PLUGIN_UNKNOWN, which should not be 130 GAIM_PLUGIN_UNKNOWN, which should not be
130 used. The second is GAIM_PLUGIN_STANDARD, 131 used. The second is GAIM_PLUGIN_STANDARD,
131 this is the value most plugins will use. 132 this is the value most plugins will use.
132 Next we have GAIM_PLUGIN_LOADER, this is 133 Next we have GAIM_PLUGIN_LOADER, this is
133 the type you want to load if you're plugin 134 the type you want to load if your plugin
134 is going to make it possible to load non 135 is going to make it possible to load non-
135 native plugins. For example, perl and tcl. 136 native plugins. For example, perl and tcl.
136 Last, we have GAIM_PLUGIN_PROTOCOL. If 137 Last, we have GAIM_PLUGIN_PROTOCOL. If
137 your plugin is going to allow the user to 138 your plugin is going to allow the user to
138 connect to another network, this is the 139 connect to another network, this is the
139 type you'd want to use. 140 type you'd want to use.
150 this howto. 151 this howto.
151 */ 152 */
152 0, /* This field is for plugin flags. Currently, 153 0, /* This field is for plugin flags. Currently,
153 the only flag available to plugins is 154 the only flag available to plugins is
154 invisible (GAIM_PLUGIN_FLAG_INVISIBLE). 155 invisible (GAIM_PLUGIN_FLAG_INVISIBLE).
155 The only plugins that current use this flag, 156 This plugin is currently used by the ssl
156 is the ssl plugin. 157 plugin, the tcl loader, and the perl
157 */ 158 loaded. It causes the plugin to NOT
158 NULL, /* This is a glist of plugin dependencies. In 159 appear in the list of plugins in Gaim's
159 other words, a glist of plugin id's that 160 preferences window.
161 */
162 NULL, /* This is a GList of plugin dependencies. In
163 other words, a GList of plugin id's that
160 your plugin depends on. If your plugin 164 your plugin depends on. If your plugin
161 does not have any dependencies, set this 165 does not have any dependencies, set this
162 value to NULL 166 value to NULL.
163 */ 167 */
164 GAIM_PRIORITY_DEFAULT, /* This is the priority gaim with give your 168 GAIM_PRIORITY_DEFAULT, /* This is the priority Gaim with give your
165 plugin. There are three possible values 169 plugin. There are three possible values
166 for this field, GAIM_PRIORITY_DEFAULT, 170 for this field, GAIM_PRIORITY_DEFAULT,
167 GAIM_PRIORITY_HIGHEST, and 171 GAIM_PRIORITY_HIGHEST, and
168 GAIM_PRIORITY_LOWEST 172 GAIM_PRIORITY_LOWEST
169 */ 173 */
170 174
171 "core-hello_world", /* This is your plugin's id. There is a whole 175 "core-hello_world", /* This is your plugin's id. There is a whole
172 page dedicated to this in the 176 page dedicated to this in the
173 'related-pages' section of the doxygen api. 177 'related-pages' section of Gaim's API docs.
174 */ 178 */
175 "Hello World!", /* This is your plugin name. This is what 179 "Hello World!", /* This is your plugin name. This is what
176 will be displayed for your plugin in the ui. 180 will be displayed for your plugin in the ui.
177 */ 181 */
178 VERSION, /* This is the version of your plugin. For 182 1.1, /* This is the version of your plugin. For
179 the sake of simplicity, I'm using the gaim 183 the sake of simplicity, I'm using the Gaim
180 version. 184 version.
181 */ 185 */
182 186
183 "Hello World Plugin", /* This is the summary of your plugin. It 187 "Hello World Plugin", /* This is the summary of your plugin. It
184 should be a short little blurb. The ui 188 should be a short little blurb. The ui
194 email address. (You are the author right?) 198 email address. (You are the author right?)
195 */ 199 */
196 GAIM_WEBSITE, /* This is the website for the plugin. This 200 GAIM_WEBSITE, /* This is the website for the plugin. This
197 is helpful if users find bugs in your 201 is helpful if users find bugs in your
198 plugin so they can help to bring them to 202 plugin so they can help to bring them to
199 your attention 203 your attention.
200 */ 204 */
201 205
202 plugin_load, /* This is a pointer to a function for gaim to 206 plugin_load, /* This is a pointer to a function for Gaim to
203 call when it is loading your plugin. It 207 call when it is loading your plugin. It
204 should be in the form of: 208 should be in the form of:
205 209
206 gboolean function_name(GaimPlugin *plugin) 210 gboolean function_name(GaimPlugin *plugin)
207 211
208 Returning TRUE will tell gaim to continue 212 Returning TRUE will tell Gaim to continue
209 loading your plugin, while FALSE will tell 213 loading your plugin, while FALSE will tell
210 gaim to stop trying to load it. 214 Gaim to stop trying to load it.
211 */ 215 */
212 NULL, /* Same as above except it is called when 216 NULL, /* Same as above except it is called when
213 gaim tries to unload your plugin. It 217 Gaim tries to unload your plugin. It
214 should be in the form of: 218 should be in the form of:
215 219
216 gboolean function_name(GaimPlugin *plugin) 220 gboolean function_name(GaimPlugin *plugin)
217 221
218 Where returning TRUE will tell gaim to 222 Where returning TRUE will tell Gaim to
219 continue unloading and false to not continue 223 continue unloading and false to not continue
220 unloading your plugin. 224 unloading your plugin.
221 */ 225 */
222 NULL, /* Similar to the two above members, except 226 NULL, /* Similar to the two above members, except
223 this is called when gaim tries to destory 227 this is called when Gaim tries to destory
224 the plugin. This is generally only called 228 the plugin. This is generally only called
225 when for some reason or another the plugin 229 when for some reason or another the plugin
226 fails to probe correctly. It should be in 230 fails to probe correctly. It should be in
227 the form of: 231 the form of:
228 232
259 @endcode 263 @endcode
260 264
261 Finally we have @c init_plugin and @c GAIM_INIT_PLUGIN. @c init_plugin is a 265 Finally we have @c init_plugin and @c GAIM_INIT_PLUGIN. @c init_plugin is a
262 function that gets called when Gaim probes the plugin. Most plugins will 266 function that gets called when Gaim probes the plugin. Most plugins will
263 add their preferences to the pref tree here, more about that later. 267 add their preferences to the pref tree here, more about that later.
264 @GAIM_INIT_PLUGIN is a macro that EVERY plugin MUST have. @GAIM_INIT_PLUGIN 268 @c GAIM_INIT_PLUGIN is a macro that EVERY plugin MUST have. @c GAIM_INIT_PLUGIN
265 tells gaim some very basic things about your plugin, like what name to use 269 tells Gaim some very basic things about your plugin, like what name to use
266 if the plugin is compiled staticly, the @c init_plugin function, and 270 if the plugin is compiled staticly, the @c init_plugin function, and
267 the name of the @c GaimPluginInfo structure. As you may have guess this 271 the name of the @c GaimPluginInfo structure. As you may have guess this
268 also gets read when Gaim is probing your plugin. If this is missing you 272 also gets read when Gaim is probing your plugin. If this is missing you
269 will get the infamous "plugin unloadable for unknown reasons", so do not 273 will get the infamous "plugin unloadable for unknown reasons", so do not
270 forget it. 274 forget it.