| |
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) |