Mercurial > pidgin.yaz
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 |