comparison pidgin/gtkutils.c @ 17200:f199d701d1b1

propagate from branch 'im.pidgin.pidgin' (head 66aea7d56ba9aeefe7437693c284ba2e3d649835) to branch 'org.maemo.garage.pidgin.pidgin.aop_menu' (head a62bd3ff292fc667603691b7d0fa79908809c64e)
author Gabriel Schulhof <nix@go-nix.ca>
date Sun, 20 May 2007 09:57:08 +0000
parents 7ade887fd3f6 f93dcfab772d
children 06aa5dd957c6
comparison
equal deleted inserted replaced
17186:b27e535cce50 17200:f199d701d1b1
59 #include "gtkimhtmltoolbar.h" 59 #include "gtkimhtmltoolbar.h"
60 #include "pidginstock.h" 60 #include "pidginstock.h"
61 #include "gtkthemes.h" 61 #include "gtkthemes.h"
62 #include "gtkutils.h" 62 #include "gtkutils.h"
63 63
64 typedef struct {
65 GtkWidget *menu ;
66 gint default_item ;
67 } AOP_MENU ;
68
64 static guint accels_save_timer = 0; 69 static guint accels_save_timer = 0;
65 70
66 static gboolean 71 static gboolean
67 url_clicked_idle_cb(gpointer data) 72 url_clicked_idle_cb(gpointer data)
68 { 73 {
428 gtk_widget_show(vbox); 433 gtk_widget_show(vbox);
429 434
430 return vbox; 435 return vbox;
431 } 436 }
432 437
438 static gpointer
439 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item)
440 {
441 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu));
442 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu));
443 if (NULL != p_item)
444 (*p_item) = item ;
445 return g_object_get_data(G_OBJECT(item), "aop_per_item_data");
446 }
447
433 static void 448 static void
434 protocol_menu_cb(GtkWidget *optmenu, GCallback cb) 449 aop_menu_cb(GtkWidget *optmenu, GCallback cb)
435 { 450 {
436 GtkWidget *menu;
437 GtkWidget *item; 451 GtkWidget *item;
438 const char *protocol; 452 gpointer per_item_data;
439 gpointer user_data; 453
440 454 per_item_data = aop_option_menu_get_selected(optmenu, &item) ;
441 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu));
442 item = gtk_menu_get_active(GTK_MENU(menu));
443
444 protocol = g_object_get_data(G_OBJECT(item), "protocol");
445
446 if (!strcmp(protocol, "prpl-fake"))
447 protocol = g_object_get_data(G_OBJECT(item), "real_protocol");
448
449 if (!strcmp(protocol, g_object_get_data(G_OBJECT(optmenu), "last_protocol")))
450 return;
451
452 user_data = (g_object_get_data(G_OBJECT(optmenu), "user_data"));
453 g_object_set_data(G_OBJECT(optmenu), "last_protocol", (gpointer)protocol);
454 455
455 if (cb != NULL) 456 if (cb != NULL)
456 ((void (*)(GtkWidget *, const char *, gpointer))cb)(item, protocol, 457 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data,
457 user_data); 458 g_object_get_data(G_OBJECT(optmenu), "user_data"));
458 } 459 }
459 460
460 static GtkWidget * 461 static GtkWidget *
461 pidgin_protocol_option_menu_item(GtkWidget *menu, GtkSizeGroup *sg, GtkWidget *image, 462 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, char *lbl, gpointer per_item_data)
462 const char *name, const char *id) 463 {
463 { 464 GtkWidget *item ;
464 GtkWidget *item; 465 GtkWidget *hbox ;
465 GtkWidget *hbox; 466 GtkWidget *image ;
466 GtkWidget *label; 467 GtkWidget *label ;
467 468
468 /* Create the item. */ 469 item = g_object_new(GTK_TYPE_MENU_ITEM, "visible", TRUE, NULL) ;
469 item = gtk_menu_item_new(); 470 hbox = g_object_new(GTK_TYPE_HBOX, "visible", TRUE, "homogeneous", FALSE, "spacing", 4, NULL) ;
470 471
471 /* Create the hbox. */ 472 /* Create the image */
472 hbox = gtk_hbox_new(FALSE, 4); 473 if (NULL == pixbuf)
473 gtk_container_add(GTK_CONTAINER(item), hbox); 474 image = g_object_new(GTK_TYPE_IMAGE, "visible", TRUE, NULL) ;
474 gtk_widget_show(hbox); 475 else
475 476 image = g_object_new(GTK_TYPE_IMAGE, "visible", TRUE, "pixbuf", pixbuf, NULL) ;
476 gtk_size_group_add_widget(sg, image); 477
477 478 if (NULL != sg)
478 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); 479 gtk_size_group_add_widget(sg, image) ;
479 gtk_widget_show(image); 480
480 481 /* Create the label */
481 /* Create the label. */ 482 label = g_object_new(GTK_TYPE_LABEL, "visible", TRUE, "justify", GTK_JUSTIFY_LEFT, "xalign", (gdouble)0.0, "yalign", (gdouble)0.5, "label", lbl, NULL) ;
482 label = gtk_label_new(name); 483
483 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); 484 gtk_container_add(GTK_CONTAINER(item), hbox) ;
484 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); 485 gtk_container_add_with_properties(GTK_CONTAINER (hbox), image, "expand", FALSE, "fill", FALSE, "padding", 0, NULL) ;
485 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); 486 gtk_container_add_with_properties(GTK_CONTAINER (hbox), label, "expand", TRUE, "fill", TRUE, "padding", 0, NULL) ;
486 gtk_widget_show(label); 487
487 488 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data) ;
488 g_object_set_data(G_OBJECT(item), "protocol", (gpointer)id); 489
489 490 pidgin_set_accessible_label(item, label);
490 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); 491
491 gtk_widget_show(item); 492 return item ;
492 pidgin_set_accessible_label (item, label); 493 }
493 494
494 return item; 495 static GtkWidget *
496 aop_option_menu_new(AOP_MENU *aop_menu, GCallback cb, gpointer user_data)
497 {
498 GtkWidget *optmenu;
499
500 optmenu = g_object_new(GTK_TYPE_OPTION_MENU, "visible", TRUE, NULL) ;
501 gtk_option_menu_set_menu(GTK_OPTION_MENU (optmenu), aop_menu->menu) ;
502 if (aop_menu->default_item != -1)
503 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item) ;
504
505 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free) ;
506 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data) ;
507
508 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb) ;
509
510 return optmenu ;
511 }
512
513 static void
514 aop_option_menu_replace_menu(GtkWidget *optmenu, AOP_MENU *new_aop_menu)
515 {
516 if (NULL != gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))
517 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu));
518 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu) ;
519 if (-1 != new_aop_menu->default_item)
520 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item) ;
521 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free) ;
522 }
523
524 static void
525 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data)
526 {
527 guint idx ;
528 GList *llItr = NULL ;
529
530 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU (optmenu)))->children ;
531 llItr != NULL ;
532 llItr = llItr->next, idx++)
533 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data"))
534 {
535 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx) ;
536 break ;
537 }
538 }
539
540 static GdkPixbuf *
541 get_prpl_pixbuf(PurplePluginProtocolInfo *prpl_info)
542 {
543 const char *proto_name ;
544 GdkPixbuf *pixbuf = NULL ;
545 char *filename ;
546 char buf[256];
547
548 proto_name = prpl_info->list_icon(NULL, NULL) ;
549 if (NULL == proto_name) return NULL ;
550
551 g_snprintf(buf, sizeof(buf), "%s.png", proto_name) ;
552 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", buf, NULL) ;
553 pixbuf = gdk_pixbuf_new_from_file(filename, NULL) ;
554 g_free(filename) ;
555
556 return pixbuf ;
557 }
558
559 static AOP_MENU *create_protocols_menu(const char *default_proto_id)
560 {
561 AOP_MENU *aop_menu = NULL ;
562 PurplePluginProtocolInfo *prpl_info;
563 PurplePlugin *plugin;
564 GdkPixbuf *pixbuf = NULL;
565 GtkSizeGroup *sg;
566 GList *p;
567 char *gtalk_name = NULL ;
568 int i;
569
570 aop_menu = g_malloc0(sizeof(AOP_MENU)) ;
571 aop_menu->default_item = -1 ;
572 aop_menu->menu = g_object_new(GTK_TYPE_MENU, "visible", TRUE, NULL) ;
573 sg = g_object_new(GTK_TYPE_SIZE_GROUP, "mode", GTK_SIZE_GROUP_HORIZONTAL, NULL) ;
574
575 if (purple_find_prpl("prpl-jabber"))
576 gtalk_name = _("Google Talk");
577
578 for (p = purple_plugins_get_protocols(), i = 0;
579 p != NULL;
580 p = p->next, i++) {
581
582 plugin = (PurplePlugin *)p->data;
583 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
584
585 if (NULL != gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) {
586 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
587 "16", "google-talk.png", NULL);
588 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
589 g_free(filename);
590
591 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu),
592 aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber"));
593
594 if (NULL != pixbuf)
595 g_object_unref(pixbuf) ;
596
597 gtalk_name = NULL ;
598 }
599
600 pixbuf = get_prpl_pixbuf(prpl_info) ;
601
602 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu),
603 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id)) ;
604 if (NULL != pixbuf)
605 g_object_unref(pixbuf) ;
606
607 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id))
608 aop_menu->default_item = i;
609 }
610
611 g_object_unref(sg) ;
612
613 return aop_menu ;
495 } 614 }
496 615
497 GtkWidget * 616 GtkWidget *
498 pidgin_protocol_option_menu_new(const char *id, GCallback cb, 617 pidgin_protocol_option_menu_new(const char *id, GCallback cb,
499 gpointer user_data) 618 gpointer user_data)
500 { 619 {
501 PurplePluginProtocolInfo *prpl_info; 620 return aop_option_menu_new(create_protocols_menu(id), cb, user_data) ;
502 PurplePlugin *plugin;
503 GtkWidget *optmenu;
504 GtkWidget *menu;
505 GdkPixbuf *pixbuf;
506 GtkWidget *image;
507 GList *p;
508 GtkSizeGroup *sg;
509 char *filename;
510 const char *proto_name;
511 char buf[256];
512 int i, selected_index = -1;
513 const char *gtalk_name = NULL;
514
515 if (purple_find_prpl("prpl-jabber"))
516 gtalk_name = _("Google Talk");
517
518 optmenu = gtk_option_menu_new();
519 gtk_widget_show(optmenu);
520
521 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data);
522
523 menu = gtk_menu_new();
524 gtk_widget_show(menu);
525
526 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
527
528 for (p = purple_plugins_get_protocols(), i = 0;
529 p != NULL;
530 p = p->next, i++) {
531
532 plugin = (PurplePlugin *)p->data;
533 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
534
535 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0)
536 {
537 GtkWidget *gtalk_item;
538
539 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
540 "16", "google-talk.png", NULL);
541 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
542 g_free(filename);
543
544
545 if (pixbuf)
546 image = gtk_image_new_from_pixbuf(pixbuf);
547 else
548 image = gtk_image_new();
549
550 gtalk_item = pidgin_protocol_option_menu_item(menu, sg, image, gtalk_name, "prpl-fake");
551 g_object_set_data(G_OBJECT(gtalk_item), "real_protocol", "prpl-jabber");
552 i++;
553
554 gtalk_name = NULL;
555 }
556
557 /* Load the image. */
558 proto_name = prpl_info->list_icon(NULL, NULL);
559 g_snprintf(buf, sizeof(buf), "%s.png", proto_name);
560
561 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
562 "16", buf, NULL);
563 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
564 g_free(filename);
565
566 if (pixbuf)
567 image = gtk_image_new_from_pixbuf(pixbuf);
568 else
569 image = gtk_image_new();
570
571 pidgin_protocol_option_menu_item(menu, sg, image, plugin->info->name, plugin->info->id);
572
573 if (id != NULL && !strcmp(plugin->info->id, id))
574 {
575 g_object_set_data(G_OBJECT(optmenu), "last_protocol", plugin->info->id);
576 selected_index = i;
577 }
578 else if (i == 0)
579 {
580 /* Ensure we set the protocol even if id is NULL or can't be found. */
581 g_object_set_data(G_OBJECT(optmenu), "last_protocol", plugin->info->id);
582 }
583
584 if (pixbuf)
585 g_object_unref(G_OBJECT(pixbuf));
586 }
587
588 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
589
590 if (selected_index != -1)
591 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), selected_index);
592
593 g_signal_connect(G_OBJECT(optmenu), "changed",
594 G_CALLBACK(protocol_menu_cb), cb);
595
596 g_object_unref(sg);
597
598 return optmenu;
599 } 621 }
600 622
601 PurpleAccount * 623 PurpleAccount *
602 pidgin_account_option_menu_get_selected(GtkWidget *optmenu) 624 pidgin_account_option_menu_get_selected(GtkWidget *optmenu)
603 { 625 {
604 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); 626 return (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL) ;
605 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); 627 }
606 return g_object_get_data(G_OBJECT(item), "account"); 628
607 } 629 static AOP_MENU *
608 630 create_account_menu(PurpleAccount *default_account,
609 static void 631 PurpleFilterAccountFunc filter_func, gboolean show_all)
610 account_menu_cb(GtkWidget *optmenu, GCallback cb) 632 {
611 { 633 AOP_MENU *aop_menu = NULL ;
612 GtkWidget *menu;
613 GtkWidget *item;
614 PurpleAccount *account; 634 PurpleAccount *account;
615 gpointer user_data; 635 GdkPixbuf *pixbuf = NULL;
616
617 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu));
618 item = gtk_menu_get_active(GTK_MENU(menu));
619
620 account = g_object_get_data(G_OBJECT(item), "account");
621 user_data = g_object_get_data(G_OBJECT(optmenu), "user_data");
622
623 if (cb != NULL)
624 ((void (*)(GtkWidget *, PurpleAccount *, gpointer))cb)(item, account,
625 user_data);
626 }
627
628 static void
629 create_account_menu(GtkWidget *optmenu, PurpleAccount *default_account,
630 PurpleFilterAccountFunc filter_func, gboolean show_all)
631 {
632 PurpleAccount *account;
633 GtkWidget *menu;
634 GtkWidget *item;
635 GtkWidget *image;
636 GtkWidget *hbox;
637 GtkWidget *label;
638 GdkPixbuf *pixbuf;
639 GList *list; 636 GList *list;
640 GList *p; 637 GList *p;
641 GtkSizeGroup *sg; 638 GtkSizeGroup *sg;
642 char *filename; 639 int i ;
643 const char *proto_name;
644 char buf[256]; 640 char buf[256];
645 int i, selected_index = -1;
646 641
647 if (show_all) 642 if (show_all)
648 list = purple_accounts_get_all(); 643 list = purple_accounts_get_all();
649 else 644 else
650 list = purple_connections_get_all(); 645 list = purple_connections_get_all();
651 646
652 menu = gtk_menu_new(); 647 aop_menu = g_malloc0(sizeof(AOP_MENU)) ;
653 gtk_widget_show(menu); 648 aop_menu->default_item = -1 ;
654 649 aop_menu->menu = g_object_new(GTK_TYPE_MENU, "visible", TRUE, NULL) ;
655 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); 650 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
656 651
657 for (p = list, i = 0; p != NULL; p = p->next, i++) { 652 for (p = list, i = 0; p != NULL; p = p->next, i++) {
658 PurplePluginProtocolInfo *prpl_info = NULL; 653 PurplePluginProtocolInfo *prpl_info = NULL;
659 PurplePlugin *plugin; 654 PurplePlugin *plugin;
674 plugin = purple_find_prpl(purple_account_get_protocol_id(account)); 669 plugin = purple_find_prpl(purple_account_get_protocol_id(account));
675 670
676 if (plugin != NULL) 671 if (plugin != NULL)
677 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); 672 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
678 673
679 /* Create the item. */
680 item = gtk_menu_item_new();
681
682 /* Create the hbox. */
683 hbox = gtk_hbox_new(FALSE, 4);
684 gtk_container_add(GTK_CONTAINER(item), hbox);
685 gtk_widget_show(hbox);
686
687 /* Load the image. */ 674 /* Load the image. */
688 if (prpl_info != NULL) { 675 if (prpl_info != NULL) {
689 proto_name = prpl_info->list_icon(account, NULL); 676 pixbuf = get_prpl_pixbuf(prpl_info) ;
690 g_snprintf(buf, sizeof(buf), "%s.png", proto_name);
691
692 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
693 "16", buf, NULL);
694 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
695 g_free(filename);
696 677
697 if (pixbuf != NULL) { 678 if (pixbuf != NULL) {
698 if (purple_account_is_disconnected(account) && show_all && 679 if (purple_account_is_disconnected(account) && show_all &&
699 purple_connections_get_all()) 680 purple_connections_get_all())
700 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); 681 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE);
701
702 image = gtk_image_new_from_pixbuf(pixbuf);
703
704 g_object_unref(G_OBJECT(pixbuf));
705 } 682 }
706 else 683 }
707 image = gtk_image_new();
708 }
709 else
710 image = gtk_image_new();
711
712 gtk_size_group_add_widget(sg, image);
713
714 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
715 gtk_widget_show(image);
716 684
717 if (purple_account_get_alias(account)) { 685 if (purple_account_get_alias(account)) {
718 g_snprintf(buf, sizeof(buf), "%s (%s) (%s)", 686 g_snprintf(buf, sizeof(buf), "%s (%s) (%s)",
719 purple_account_get_username(account), 687 purple_account_get_username(account),
720 purple_account_get_alias(account), 688 purple_account_get_alias(account),
723 g_snprintf(buf, sizeof(buf), "%s (%s)", 691 g_snprintf(buf, sizeof(buf), "%s (%s)",
724 purple_account_get_username(account), 692 purple_account_get_username(account),
725 purple_account_get_protocol_name(account)); 693 purple_account_get_protocol_name(account));
726 } 694 }
727 695
728 /* Create the label. */ 696 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu),
729 label = gtk_label_new(buf); 697 aop_menu_item_new(sg, pixbuf, buf, account));
730 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); 698
731 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); 699 if (NULL != pixbuf)
732 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); 700 g_object_unref(pixbuf) ;
733 gtk_widget_show(label);
734
735 g_object_set_data(G_OBJECT(item), "account", account);
736
737 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
738 gtk_widget_show(item);
739 pidgin_set_accessible_label (item, label);
740 701
741 if (default_account != NULL && account == default_account) 702 if (default_account != NULL && account == default_account)
742 selected_index = i; 703 aop_menu->default_item = i;
743 } 704 }
744 705
745 g_object_unref(sg); 706 g_object_unref(sg);
746 707
747 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); 708 return aop_menu ;
748
749 /* Set the place we should be at. */
750 if (selected_index != -1)
751 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), selected_index);
752 } 709 }
753 710
754 static void 711 static void
755 regenerate_account_menu(GtkWidget *optmenu) 712 regenerate_account_menu(GtkWidget *optmenu)
756 { 713 {
757 GtkWidget *menu;
758 GtkWidget *item;
759 gboolean show_all; 714 gboolean show_all;
760 PurpleAccount *account; 715 PurpleAccount *account;
761 PurpleFilterAccountFunc filter_func; 716 PurpleFilterAccountFunc filter_func;
762 717
763 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); 718 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL) ;
764 item = gtk_menu_get_active(GTK_MENU(menu)); 719 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all"));
765 account = g_object_get_data(G_OBJECT(item), "account"); 720 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func");
766 721
767 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), 722 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)) ;
768 "show_all"));
769
770 filter_func = g_object_get_data(G_OBJECT(optmenu),
771 "filter_func");
772
773 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu));
774
775 create_account_menu(optmenu, account, filter_func, show_all);
776 } 723 }
777 724
778 static void 725 static void
779 account_menu_sign_on_off_cb(PurpleConnection *gc, GtkWidget *optmenu) 726 account_menu_sign_on_off_cb(PurpleConnection *gc, GtkWidget *optmenu)
780 { 727 {
797 } 744 }
798 745
799 void 746 void
800 pidgin_account_option_menu_set_selected(GtkWidget *optmenu, PurpleAccount *account) 747 pidgin_account_option_menu_set_selected(GtkWidget *optmenu, PurpleAccount *account)
801 { 748 {
802 GtkWidget *menu; 749 aop_option_menu_select_by_data(optmenu, (gpointer)account) ;
803 GtkWidget *item;
804 gboolean show_all;
805 PurpleAccount *curaccount;
806 PurpleFilterAccountFunc filter_func;
807
808 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu));
809 item = gtk_menu_get_active(GTK_MENU(menu));
810 curaccount = g_object_get_data(G_OBJECT(item), "account");
811
812 if (account == curaccount)
813 return;
814
815 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu),
816 "show_all"));
817
818 filter_func = g_object_get_data(G_OBJECT(optmenu),
819 "filter_func");
820
821 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu));
822
823 create_account_menu(optmenu, account, filter_func, show_all);
824 } 750 }
825 751
826 GtkWidget * 752 GtkWidget *
827 pidgin_account_option_menu_new(PurpleAccount *default_account, 753 pidgin_account_option_menu_new(PurpleAccount *default_account,
828 gboolean show_all, GCallback cb, 754 gboolean show_all, GCallback cb,
830 gpointer user_data) 756 gpointer user_data)
831 { 757 {
832 GtkWidget *optmenu; 758 GtkWidget *optmenu;
833 759
834 /* Create the option menu */ 760 /* Create the option menu */
835 optmenu = gtk_option_menu_new(); 761 optmenu = aop_option_menu_new(create_account_menu(default_account, filter_func, show_all), cb, user_data) ;
836 gtk_widget_show(optmenu);
837 762
838 g_signal_connect(G_OBJECT(optmenu), "destroy", 763 g_signal_connect(G_OBJECT(optmenu), "destroy",
839 G_CALLBACK(account_menu_destroyed_cb), NULL); 764 G_CALLBACK(account_menu_destroyed_cb), NULL);
840 765
841 /* Register the purple sign on/off event callbacks. */ 766 /* Register the purple sign on/off event callbacks. */
855 /* Set some data. */ 780 /* Set some data. */
856 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); 781 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data);
857 g_object_set_data(G_OBJECT(optmenu), "show_all", GINT_TO_POINTER(show_all)); 782 g_object_set_data(G_OBJECT(optmenu), "show_all", GINT_TO_POINTER(show_all));
858 g_object_set_data(G_OBJECT(optmenu), "filter_func", 783 g_object_set_data(G_OBJECT(optmenu), "filter_func",
859 filter_func); 784 filter_func);
860
861 /* Create and set the actual menu. */
862 create_account_menu(optmenu, default_account, filter_func, show_all);
863
864 /* And now the last callback. */
865 g_signal_connect(G_OBJECT(optmenu), "changed",
866 G_CALLBACK(account_menu_cb), cb);
867 785
868 return optmenu; 786 return optmenu;
869 } 787 }
870 788
871 gboolean 789 gboolean
1901 g_value_unset(&val); 1819 g_value_unset(&val);
1902 1820
1903 if (account == NULL) 1821 if (account == NULL)
1904 return TRUE; 1822 return TRUE;
1905 1823
1906 if (optmenu != NULL) { 1824 if (optmenu != NULL)
1907 GList *items; 1825 aop_option_menu_select_by_data(optmenu, (gpointer)account) ;
1908 guint index = 0;
1909 pidgin_account_option_menu_set_selected(optmenu, account);
1910 items = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children;
1911
1912 do {
1913 if (account == g_object_get_data(G_OBJECT(items->data), "account")) {
1914 /* Set the account in the GUI. */
1915 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), index);
1916 return TRUE;
1917 }
1918 index++;
1919 } while ((items = items->next) != NULL);
1920 }
1921 1826
1922 return TRUE; 1827 return TRUE;
1923 } 1828 }
1924 1829
1925 static void 1830 static void