| |
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 && launcher_count != LAUNCHER_COUNT_DISABLE); |
| |
60 |
| |
61 if (launcher_count == LAUNCHER_COUNT_MESSAGES) { |
| |
62 for (convs = purple_get_conversations(); convs != NULL; convs = convs->next) { |
| |
63 PurpleConversation *conv = convs->data; |
| |
64 count += GPOINTER_TO_INT(purple_conversation_get_data(conv, |
| |
65 "unity-message-count")); |
| |
66 } |
| |
67 } else { |
| |
68 count = n_sources; |
| |
69 } |
| |
70 |
| |
71 if (launcher != NULL) { |
| |
72 if (count > 0) |
| |
73 unity_launcher_entry_set_count_visible(launcher, TRUE); |
| |
74 else |
| |
75 unity_launcher_entry_set_count_visible(launcher, FALSE); |
| |
76 unity_launcher_entry_set_count(launcher, count); |
| |
77 } |
| |
78 } |
| |
79 |
| |
80 static gchar * |
| |
81 conversation_id(PurpleConversation *conv) |
| |
82 { |
| |
83 PurpleConversationType conv_type = purple_conversation_get_type(conv); |
| |
84 PurpleAccount *account = purple_conversation_get_account(conv); |
| |
85 char type[2] = "0"; |
| |
86 type[0] += conv_type; |
| |
87 |
| |
88 return g_strconcat(type, ":", |
| |
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_get_conversations(); convs != NULL; convs = convs->next) { |
| |
131 PurpleConversation *conv = convs->data; |
| |
132 messaging_menu_add_conversation(conv, |
| |
133 GPOINTER_TO_INT(purple_conversation_get_data(conv, "unity-message-count"))); |
| |
134 } |
| |
135 } |
| |
136 |
| |
137 static int |
| |
138 alert(PurpleConversation *conv) |
| |
139 { |
| |
140 gint count; |
| |
141 PidginWindow *purplewin = NULL; |
| |
142 if (conv == NULL || PIDGIN_CONVERSATION(conv) == NULL) |
| |
143 return 0; |
| |
144 |
| |
145 purplewin = PIDGIN_CONVERSATION(conv)->win; |
| |
146 |
| |
147 if (!pidgin_conv_window_has_focus(purplewin) || |
| |
148 !pidgin_conv_window_is_active_conversation(conv)) |
| |
149 { |
| |
150 count = GPOINTER_TO_INT(purple_conversation_get_data(conv, |
| |
151 "unity-message-count")); |
| |
152 if (!count++) |
| |
153 ++n_sources; |
| |
154 |
| |
155 purple_conversation_set_data(conv, "unity-message-count", |
| |
156 GINT_TO_POINTER(count)); |
| |
157 messaging_menu_add_conversation(conv, count); |
| |
158 update_launcher(); |
| |
159 } |
| |
160 |
| |
161 return 0; |
| |
162 } |
| |
163 |
| |
164 static void |
| |
165 unalert(PurpleConversation *conv) |
| |
166 { |
| |
167 if (GPOINTER_TO_INT(purple_conversation_get_data(conv, "unity-message-count")) > 0) |
| |
168 --n_sources; |
| |
169 purple_conversation_set_data(conv, "unity-message-count", |
| |
170 GINT_TO_POINTER(0)); |
| |
171 messaging_menu_remove_conversation(conv); |
| |
172 update_launcher(); |
| |
173 } |
| |
174 |
| |
175 static int |
| |
176 unalert_cb(GtkWidget *widget, gpointer data, PurpleConversation *conv) |
| |
177 { |
| |
178 unalert(conv); |
| |
179 return 0; |
| |
180 } |
| |
181 |
| |
182 static gboolean |
| |
183 message_displayed_cb(PurpleAccount *account, const char *who, char *message, |
| |
184 PurpleConversation *conv, PurpleMessageFlags flags) |
| |
185 { |
| |
186 if ((purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT && |
| |
187 alert_chat_nick && !(flags & PURPLE_MESSAGE_NICK))) |
| |
188 return FALSE; |
| |
189 |
| |
190 if ((flags & PURPLE_MESSAGE_RECV) && !(flags & PURPLE_MESSAGE_DELAYED)) |
| |
191 alert(conv); |
| |
192 |
| |
193 return FALSE; |
| |
194 } |
| |
195 |
| |
196 static void |
| |
197 im_sent_im(PurpleAccount *account, const char *receiver, const char *message) |
| |
198 { |
| |
199 PurpleConversation *conv = NULL; |
| |
200 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, receiver, |
| |
201 account); |
| |
202 unalert(conv); |
| |
203 } |
| |
204 |
| |
205 static void |
| |
206 chat_sent_im(PurpleAccount *account, const char *message, int id) |
| |
207 { |
| |
208 PurpleConversation *conv = NULL; |
| |
209 conv = purple_find_chat(purple_account_get_connection(account), id); |
| |
210 unalert(conv); |
| |
211 } |
| |
212 |
| |
213 static void |
| |
214 conv_created(PurpleConversation *conv) |
| |
215 { |
| |
216 purple_conversation_set_data(conv, "unity-message-count", |
| |
217 GINT_TO_POINTER(0)); |
| |
218 attach_signals(conv); |
| |
219 } |
| |
220 |
| |
221 static void |
| |
222 deleting_conv(PurpleConversation *conv) |
| |
223 { |
| |
224 detach_signals(conv); |
| |
225 unalert(conv); |
| |
226 } |
| |
227 |
| |
228 static void |
| |
229 message_source_activated(MessagingMenuApp *app, const gchar *id, |
| |
230 gpointer user_data) |
| |
231 { |
| |
232 gchar **sections = g_strsplit(id, ":", 0); |
| |
233 PurpleConversation *conv = NULL; |
| |
234 PurpleAccount *account; |
| |
235 PidginWindow *purplewin = NULL; |
| |
236 PurpleConversationType conv_type; |
| |
237 |
| |
238 char *type = sections[0]; |
| |
239 char *cname = sections[1]; |
| |
240 char *aname = sections[2]; |
| |
241 char *protocol = sections[3]; |
| |
242 |
| |
243 conv_type = type[0] - '0'; |
| |
244 account = purple_accounts_find(aname, protocol); |
| |
245 conv = purple_find_conversation_with_account(conv_type, cname, account); |
| |
246 |
| |
247 if (conv) { |
| |
248 unalert(conv); |
| |
249 purplewin = PIDGIN_CONVERSATION(conv)->win; |
| |
250 pidgin_conv_window_switch_gtkconv(purplewin, PIDGIN_CONVERSATION(conv)); |
| |
251 gdk_window_focus(gtk_widget_get_window(purplewin->window), time(NULL)); |
| |
252 } |
| |
253 g_strfreev (sections); |
| |
254 } |
| |
255 |
| |
256 static PurpleSavedStatus * |
| |
257 create_transient_status(PurpleStatusPrimitive primitive, PurpleStatusType *status_type) |
| |
258 { |
| |
259 PurpleSavedStatus *saved_status = purple_savedstatus_new(NULL, primitive); |
| |
260 |
| |
261 if(status_type != NULL) { |
| |
262 GList *tmp, *active_accts = purple_accounts_get_all_active(); |
| |
263 for (tmp = active_accts; tmp != NULL; tmp = tmp->next) { |
| |
264 purple_savedstatus_set_substatus(saved_status, |
| |
265 (PurpleAccount*) tmp->data, status_type, NULL); |
| |
266 } |
| |
267 g_list_free(active_accts); |
| |
268 } |
| |
269 |
| |
270 return saved_status; |
| |
271 } |
| |
272 |
| |
273 static void |
| |
274 status_changed_cb(PurpleSavedStatus *saved_status) |
| |
275 { |
| |
276 MessagingMenuStatus status = MESSAGING_MENU_STATUS_AVAILABLE; |
| |
277 |
| |
278 switch (purple_savedstatus_get_type(saved_status)) { |
| |
279 case PURPLE_STATUS_AVAILABLE: |
| |
280 case PURPLE_STATUS_MOOD: |
| |
281 case PURPLE_STATUS_TUNE: |
| |
282 case PURPLE_STATUS_UNSET: |
| |
283 status = MESSAGING_MENU_STATUS_AVAILABLE; |
| |
284 break; |
| |
285 |
| |
286 case PURPLE_STATUS_AWAY: |
| |
287 case PURPLE_STATUS_EXTENDED_AWAY: |
| |
288 status = MESSAGING_MENU_STATUS_AWAY; |
| |
289 break; |
| |
290 |
| |
291 case PURPLE_STATUS_INVISIBLE: |
| |
292 status = MESSAGING_MENU_STATUS_INVISIBLE; |
| |
293 break; |
| |
294 |
| |
295 case PURPLE_STATUS_MOBILE: |
| |
296 case PURPLE_STATUS_OFFLINE: |
| |
297 status = MESSAGING_MENU_STATUS_OFFLINE; |
| |
298 break; |
| |
299 |
| |
300 case PURPLE_STATUS_UNAVAILABLE: |
| |
301 status = MESSAGING_MENU_STATUS_BUSY; |
| |
302 break; |
| |
303 |
| |
304 default: |
| |
305 g_assert_not_reached(); |
| |
306 } |
| |
307 messaging_menu_app_set_status(mmapp, status); |
| |
308 } |
| |
309 |
| |
310 static void |
| |
311 messaging_menu_status_changed(MessagingMenuApp *mmapp, |
| |
312 MessagingMenuStatus mm_status, gpointer user_data) |
| |
313 { |
| |
314 PurpleSavedStatus *saved_status; |
| |
315 PurpleStatusPrimitive primitive = PURPLE_STATUS_UNSET; |
| |
316 |
| |
317 switch (mm_status) { |
| |
318 case MESSAGING_MENU_STATUS_AVAILABLE: |
| |
319 primitive = PURPLE_STATUS_AVAILABLE; |
| |
320 break; |
| |
321 |
| |
322 case MESSAGING_MENU_STATUS_AWAY: |
| |
323 primitive = PURPLE_STATUS_AWAY; |
| |
324 break; |
| |
325 |
| |
326 case MESSAGING_MENU_STATUS_BUSY: |
| |
327 primitive = PURPLE_STATUS_UNAVAILABLE; |
| |
328 break; |
| |
329 |
| |
330 case MESSAGING_MENU_STATUS_INVISIBLE: |
| |
331 primitive = PURPLE_STATUS_INVISIBLE; |
| |
332 break; |
| |
333 |
| |
334 case MESSAGING_MENU_STATUS_OFFLINE: |
| |
335 primitive = PURPLE_STATUS_OFFLINE; |
| |
336 break; |
| |
337 |
| |
338 default: |
| |
339 g_assert_not_reached(); |
| |
340 } |
| |
341 |
| |
342 saved_status = purple_savedstatus_find_transient_by_type_and_message(primitive, NULL); |
| |
343 if (saved_status == NULL) |
| |
344 saved_status = create_transient_status(primitive, NULL); |
| |
345 purple_savedstatus_activate(saved_status); |
| |
346 } |
| |
347 |
| |
348 static void |
| |
349 alert_config_cb(GtkWidget *widget, gpointer data) |
| |
350 { |
| |
351 gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); |
| |
352 purple_prefs_set_bool("/plugins/gtk/unity/alert_chat_nick", on); |
| |
353 alert_chat_nick = on; |
| |
354 } |
| |
355 |
| |
356 static void |
| |
357 launcher_config_cb(GtkWidget *widget, gpointer data) |
| |
358 { |
| |
359 gint option = GPOINTER_TO_INT(data); |
| |
360 g_return_if_fail(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); |
| |
361 |
| |
362 purple_prefs_set_int("/plugins/gtk/unity/launcher_count", option); |
| |
363 launcher_count = option; |
| |
364 if (option == LAUNCHER_COUNT_DISABLE) |
| |
365 unity_launcher_entry_set_count_visible(launcher, FALSE); |
| |
366 else |
| |
367 update_launcher(); |
| |
368 } |
| |
369 |
| |
370 static void |
| |
371 messaging_menu_config_cb(GtkWidget *widget, gpointer data) |
| |
372 { |
| |
373 gint option = GPOINTER_TO_INT(data); |
| |
374 g_return_if_fail(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); |
| |
375 |
| |
376 purple_prefs_set_int("/plugins/gtk/unity/messaging_menu_text", option); |
| |
377 messaging_menu_text = option; |
| |
378 refill_messaging_menu(); |
| |
379 } |
| |
380 |
| |
381 static int |
| |
382 attach_signals(PurpleConversation *conv) |
| |
383 { |
| |
384 PidginConversation *gtkconv = NULL; |
| |
385 guint id; |
| |
386 |
| |
387 gtkconv = PIDGIN_CONVERSATION(conv); |
| |
388 if (!gtkconv) |
| |
389 return 0; |
| |
390 |
| |
391 id = g_signal_connect(G_OBJECT(gtkconv->entry), "focus-in-event", |
| |
392 G_CALLBACK(unalert_cb), conv); |
| |
393 purple_conversation_set_data(conv, "unity-entry-signal", GUINT_TO_POINTER(id)); |
| |
394 |
| |
395 id = g_signal_connect(G_OBJECT(gtkconv->imhtml), "focus-in-event", |
| |
396 G_CALLBACK(unalert_cb), conv); |
| |
397 purple_conversation_set_data(conv, "unity-imhtml-signal", GUINT_TO_POINTER(id)); |
| |
398 |
| |
399 return 0; |
| |
400 } |
| |
401 |
| |
402 static void |
| |
403 detach_signals(PurpleConversation *conv) |
| |
404 { |
| |
405 PidginConversation *gtkconv = NULL; |
| |
406 guint id; |
| |
407 gtkconv = PIDGIN_CONVERSATION(conv); |
| |
408 if (!gtkconv) |
| |
409 return; |
| |
410 |
| |
411 id = GPOINTER_TO_INT(purple_conversation_get_data(conv, "unity-imhtml-signal")); |
| |
412 g_signal_handler_disconnect(gtkconv->imhtml, id); |
| |
413 |
| |
414 id = GPOINTER_TO_INT(purple_conversation_get_data(conv, "unity-entry-signal")); |
| |
415 g_signal_handler_disconnect(gtkconv->entry, id); |
| |
416 |
| |
417 purple_conversation_set_data(conv, "unity-message-count", |
| |
418 GINT_TO_POINTER(0)); |
| |
419 } |
| |
420 |
| |
421 static GtkWidget * |
| |
422 get_config_frame(PurplePlugin *plugin) |
| |
423 { |
| |
424 GtkWidget *ret = NULL, *frame = NULL; |
| |
425 GtkWidget *vbox = NULL, *toggle = NULL; |
| |
426 |
| |
427 ret = gtk_vbox_new(FALSE, 18); |
| |
428 gtk_container_set_border_width(GTK_CONTAINER (ret), 12); |
| |
429 |
| |
430 /* Alerts */ |
| |
431 |
| |
432 frame = pidgin_make_frame(ret, _("Chatroom alerts")); |
| |
433 vbox = gtk_vbox_new(FALSE, 5); |
| |
434 gtk_container_add(GTK_CONTAINER(frame), vbox); |
| |
435 |
| |
436 toggle = gtk_check_button_new_with_mnemonic(_("Chatroom message alerts _only where someone says your username")); |
| |
437 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
| |
438 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), |
| |
439 purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick")); |
| |
440 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
441 G_CALLBACK(alert_config_cb), NULL); |
| |
442 |
| |
443 /* Launcher integration */ |
| |
444 |
| |
445 frame = pidgin_make_frame(ret, _("Launcher Icon")); |
| |
446 vbox = gtk_vbox_new(FALSE, 5); |
| |
447 gtk_container_add(GTK_CONTAINER(frame), vbox); |
| |
448 |
| |
449 toggle = gtk_radio_button_new_with_mnemonic(NULL, _("_Disable launcher integration")); |
| |
450 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
| |
451 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), |
| |
452 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_DISABLE); |
| |
453 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
454 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_DISABLE)); |
| |
455 |
| |
456 toggle = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(toggle), |
| |
457 _("Show number of unread _messages on launcher icon")); |
| |
458 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
| |
459 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), |
| |
460 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_MESSAGES); |
| |
461 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
462 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_MESSAGES)); |
| |
463 |
| |
464 toggle = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(toggle), |
| |
465 _("Show number of unread _conversations on launcher icon")); |
| |
466 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
| |
467 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), |
| |
468 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_SOURCES); |
| |
469 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
470 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_SOURCES)); |
| |
471 |
| |
472 /* Messaging menu integration */ |
| |
473 |
| |
474 frame = pidgin_make_frame(ret, _("Messaging Menu")); |
| |
475 vbox = gtk_vbox_new(FALSE, 5); |
| |
476 gtk_container_add(GTK_CONTAINER(frame), vbox); |
| |
477 |
| |
478 toggle = gtk_radio_button_new_with_mnemonic(NULL, |
| |
479 _("Show number of _unread messages for conversations in messaging menu")); |
| |
480 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
| |
481 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), |
| |
482 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_COUNT); |
| |
483 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
484 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_COUNT)); |
| |
485 |
| |
486 toggle = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(toggle), |
| |
487 _("Show _elapsed time for unread conversations in messaging menu")); |
| |
488 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
| |
489 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), |
| |
490 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_TIME); |
| |
491 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
492 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_TIME)); |
| |
493 |
| |
494 gtk_widget_show_all(ret); |
| |
495 return ret; |
| |
496 } |
| |
497 |
| |
498 static gboolean |
| |
499 plugin_load(PurplePlugin *plugin) |
| |
500 { |
| |
501 GList *convs = purple_get_conversations(); |
| |
502 PurpleSavedStatus *saved_status; |
| |
503 void *conv_handle = purple_conversations_get_handle(); |
| |
504 void *gtk_conv_handle = pidgin_conversations_get_handle(); |
| |
505 void *savedstat_handle = purple_savedstatuses_get_handle(); |
| |
506 |
| |
507 alert_chat_nick = purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick"); |
| |
508 |
| |
509 mmapp = messaging_menu_app_new("pidgin.desktop"); |
| |
510 g_object_ref(mmapp); |
| |
511 messaging_menu_app_register(mmapp); |
| |
512 messaging_menu_text = purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text"); |
| |
513 |
| |
514 g_signal_connect(mmapp, "activate-source", |
| |
515 G_CALLBACK(message_source_activated), NULL); |
| |
516 g_signal_connect(mmapp, "status-changed", |
| |
517 G_CALLBACK(messaging_menu_status_changed), NULL); |
| |
518 |
| |
519 saved_status = purple_savedstatus_get_current(); |
| |
520 status_changed_cb(saved_status); |
| |
521 |
| |
522 purple_signal_connect(savedstat_handle, "savedstatus-changed", plugin, |
| |
523 PURPLE_CALLBACK(status_changed_cb), NULL); |
| |
524 |
| |
525 launcher = unity_launcher_entry_get_for_desktop_id("pidgin.desktop"); |
| |
526 g_object_ref(launcher); |
| |
527 launcher_count = purple_prefs_get_int("/plugins/gtk/unity/launcher_count"); |
| |
528 |
| |
529 purple_signal_connect(gtk_conv_handle, "displayed-im-msg", plugin, |
| |
530 PURPLE_CALLBACK(message_displayed_cb), NULL); |
| |
531 purple_signal_connect(gtk_conv_handle, "displayed-chat-msg", plugin, |
| |
532 PURPLE_CALLBACK(message_displayed_cb), NULL); |
| |
533 purple_signal_connect(conv_handle, "sent-im-msg", plugin, |
| |
534 PURPLE_CALLBACK(im_sent_im), NULL); |
| |
535 purple_signal_connect(conv_handle, "sent-chat-msg", plugin, |
| |
536 PURPLE_CALLBACK(chat_sent_im), NULL); |
| |
537 purple_signal_connect(conv_handle, "conversation-created", plugin, |
| |
538 PURPLE_CALLBACK(conv_created), NULL); |
| |
539 purple_signal_connect(conv_handle, "deleting-conversation", plugin, |
| |
540 PURPLE_CALLBACK(deleting_conv), NULL); |
| |
541 |
| |
542 while (convs) { |
| |
543 PurpleConversation *conv = (PurpleConversation *)convs->data; |
| |
544 attach_signals(conv); |
| |
545 convs = convs->next; |
| |
546 } |
| |
547 |
| |
548 return TRUE; |
| |
549 } |
| |
550 |
| |
551 static gboolean |
| |
552 plugin_unload(PurplePlugin *plugin) |
| |
553 { |
| |
554 GList *convs = purple_get_conversations(); |
| |
555 while (convs) { |
| |
556 PurpleConversation *conv = (PurpleConversation *)convs->data; |
| |
557 unalert(conv); |
| |
558 detach_signals(conv); |
| |
559 convs = convs->next; |
| |
560 } |
| |
561 |
| |
562 unity_launcher_entry_set_count_visible(launcher, FALSE); |
| |
563 messaging_menu_app_unregister(mmapp); |
| |
564 |
| |
565 g_object_unref(launcher); |
| |
566 g_object_unref(mmapp); |
| |
567 return TRUE; |
| |
568 } |
| |
569 |
| |
570 static PidginPluginUiInfo ui_info = |
| |
571 { |
| |
572 get_config_frame, |
| |
573 0, /* page_num (Reserved) */ |
| |
574 |
| |
575 /* padding */ |
| |
576 NULL, |
| |
577 NULL, |
| |
578 NULL, |
| |
579 NULL |
| |
580 }; |
| |
581 |
| |
582 static PurplePluginInfo info = |
| |
583 { |
| |
584 PURPLE_PLUGIN_MAGIC, |
| |
585 PURPLE_MAJOR_VERSION, |
| |
586 PURPLE_MINOR_VERSION, |
| |
587 PURPLE_PLUGIN_STANDARD, /**< type */ |
| |
588 PIDGIN_PLUGIN_TYPE, /**< ui_requirement */ |
| |
589 0, /**< flags */ |
| |
590 NULL, /**< dependencies */ |
| |
591 PURPLE_PRIORITY_DEFAULT, /**< priority */ |
| |
592 |
| |
593 UNITY_PLUGIN_ID, /**< id */ |
| |
594 N_("Unity Integration"), /**< name */ |
| |
595 DISPLAY_VERSION, /**< version */ |
| |
596 /** summary */ |
| |
597 N_("Provides integration with Unity."), |
| |
598 /** description */ |
| |
599 N_("Provides integration with Unity's messaging " |
| |
600 "menu and launcher."), |
| |
601 /**< author */ |
| |
602 "Ankit Vani <a@nevitus.org>", |
| |
603 PURPLE_WEBSITE, /**< homepage */ |
| |
604 |
| |
605 plugin_load, /**< load */ |
| |
606 plugin_unload, /**< unload */ |
| |
607 NULL, /**< destroy */ |
| |
608 |
| |
609 &ui_info, /**< ui_info */ |
| |
610 NULL, /**< extra_info */ |
| |
611 NULL, |
| |
612 NULL, |
| |
613 |
| |
614 /* padding */ |
| |
615 NULL, |
| |
616 NULL, |
| |
617 NULL, |
| |
618 NULL |
| |
619 }; |
| |
620 |
| |
621 static void |
| |
622 init_plugin(PurplePlugin *plugin) |
| |
623 { |
| |
624 purple_prefs_add_none("/plugins/gtk"); |
| |
625 purple_prefs_add_none("/plugins/gtk/unity"); |
| |
626 purple_prefs_add_int("/plugins/gtk/unity/launcher_count", LAUNCHER_COUNT_SOURCES); |
| |
627 purple_prefs_add_int("/plugins/gtk/unity/messaging_menu_text", MESSAGING_MENU_COUNT); |
| |
628 purple_prefs_add_bool("/plugins/gtk/unity/alert_chat_nick", TRUE); |
| |
629 } |
| |
630 |
| |
631 PURPLE_INIT_PLUGIN(unity, init_plugin, info) |