10468
+ �� 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
10469
+ �� 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.
10468
+ �� 11 You may also want to develop against CVS. While we do NOT recomend this for
10469
+ �� 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
10468
+ �� 14 change between versions and it's much easier to fix your plugin as things
+ �� 15 change rather than waiting until the release. But please do not abuse CVS.
+ �� 16 Gaim puts a lot of strain on Source Forge's servers, and we do not need to
+ �� 17 add anymore to it.
+ �� 18
10469
+ �� 19 If you choose not to head my warnings and develop against a version of Gaim
+ �� 20 that is different from what you're running, then your Gaim source must at
10468
+ �� 21 the very least be configured. Note that just running configure will
+ �� 22 generally set the prefix to /usr/local. This shouldn't be a problem, except
10469
+ �� 23 that most packages compile and install Gaim with /usr as the prefix.
10468
+ �� 24
+ �� 25 All plugins must have @c GAIM_PLUGINS defined. You can choose to include
+ �� 26 @c internal.h to do this, but if you choose to do it this way it must be
10469
+ �� 27 included before any other Gaim files. Likewise, if you choose to manually
+ �� 28 define @c GAIM_PLUGINS, the definition must be before including any Gaim
10468
+ �� 29 files. Failure to do so will produce the 'plugin foo could not be loaded for
+ �� 30 an unknown reason'. This is one of the hardest unknown reasons to track
+ �� 31 down, so let's try to avoid it at all costs ;)
+ �� 32
+ �� 33 @section hello_world Hello World!
10469
+ �� 34 I know every tutorial has a hello world, so why should Gaim be any different?
10468
+ �� 35
+ �� 36 @code
+ �� 37 #define GAIM_PLUGINS
+ �� 38
+ �� 39 #include <glib.h>
+ �� 40
+ �� 41 #include "notify.h"
+ �� 42 #include "plugin.h"
+ �� 43 #include "version.h"
+ �� 44
+ �� 45 static gboolean
+ �� 46 plugin_load(GaimPlugin *plugin) {
+ �� 47 gaim_notify_message(plugin, GAIM_NOTIFY_MSG_INFO, "Hello World!",
+ �� 48 "This is the Hello World! plugin :)", NULL, NULL, NULL);
+ �� 49
+ �� 50 return TRUE;
+ �� 51 }
+ �� 52
+ �� 53 static GaimPluginInfo info = {
+ �� 54 GAIM_PLUGIN_MAGIC,
+ �� 55 GAIM_MAJOR_VERSION,
+ �� 56 GAIM_MINOR_VERSION,
+ �� 57 GAIM_PLUGIN_STANDARD,
+ �� 58 NULL,
+ �� 59 0,
+ �� 60 NULL,
+ �� 61 GAIM_PRIORITY_DEFAULT,
+ �� 62
+ �� 63 "core-hello_world",
+ �� 64 "Hello World!",
+ �� 65 VERSION,
+ �� 66
+ �� 67 "Hello World Plugin",
+ �� 68 "Hello World Plugin",
+ �� 69 NULL,
+ �� 70 GAIM_WEBSITE,
+ �� 71
+ �� 72 plugin_load,
+ �� 73 NULL,
+ �� 74 NULL,
+ �� 75
+ �� 76 NULL,
+ �� 77 NULL,
+ �� 78 NULL,
+ �� 79 NULL
+ �� 80 };
+ �� 81
+ �� 82 static void
+ �� 83 init_plugin(GaimPlugin *plugin) {
+ �� 84 }
+ �� 85
+ �� 86 GAIM_INIT_PLUGIN(hello_world, init_plugin, info);
+ �� 87
+ �� 88 @endcode
+ �� 89
+ �� 90 Okay, so what does all this mean? We start off by defining @c GAIM_PLUGINS
+ �� 91 like described before. Next we include glib.h, mainly for gboolean and the
+ �� 92 glib wrappers of the standard c types. We could just use stdio and use
10469
+ �� 93 an int for the gboolean but since Gaim uses glib internally, we might as
10468
+ �� 94 well do the same.
+ �� 95
+ �� 96 Next, we include plugin.h which has all the plugin specific stuff that we
+ �� 97 need. For example @c GaimPlugin, @c GaimPluginInfo, @c GAIM_PLUGIN_MAGIC,
+ �� 98 and @c GAIM_INIT_PLUGIN().
+ �� 99
+ �� 100 Our last include is version.h which defines @c GAIM_MAJOR_VERSION, and
10469
+ �� 101 @c GAIM_MINOR_VERSION. There is not much you need to know about these,
+ �� 102 except that they are required and will stop your plugin from crashing Gaim
+ �� 103 when something has changed that you plugin does not know about yet.
10468
+ �� 104
10469
+ �� 105 plugin_load is not required. It is called when the plugin is loaded so that
+ �� 106 you can initialize any variables and so on. But in this plugin we'll just
+ �� 107 use it to display a message.
10468
+ �� 108
+ �� 109 Next we have the @c GaimPluginInfo structure. Every plugin MUST have one of
+ �� 110 these. Below is a code snipet of the same struct used in @c hello_world with
+ �� 111 comments describing what each is.
+ �� 112
+ �� 113 @code
+ �� 114 static GaimPluginInfo info = {
+ �� 115 GAIM_PLUGIN_MAGIC, /* Plugin magic, this should always be
+ �� 116 GAIM_PLUGIN_MAGIC. This value gets
10469
+ �� 117 incremented inside of Gaim so that plugins
+ �� 118 that haven't been updated yet will fail to
10468
+ �� 119 load and avoid potential crashes while
+ �� 120 loading old plugins.
+ �� 121 */
10469
+ �� 122 GAIM_MAJOR_VERSION, /* This is also defined in Gaim. It helps
+ �� 123 Gaim's plugin system determine what version
+ �� 124 of Gaim this plugin was compiled for, and
+ �� 125 whether loading it will cause problems.
10468
+ �� 126 */
+ �� 127 GAIM_MINOR_VERSION, /* See previous */
+ �� 128 GAIM_PLUGIN_STANDARD, /* GaimPluginType, there are 4 different values
+ �� 129 for this field. The first is
+ �� 130 GAIM_PLUGIN_UNKNOWN, which should not be
+ �� 131 used. The second is GAIM_PLUGIN_STANDARD,
+ �� 132 this is the value most plugins will use.
+ �� 133 Next we have GAIM_PLUGIN_LOADER, this is
10469
+ �� 134 the type you want to load if your plugin
+ �� 135 is going to make it possible to load non-
10468
+ �� 136 native plugins. For example, perl and tcl.
+ �� 137 Last, we have GAIM_PLUGIN_PROTOCOL. If
+ �� 138 your plugin is going to allow the user to
+ �� 139 connect to another network, this is the
+ �� 140 type you'd want to use.
+ �� 141 */
+ �� 142 NULL, /* This field is the ui requirement. This
+ �� 143 value should be a string. If you're
+ �� 144 writing a core plugin, this should be NULL
+ �� 145 and the plugin should not contain any ui
+ �� 146 specific code. If you're writing a gtk
+ �� 147 plugin, you can use the
+ �� 148 GAIM_GTK_PLUGIN_TYPE macro. All other ui
+ �� 149 plugins are dependent on their ui
+ �� 150 implementation, and is outside the scope of
+ �� 151 this howto.
+ �� 152 */
+ �� 153 0, /* This field is for plugin flags. Currently,
+ �� 154 the only flag available to plugins is
+ �� 155 invisible (GAIM_PLUGIN_FLAG_INVISIBLE).
10469
+ �� 156 This plugin is currently used by the ssl
+ �� 157 plugin, the tcl loader, and the perl
+ �� 158 loaded. It causes the plugin to NOT
+ �� 159 appear in the list of plugins in Gaim's
+ �� 160 preferences window.
10468
+ �� 161 */
10469
+ �� 162 NULL, /* This is a GList of plugin dependencies. In
+ �� 163 other words, a GList of plugin id's that
10468
+ �� 164 your plugin depends on. If your plugin
+ �� 165 does not have any dependencies, set this
10469
+ �� 166 value to NULL.
10468
+ �� 167 */
10469
+ �� 168 GAIM_PRIORITY_DEFAULT, /* This is the priority Gaim with give your
10468
+ �� 169 plugin. There are three possible values
+ �� 170 for this field, GAIM_PRIORITY_DEFAULT,
+ �� 171 GAIM_PRIORITY_HIGHEST, and
+ �� 172 GAIM_PRIORITY_LOWEST
+ �� 173 */
+ �� 174
+ �� 175 "core-hello_world", /* This is your plugin's id. There is a whole
+ �� 176 page dedicated to this in the
10469
+ �� 177 'related-pages' section of Gaim's API docs.
10468
+ �� 178 */
+ �� 179 "Hello World!", /* This is your plugin name. This is what
+ �� 180 will be displayed for your plugin in the ui.
+ �� 181 */
10469
+ �� 182 1.1, /* This is the version of your plugin. For
+ �� 183 the sake of simplicity, I'm using the Gaim
10468
+ �� 184 version.
+ �� 185 */
+ �� 186
+ �� 187 "Hello World Plugin", /* This is the summary of your plugin. It
+ �� 188 should be a short little blurb. The ui
+ �� 189 determines where, if at all, to display
+ �� 190 this.
+ �� 191 */
+ �� 192 "Hello World Plugin", /* This is the description of your plugin. It
+ �� 193 can be as long and as descriptive as you
+ �� 194 like. And like the summary, it's up to the
+ �� 195 ui where, if at all, to display this.
+ �� 196 */
+ �� 197 NULL, /* This is where you can put your name and
+ �� 198 email address. (You are the author right?)
+ �� 199 */
+ �� 200 GAIM_WEBSITE, /* This is the website for the plugin. This
+ �� 201 is helpful if users find bugs in your
+ �� 202 plugin so they can help to bring them to
10469
+ �� 203 your attention.
10468
+ �� 204 */
+ �� 205
10469
+ �� 206 plugin_load, /* This is a pointer to a function for Gaim to
10468
+ �� 207 call when it is loading your plugin. It
+ �� 208 should be in the form of:
+ �� 209
+ �� 210 gboolean function_name(GaimPlugin *plugin)
+ �� 211
10469
+ �� 212 Returning TRUE will tell Gaim to continue
10468
+ �� 213 loading your plugin, while FALSE will tell
10469
+ �� 214 Gaim to stop trying to load it.
10468
+ �� 215 */
+ �� 216 NULL, /* Same as above except it is called when
10469
+ �� 217 Gaim tries to unload your plugin. It
10468
+ �� 218 should be in the form of:
+ �� 219
+ �� 220 gboolean function_name(GaimPlugin *plugin)
+ �� 221
10469
+ �� 222 Where returning TRUE will tell Gaim to
10468
+ �� 223 continue unloading and false to not continue
+ �� 224 unloading your plugin.
+ �� 225 */
+ �� 226 NULL, /* Similar to the two above members, except
10469
+ �� 227 this is called when Gaim tries to destory
10468
+ �� 228 the plugin. This is generally only called
+ �� 229 when for some reason or another the plugin
+ �� 230 fails to probe correctly. It should be in
+ �� 231 the form of:
+ �� 232
+ �� 233 void function_name(GaimPlugin *plugin)
+ �� 234 */
+ �� 235
+ �� 236 NULL, /* This is a pointer to a ui specific struct.
+ �� 237 For a gtk plugin it will be a pointer to a
+ �� 238 GaimGtkPluginUiInfo struct.
+ �� 239 */
+ �� 240 NULL, /* This is a pointer to either a
+ �� 241 GaimPluginLoaderInfo struct or a
+ �� 242 GaimPluginProtocolInfo struct, and is
+ �� 243 beyond the scope of this document.
+ �� 244 */
+ �� 245 NULL, /* This is a pointer to a GaimPluginUiInfo
+ �� 246 struct. It is a core/ui split way for
+ �� 247 core plugins to have a ui configuration
+ �� 248 frame. You can find an example of this
+ �� 249 code in plugins/pluginpref_example.c
+ �� 250 */
+ �� 251 NULL /* Finally the last member of the structure,
+ �� 252 is a function pointer where you can define
+ �� 253 menu entries for 'Tools->Plugin Actions'.
+ �� 254 It should be in the form of:
+ �� 255
+ �� 256 GList *function_name(GaimPlugin *plugin,
+ �� 257 gpointer context)
+ �� 258
+ �� 259 It should return a GList of
+ �� 260 GaimPluginActions.
+ �� 261 */
+ �� 262 };
+ �� 263 @endcode
+ �� 264
+ �� 265 Finally we have @c init_plugin and @c GAIM_INIT_PLUGIN. @c init_plugin is a
+ �� 266 function that gets called when Gaim probes the plugin. Most plugins will
+ �� 267 add their preferences to the pref tree here, more about that later.
10469
+ �� 268 @c GAIM_INIT_PLUGIN is a macro that EVERY plugin MUST have. @c GAIM_INIT_PLUGIN
+ �� 269 tells Gaim some very basic things about your plugin, like what name to use
10468
+ �� 270 if the plugin is compiled staticly, the @c init_plugin function, and
+ �� 271 the name of the @c GaimPluginInfo structure. As you may have guess this
+ �� 272 also gets read when Gaim is probing your plugin. If this is missing you
+ �� 273 will get the infamous "plugin unloadable for unknown reasons", so do not
+ �� 274 forget it.
+ �� 275 */