Mercurial > pidgin.yaz
comparison pidgin/gtkutils.c @ 17134:77f8b8adb256
propagate from branch 'im.pidgin.pidgin' (head 4398ffa92e9bb0a16dbede7756a4cbc5dfa96602)
to branch 'org.maemo.garage.pidgin.pidgin.aop_menu' (head 55e7f2fb22337a9b6d5f26bf59cba3026f7afa13)
author | Gabriel Schulhof <nix@go-nix.ca> |
---|---|
date | Thu, 17 May 2007 07:28:53 +0000 |
parents | f93dcfab772d |
children | f199d701d1b1 |
comparison
equal
deleted
inserted
replaced
17117:7cdc1d7fad55 | 17134:77f8b8adb256 |
---|---|
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 |