comparison doc/C-HOWTO.dox @ 10468:87d2f1a7f984

[gaim-migrate @ 11750] a newwer plugin how to brought to you by grim committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Mon, 03 Jan 2005 18:20:22 +0000
parents
children 51b87da4e9f0
comparison
equal deleted inserted replaced
10467:cbbf5af9e520 10468:87d2f1a7f984
1 /** @page c-howto C Plugin HOWTO
2
3 @section Introduction
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
6 well as the perl and tcl loader plugins are written in C.
7
8 @section getting_started Getting Started
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.
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
13 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 Gaim puts a lot of strain on Source Forge's servers, and we do not need to
16 add anymore to it.
17
18 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 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 that most packages compile and install gaim with /usr as the prefix.
23
24 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 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 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 down, so let's try to avoid it at all costs ;)
31
32 @section hello_world Hello World!
33 I know every tutorial has a hello world, so why should gaim be any different?
34
35 @code
36 #define GAIM_PLUGINS
37
38 #include <glib.h>
39
40 #include "notify.h"
41 #include "plugin.h"
42 #include "version.h"
43
44 static gboolean
45 plugin_load(GaimPlugin *plugin) {
46 gaim_notify_message(plugin, GAIM_NOTIFY_MSG_INFO, "Hello World!",
47 "This is the Hello World! plugin :)", NULL, NULL, NULL);
48
49 return TRUE;
50 }
51
52 static GaimPluginInfo info = {
53 GAIM_PLUGIN_MAGIC,
54 GAIM_MAJOR_VERSION,
55 GAIM_MINOR_VERSION,
56 GAIM_PLUGIN_STANDARD,
57 NULL,
58 0,
59 NULL,
60 GAIM_PRIORITY_DEFAULT,
61
62 "core-hello_world",
63 "Hello World!",
64 VERSION,
65
66 "Hello World Plugin",
67 "Hello World Plugin",
68 NULL,
69 GAIM_WEBSITE,
70
71 plugin_load,
72 NULL,
73 NULL,
74
75 NULL,
76 NULL,
77 NULL,
78 NULL
79 };
80
81 static void
82 init_plugin(GaimPlugin *plugin) {
83 }
84
85 GAIM_INIT_PLUGIN(hello_world, init_plugin, info);
86
87 @endcode
88
89 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 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 well do the same.
94
95 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 and @c GAIM_INIT_PLUGIN().
98
99 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 that they are required and will stop your plugin from crashing Gaim when
102 something has changed that you plugin does not know about yet.
103
104 plugin_load is not required. It is called when the plugin is loaded, so you
105 can initialize any variables and so on. But in this plugin we'll just use it
106 to display a message.
107
108 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 comments describing what each is.
111
112 @code
113 static GaimPluginInfo info = {
114 GAIM_PLUGIN_MAGIC, /* Plugin magic, this should always be
115 GAIM_PLUGIN_MAGIC. This value gets
116 incremented inside of gaim so that plugins
117 that haven't been updated yet, will fail to
118 load and avoid potential crashes while
119 loading old plugins.
120 */
121 GAIM_MAJOR_VERSION, /* This is also define in gaim. It helps
122 Gaim's plugin system tell what version of
123 this plugin was compiled for, and whether
124 or not loading it will cause problems
125 */
126 GAIM_MINOR_VERSION, /* See previous */
127 GAIM_PLUGIN_STANDARD, /* GaimPluginType, there are 4 different values
128 for this field. The first is
129 GAIM_PLUGIN_UNKNOWN, which should not be
130 used. The second is GAIM_PLUGIN_STANDARD,
131 this is the value most plugins will use.
132 Next we have GAIM_PLUGIN_LOADER, this is
133 the type you want to load if you're plugin
134 is going to make it possible to load non
135 native plugins. For example, perl and tcl.
136 Last, we have GAIM_PLUGIN_PROTOCOL. If
137 your plugin is going to allow the user to
138 connect to another network, this is the
139 type you'd want to use.
140 */
141 NULL, /* This field is the ui requirement. This
142 value should be a string. If you're
143 writing a core plugin, this should be NULL
144 and the plugin should not contain any ui
145 specific code. If you're writing a gtk
146 plugin, you can use the
147 GAIM_GTK_PLUGIN_TYPE macro. All other ui
148 plugins are dependent on their ui
149 implementation, and is outside the scope of
150 this howto.
151 */
152 0, /* This field is for plugin flags. Currently,
153 the only flag available to plugins is
154 invisible (GAIM_PLUGIN_FLAG_INVISIBLE).
155 The only plugins that current use this flag,
156 is the ssl plugin.
157 */
158 NULL, /* This is a glist of plugin dependencies. In
159 other words, a glist of plugin id's that
160 your plugin depends on. If your plugin
161 does not have any dependencies, set this
162 value to NULL
163 */
164 GAIM_PRIORITY_DEFAULT, /* This is the priority gaim with give your
165 plugin. There are three possible values
166 for this field, GAIM_PRIORITY_DEFAULT,
167 GAIM_PRIORITY_HIGHEST, and
168 GAIM_PRIORITY_LOWEST
169 */
170
171 "core-hello_world", /* This is your plugin's id. There is a whole
172 page dedicated to this in the
173 'related-pages' section of the doxygen api.
174 */
175 "Hello World!", /* This is your plugin name. This is what
176 will be displayed for your plugin in the ui.
177 */
178 VERSION, /* This is the version of your plugin. For
179 the sake of simplicity, I'm using the gaim
180 version.
181 */
182
183 "Hello World Plugin", /* This is the summary of your plugin. It
184 should be a short little blurb. The ui
185 determines where, if at all, to display
186 this.
187 */
188 "Hello World Plugin", /* This is the description of your plugin. It
189 can be as long and as descriptive as you
190 like. And like the summary, it's up to the
191 ui where, if at all, to display this.
192 */
193 NULL, /* This is where you can put your name and
194 email address. (You are the author right?)
195 */
196 GAIM_WEBSITE, /* This is the website for the plugin. This
197 is helpful if users find bugs in your
198 plugin so they can help to bring them to
199 your attention
200 */
201
202 plugin_load, /* This is a pointer to a function for gaim to
203 call when it is loading your plugin. It
204 should be in the form of:
205
206 gboolean function_name(GaimPlugin *plugin)
207
208 Returning TRUE will tell gaim to continue
209 loading your plugin, while FALSE will tell
210 gaim to stop trying to load it.
211 */
212 NULL, /* Same as above except it is called when
213 gaim tries to unload your plugin. It
214 should be in the form of:
215
216 gboolean function_name(GaimPlugin *plugin)
217
218 Where returning TRUE will tell gaim to
219 continue unloading and false to not continue
220 unloading your plugin.
221 */
222 NULL, /* Similar to the two above members, except
223 this is called when gaim tries to destory
224 the plugin. This is generally only called
225 when for some reason or another the plugin
226 fails to probe correctly. It should be in
227 the form of:
228
229 void function_name(GaimPlugin *plugin)
230 */
231
232 NULL, /* This is a pointer to a ui specific struct.
233 For a gtk plugin it will be a pointer to a
234 GaimGtkPluginUiInfo struct.
235 */
236 NULL, /* This is a pointer to either a
237 GaimPluginLoaderInfo struct or a
238 GaimPluginProtocolInfo struct, and is
239 beyond the scope of this document.
240 */
241 NULL, /* This is a pointer to a GaimPluginUiInfo
242 struct. It is a core/ui split way for
243 core plugins to have a ui configuration
244 frame. You can find an example of this
245 code in plugins/pluginpref_example.c
246 */
247 NULL /* Finally the last member of the structure,
248 is a function pointer where you can define
249 menu entries for 'Tools->Plugin Actions'.
250 It should be in the form of:
251
252 GList *function_name(GaimPlugin *plugin,
253 gpointer context)
254
255 It should return a GList of
256 GaimPluginActions.
257 */
258 };
259 @endcode
260
261 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
263 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
265 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
267 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
269 will get the infamous "plugin unloadable for unknown reasons", so do not
270 forget it.
271 */