pidgin/plugins/unity.c

changeset 35123
3d1148d9cb71
child 35125
6e13f4f28638
equal deleted inserted replaced
35118:c0334bd2d848 35123:3d1148d9cb71
1 /*
2 * Integration with Unity's messaging menu and launcher
3 * Copyright (C) 2013 Ankit Vani <a@nevitus.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
18 */
19 #include "internal.h"
20 #include "version.h"
21 #include "account.h"
22 #include "savedstatuses.h"
23
24 #include "gtkplugin.h"
25 #include "gtkconv.h"
26 #include "gtkutils.h"
27
28 #include <unity.h>
29 #include <messaging-menu.h>
30
31 #define UNITY_PLUGIN_ID "gtk-unity-integration"
32
33 static MessagingMenuApp *mmapp = NULL;
34 static UnityLauncherEntry *launcher = NULL;
35 static guint n_sources = 0;
36 static gint launcher_count;
37 static gint messaging_menu_text;
38 static gboolean alert_chat_nick = TRUE;
39
40 enum {
41 LAUNCHER_COUNT_DISABLE,
42 LAUNCHER_COUNT_MESSAGES,
43 LAUNCHER_COUNT_SOURCES,
44 };
45
46 enum {
47 MESSAGING_MENU_COUNT,
48 MESSAGING_MENU_TIME,
49 };
50
51 static int attach_signals(PurpleConversation *conv);
52 static void detach_signals(PurpleConversation *conv);
53
54 static void
55 update_launcher()
56 {
57 guint count = 0;
58 GList *convs = NULL;
59 g_return_if_fail(launcher != NULL);
60 if (launcher_count == LAUNCHER_COUNT_DISABLE)
61 return;
62
63 if (launcher_count == LAUNCHER_COUNT_MESSAGES) {
64 for (convs = purple_conversations_get_all(); convs != NULL; convs = convs->next) {
65 PurpleConversation *conv = convs->data;
66 count += GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv),
67 "unity-message-count"));
68 }
69 } else {
70 count = n_sources;
71 }
72
73 if (launcher != NULL) {
74 if (count > 0)
75 unity_launcher_entry_set_count_visible(launcher, TRUE);
76 else
77 unity_launcher_entry_set_count_visible(launcher, FALSE);
78 unity_launcher_entry_set_count(launcher, count);
79 }
80 }
81
82 static gchar *
83 conversation_id(PurpleConversation *conv)
84 {
85 PurpleAccount *account = purple_conversation_get_account(conv);
86
87 return g_strconcat((PURPLE_IS_IM_CONVERSATION(conv) ? "im" :
88 PURPLE_IS_CHAT_CONVERSATION(conv) ? "chat" : "misc"), ":",
89 purple_conversation_get_name(conv), ":",
90 purple_account_get_username(account), ":",
91 purple_account_get_protocol_id(account), NULL);
92 }
93
94 static void
95 messaging_menu_add_conversation(PurpleConversation *conv, gint count)
96 {
97 gchar *id;
98 g_return_if_fail(count > 0);
99 id = conversation_id(conv);
100
101 /* GBytesIcon may be useful for messaging menu source icons using buddy
102 icon data for IMs */
103 if (!messaging_menu_app_has_source(mmapp, id))
104 messaging_menu_app_append_source(mmapp, id, NULL,
105 purple_conversation_get_title(conv));
106
107 if (messaging_menu_text == MESSAGING_MENU_TIME)
108 messaging_menu_app_set_source_time(mmapp, id, g_get_real_time());
109 else if (messaging_menu_text == MESSAGING_MENU_COUNT)
110 messaging_menu_app_set_source_count(mmapp, id, count);
111 messaging_menu_app_draw_attention(mmapp, id);
112
113 g_free(id);
114 }
115
116 static void
117 messaging_menu_remove_conversation(PurpleConversation *conv)
118 {
119 gchar *id = conversation_id(conv);
120 if (messaging_menu_app_has_source(mmapp, id))
121 messaging_menu_app_remove_source(mmapp, id);
122 g_free(id);
123 }
124
125 static void
126 refill_messaging_menu()
127 {
128 GList *convs;
129
130 for (convs = purple_conversations_get_all(); convs != NULL; convs = convs->next) {
131 PurpleConversation *conv = convs->data;
132 messaging_menu_add_conversation(conv,
133 GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv),
134 "unity-message-count")));
135 }
136 }
137
138 static int
139 alert(PurpleConversation *conv)
140 {
141 gint count;
142 PidginWindow *purplewin = NULL;
143 if (conv == NULL || PIDGIN_CONVERSATION(conv) == NULL)
144 return 0;
145
146 purplewin = PIDGIN_CONVERSATION(conv)->win;
147
148 if (!pidgin_conv_window_has_focus(purplewin) ||
149 !pidgin_conv_window_is_active_conversation(conv))
150 {
151 count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv),
152 "unity-message-count"));
153 if (!count++)
154 ++n_sources;
155
156 g_object_set_data(G_OBJECT(conv), "unity-message-count",
157 GINT_TO_POINTER(count));
158 messaging_menu_add_conversation(conv, count);
159 update_launcher();
160 }
161
162 return 0;
163 }
164
165 static void
166 unalert(PurpleConversation *conv)
167 {
168 if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-message-count")) > 0)
169 --n_sources;
170
171 g_object_set_data(G_OBJECT(conv), "unity-message-count",
172 GINT_TO_POINTER(0));
173 messaging_menu_remove_conversation(conv);
174 update_launcher();
175 }
176
177 static int
178 unalert_cb(GtkWidget *widget, gpointer data, PurpleConversation *conv)
179 {
180 unalert(conv);
181 return 0;
182 }
183
184 static gboolean
185 message_displayed_cb(PurpleAccount *account, const char *who, char *message,
186 PurpleConversation *conv, PurpleMessageFlags flags)
187 {
188 if ((PURPLE_IS_CHAT_CONVERSATION(conv) && alert_chat_nick &&
189 !(flags & PURPLE_MESSAGE_NICK)))
190 return FALSE;
191
192 if ((flags & PURPLE_MESSAGE_RECV) && !(flags & PURPLE_MESSAGE_DELAYED))
193 alert(conv);
194
195 return FALSE;
196 }
197
198 static void
199 im_sent_im(PurpleAccount *account, const char *receiver, const char *message)
200 {
201 PurpleIMConversation *im = NULL;
202 im = purple_conversations_find_im_with_account(receiver, account);
203 unalert(PURPLE_CONVERSATION(im));
204 }
205
206 static void
207 chat_sent_im(PurpleAccount *account, const char *message, int id)
208 {
209 PurpleChatConversation *chat = NULL;
210 chat = purple_conversations_find_chat(purple_account_get_connection(account), id);
211 unalert(PURPLE_CONVERSATION(chat));
212 }
213
214 static void
215 conv_created(PurpleConversation *conv)
216 {
217 g_object_set_data(G_OBJECT(conv), "unity-message-count",
218 GINT_TO_POINTER(0));
219 attach_signals(conv);
220 }
221
222 static void
223 deleting_conv(PurpleConversation *conv)
224 {
225 detach_signals(conv);
226 unalert(conv);
227 }
228
229 static void
230 message_source_activated(MessagingMenuApp *app, const gchar *id,
231 gpointer user_data)
232 {
233 gchar **sections = g_strsplit(id, ":", 0);
234 PurpleConversation *conv = NULL;
235 PurpleAccount *account;
236 PidginWindow *purplewin = NULL;
237
238 char *type = sections[0];
239 char *cname = sections[1];
240 char *aname = sections[2];
241 char *protocol = sections[3];
242
243 account = purple_accounts_find(aname, protocol);
244
245 if (g_strcmp0(type, "im") == 0)
246 conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(cname, account));
247 else if (g_strcmp0(type, "chat") == 0)
248 conv = PURPLE_CONVERSATION(purple_conversations_find_chat_with_account(cname, account));
249 else
250 conv = purple_conversations_find_with_account(cname, account);
251
252 if (conv) {
253 unalert(conv);
254 purplewin = PIDGIN_CONVERSATION(conv)->win;
255 pidgin_conv_window_switch_gtkconv(purplewin, PIDGIN_CONVERSATION(conv));
256 gdk_window_focus(gtk_widget_get_window(purplewin->window), time(NULL));
257 }
258 g_strfreev (sections);
259 }
260
261 static PurpleSavedStatus *
262 create_transient_status(PurpleStatusPrimitive primitive, PurpleStatusType *status_type)
263 {
264 PurpleSavedStatus *saved_status = purple_savedstatus_new(NULL, primitive);
265
266 if(status_type != NULL) {
267 GList *tmp, *active_accts = purple_accounts_get_all_active();
268 for (tmp = active_accts; tmp != NULL; tmp = tmp->next) {
269 purple_savedstatus_set_substatus(saved_status,
270 (PurpleAccount*) tmp->data, status_type, NULL);
271 }
272 g_list_free(active_accts);
273 }
274
275 return saved_status;
276 }
277
278 static void
279 status_changed_cb(PurpleSavedStatus *saved_status)
280 {
281 MessagingMenuStatus status = MESSAGING_MENU_STATUS_AVAILABLE;
282
283 switch (purple_savedstatus_get_type(saved_status)) {
284 case PURPLE_STATUS_AVAILABLE:
285 case PURPLE_STATUS_MOOD:
286 case PURPLE_STATUS_TUNE:
287 case PURPLE_STATUS_UNSET:
288 status = MESSAGING_MENU_STATUS_AVAILABLE;
289 break;
290
291 case PURPLE_STATUS_AWAY:
292 case PURPLE_STATUS_EXTENDED_AWAY:
293 status = MESSAGING_MENU_STATUS_AWAY;
294 break;
295
296 case PURPLE_STATUS_INVISIBLE:
297 status = MESSAGING_MENU_STATUS_INVISIBLE;
298 break;
299
300 case PURPLE_STATUS_MOBILE:
301 case PURPLE_STATUS_OFFLINE:
302 status = MESSAGING_MENU_STATUS_OFFLINE;
303 break;
304
305 case PURPLE_STATUS_UNAVAILABLE:
306 status = MESSAGING_MENU_STATUS_BUSY;
307 break;
308
309 default:
310 g_assert_not_reached();
311 }
312 messaging_menu_app_set_status(mmapp, status);
313 }
314
315 static void
316 messaging_menu_status_changed(MessagingMenuApp *mmapp,
317 MessagingMenuStatus mm_status, gpointer user_data)
318 {
319 PurpleSavedStatus *saved_status;
320 PurpleStatusPrimitive primitive = PURPLE_STATUS_UNSET;
321
322 switch (mm_status) {
323 case MESSAGING_MENU_STATUS_AVAILABLE:
324 primitive = PURPLE_STATUS_AVAILABLE;
325 break;
326
327 case MESSAGING_MENU_STATUS_AWAY:
328 primitive = PURPLE_STATUS_AWAY;
329 break;
330
331 case MESSAGING_MENU_STATUS_BUSY:
332 primitive = PURPLE_STATUS_UNAVAILABLE;
333 break;
334
335 case MESSAGING_MENU_STATUS_INVISIBLE:
336 primitive = PURPLE_STATUS_INVISIBLE;
337 break;
338
339 case MESSAGING_MENU_STATUS_OFFLINE:
340 primitive = PURPLE_STATUS_OFFLINE;
341 break;
342
343 default:
344 g_assert_not_reached();
345 }
346
347 saved_status = purple_savedstatus_find_transient_by_type_and_message(primitive, NULL);
348 if (saved_status == NULL)
349 saved_status = create_transient_status(primitive, NULL);
350 purple_savedstatus_activate(saved_status);
351 }
352
353 static void
354 alert_config_cb(GtkWidget *widget, gpointer data)
355 {
356 gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
357 purple_prefs_set_bool("/plugins/gtk/unity/alert_chat_nick", on);
358 alert_chat_nick = on;
359 }
360
361 static void
362 launcher_config_cb(GtkWidget *widget, gpointer data)
363 {
364 gint option = GPOINTER_TO_INT(data);
365 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
366 return;
367
368 purple_prefs_set_int("/plugins/gtk/unity/launcher_count", option);
369 launcher_count = option;
370 if (option == LAUNCHER_COUNT_DISABLE)
371 unity_launcher_entry_set_count_visible(launcher, FALSE);
372 else
373 update_launcher();
374 }
375
376 static void
377 messaging_menu_config_cb(GtkWidget *widget, gpointer data)
378 {
379 gint option = GPOINTER_TO_INT(data);
380 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
381 return;
382
383 purple_prefs_set_int("/plugins/gtk/unity/messaging_menu_text", option);
384 messaging_menu_text = option;
385 refill_messaging_menu();
386 }
387
388 static int
389 attach_signals(PurpleConversation *conv)
390 {
391 PidginConversation *gtkconv = NULL;
392 guint id;
393
394 gtkconv = PIDGIN_CONVERSATION(conv);
395 if (!gtkconv)
396 return 0;
397
398 id = g_signal_connect(G_OBJECT(gtkconv->entry), "focus-in-event",
399 G_CALLBACK(unalert_cb), conv);
400 g_object_set_data(G_OBJECT(conv), "unity-entry-signal", GUINT_TO_POINTER(id));
401
402 id = g_signal_connect(G_OBJECT(gtkconv->webview), "focus-in-event",
403 G_CALLBACK(unalert_cb), conv);
404 g_object_set_data(G_OBJECT(conv), "unity-webview-signal", GUINT_TO_POINTER(id));
405
406 return 0;
407 }
408
409 static void
410 detach_signals(PurpleConversation *conv)
411 {
412 PidginConversation *gtkconv = NULL;
413 guint id;
414 gtkconv = PIDGIN_CONVERSATION(conv);
415 if (!gtkconv)
416 return;
417
418 id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-webview-signal"));
419 g_signal_handler_disconnect(gtkconv->webview, id);
420
421 id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-entry-signal"));
422 g_signal_handler_disconnect(gtkconv->entry, id);
423
424 g_object_set_data(G_OBJECT(conv), "unity-message-count",
425 GINT_TO_POINTER(0));
426 }
427
428 static GtkWidget *
429 get_config_frame(PurplePlugin *plugin)
430 {
431 GtkWidget *ret = NULL, *frame = NULL;
432 GtkWidget *vbox = NULL, *toggle = NULL;
433
434 ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
435 gtk_container_set_border_width(GTK_CONTAINER (ret), 12);
436
437 /* Alerts */
438
439 frame = pidgin_make_frame(ret, _("Chatroom alerts"));
440 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
441 gtk_container_add(GTK_CONTAINER(frame), vbox);
442
443 toggle = gtk_check_button_new_with_mnemonic(_("Chatroom message alerts _only where someone says your username"));
444 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
445 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
446 purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick"));
447 g_signal_connect(G_OBJECT(toggle), "toggled",
448 G_CALLBACK(alert_config_cb), NULL);
449
450 /* Launcher integration */
451
452 frame = pidgin_make_frame(ret, _("Launcher Icon"));
453 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
454 gtk_container_add(GTK_CONTAINER(frame), vbox);
455
456 toggle = gtk_radio_button_new_with_mnemonic(NULL, _("_Disable launcher integration"));
457 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
458 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
459 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_DISABLE);
460 g_signal_connect(G_OBJECT(toggle), "toggled",
461 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_DISABLE));
462
463 toggle = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(toggle),
464 _("Show number of unread _messages on launcher icon"));
465 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
466 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
467 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_MESSAGES);
468 g_signal_connect(G_OBJECT(toggle), "toggled",
469 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_MESSAGES));
470
471 toggle = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(toggle),
472 _("Show number of unread _conversations on launcher icon"));
473 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
474 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
475 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_SOURCES);
476 g_signal_connect(G_OBJECT(toggle), "toggled",
477 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_SOURCES));
478
479 /* Messaging menu integration */
480
481 frame = pidgin_make_frame(ret, _("Messaging Menu"));
482 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
483 gtk_container_add(GTK_CONTAINER(frame), vbox);
484
485 toggle = gtk_radio_button_new_with_mnemonic(NULL,
486 _("Show number of _unread messages for conversations in messaging menu"));
487 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
488 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
489 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_COUNT);
490 g_signal_connect(G_OBJECT(toggle), "toggled",
491 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_COUNT));
492
493 toggle = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(toggle),
494 _("Show _elapsed time for unread conversations in messaging menu"));
495 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
496 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
497 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_TIME);
498 g_signal_connect(G_OBJECT(toggle), "toggled",
499 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_TIME));
500
501 gtk_widget_show_all(ret);
502 return ret;
503 }
504
505 static gboolean
506 plugin_load(PurplePlugin *plugin)
507 {
508 GList *convs = purple_conversations_get_all();
509 PurpleSavedStatus *saved_status;
510 void *conv_handle = purple_conversations_get_handle();
511 void *gtk_conv_handle = pidgin_conversations_get_handle();
512 void *savedstat_handle = purple_savedstatuses_get_handle();
513
514 alert_chat_nick = purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick");
515
516 mmapp = messaging_menu_app_new("pidgin.desktop");
517 g_object_ref(mmapp);
518 messaging_menu_app_register(mmapp);
519 messaging_menu_text = purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text");
520
521 g_signal_connect(mmapp, "activate-source",
522 G_CALLBACK(message_source_activated), NULL);
523 g_signal_connect(mmapp, "status-changed",
524 G_CALLBACK(messaging_menu_status_changed), NULL);
525
526 saved_status = purple_savedstatus_get_current();
527 status_changed_cb(saved_status);
528
529 purple_signal_connect(savedstat_handle, "savedstatus-changed", plugin,
530 PURPLE_CALLBACK(status_changed_cb), NULL);
531
532 launcher = unity_launcher_entry_get_for_desktop_id("pidgin.desktop");
533 g_object_ref(launcher);
534 launcher_count = purple_prefs_get_int("/plugins/gtk/unity/launcher_count");
535
536 purple_signal_connect(gtk_conv_handle, "displayed-im-msg", plugin,
537 PURPLE_CALLBACK(message_displayed_cb), NULL);
538 purple_signal_connect(gtk_conv_handle, "displayed-chat-msg", plugin,
539 PURPLE_CALLBACK(message_displayed_cb), NULL);
540 purple_signal_connect(conv_handle, "sent-im-msg", plugin,
541 PURPLE_CALLBACK(im_sent_im), NULL);
542 purple_signal_connect(conv_handle, "sent-chat-msg", plugin,
543 PURPLE_CALLBACK(chat_sent_im), NULL);
544 purple_signal_connect(conv_handle, "conversation-created", plugin,
545 PURPLE_CALLBACK(conv_created), NULL);
546 purple_signal_connect(conv_handle, "deleting-conversation", plugin,
547 PURPLE_CALLBACK(deleting_conv), NULL);
548
549 while (convs) {
550 PurpleConversation *conv = (PurpleConversation *)convs->data;
551 attach_signals(conv);
552 convs = convs->next;
553 }
554
555 return TRUE;
556 }
557
558 static gboolean
559 plugin_unload(PurplePlugin *plugin)
560 {
561 GList *convs = purple_conversations_get_all();
562 while (convs) {
563 PurpleConversation *conv = (PurpleConversation *)convs->data;
564 unalert(conv);
565 detach_signals(conv);
566 convs = convs->next;
567 }
568
569 unity_launcher_entry_set_count_visible(launcher, FALSE);
570 messaging_menu_app_unregister(mmapp);
571
572 g_object_unref(launcher);
573 g_object_unref(mmapp);
574 return TRUE;
575 }
576
577 static PidginPluginUiInfo ui_info =
578 {
579 get_config_frame,
580
581 /* padding */
582 NULL,
583 NULL,
584 NULL,
585 NULL
586 };
587
588 static PurplePluginInfo info =
589 {
590 PURPLE_PLUGIN_MAGIC,
591 PURPLE_MAJOR_VERSION,
592 PURPLE_MINOR_VERSION,
593 PURPLE_PLUGIN_STANDARD, /**< type */
594 PIDGIN_PLUGIN_TYPE, /**< ui_requirement */
595 0, /**< flags */
596 NULL, /**< dependencies */
597 PURPLE_PRIORITY_DEFAULT, /**< priority */
598
599 UNITY_PLUGIN_ID, /**< id */
600 N_("Unity Integration"), /**< name */
601 DISPLAY_VERSION, /**< version */
602 /** summary */
603 N_("Provides integration with Unity."),
604 /** description */
605 N_("Provides integration with Unity's messaging "
606 "menu and launcher."),
607 /**< author */
608 "Ankit Vani <a@nevitus.org>",
609 PURPLE_WEBSITE, /**< homepage */
610
611 plugin_load, /**< load */
612 plugin_unload, /**< unload */
613 NULL, /**< destroy */
614
615 &ui_info, /**< ui_info */
616 NULL, /**< extra_info */
617 NULL,
618 NULL,
619
620 /* padding */
621 NULL,
622 NULL,
623 NULL,
624 NULL
625 };
626
627 static void
628 init_plugin(PurplePlugin *plugin)
629 {
630 purple_prefs_add_none("/plugins/gtk");
631 purple_prefs_add_none("/plugins/gtk/unity");
632 purple_prefs_add_int("/plugins/gtk/unity/launcher_count", LAUNCHER_COUNT_SOURCES);
633 purple_prefs_add_int("/plugins/gtk/unity/messaging_menu_text", MESSAGING_MENU_COUNT);
634 purple_prefs_add_bool("/plugins/gtk/unity/alert_chat_nick", TRUE);
635 }
636
637 PURPLE_INIT_PLUGIN(unity, init_plugin, info)

mercurial