Mercurial > pidgin.yaz
comparison pidgin/gtkutils.c @ 17998:70fb7663a918
merge of '2a1a3522e67a5f99ed2e65a23693d148907cfdb7'
and '92064acfc75ce644d052783c588ecd1058b3a76a'
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 02 Jun 2007 14:41:13 +0000 |
parents | ff04387682ce 9fe9b4debad7 |
children | d40fd7106ebf 6b7b13adb9b1 |
comparison
equal
deleted
inserted
replaced
17659:ff04387682ce | 17998:70fb7663a918 |
---|---|
243 gtk_widget_hide(to_toggle); | 243 gtk_widget_hide(to_toggle); |
244 else | 244 else |
245 gtk_widget_show(to_toggle); | 245 gtk_widget_show(to_toggle); |
246 } | 246 } |
247 | 247 |
248 void pidgin_separator(GtkWidget *menu) | 248 GtkWidget *pidgin_separator(GtkWidget *menu) |
249 { | 249 { |
250 GtkWidget *menuitem; | 250 GtkWidget *menuitem; |
251 | 251 |
252 menuitem = gtk_separator_menu_item_new(); | 252 menuitem = gtk_separator_menu_item_new(); |
253 gtk_widget_show(menuitem); | 253 gtk_widget_show(menuitem); |
254 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 254 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
255 return menuitem; | |
255 } | 256 } |
256 | 257 |
257 GtkWidget *pidgin_new_item(GtkWidget *menu, const char *str) | 258 GtkWidget *pidgin_new_item(GtkWidget *menu, const char *str) |
258 { | 259 { |
259 GtkWidget *menuitem; | 260 GtkWidget *menuitem; |
460 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); | 461 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); |
461 } | 462 } |
462 } | 463 } |
463 | 464 |
464 static GtkWidget * | 465 static GtkWidget * |
465 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data) | 466 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) |
466 { | 467 { |
467 GtkWidget *item; | 468 GtkWidget *item; |
468 GtkWidget *hbox; | 469 GtkWidget *hbox; |
469 GtkWidget *image; | 470 GtkWidget *image; |
470 GtkWidget *label; | 471 GtkWidget *label; |
493 | 494 |
494 gtk_container_add(GTK_CONTAINER(item), hbox); | 495 gtk_container_add(GTK_CONTAINER(item), hbox); |
495 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); | 496 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); |
496 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); | 497 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); |
497 | 498 |
499 g_object_set_data(G_OBJECT (item), data, per_item_data); | |
498 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); | 500 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); |
499 | 501 |
500 pidgin_set_accessible_label(item, label); | 502 pidgin_set_accessible_label(item, label); |
501 | 503 |
502 return item; | 504 return item; |
505 } | |
506 | |
507 static GdkPixbuf * | |
508 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) | |
509 { | |
510 PurplePluginProtocolInfo *prpl_info; | |
511 const char *protoname = NULL; | |
512 char buf[MAXPATHLEN]; | |
513 char *filename = NULL; | |
514 GdkPixbuf *pixbuf; | |
515 | |
516 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); | |
517 if (prpl_info->list_icon == NULL) | |
518 return NULL; | |
519 | |
520 protoname = prpl_info->list_icon(account, NULL); | |
521 if (protoname == NULL) | |
522 return NULL; | |
523 | |
524 /* | |
525 * Status icons will be themeable too, and then it will look up | |
526 * protoname from the theme | |
527 */ | |
528 g_snprintf(buf, sizeof(buf), "%s.png", protoname); | |
529 | |
530 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", | |
531 size == PIDGIN_PRPL_ICON_SMALL ? "16" : | |
532 size == PIDGIN_PRPL_ICON_MEDIUM ? "22" : "48", | |
533 buf, NULL); | |
534 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
535 g_free(filename); | |
536 | |
537 return pixbuf; | |
503 } | 538 } |
504 | 539 |
505 static GtkWidget * | 540 static GtkWidget * |
506 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) | 541 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) |
507 { | 542 { |
548 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { | 583 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { |
549 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); | 584 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); |
550 break; | 585 break; |
551 } | 586 } |
552 } | 587 } |
553 } | |
554 | |
555 static GdkPixbuf * | |
556 get_prpl_pixbuf(PurplePluginProtocolInfo *prpl_info) | |
557 { | |
558 const char *proto_name; | |
559 GdkPixbuf *pixbuf = NULL; | |
560 char *filename; | |
561 char buf[256]; | |
562 | |
563 proto_name = prpl_info->list_icon(NULL, NULL); | |
564 g_return_val_if_fail(proto_name != NULL, NULL); | |
565 | |
566 g_snprintf(buf, sizeof(buf), "%s.png", proto_name); | |
567 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", buf, NULL); | |
568 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
569 g_free(filename); | |
570 | |
571 return pixbuf; | |
572 } | 588 } |
573 | 589 |
574 static AopMenu * | 590 static AopMenu * |
575 create_protocols_menu(const char *default_proto_id) | 591 create_protocols_menu(const char *default_proto_id) |
576 { | 592 { |
600 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); | 616 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); |
601 | 617 |
602 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { | 618 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { |
603 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", | 619 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
604 "16", "google-talk.png", NULL); | 620 "16", "google-talk.png", NULL); |
621 GtkWidget *item; | |
622 | |
605 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | 623 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
606 g_free(filename); | 624 g_free(filename); |
607 | 625 |
608 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | 626 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
609 aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber")); | 627 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); |
628 g_object_set_data(G_OBJECT(item), "fake", GINT_TO_POINTER(1)); | |
610 | 629 |
611 if (pixbuf) | 630 if (pixbuf) |
612 g_object_unref(pixbuf); | 631 g_object_unref(pixbuf); |
613 | 632 |
614 gtalk_name = NULL; | 633 gtalk_name = NULL; |
615 i++; | 634 i++; |
616 } | 635 } |
617 | 636 |
618 pixbuf = get_prpl_pixbuf(prpl_info); | 637 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); |
619 | 638 |
620 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | 639 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
621 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id)); | 640 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); |
622 | 641 |
623 if (pixbuf) | 642 if (pixbuf) |
624 g_object_unref(pixbuf); | 643 g_object_unref(pixbuf); |
625 | 644 |
626 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) | 645 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
668 aop_menu->menu = gtk_menu_new(); | 687 aop_menu->menu = gtk_menu_new(); |
669 gtk_widget_show(aop_menu->menu); | 688 gtk_widget_show(aop_menu->menu); |
670 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | 689 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
671 | 690 |
672 for (p = list, i = 0; p != NULL; p = p->next, i++) { | 691 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
673 PurplePluginProtocolInfo *prpl_info = NULL; | |
674 PurplePlugin *plugin; | 692 PurplePlugin *plugin; |
675 | 693 |
676 if (show_all) | 694 if (show_all) |
677 account = (PurpleAccount *)p->data; | 695 account = (PurpleAccount *)p->data; |
678 else { | 696 else { |
686 continue; | 704 continue; |
687 } | 705 } |
688 | 706 |
689 plugin = purple_find_prpl(purple_account_get_protocol_id(account)); | 707 plugin = purple_find_prpl(purple_account_get_protocol_id(account)); |
690 | 708 |
691 if (plugin) | 709 pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); |
692 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); | 710 |
693 | 711 if (pixbuf) { |
694 /* Load the image. */ | 712 if (purple_account_is_disconnected(account) && show_all && |
695 if (prpl_info) { | 713 purple_connections_get_all()) |
696 pixbuf = get_prpl_pixbuf(prpl_info); | 714 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); |
697 | |
698 if (pixbuf) { | |
699 if (purple_account_is_disconnected(account) && show_all && | |
700 purple_connections_get_all()) | |
701 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); | |
702 } | |
703 } | 715 } |
704 | 716 |
705 if (purple_account_get_alias(account)) { | 717 if (purple_account_get_alias(account)) { |
706 g_snprintf(buf, sizeof(buf), "%s (%s) (%s)", | 718 g_snprintf(buf, sizeof(buf), "%s (%s) (%s)", |
707 purple_account_get_username(account), | 719 purple_account_get_username(account), |
712 purple_account_get_username(account), | 724 purple_account_get_username(account), |
713 purple_account_get_protocol_name(account)); | 725 purple_account_get_protocol_name(account)); |
714 } | 726 } |
715 | 727 |
716 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | 728 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
717 aop_menu_item_new(sg, pixbuf, buf, account)); | 729 aop_menu_item_new(sg, pixbuf, buf, account, "account")); |
718 | 730 |
719 if (pixbuf) | 731 if (pixbuf) |
720 g_object_unref(pixbuf); | 732 g_object_unref(pixbuf); |
721 | 733 |
722 if (default_account && account == default_account) | 734 if (default_account && account == default_account) |
879 | 891 |
880 filename = g_build_filename(purple_user_dir(), G_DIR_SEPARATOR_S, | 892 filename = g_build_filename(purple_user_dir(), G_DIR_SEPARATOR_S, |
881 "accels", NULL); | 893 "accels", NULL); |
882 gtk_accel_map_load(filename); | 894 gtk_accel_map_load(filename); |
883 g_free(filename); | 895 g_free(filename); |
896 } | |
897 | |
898 void pidgin_retrieve_user_info(PurpleConnection *conn, const char *name) | |
899 { | |
900 PurpleNotifyUserInfo *info = purple_notify_user_info_new(); | |
901 purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving...")); | |
902 purple_notify_userinfo(conn, name, info, NULL, NULL); | |
903 purple_notify_user_info_destroy(info); | |
904 serv_get_info(conn, name); | |
884 } | 905 } |
885 | 906 |
886 gboolean | 907 gboolean |
887 pidgin_parse_x_im_contact(const char *msg, gboolean all_accounts, | 908 pidgin_parse_x_im_contact(const char *msg, gboolean all_accounts, |
888 PurpleAccount **ret_account, char **ret_protocol, | 909 PurpleAccount **ret_account, char **ret_protocol, |
1581 | 1602 |
1582 GdkPixbuf * | 1603 GdkPixbuf * |
1583 pidgin_create_prpl_icon(PurpleAccount *account, PidginPrplIconSize size) | 1604 pidgin_create_prpl_icon(PurpleAccount *account, PidginPrplIconSize size) |
1584 { | 1605 { |
1585 PurplePlugin *prpl; | 1606 PurplePlugin *prpl; |
1586 PurplePluginProtocolInfo *prpl_info; | |
1587 const char *protoname = NULL; | |
1588 char buf[256]; /* TODO: We should use a define for max file length */ | |
1589 char *filename = NULL; | |
1590 GdkPixbuf *pixbuf; | |
1591 | 1607 |
1592 g_return_val_if_fail(account != NULL, NULL); | 1608 g_return_val_if_fail(account != NULL, NULL); |
1593 | 1609 |
1594 prpl = purple_find_prpl(purple_account_get_protocol_id(account)); | 1610 prpl = purple_find_prpl(purple_account_get_protocol_id(account)); |
1595 if (prpl == NULL) | 1611 if (prpl == NULL) |
1596 return NULL; | 1612 return NULL; |
1597 | 1613 return pidgin_create_prpl_icon_from_prpl(prpl, size, account); |
1598 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); | |
1599 if (prpl_info->list_icon == NULL) | |
1600 return NULL; | |
1601 | |
1602 protoname = prpl_info->list_icon(account, NULL); | |
1603 if (protoname == NULL) | |
1604 return NULL; | |
1605 | |
1606 /* | |
1607 * Status icons will be themeable too, and then it will look up | |
1608 * protoname from the theme | |
1609 */ | |
1610 g_snprintf(buf, sizeof(buf), "%s.png", protoname); | |
1611 | |
1612 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", | |
1613 size == PIDGIN_PRPL_ICON_SMALL ? "16" : | |
1614 size == PIDGIN_PRPL_ICON_MEDIUM ? "22" : "48", | |
1615 buf, NULL); | |
1616 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
1617 g_free(filename); | |
1618 | |
1619 return pixbuf; | |
1620 } | 1614 } |
1621 | 1615 |
1622 static void | 1616 static void |
1623 menu_action_cb(GtkMenuItem *item, gpointer object) | 1617 menu_action_cb(GtkMenuItem *item, gpointer object) |
1624 { | 1618 { |
1630 | 1624 |
1631 if (callback) | 1625 if (callback) |
1632 callback(object, data); | 1626 callback(object, data); |
1633 } | 1627 } |
1634 | 1628 |
1635 void | 1629 GtkWidget * |
1636 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, | 1630 pidgin_append_menu_action(GtkWidget *menu, PurpleMenuAction *act, |
1637 gpointer object) | 1631 gpointer object) |
1638 { | 1632 { |
1633 GtkWidget *menuitem; | |
1634 | |
1639 if (act == NULL) { | 1635 if (act == NULL) { |
1640 pidgin_separator(menu); | 1636 return pidgin_separator(menu); |
1637 } | |
1638 | |
1639 if (act->children == NULL) { | |
1640 menuitem = gtk_menu_item_new_with_mnemonic(act->label); | |
1641 | |
1642 if (act->callback != NULL) { | |
1643 g_object_set_data(G_OBJECT(menuitem), | |
1644 "purplecallback", | |
1645 act->callback); | |
1646 g_object_set_data(G_OBJECT(menuitem), | |
1647 "purplecallbackdata", | |
1648 act->data); | |
1649 g_signal_connect(G_OBJECT(menuitem), "activate", | |
1650 G_CALLBACK(menu_action_cb), | |
1651 object); | |
1652 } else { | |
1653 gtk_widget_set_sensitive(menuitem, FALSE); | |
1654 } | |
1655 | |
1656 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
1641 } else { | 1657 } else { |
1642 GtkWidget *menuitem; | 1658 GList *l = NULL; |
1643 | 1659 GtkWidget *submenu = NULL; |
1644 if (act->children == NULL) { | 1660 GtkAccelGroup *group; |
1645 menuitem = gtk_menu_item_new_with_mnemonic(act->label); | 1661 |
1646 | 1662 menuitem = gtk_menu_item_new_with_mnemonic(act->label); |
1647 if (act->callback != NULL) { | 1663 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
1648 g_object_set_data(G_OBJECT(menuitem), | 1664 |
1649 "purplecallback", | 1665 submenu = gtk_menu_new(); |
1650 act->callback); | 1666 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
1651 g_object_set_data(G_OBJECT(menuitem), | 1667 |
1652 "purplecallbackdata", | 1668 group = gtk_menu_get_accel_group(GTK_MENU(menu)); |
1653 act->data); | 1669 if (group) { |
1654 g_signal_connect(G_OBJECT(menuitem), "activate", | 1670 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label); |
1655 G_CALLBACK(menu_action_cb), | 1671 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
1656 object); | 1672 g_free(path); |
1657 } else { | 1673 gtk_menu_set_accel_group(GTK_MENU(submenu), group); |
1658 gtk_widget_set_sensitive(menuitem, FALSE); | 1674 } |
1659 } | 1675 |
1660 | 1676 for (l = act->children; l; l = l->next) { |
1661 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 1677 PurpleMenuAction *act = (PurpleMenuAction *)l->data; |
1662 } else { | 1678 |
1663 GList *l = NULL; | 1679 pidgin_append_menu_action(submenu, act, object); |
1664 GtkWidget *submenu = NULL; | 1680 } |
1665 GtkAccelGroup *group; | 1681 g_list_free(act->children); |
1666 | 1682 act->children = NULL; |
1667 menuitem = gtk_menu_item_new_with_mnemonic(act->label); | 1683 } |
1668 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 1684 purple_menu_action_free(act); |
1669 | 1685 return menuitem; |
1670 submenu = gtk_menu_new(); | |
1671 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
1672 | |
1673 group = gtk_menu_get_accel_group(GTK_MENU(menu)); | |
1674 if (group) { | |
1675 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label); | |
1676 gtk_menu_set_accel_path(GTK_MENU(submenu), path); | |
1677 g_free(path); | |
1678 gtk_menu_set_accel_group(GTK_MENU(submenu), group); | |
1679 } | |
1680 | |
1681 for (l = act->children; l; l = l->next) { | |
1682 PurpleMenuAction *act = (PurpleMenuAction *)l->data; | |
1683 | |
1684 pidgin_append_menu_action(submenu, act, object); | |
1685 } | |
1686 g_list_free(act->children); | |
1687 act->children = NULL; | |
1688 } | |
1689 purple_menu_action_free(act); | |
1690 } | |
1691 } | 1686 } |
1692 | 1687 |
1693 #if GTK_CHECK_VERSION(2,3,0) | 1688 #if GTK_CHECK_VERSION(2,3,0) |
1694 # define NEW_STYLE_COMPLETION | 1689 # define NEW_STYLE_COMPLETION |
1695 #endif | 1690 #endif |