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