comparison pidgin/gtkutils.c @ 18043:6b7b13adb9b1

propagate from branch 'im.pidgin.pidgin' (head ac83216c7b78e652b47f1fd0bcb91f1eaf2cdf36) to branch 'im.pidgin.pidgin.2.1.0' (head 30a48520e9bc26b0d3914edad456b063cd6cf9fe)
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Mon, 04 Jun 2007 23:48:54 +0000
parents 2a6fb7c6d030 70fb7663a918
children 2f9eabdc6011
comparison
equal deleted inserted replaced
18036:ee9f7ee0be66 18043:6b7b13adb9b1
259 gtk_widget_hide(to_toggle); 259 gtk_widget_hide(to_toggle);
260 else 260 else
261 gtk_widget_show(to_toggle); 261 gtk_widget_show(to_toggle);
262 } 262 }
263 263
264 void pidgin_separator(GtkWidget *menu) 264 GtkWidget *pidgin_separator(GtkWidget *menu)
265 { 265 {
266 GtkWidget *menuitem; 266 GtkWidget *menuitem;
267 267
268 menuitem = gtk_separator_menu_item_new(); 268 menuitem = gtk_separator_menu_item_new();
269 gtk_widget_show(menuitem); 269 gtk_widget_show(menuitem);
270 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 270 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
271 return menuitem;
271 } 272 }
272 273
273 GtkWidget *pidgin_new_item(GtkWidget *menu, const char *str) 274 GtkWidget *pidgin_new_item(GtkWidget *menu, const char *str)
274 { 275 {
275 GtkWidget *menuitem; 276 GtkWidget *menuitem;
476 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); 477 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data"));
477 } 478 }
478 } 479 }
479 480
480 static GtkWidget * 481 static GtkWidget *
481 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data) 482 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data)
482 { 483 {
483 GtkWidget *item; 484 GtkWidget *item;
484 GtkWidget *hbox; 485 GtkWidget *hbox;
485 GtkWidget *image; 486 GtkWidget *image;
486 GtkWidget *label; 487 GtkWidget *label;
509 510
510 gtk_container_add(GTK_CONTAINER(item), hbox); 511 gtk_container_add(GTK_CONTAINER(item), hbox);
511 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); 512 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
512 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); 513 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
513 514
515 g_object_set_data(G_OBJECT (item), data, per_item_data);
514 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); 516 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data);
515 517
516 pidgin_set_accessible_label(item, label); 518 pidgin_set_accessible_label(item, label);
517 519
518 return item; 520 return item;
521 }
522
523 static GdkPixbuf *
524 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account)
525 {
526 PurplePluginProtocolInfo *prpl_info;
527 const char *protoname = NULL;
528 char buf[MAXPATHLEN];
529 char *filename = NULL;
530 GdkPixbuf *pixbuf;
531
532 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
533 if (prpl_info->list_icon == NULL)
534 return NULL;
535
536 protoname = prpl_info->list_icon(account, NULL);
537 if (protoname == NULL)
538 return NULL;
539
540 /*
541 * Status icons will be themeable too, and then it will look up
542 * protoname from the theme
543 */
544 g_snprintf(buf, sizeof(buf), "%s.png", protoname);
545
546 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
547 size == PIDGIN_PRPL_ICON_SMALL ? "16" :
548 size == PIDGIN_PRPL_ICON_MEDIUM ? "22" : "48",
549 buf, NULL);
550 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
551 g_free(filename);
552
553 return pixbuf;
519 } 554 }
520 555
521 static GtkWidget * 556 static GtkWidget *
522 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) 557 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data)
523 { 558 {
564 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { 599 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) {
565 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); 600 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx);
566 break; 601 break;
567 } 602 }
568 } 603 }
569 }
570
571 static GdkPixbuf *
572 get_prpl_pixbuf(PurplePluginProtocolInfo *prpl_info)
573 {
574 const char *proto_name;
575 GdkPixbuf *pixbuf = NULL;
576 char *filename;
577 char buf[256];
578
579 proto_name = prpl_info->list_icon(NULL, NULL);
580 g_return_val_if_fail(proto_name != NULL, NULL);
581
582 g_snprintf(buf, sizeof(buf), "%s.png", proto_name);
583 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", buf, NULL);
584 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
585 g_free(filename);
586
587 return pixbuf;
588 } 604 }
589 605
590 static AopMenu * 606 static AopMenu *
591 create_protocols_menu(const char *default_proto_id) 607 create_protocols_menu(const char *default_proto_id)
592 { 608 {
616 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); 632 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
617 633
618 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { 634 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) {
619 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", 635 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
620 "16", "google-talk.png", NULL); 636 "16", "google-talk.png", NULL);
637 GtkWidget *item;
638
621 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); 639 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
622 g_free(filename); 640 g_free(filename);
623 641
624 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 642 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu),
625 aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber")); 643 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol"));
644 g_object_set_data(G_OBJECT(item), "fake", GINT_TO_POINTER(1));
626 645
627 if (pixbuf) 646 if (pixbuf)
628 g_object_unref(pixbuf); 647 g_object_unref(pixbuf);
629 648
630 gtalk_name = NULL; 649 gtalk_name = NULL;
631 i++; 650 i++;
632 } 651 }
633 652
634 pixbuf = get_prpl_pixbuf(prpl_info); 653 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL);
635 654
636 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 655 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu),
637 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id)); 656 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol"));
638 657
639 if (pixbuf) 658 if (pixbuf)
640 g_object_unref(pixbuf); 659 g_object_unref(pixbuf);
641 660
642 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) 661 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id))
684 aop_menu->menu = gtk_menu_new(); 703 aop_menu->menu = gtk_menu_new();
685 gtk_widget_show(aop_menu->menu); 704 gtk_widget_show(aop_menu->menu);
686 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); 705 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
687 706
688 for (p = list, i = 0; p != NULL; p = p->next, i++) { 707 for (p = list, i = 0; p != NULL; p = p->next, i++) {
689 PurplePluginProtocolInfo *prpl_info = NULL;
690 PurplePlugin *plugin; 708 PurplePlugin *plugin;
691 709
692 if (show_all) 710 if (show_all)
693 account = (PurpleAccount *)p->data; 711 account = (PurpleAccount *)p->data;
694 else { 712 else {
702 continue; 720 continue;
703 } 721 }
704 722
705 plugin = purple_find_prpl(purple_account_get_protocol_id(account)); 723 plugin = purple_find_prpl(purple_account_get_protocol_id(account));
706 724
707 if (plugin) 725 pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
708 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); 726
709 727 if (pixbuf) {
710 /* Load the image. */ 728 if (purple_account_is_disconnected(account) && show_all &&
711 if (prpl_info) { 729 purple_connections_get_all())
712 pixbuf = get_prpl_pixbuf(prpl_info); 730 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE);
713
714 if (pixbuf) {
715 if (purple_account_is_disconnected(account) && show_all &&
716 purple_connections_get_all())
717 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE);
718 }
719 } 731 }
720 732
721 if (purple_account_get_alias(account)) { 733 if (purple_account_get_alias(account)) {
722 g_snprintf(buf, sizeof(buf), "%s (%s) (%s)", 734 g_snprintf(buf, sizeof(buf), "%s (%s) (%s)",
723 purple_account_get_username(account), 735 purple_account_get_username(account),
728 purple_account_get_username(account), 740 purple_account_get_username(account),
729 purple_account_get_protocol_name(account)); 741 purple_account_get_protocol_name(account));
730 } 742 }
731 743
732 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 744 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu),
733 aop_menu_item_new(sg, pixbuf, buf, account)); 745 aop_menu_item_new(sg, pixbuf, buf, account, "account"));
734 746
735 if (pixbuf) 747 if (pixbuf)
736 g_object_unref(pixbuf); 748 g_object_unref(pixbuf);
737 749
738 if (default_account && account == default_account) 750 if (default_account && account == default_account)
895 907
896 filename = g_build_filename(purple_user_dir(), G_DIR_SEPARATOR_S, 908 filename = g_build_filename(purple_user_dir(), G_DIR_SEPARATOR_S,
897 "accels", NULL); 909 "accels", NULL);
898 gtk_accel_map_load(filename); 910 gtk_accel_map_load(filename);
899 g_free(filename); 911 g_free(filename);
912 }
913
914 void pidgin_retrieve_user_info(PurpleConnection *conn, const char *name)
915 {
916 PurpleNotifyUserInfo *info = purple_notify_user_info_new();
917 purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving..."));
918 purple_notify_userinfo(conn, name, info, NULL, NULL);
919 purple_notify_user_info_destroy(info);
920 serv_get_info(conn, name);
900 } 921 }
901 922
902 gboolean 923 gboolean
903 pidgin_parse_x_im_contact(const char *msg, gboolean all_accounts, 924 pidgin_parse_x_im_contact(const char *msg, gboolean all_accounts,
904 PurpleAccount **ret_account, char **ret_protocol, 925 PurpleAccount **ret_account, char **ret_protocol,
1597 1618
1598 GdkPixbuf * 1619 GdkPixbuf *
1599 pidgin_create_prpl_icon(PurpleAccount *account, PidginPrplIconSize size) 1620 pidgin_create_prpl_icon(PurpleAccount *account, PidginPrplIconSize size)
1600 { 1621 {
1601 PurplePlugin *prpl; 1622 PurplePlugin *prpl;
1602 PurplePluginProtocolInfo *prpl_info;
1603 const char *protoname = NULL;
1604 char buf[256]; /* TODO: We should use a define for max file length */
1605 char *filename = NULL;
1606 GdkPixbuf *pixbuf;
1607 1623
1608 g_return_val_if_fail(account != NULL, NULL); 1624 g_return_val_if_fail(account != NULL, NULL);
1609 1625
1610 prpl = purple_find_prpl(purple_account_get_protocol_id(account)); 1626 prpl = purple_find_prpl(purple_account_get_protocol_id(account));
1611 if (prpl == NULL) 1627 if (prpl == NULL)
1612 return NULL; 1628 return NULL;
1613 1629 return pidgin_create_prpl_icon_from_prpl(prpl, size, account);
1614 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
1615 if (prpl_info->list_icon == NULL)
1616 return NULL;
1617
1618 protoname = prpl_info->list_icon(account, NULL);
1619 if (protoname == NULL)
1620 return NULL;
1621
1622 /*
1623 * Status icons will be themeable too, and then it will look up
1624 * protoname from the theme
1625 */
1626 g_snprintf(buf, sizeof(buf), "%s.png", protoname);
1627
1628 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
1629 size == PIDGIN_PRPL_ICON_SMALL ? "16" :
1630 size == PIDGIN_PRPL_ICON_MEDIUM ? "22" : "48",
1631 buf, NULL);
1632 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
1633 g_free(filename);
1634
1635 return pixbuf;
1636 } 1630 }
1637 1631
1638 static void 1632 static void
1639 menu_action_cb(GtkMenuItem *item, gpointer object) 1633 menu_action_cb(GtkMenuItem *item, gpointer object)
1640 { 1634 {
1646 1640
1647 if (callback) 1641 if (callback)
1648 callback(object, data); 1642 callback(object, data);
1649 } 1643 }
1650 1644
1651 void 1645 GtkWidget *
1652 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, 1646 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act,
1653 gpointer object) 1647 gpointer object)
1654 { 1648 {
1649 GtkWidget *menuitem;
1650
1655 if (act == NULL) { 1651 if (act == NULL) {
1656 pidgin_separator(menu); 1652 return pidgin_separator(menu);
1653 }
1654
1655 if (act->children == NULL) {
1656 menuitem = gtk_menu_item_new_with_mnemonic(act->label);
1657
1658 if (act->callback != NULL) {
1659 g_object_set_data(G_OBJECT(menuitem),
1660 "purplecallback",
1661 act->callback);
1662 g_object_set_data(G_OBJECT(menuitem),
1663 "purplecallbackdata",
1664 act->data);
1665 g_signal_connect(G_OBJECT(menuitem), "activate",
1666 G_CALLBACK(menu_action_cb),
1667 object);
1668 } else {
1669 gtk_widget_set_sensitive(menuitem, FALSE);
1670 }
1671
1672 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
1657 } else { 1673 } else {
1658 GtkWidget *menuitem; 1674 GList *l = NULL;
1659 1675 GtkWidget *submenu = NULL;
1660 if (act->children == NULL) { 1676 GtkAccelGroup *group;
1661 menuitem = gtk_menu_item_new_with_mnemonic(act->label); 1677
1662 1678 menuitem = gtk_menu_item_new_with_mnemonic(act->label);
1663 if (act->callback != NULL) { 1679 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
1664 g_object_set_data(G_OBJECT(menuitem), 1680
1665 "purplecallback", 1681 submenu = gtk_menu_new();
1666 act->callback); 1682 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
1667 g_object_set_data(G_OBJECT(menuitem), 1683
1668 "purplecallbackdata", 1684 group = gtk_menu_get_accel_group(GTK_MENU(menu));
1669 act->data); 1685 if (group) {
1670 g_signal_connect(G_OBJECT(menuitem), "activate", 1686 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label);
1671 G_CALLBACK(menu_action_cb), 1687 gtk_menu_set_accel_path(GTK_MENU(submenu), path);
1672 object); 1688 g_free(path);
1673 } else { 1689 gtk_menu_set_accel_group(GTK_MENU(submenu), group);
1674 gtk_widget_set_sensitive(menuitem, FALSE); 1690 }
1675 } 1691
1676 1692 for (l = act->children; l; l = l->next) {
1677 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 1693 PurpleMenuAction *act = (PurpleMenuAction *)l->data;
1678 } else { 1694
1679 GList *l = NULL; 1695 pidgin_append_menu_action(submenu, act, object);
1680 GtkWidget *submenu = NULL; 1696 }
1681 GtkAccelGroup *group; 1697 g_list_free(act->children);
1682 1698 act->children = NULL;
1683 menuitem = gtk_menu_item_new_with_mnemonic(act->label); 1699 }
1684 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 1700 purple_menu_action_free(act);
1685 1701 return menuitem;
1686 submenu = gtk_menu_new();
1687 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
1688
1689 group = gtk_menu_get_accel_group(GTK_MENU(menu));
1690 if (group) {
1691 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label);
1692 gtk_menu_set_accel_path(GTK_MENU(submenu), path);
1693 g_free(path);
1694 gtk_menu_set_accel_group(GTK_MENU(submenu), group);
1695 }
1696
1697 for (l = act->children; l; l = l->next) {
1698 PurpleMenuAction *act = (PurpleMenuAction *)l->data;
1699
1700 pidgin_append_menu_action(submenu, act, object);
1701 }
1702 g_list_free(act->children);
1703 act->children = NULL;
1704 }
1705 purple_menu_action_free(act);
1706 }
1707 } 1702 }
1708 1703
1709 #if GTK_CHECK_VERSION(2,3,0) 1704 #if GTK_CHECK_VERSION(2,3,0)
1710 # define NEW_STYLE_COMPLETION 1705 # define NEW_STYLE_COMPLETION
1711 #endif 1706 #endif