pidgin/plugins/unity/unity.c

changeset 42452
8b5a5b21d6da
parent 42342
7498c6982122
child 42453
1c13bc243b7d
equal deleted inserted replaced
42451:b706b229d5f4 42452:8b5a5b21d6da
25 25
26 #include <unity.h> 26 #include <unity.h>
27 #include <messaging-menu.h> 27 #include <messaging-menu.h>
28 28
29 #define UNITY_PLUGIN_ID "gtk-unity-integration" 29 #define UNITY_PLUGIN_ID "gtk-unity-integration"
30 #define SETTINGS_SCHEMA_ID "im.pidgin.Pidgin.plugin.Unity"
30 31
31 static MessagingMenuApp *mmapp = NULL; 32 static MessagingMenuApp *mmapp = NULL;
32 static UnityLauncherEntry *launcher = NULL; 33 static UnityLauncherEntry *launcher = NULL;
33 static guint n_sources = 0; 34 static guint n_sources = 0;
34 static gint launcher_count; 35 static gint launcher_count;
415 saved_status = create_transient_status(primitive, NULL); 416 saved_status = create_transient_status(primitive, NULL);
416 purple_savedstatus_activate(saved_status); 417 purple_savedstatus_activate(saved_status);
417 } 418 }
418 419
419 static void 420 static void
420 alert_config_cb(GtkWidget *widget, G_GNUC_UNUSED gpointer data) 421 settings_change_cb(GSettings *settings, char *key, G_GNUC_UNUSED gpointer data)
421 { 422 {
422 gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); 423 if(purple_strequal(key, "alert-chat-nick")) {
423 purple_prefs_set_bool("/plugins/gtk/unity/alert_chat_nick", on); 424 alert_chat_nick = g_settings_get_boolean(settings, key);
424 alert_chat_nick = on; 425 } else if(purple_strequal(key, "launcher-count")) {
425 } 426 launcher_count = g_settings_get_enum(settings, key);
426 427 if(launcher_count == LAUNCHER_COUNT_DISABLE) {
427 static void 428 unity_launcher_entry_set_count_visible(launcher, FALSE);
428 launcher_config_cb(GtkWidget *widget, gpointer data) 429 } else {
429 { 430 update_launcher();
430 gint option = GPOINTER_TO_INT(data); 431 }
431 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) 432 } else if(purple_strequal(key, "messaging-menu-text")) {
432 return; 433 messaging_menu_text = g_settings_get_enum(settings, key);
433 434 refill_messaging_menu();
434 purple_prefs_set_int("/plugins/gtk/unity/launcher_count", option); 435 } else {
435 launcher_count = option; 436 g_warning("Got unity-integration settings change for unknown key: %s",
436 if (option == LAUNCHER_COUNT_DISABLE) 437 key);
437 unity_launcher_entry_set_count_visible(launcher, FALSE); 438 }
438 else
439 update_launcher();
440 }
441
442 static void
443 messaging_menu_config_cb(GtkWidget *widget, gpointer data)
444 {
445 gint option = GPOINTER_TO_INT(data);
446 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
447 return;
448
449 purple_prefs_set_int("/plugins/gtk/unity/messaging_menu_text", option);
450 messaging_menu_text = option;
451 refill_messaging_menu();
452 } 439 }
453 440
454 static int 441 static int
455 attach_signals(PurpleConversation *conv) 442 attach_signals(PurpleConversation *conv)
456 { 443 {
487 id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-entry-signal")); 474 id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(conv), "unity-entry-signal"));
488 g_signal_handler_disconnect(gtkconv->entry, id); 475 g_signal_handler_disconnect(gtkconv->entry, id);
489 476
490 g_object_set_data(G_OBJECT(conv), "unity-message-count", 477 g_object_set_data(G_OBJECT(conv), "unity-message-count",
491 GINT_TO_POINTER(0)); 478 GINT_TO_POINTER(0));
492 }
493
494 static GtkWidget *
495 get_config_frame(G_GNUC_UNUSED PurplePlugin *plugin)
496 {
497 GtkWidget *ret = NULL, *frame = NULL;
498 GtkWidget *vbox = NULL, *toggle = NULL, *group = NULL;
499
500 ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
501
502 /* Alerts */
503
504 frame = pidgin_make_frame(ret, _("Chatroom alerts"));
505 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
506 gtk_box_append(GTK_BOX(frame), vbox);
507
508 toggle = gtk_check_button_new_with_mnemonic(_("Chatroom message alerts _only where someone says your username"));
509 gtk_box_append(GTK_BOX(vbox), toggle);
510 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle),
511 purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick"));
512 g_signal_connect(G_OBJECT(toggle), "toggled",
513 G_CALLBACK(alert_config_cb), NULL);
514
515 /* Launcher integration */
516
517 frame = pidgin_make_frame(ret, _("Launcher Icon"));
518 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
519 gtk_box_append(GTK_BOX(frame), vbox);
520
521 toggle = gtk_check_button_new_with_mnemonic(_("_Disable launcher integration"));
522 group = toggle;
523 gtk_box_append(GTK_BOX(vbox), toggle);
524 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle),
525 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_DISABLE);
526 g_signal_connect(G_OBJECT(toggle), "toggled",
527 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_DISABLE));
528
529 toggle = gtk_check_button_new_with_mnemonic(
530 _("Show number of unread _messages on launcher icon"));
531 gtk_check_button_set_group(GTK_CHECK_BUTTON(toggle),
532 GTK_CHECK_BUTTON(group));
533 gtk_box_append(GTK_BOX(vbox), toggle);
534 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle),
535 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_MESSAGES);
536 g_signal_connect(G_OBJECT(toggle), "toggled",
537 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_MESSAGES));
538
539 toggle = gtk_check_button_new_with_mnemonic(
540 _("Show number of unread co_nversations on launcher icon"));
541 gtk_check_button_set_group(GTK_CHECK_BUTTON(toggle),
542 GTK_CHECK_BUTTON(group));
543 gtk_box_append(GTK_BOX(vbox), toggle);
544 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle),
545 purple_prefs_get_int("/plugins/gtk/unity/launcher_count") == LAUNCHER_COUNT_SOURCES);
546 g_signal_connect(G_OBJECT(toggle), "toggled",
547 G_CALLBACK(launcher_config_cb), GUINT_TO_POINTER(LAUNCHER_COUNT_SOURCES));
548
549 /* Messaging menu integration */
550
551 frame = pidgin_make_frame(ret, _("Messaging Menu"));
552 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
553 gtk_box_append(GTK_BOX(frame), vbox);
554
555 toggle = gtk_check_button_new_with_mnemonic(
556 _("Show number of _unread messages for conversations in messaging menu"));
557 group = toggle;
558 gtk_box_append(GTK_BOX(vbox), toggle);
559 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle),
560 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_COUNT);
561 g_signal_connect(G_OBJECT(toggle), "toggled",
562 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_COUNT));
563
564 toggle = gtk_check_button_new_with_mnemonic(
565 _("Show _elapsed time for unread conversations in messaging menu"));
566 gtk_check_button_set_group(GTK_CHECK_BUTTON(toggle),
567 GTK_CHECK_BUTTON(group));
568 gtk_box_append(GTK_BOX(vbox), toggle);
569 gtk_check_button_set_active(GTK_CHECK_BUTTON(toggle),
570 purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text") == MESSAGING_MENU_TIME);
571 g_signal_connect(G_OBJECT(toggle), "toggled",
572 G_CALLBACK(messaging_menu_config_cb), GUINT_TO_POINTER(MESSAGING_MENU_TIME));
573
574 return ret;
575 } 479 }
576 480
577 static GPluginPluginInfo * 481 static GPluginPluginInfo *
578 unity_query(G_GNUC_UNUSED GError **error) 482 unity_query(G_GNUC_UNUSED GError **error)
579 { 483 {
591 "description", N_("Provides integration with Unity's " 495 "description", N_("Provides integration with Unity's "
592 "messaging menu and launcher."), 496 "messaging menu and launcher."),
593 "authors", authors, 497 "authors", authors,
594 "website", PURPLE_WEBSITE, 498 "website", PURPLE_WEBSITE,
595 "abi-version", PURPLE_ABI_VERSION, 499 "abi-version", PURPLE_ABI_VERSION,
596 "gtk-config-frame-cb", get_config_frame, 500 "settings-schema", SETTINGS_SCHEMA_ID,
597 NULL 501 NULL
598 ); 502 );
599 } 503 }
600 504
601 static gboolean 505 static gboolean
602 unity_load(GPluginPlugin *plugin, G_GNUC_UNUSED GError **error) { 506 unity_load(GPluginPlugin *plugin, G_GNUC_UNUSED GError **error) {
507 GSettings *settings = NULL;
603 GList *convs = NULL; 508 GList *convs = NULL;
604 PurpleConversationManager *manager = NULL; 509 PurpleConversationManager *manager = NULL;
605 PurpleSavedStatus *saved_status; 510 PurpleSavedStatus *saved_status;
606 void *conv_handle = purple_conversations_get_handle(); 511 void *conv_handle = purple_conversations_get_handle();
607 void *gtk_conv_handle = pidgin_conversations_get_handle(); 512 void *gtk_conv_handle = pidgin_conversations_get_handle();
608 void *savedstat_handle = purple_savedstatuses_get_handle(); 513 void *savedstat_handle = purple_savedstatuses_get_handle();
609 514
610 purple_prefs_add_none("/plugins/gtk"); 515 settings = g_settings_new_with_backend(SETTINGS_SCHEMA_ID,
611 purple_prefs_add_none("/plugins/gtk/unity"); 516 purple_core_get_settings_backend());
612 purple_prefs_add_int("/plugins/gtk/unity/launcher_count", LAUNCHER_COUNT_SOURCES); 517 g_signal_connect(settings, "changed",
613 purple_prefs_add_int("/plugins/gtk/unity/messaging_menu_text", MESSAGING_MENU_COUNT); 518 G_CALLBACK(settings_change_cb), NULL);
614 purple_prefs_add_bool("/plugins/gtk/unity/alert_chat_nick", TRUE); 519
615 520 alert_chat_nick = g_settings_get_boolean(settings, "alert-chat-nick");
616 alert_chat_nick = purple_prefs_get_bool("/plugins/gtk/unity/alert_chat_nick");
617 521
618 mmapp = messaging_menu_app_new("pidgin.desktop"); 522 mmapp = messaging_menu_app_new("pidgin.desktop");
619 g_object_ref(mmapp); 523 g_object_ref(mmapp);
620 messaging_menu_app_register(mmapp); 524 messaging_menu_app_register(mmapp);
621 messaging_menu_text = purple_prefs_get_int("/plugins/gtk/unity/messaging_menu_text"); 525 messaging_menu_text = g_settings_get_enum(settings, "messaging-menu-text");
622 526
623 g_signal_connect(mmapp, "activate-source", 527 g_signal_connect(mmapp, "activate-source",
624 G_CALLBACK(message_source_activated), NULL); 528 G_CALLBACK(message_source_activated), NULL);
625 g_signal_connect(mmapp, "status-changed", 529 g_signal_connect(mmapp, "status-changed",
626 G_CALLBACK(messaging_menu_status_changed), NULL); 530 G_CALLBACK(messaging_menu_status_changed), NULL);
631 purple_signal_connect(savedstat_handle, "savedstatus-changed", plugin, 535 purple_signal_connect(savedstat_handle, "savedstatus-changed", plugin,
632 G_CALLBACK(status_changed_cb), NULL); 536 G_CALLBACK(status_changed_cb), NULL);
633 537
634 launcher = unity_launcher_entry_get_for_desktop_id("pidgin.desktop"); 538 launcher = unity_launcher_entry_get_for_desktop_id("pidgin.desktop");
635 g_object_ref(launcher); 539 g_object_ref(launcher);
636 launcher_count = purple_prefs_get_int("/plugins/gtk/unity/launcher_count"); 540 launcher_count = g_settings_get_enum(settings, "launcher-count");
637 541
638 purple_signal_connect(gtk_conv_handle, "displayed-im-msg", plugin, 542 purple_signal_connect(gtk_conv_handle, "displayed-im-msg", plugin,
639 G_CALLBACK(message_displayed_cb), NULL); 543 G_CALLBACK(message_displayed_cb), NULL);
640 purple_signal_connect(gtk_conv_handle, "displayed-chat-msg", plugin, 544 purple_signal_connect(gtk_conv_handle, "displayed-chat-msg", plugin,
641 G_CALLBACK(message_displayed_cb), NULL); 545 G_CALLBACK(message_displayed_cb), NULL);
654 PurpleConversation *conv = PURPLE_CONVERSATION(convs->data); 558 PurpleConversation *conv = PURPLE_CONVERSATION(convs->data);
655 attach_signals(conv); 559 attach_signals(conv);
656 convs = g_list_delete_link(convs, convs); 560 convs = g_list_delete_link(convs, convs);
657 } 561 }
658 562
563 g_object_unref(settings);
564
659 return TRUE; 565 return TRUE;
660 } 566 }
661 567
662 static gboolean 568 static gboolean
663 unity_unload(G_GNUC_UNUSED GPluginPlugin *plugin, 569 unity_unload(G_GNUC_UNUSED GPluginPlugin *plugin,

mercurial