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