| |
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 <glib.h> |
| |
20 #include <glib/gi18n-lib.h> |
| |
21 |
| |
22 #include <purple.h> |
| |
23 |
| |
24 #include <pidgin.h> |
| |
25 |
| |
26 #include <talkatu.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 PurpleConversationManager *manager = NULL; |
| |
65 |
| |
66 manager = purple_conversation_manager_get_default(); |
| |
67 convs = purple_conversation_manager_get_all(manager); |
| |
68 |
| |
69 while(convs != NULL) { |
| |
70 PurpleConversation *conv = convs->data; |
| |
71 count += GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), |
| |
72 "unity-message-count")); |
| |
73 convs = g_list_delete_link(convs, convs); |
| |
74 } |
| |
75 } else { |
| |
76 count = n_sources; |
| |
77 } |
| |
78 |
| |
79 if (launcher != NULL) { |
| |
80 if (count > 0) |
| |
81 unity_launcher_entry_set_count_visible(launcher, TRUE); |
| |
82 else |
| |
83 unity_launcher_entry_set_count_visible(launcher, FALSE); |
| |
84 unity_launcher_entry_set_count(launcher, count); |
| |
85 } |
| |
86 } |
| |
87 |
| |
88 static gchar * |
| |
89 conversation_id(PurpleConversation *conv) |
| |
90 { |
| |
91 PurpleAccount *account = purple_conversation_get_account(conv); |
| |
92 |
| |
93 return g_strconcat((PURPLE_IS_IM_CONVERSATION(conv) ? "im" : |
| |
94 PURPLE_IS_CHAT_CONVERSATION(conv) ? "chat" : "misc"), ":", |
| |
95 purple_conversation_get_name(conv), ":", |
| |
96 purple_account_get_username(account), ":", |
| |
97 purple_account_get_protocol_id(account), NULL); |
| |
98 } |
| |
99 |
| |
100 static void |
| |
101 messaging_menu_add_conversation(PurpleConversation *conv, gint count) |
| |
102 { |
| |
103 gchar *id; |
| |
104 g_return_if_fail(count > 0); |
| |
105 id = conversation_id(conv); |
| |
106 |
| |
107 /* GBytesIcon may be useful for messaging menu source icons using buddy |
| |
108 icon data for IMs */ |
| |
109 if (!messaging_menu_app_has_source(mmapp, id)) |
| |
110 messaging_menu_app_append_source(mmapp, id, NULL, |
| |
111 purple_conversation_get_title(conv)); |
| |
112 |
| |
113 if (messaging_menu_text == MESSAGING_MENU_TIME) |
| |
114 messaging_menu_app_set_source_time(mmapp, id, g_get_real_time()); |
| |
115 else if (messaging_menu_text == MESSAGING_MENU_COUNT) |
| |
116 messaging_menu_app_set_source_count(mmapp, id, count); |
| |
117 messaging_menu_app_draw_attention(mmapp, id); |
| |
118 |
| |
119 g_free(id); |
| |
120 } |
| |
121 |
| |
122 static void |
| |
123 messaging_menu_remove_conversation(PurpleConversation *conv) |
| |
124 { |
| |
125 gchar *id = conversation_id(conv); |
| |
126 if (messaging_menu_app_has_source(mmapp, id)) |
| |
127 messaging_menu_app_remove_source(mmapp, id); |
| |
128 g_free(id); |
| |
129 } |
| |
130 |
| |
131 static void |
| |
132 refill_messaging_menu() |
| |
133 { |
| |
134 PurpleConversationManager *manager = NULL; |
| |
135 GList *convs; |
| |
136 |
| |
137 manager = purple_conversation_manager_get_default(); |
| |
138 convs = purple_conversation_manager_get_all(manager); |
| |
139 while(convs != NULL) { |
| |
140 PurpleConversation *conv = convs->data; |
| |
141 messaging_menu_add_conversation(conv, |
| |
142 GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), |
| |
143 "unity-message-count"))); |
| |
144 convs = g_list_delete_link(convs, convs); |
| |
145 } |
| |
146 } |
| |
147 |
| |
148 static int |
| |
149 alert(PurpleConversation *conv) |
| |
150 { |
| |
151 gint count; |
| |
152 PidginConversation *gtkconv = NULL; |
| |
153 PidginConversationWindow *convwin = NULL; |
| |
154 GtkRoot *root = NULL; |
| |
155 GtkWidget *win = NULL; |
| |
156 |
| |
157 if (conv == NULL || PIDGIN_CONVERSATION(conv) == NULL) |
| |
158 return 0; |
| |
159 |
| |
160 gtkconv = PIDGIN_CONVERSATION(conv); |
| |
161 root = gtk_widget_get_root(gtkconv->tab_cont); |
| |
162 win = GTK_WIDGET(root); |
| |
163 convwin = PIDGIN_CONVERSATION_WINDOW(win); |
| |
164 |
| |
165 if (!gtk_widget_has_focus(win) || |
| |
166 !pidgin_conversation_window_conversation_is_selected(convwin, conv)) |
| |
167 { |
| |
168 count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), |
| |
169 "unity-message-count")); |
| |
170 if (!count++) |
| |
171 ++n_sources; |
| |
172 |
| |
173 g_object_set_data(G_OBJECT(conv), "unity-message-count", |
| |
174 GINT_TO_POINTER(count)); |
| |
175 messaging_menu_add_conversation(conv, count); |
| |
176 update_launcher(); |
| |
177 } |
| |
178 |
| |
179 return 0; |
| |
180 } |
| |
181 |
| |
182 static void |
| |
183 unalert(PurpleConversation *conv) |
| |
184 { |
| |
185 if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-message-count")) > 0) |
| |
186 --n_sources; |
| |
187 |
| |
188 g_object_set_data(G_OBJECT(conv), "unity-message-count", |
| |
189 GINT_TO_POINTER(0)); |
| |
190 messaging_menu_remove_conversation(conv); |
| |
191 update_launcher(); |
| |
192 } |
| |
193 |
| |
194 static int |
| |
195 unalert_cb(GtkWidget *widget, gpointer data, PurpleConversation *conv) |
| |
196 { |
| |
197 unalert(conv); |
| |
198 return 0; |
| |
199 } |
| |
200 |
| |
201 static gboolean |
| |
202 message_displayed_cb(PurpleConversation *conv, PurpleMessage *msg, gpointer _unused) |
| |
203 { |
| |
204 PurpleMessageFlags flags = purple_message_get_flags(msg); |
| |
205 |
| |
206 if ((PURPLE_IS_CHAT_CONVERSATION(conv) && alert_chat_nick && |
| |
207 !(flags & PURPLE_MESSAGE_NICK))) |
| |
208 return FALSE; |
| |
209 |
| |
210 if ((flags & PURPLE_MESSAGE_RECV) && !(flags & PURPLE_MESSAGE_DELAYED)) |
| |
211 alert(conv); |
| |
212 |
| |
213 return FALSE; |
| |
214 } |
| |
215 |
| |
216 static void |
| |
217 im_sent_im(PurpleAccount *account, PurpleMessage *msg, gpointer _unused) |
| |
218 { |
| |
219 PurpleConversation *im = NULL; |
| |
220 PurpleConversationManager *manager = NULL; |
| |
221 |
| |
222 manager = purple_conversation_manager_get_default(); |
| |
223 |
| |
224 im = purple_conversation_manager_find_im(manager, account, |
| |
225 purple_message_get_recipient(msg)); |
| |
226 |
| |
227 unalert(im); |
| |
228 } |
| |
229 |
| |
230 static void |
| |
231 chat_sent_im(PurpleAccount *account, PurpleMessage *msg, int id) |
| |
232 { |
| |
233 PurpleConversation *chat = NULL; |
| |
234 PurpleConversationManager *manager = NULL; |
| |
235 |
| |
236 manager = purple_conversation_manager_get_default(); |
| |
237 |
| |
238 chat = purple_conversation_manager_find_chat_by_id(manager, account, id); |
| |
239 |
| |
240 unalert(chat); |
| |
241 } |
| |
242 |
| |
243 static void |
| |
244 conv_created(PurpleConversation *conv) |
| |
245 { |
| |
246 g_object_set_data(G_OBJECT(conv), "unity-message-count", |
| |
247 GINT_TO_POINTER(0)); |
| |
248 attach_signals(conv); |
| |
249 } |
| |
250 |
| |
251 static void |
| |
252 deleting_conv(PurpleConversation *conv) |
| |
253 { |
| |
254 detach_signals(conv); |
| |
255 unalert(conv); |
| |
256 } |
| |
257 |
| |
258 static void |
| |
259 message_source_activated(MessagingMenuApp *app, const gchar *id, |
| |
260 gpointer user_data) |
| |
261 { |
| |
262 gchar **sections = g_strsplit(id, ":", 0); |
| |
263 PurpleConversation *conv = NULL; |
| |
264 PurpleConversationManager *conversation_manager = NULL; |
| |
265 PurpleAccount *account; |
| |
266 PurpleAccountManager *account_manager = NULL; |
| |
267 |
| |
268 char *type = sections[0]; |
| |
269 char *cname = sections[1]; |
| |
270 char *aname = sections[2]; |
| |
271 char *protocol = sections[3]; |
| |
272 |
| |
273 conversation_manager = purple_conversation_manager_get_default(); |
| |
274 |
| |
275 account_manager = purple_account_manager_get_default(); |
| |
276 account = purple_account_manager_find(account_manager, aname, protocol); |
| |
277 |
| |
278 if (g_strcmp0(type, "im") == 0) { |
| |
279 conv = purple_conversation_manager_find_im(conversation_manager, |
| |
280 account, cname); |
| |
281 } else if (g_strcmp0(type, "chat") == 0) { |
| |
282 conv = purple_conversation_manager_find_chat(conversation_manager, |
| |
283 account, cname); |
| |
284 } else { |
| |
285 conv = purple_conversation_manager_find(conversation_manager, |
| |
286 account, cname); |
| |
287 } |
| |
288 |
| |
289 if (conv) { |
| |
290 GtkRoot *root = NULL; |
| |
291 GtkWidget *win = NULL; |
| |
292 PidginConversationWindow *convwin = NULL; |
| |
293 |
| |
294 root = gtk_widget_get_root(PIDGIN_CONVERSATION(conv)->tab_cont); |
| |
295 win = GTK_WIDGET(root); |
| |
296 convwin = PIDGIN_CONVERSATION_WINDOW(win); |
| |
297 |
| |
298 unalert(conv); |
| |
299 |
| |
300 pidgin_conversation_window_select(convwin, conv); |
| |
301 |
| |
302 gtk_root_set_focus(root, PIDGIN_CONVERSATION(conv)->entry); |
| |
303 } |
| |
304 g_strfreev (sections); |
| |
305 } |
| |
306 |
| |
307 static PurpleSavedStatus * |
| |
308 create_transient_status(PurpleStatusPrimitive primitive, |
| |
309 PurpleStatusType *status_type) |
| |
310 { |
| |
311 PurpleSavedStatus *saved_status = purple_savedstatus_new(NULL, primitive); |
| |
312 |
| |
313 if(status_type != NULL) { |
| |
314 PurpleAccountManager *manager = NULL; |
| |
315 GList *active_accts = NULL; |
| |
316 |
| |
317 manager = purple_account_manager_get_default(); |
| |
318 active_accts = purple_account_manager_get_enabled(manager); |
| |
319 |
| |
320 while(active_accts != NULL) { |
| |
321 PurpleAccount *account = PURPLE_ACCOUNT(active_accts->data); |
| |
322 |
| |
323 purple_savedstatus_set_substatus(saved_status, account, |
| |
324 status_type, NULL); |
| |
325 |
| |
326 active_accts = g_list_delete_link(active_accts, active_accts); |
| |
327 } |
| |
328 } |
| |
329 |
| |
330 return saved_status; |
| |
331 } |
| |
332 |
| |
333 static void |
| |
334 status_changed_cb(PurpleSavedStatus *saved_status) |
| |
335 { |
| |
336 MessagingMenuStatus status = MESSAGING_MENU_STATUS_AVAILABLE; |
| |
337 |
| |
338 switch (purple_savedstatus_get_primitive_type(saved_status)) { |
| |
339 case PURPLE_STATUS_AVAILABLE: |
| |
340 case PURPLE_STATUS_MOOD: |
| |
341 case PURPLE_STATUS_TUNE: |
| |
342 case PURPLE_STATUS_UNSET: |
| |
343 status = MESSAGING_MENU_STATUS_AVAILABLE; |
| |
344 break; |
| |
345 |
| |
346 case PURPLE_STATUS_AWAY: |
| |
347 case PURPLE_STATUS_EXTENDED_AWAY: |
| |
348 status = MESSAGING_MENU_STATUS_AWAY; |
| |
349 break; |
| |
350 |
| |
351 case PURPLE_STATUS_INVISIBLE: |
| |
352 status = MESSAGING_MENU_STATUS_INVISIBLE; |
| |
353 break; |
| |
354 |
| |
355 case PURPLE_STATUS_MOBILE: |
| |
356 case PURPLE_STATUS_OFFLINE: |
| |
357 status = MESSAGING_MENU_STATUS_OFFLINE; |
| |
358 break; |
| |
359 |
| |
360 case PURPLE_STATUS_UNAVAILABLE: |
| |
361 status = MESSAGING_MENU_STATUS_BUSY; |
| |
362 break; |
| |
363 |
| |
364 default: |
| |
365 g_assert_not_reached(); |
| |
366 } |
| |
367 messaging_menu_app_set_status(mmapp, status); |
| |
368 } |
| |
369 |
| |
370 static void |
| |
371 messaging_menu_status_changed(MessagingMenuApp *mmapp, |
| |
372 MessagingMenuStatus mm_status, gpointer user_data) |
| |
373 { |
| |
374 PurpleSavedStatus *saved_status; |
| |
375 PurpleStatusPrimitive primitive = PURPLE_STATUS_UNSET; |
| |
376 |
| |
377 switch (mm_status) { |
| |
378 case MESSAGING_MENU_STATUS_AVAILABLE: |
| |
379 primitive = PURPLE_STATUS_AVAILABLE; |
| |
380 break; |
| |
381 |
| |
382 case MESSAGING_MENU_STATUS_AWAY: |
| |
383 primitive = PURPLE_STATUS_AWAY; |
| |
384 break; |
| |
385 |
| |
386 case MESSAGING_MENU_STATUS_BUSY: |
| |
387 primitive = PURPLE_STATUS_UNAVAILABLE; |
| |
388 break; |
| |
389 |
| |
390 case MESSAGING_MENU_STATUS_INVISIBLE: |
| |
391 primitive = PURPLE_STATUS_INVISIBLE; |
| |
392 break; |
| |
393 |
| |
394 case MESSAGING_MENU_STATUS_OFFLINE: |
| |
395 primitive = PURPLE_STATUS_OFFLINE; |
| |
396 break; |
| |
397 |
| |
398 default: |
| |
399 g_assert_not_reached(); |
| |
400 } |
| |
401 |
| |
402 saved_status = purple_savedstatus_find_transient_by_type_and_message(primitive, NULL); |
| |
403 if (saved_status == NULL) |
| |
404 saved_status = create_transient_status(primitive, NULL); |
| |
405 purple_savedstatus_activate(saved_status); |
| |
406 } |
| |
407 |
| |
408 static void |
| |
409 alert_config_cb(GtkWidget *widget, gpointer data) |
| |
410 { |
| |
411 gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); |
| |
412 purple_prefs_set_bool("/plugins/gtk/unity/alert_chat_nick", on); |
| |
413 alert_chat_nick = on; |
| |
414 } |
| |
415 |
| |
416 static void |
| |
417 launcher_config_cb(GtkWidget *widget, gpointer data) |
| |
418 { |
| |
419 gint option = GPOINTER_TO_INT(data); |
| |
420 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) |
| |
421 return; |
| |
422 |
| |
423 purple_prefs_set_int("/plugins/gtk/unity/launcher_count", option); |
| |
424 launcher_count = option; |
| |
425 if (option == LAUNCHER_COUNT_DISABLE) |
| |
426 unity_launcher_entry_set_count_visible(launcher, FALSE); |
| |
427 else |
| |
428 update_launcher(); |
| |
429 } |
| |
430 |
| |
431 static void |
| |
432 messaging_menu_config_cb(GtkWidget *widget, gpointer data) |
| |
433 { |
| |
434 gint option = GPOINTER_TO_INT(data); |
| |
435 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) |
| |
436 return; |
| |
437 |
| |
438 purple_prefs_set_int("/plugins/gtk/unity/messaging_menu_text", option); |
| |
439 messaging_menu_text = option; |
| |
440 refill_messaging_menu(); |
| |
441 } |
| |
442 |
| |
443 static int |
| |
444 attach_signals(PurpleConversation *conv) |
| |
445 { |
| |
446 PidginConversation *gtkconv = NULL; |
| |
447 guint id; |
| |
448 |
| |
449 gtkconv = PIDGIN_CONVERSATION(conv); |
| |
450 if (!gtkconv) |
| |
451 return 0; |
| |
452 |
| |
453 id = g_signal_connect(G_OBJECT(gtkconv->entry), "focus-in-event", |
| |
454 G_CALLBACK(unalert_cb), conv); |
| |
455 g_object_set_data(G_OBJECT(conv), "unity-entry-signal", GUINT_TO_POINTER(id)); |
| |
456 |
| |
457 id = g_signal_connect(G_OBJECT(gtkconv->history), "focus-in-event", |
| |
458 G_CALLBACK(unalert_cb), conv); |
| |
459 g_object_set_data(G_OBJECT(conv), "unity-history-signal", GUINT_TO_POINTER(id)); |
| |
460 |
| |
461 return 0; |
| |
462 } |
| |
463 |
| |
464 static void |
| |
465 detach_signals(PurpleConversation *conv) |
| |
466 { |
| |
467 PidginConversation *gtkconv = NULL; |
| |
468 guint id; |
| |
469 gtkconv = PIDGIN_CONVERSATION(conv); |
| |
470 if (!gtkconv) |
| |
471 return; |
| |
472 |
| |
473 id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-history-signal")); |
| |
474 g_signal_handler_disconnect(gtkconv->history, id); |
| |
475 |
| |
476 id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-entry-signal")); |
| |
477 g_signal_handler_disconnect(gtkconv->entry, id); |
| |
478 |
| |
479 g_object_set_data(G_OBJECT(conv), "unity-message-count", |
| |
480 GINT_TO_POINTER(0)); |
| |
481 } |
| |
482 |
| |
483 static GtkWidget * |
| |
484 get_config_frame(PurplePlugin *plugin) |
| |
485 { |
| |
486 GtkWidget *ret = NULL, *frame = NULL; |
| |
487 GtkWidget *vbox = NULL, *toggle = NULL, *group = NULL; |
| |
488 |
| |
489 ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18); |
| |
490 |
| |
491 /* Alerts */ |
| |
492 |
| |
493 frame = pidgin_make_frame(ret, _("Chatroom alerts")); |
| |
494 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); |
| |
495 gtk_box_append(GTK_BOX(frame), vbox); |
| |
496 |
| |
497 toggle = gtk_check_button_new_with_mnemonic(_("Chatroom message alerts _only where someone says your username")); |
| |
498 gtk_box_append(GTK_BOX(vbox), toggle); |
| |
499 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle), |
| |
500 purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick")); |
| |
501 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
502 G_CALLBACK(alert_config_cb), NULL); |
| |
503 |
| |
504 /* Launcher integration */ |
| |
505 |
| |
506 frame = pidgin_make_frame(ret, _("Launcher Icon")); |
| |
507 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); |
| |
508 gtk_box_append(GTK_BOX(frame), vbox); |
| |
509 |
| |
510 toggle = gtk_check_button_new_with_mnemonic(_("_Disable launcher integration")); |
| |
511 group = toggle; |
| |
512 gtk_box_append(GTK_BOX(vbox), toggle); |
| |
513 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle), |
| |
514 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_DISABLE); |
| |
515 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
516 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_DISABLE)); |
| |
517 |
| |
518 toggle = gtk_check_button_new_with_mnemonic( |
| |
519 _("Show number of unread _messages on launcher icon")); |
| |
520 gtk_check_button_set_group(GTK_CHECK_BUTTON(toggle), |
| |
521 GTK_CHECK_BUTTON(group)); |
| |
522 gtk_box_append(GTK_BOX(vbox), toggle); |
| |
523 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle), |
| |
524 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_MESSAGES); |
| |
525 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
526 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_MESSAGES)); |
| |
527 |
| |
528 toggle = gtk_check_button_new_with_mnemonic( |
| |
529 _("Show number of unread co_nversations on launcher icon")); |
| |
530 gtk_check_button_set_group(GTK_CHECK_BUTTON(toggle), |
| |
531 GTK_CHECK_BUTTON(group)); |
| |
532 gtk_box_append(GTK_BOX(vbox), toggle); |
| |
533 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle), |
| |
534 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_SOURCES); |
| |
535 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
536 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_SOURCES)); |
| |
537 |
| |
538 /* Messaging menu integration */ |
| |
539 |
| |
540 frame = pidgin_make_frame(ret, _("Messaging Menu")); |
| |
541 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); |
| |
542 gtk_box_append(GTK_BOX(frame), vbox); |
| |
543 |
| |
544 toggle = gtk_check_button_new_with_mnemonic( |
| |
545 _("Show number of _unread messages for conversations in messaging menu")); |
| |
546 group = toggle; |
| |
547 gtk_box_append(GTK_BOX(vbox), toggle); |
| |
548 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle), |
| |
549 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_COUNT); |
| |
550 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
551 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_COUNT)); |
| |
552 |
| |
553 toggle = gtk_check_button_new_with_mnemonic( |
| |
554 _("Show _elapsed time for unread conversations in messaging menu")); |
| |
555 gtk_check_button_set_group(GTK_CHECK_BUTTON(toggle), |
| |
556 GTK_CHECK_BUTTON(group)); |
| |
557 gtk_box_append(GTK_BOX(vbox), toggle); |
| |
558 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle), |
| |
559 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_TIME); |
| |
560 g_signal_connect(G_OBJECT(toggle), "toggled", |
| |
561 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_TIME)); |
| |
562 |
| |
563 return ret; |
| |
564 } |
| |
565 |
| |
566 static GPluginPluginInfo * |
| |
567 unity_query(GError **error) |
| |
568 { |
| |
569 const gchar * const authors[] = { |
| |
570 "Ankit Vani <a@nevitus.org>", |
| |
571 NULL |
| |
572 }; |
| |
573 |
| |
574 return pidgin_plugin_info_new( |
| |
575 "id", UNITY_PLUGIN_ID, |
| |
576 "name", N_("Unity Integration"), |
| |
577 "version", DISPLAY_VERSION, |
| |
578 "category", N_("Notification"), |
| |
579 "summary", N_("Provides integration with Unity."), |
| |
580 "description", N_("Provides integration with Unity's " |
| |
581 "messaging menu and launcher."), |
| |
582 "authors", authors, |
| |
583 "website", PURPLE_WEBSITE, |
| |
584 "abi-version", PURPLE_ABI_VERSION, |
| |
585 "gtk-config-frame-cb", get_config_frame, |
| |
586 NULL |
| |
587 ); |
| |
588 } |
| |
589 |
| |
590 static gboolean |
| |
591 unity_load(GPluginPlugin *plugin, GError **error) { |
| |
592 GList *convs = NULL; |
| |
593 PurpleConversationManager *manager = NULL; |
| |
594 PurpleSavedStatus *saved_status; |
| |
595 void *conv_handle = purple_conversations_get_handle(); |
| |
596 void *gtk_conv_handle = pidgin_conversations_get_handle(); |
| |
597 void *savedstat_handle = purple_savedstatuses_get_handle(); |
| |
598 |
| |
599 purple_prefs_add_none("/plugins/gtk"); |
| |
600 purple_prefs_add_none("/plugins/gtk/unity"); |
| |
601 purple_prefs_add_int("/plugins/gtk/unity/launcher_count", LAUNCHER_COUNT_SOURCES); |
| |
602 purple_prefs_add_int("/plugins/gtk/unity/messaging_menu_text", MESSAGING_MENU_COUNT); |
| |
603 purple_prefs_add_bool("/plugins/gtk/unity/alert_chat_nick", TRUE); |
| |
604 |
| |
605 alert_chat_nick = purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick"); |
| |
606 |
| |
607 mmapp = messaging_menu_app_new("pidgin.desktop"); |
| |
608 g_object_ref(mmapp); |
| |
609 messaging_menu_app_register(mmapp); |
| |
610 messaging_menu_text = purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text"); |
| |
611 |
| |
612 g_signal_connect(mmapp, "activate-source", |
| |
613 G_CALLBACK(message_source_activated), NULL); |
| |
614 g_signal_connect(mmapp, "status-changed", |
| |
615 G_CALLBACK(messaging_menu_status_changed), NULL); |
| |
616 |
| |
617 saved_status = purple_savedstatus_get_current(); |
| |
618 status_changed_cb(saved_status); |
| |
619 |
| |
620 purple_signal_connect(savedstat_handle, "savedstatus-changed", plugin, |
| |
621 G_CALLBACK(status_changed_cb), NULL); |
| |
622 |
| |
623 launcher = unity_launcher_entry_get_for_desktop_id("pidgin.desktop"); |
| |
624 g_object_ref(launcher); |
| |
625 launcher_count = purple_prefs_get_int("/plugins/gtk/unity/launcher_count"); |
| |
626 |
| |
627 purple_signal_connect(gtk_conv_handle, "displayed-im-msg", plugin, |
| |
628 G_CALLBACK(message_displayed_cb), NULL); |
| |
629 purple_signal_connect(gtk_conv_handle, "displayed-chat-msg", plugin, |
| |
630 G_CALLBACK(message_displayed_cb), NULL); |
| |
631 purple_signal_connect(conv_handle, "sent-im-msg", plugin, |
| |
632 G_CALLBACK(im_sent_im), NULL); |
| |
633 purple_signal_connect(conv_handle, "sent-chat-msg", plugin, |
| |
634 G_CALLBACK(chat_sent_im), NULL); |
| |
635 purple_signal_connect(conv_handle, "conversation-created", plugin, |
| |
636 G_CALLBACK(conv_created), NULL); |
| |
637 purple_signal_connect(conv_handle, "deleting-conversation", plugin, |
| |
638 G_CALLBACK(deleting_conv), NULL); |
| |
639 |
| |
640 manager = purple_conversation_manager_get_default(); |
| |
641 convs = purple_conversation_manager_get_all(manager); |
| |
642 while(convs != NULL) { |
| |
643 PurpleConversation *conv = PURPLE_CONVERSATION(convs->data); |
| |
644 attach_signals(conv); |
| |
645 convs = g_list_delete_link(convs, convs); |
| |
646 } |
| |
647 |
| |
648 return TRUE; |
| |
649 } |
| |
650 |
| |
651 static gboolean |
| |
652 unity_unload(GPluginPlugin *plugin, gboolean shutdown, GError **error) { |
| |
653 GList *convs = NULL; |
| |
654 PurpleConversationManager *manager = NULL; |
| |
655 |
| |
656 manager = purple_conversation_manager_get_default(); |
| |
657 convs = purple_conversation_manager_get_all(manager); |
| |
658 |
| |
659 while(convs != NULL) { |
| |
660 PurpleConversation *conv = PURPLE_CONVERSATION(convs->data); |
| |
661 unalert(conv); |
| |
662 detach_signals(conv); |
| |
663 convs = g_list_delete_link(convs, convs); |
| |
664 } |
| |
665 |
| |
666 unity_launcher_entry_set_count_visible(launcher, FALSE); |
| |
667 messaging_menu_app_unregister(mmapp); |
| |
668 |
| |
669 g_object_unref(launcher); |
| |
670 g_object_unref(mmapp); |
| |
671 return TRUE; |
| |
672 } |
| |
673 |
| |
674 GPLUGIN_NATIVE_PLUGIN_DECLARE(unity) |