pidgin/gtkutils.c

branch
cpw.qulogic.gtk3
changeset 32424
be4a642b2d45
parent 31565
1138b2c998ec
parent 32423
76f31ce24022
child 32425
24aa67208304
equal deleted inserted replaced
31579:a0a4b018f9eb 32424:be4a642b2d45
68 #include "gtkthemes.h" 68 #include "gtkthemes.h"
69 #include "gtkutils.h" 69 #include "gtkutils.h"
70 #include "pidgin/minidialog.h" 70 #include "pidgin/minidialog.h"
71 71
72 typedef struct { 72 typedef struct {
73 GtkWidget *menu; 73 GtkTreeModel *model;
74 gint default_item; 74 gint default_item;
75 } AopMenu; 75 } AopMenu;
76 76
77 static guint accels_save_timer = 0; 77 static guint accels_save_timer = 0;
78 static GSList *registered_url_handlers = NULL; 78 static GSList *registered_url_handlers = NULL;
178 { 178 {
179 GtkWindow *wnd = NULL; 179 GtkWindow *wnd = NULL;
180 180
181 wnd = GTK_WINDOW(gtk_dialog_new()); 181 wnd = GTK_WINDOW(gtk_dialog_new());
182 pidgin_window_init(wnd, title, border_width, role, resizable); 182 pidgin_window_init(wnd, title, border_width, role, resizable);
183 g_object_set(G_OBJECT(wnd), "has-separator", FALSE, NULL);
184 183
185 return GTK_WIDGET(wnd); 184 return GTK_WIDGET(wnd);
186 } 185 }
187 186
188 GtkWidget * 187 GtkWidget *
189 pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing) 188 pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing)
190 { 189 {
191 GtkBox *vbox = GTK_BOX(GTK_DIALOG(dialog)->vbox); 190 GtkBox *vbox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
192 gtk_box_set_homogeneous(vbox, homogeneous); 191 gtk_box_set_homogeneous(vbox, homogeneous);
193 gtk_box_set_spacing(vbox, spacing); 192 gtk_box_set_spacing(vbox, spacing);
194 return GTK_WIDGET(vbox); 193 return GTK_WIDGET(vbox);
195 } 194 }
196 195
197 GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog) 196 GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog)
198 { 197 {
199 return GTK_DIALOG(dialog)->vbox; 198 return gtk_dialog_get_content_area(GTK_DIALOG(dialog));
200 } 199 }
201 200
202 GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog) 201 GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog)
203 { 202 {
204 return GTK_DIALOG(dialog)->action_area; 203 return gtk_dialog_get_action_area(GTK_DIALOG(dialog));
205 } 204 }
206 205
207 GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label, 206 GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label,
208 GCallback callback, gpointer callbackdata) 207 GCallback callback, gpointer callbackdata)
209 { 208 {
290 gboolean sensitivity; 289 gboolean sensitivity;
291 290
292 if (to_toggle == NULL) 291 if (to_toggle == NULL)
293 return; 292 return;
294 293
295 sensitivity = GTK_WIDGET_IS_SENSITIVE(to_toggle); 294 sensitivity = gtk_widget_get_sensitive(to_toggle);
296 295
297 gtk_widget_set_sensitive(to_toggle, !sensitivity); 296 gtk_widget_set_sensitive(to_toggle, !sensitivity);
298 } 297 }
299 298
300 void 299 void
307 for (i=0; i < data->len; i++) { 306 for (i=0; i < data->len; i++) {
308 element = g_ptr_array_index(data,i); 307 element = g_ptr_array_index(data,i);
309 if (element == NULL) 308 if (element == NULL)
310 continue; 309 continue;
311 310
312 sensitivity = GTK_WIDGET_IS_SENSITIVE(element); 311 sensitivity = gtk_widget_get_sensitive(element);
313 312
314 gtk_widget_set_sensitive(element, !sensitivity); 313 gtk_widget_set_sensitive(element, !sensitivity);
315 } 314 }
316 } 315 }
317 316
319 pidgin_toggle_showhide(GtkWidget *widget, GtkWidget *to_toggle) 318 pidgin_toggle_showhide(GtkWidget *widget, GtkWidget *to_toggle)
320 { 319 {
321 if (to_toggle == NULL) 320 if (to_toggle == NULL)
322 return; 321 return;
323 322
324 if (GTK_WIDGET_VISIBLE(to_toggle)) 323 if (gtk_widget_get_visible(to_toggle))
325 gtk_widget_hide(to_toggle); 324 gtk_widget_hide(to_toggle);
326 else 325 else
327 gtk_widget_show(to_toggle); 326 gtk_widget_show(to_toggle);
328 } 327 }
329 328
520 519
521 return vbox; 520 return vbox;
522 } 521 }
523 522
524 static gpointer 523 static gpointer
525 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) 524 aop_option_menu_get_selected(GtkWidget *optmenu)
526 { 525 {
527 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); 526 gpointer data = NULL;
528 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); 527 GtkTreeIter iter;
529 if (p_item) 528
530 (*p_item) = item; 529 g_return_val_if_fail(optmenu != NULL, NULL);
531 return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL; 530
531 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter))
532 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), &iter, 2, &data, -1);
533
534 return data;
532 } 535 }
533 536
534 static void 537 static void
535 aop_menu_cb(GtkWidget *optmenu, GCallback cb) 538 aop_menu_cb(GtkWidget *optmenu, GCallback cb)
536 { 539 {
537 GtkWidget *item;
538 gpointer per_item_data;
539
540 per_item_data = aop_option_menu_get_selected(optmenu, &item);
541
542 if (cb != NULL) { 540 if (cb != NULL) {
543 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); 541 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(optmenu,
544 } 542 aop_option_menu_get_selected(optmenu),
545 } 543 g_object_get_data(G_OBJECT(optmenu), "user_data"));
546 544 }
547 static GtkWidget * 545 }
548 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) 546
549 { 547 static void
550 GtkWidget *item; 548 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu)
551 GtkWidget *hbox; 549 {
552 GtkWidget *image; 550 gtk_combo_box_set_model(GTK_COMBO_BOX(optmenu), new_aop_menu->model);
553 GtkWidget *label; 551 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), new_aop_menu->default_item);
554 552 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free);
555 item = gtk_menu_item_new();
556 gtk_widget_show(item);
557
558 hbox = gtk_hbox_new(FALSE, 4);
559 gtk_widget_show(hbox);
560
561 /* Create the image */
562 if (pixbuf == NULL)
563 image = gtk_image_new();
564 else
565 image = gtk_image_new_from_pixbuf(pixbuf);
566 gtk_widget_show(image);
567
568 if (sg)
569 gtk_size_group_add_widget(sg, image);
570
571 /* Create the label */
572 label = gtk_label_new (lbl);
573 gtk_widget_show (label);
574 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
575 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
576
577 gtk_container_add(GTK_CONTAINER(item), hbox);
578 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
579 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
580
581 g_object_set_data(G_OBJECT (item), data, per_item_data);
582 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data);
583
584 pidgin_set_accessible_label(item, label);
585
586 return item;
587 } 553 }
588 554
589 static GdkPixbuf * 555 static GdkPixbuf *
590 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) 556 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account)
591 { 557 {
622 } 588 }
623 589
624 static GtkWidget * 590 static GtkWidget *
625 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) 591 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data)
626 { 592 {
627 GtkWidget *optmenu; 593 GtkWidget *optmenu = NULL;
628 594 GtkCellRenderer *cr = NULL;
629 optmenu = gtk_option_menu_new(); 595
596 optmenu = gtk_combo_box_new();
630 gtk_widget_show(optmenu); 597 gtk_widget_show(optmenu);
631 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), aop_menu->menu); 598 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE);
632 599 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", 0);
633 if (aop_menu->default_item != -1) 600 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE);
634 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item); 601 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", 1);
635 602
636 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free); 603 aop_option_menu_replace_menu(optmenu, aop_menu);
604 if (aop_menu->default_item == -1)
605 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0);
637 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); 606 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data);
638 607
639 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); 608 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb);
640 609
641 return optmenu; 610 return optmenu;
642 }
643
644 static void
645 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu)
646 {
647 if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))
648 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu));
649
650 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu);
651
652 if (new_aop_menu->default_item != -1)
653 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item);
654
655 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free);
656 } 611 }
657 612
658 static void 613 static void
659 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) 614 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data)
660 { 615 {
661 guint idx; 616 GtkTreeModel *model;
662 GList *llItr = NULL; 617 GtkTreeIter iter;
663 618 gpointer iter_data;
664 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children; 619 model = gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu));
665 llItr != NULL; 620 if (gtk_tree_model_get_iter_first(model, &iter)) {
666 llItr = llItr->next, idx++) { 621 do {
667 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { 622 gtk_tree_model_get(model, &iter, 2, &iter_data, -1);
668 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); 623 if (iter_data == data) {
669 break; 624 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optmenu), &iter);
670 } 625 return;
626 }
627 } while (gtk_tree_model_iter_next(model, &iter));
671 } 628 }
672 } 629 }
673 630
674 static AopMenu * 631 static AopMenu *
675 create_protocols_menu(const char *default_proto_id) 632 create_protocols_menu(const char *default_proto_id)
676 { 633 {
677 AopMenu *aop_menu = NULL; 634 AopMenu *aop_menu = NULL;
678 PurplePlugin *plugin; 635 PurplePlugin *plugin;
679 GdkPixbuf *pixbuf = NULL; 636 GdkPixbuf *pixbuf = NULL;
680 GtkSizeGroup *sg; 637 GtkTreeIter iter;
638 GtkListStore *ls;
681 GList *p; 639 GList *p;
682 const char *gtalk_name = NULL, *facebook_name = NULL; 640 const char *gtalk_name = NULL, *facebook_name = NULL;
683 int i; 641 int i;
684 642
643 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
644
685 aop_menu = g_malloc0(sizeof(AopMenu)); 645 aop_menu = g_malloc0(sizeof(AopMenu));
686 aop_menu->default_item = -1; 646 aop_menu->default_item = -1;
687 aop_menu->menu = gtk_menu_new(); 647 aop_menu->model = GTK_TREE_MODEL(ls);
688 gtk_widget_show(aop_menu->menu);
689 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
690 648
691 if (purple_find_prpl("prpl-jabber")) { 649 if (purple_find_prpl("prpl-jabber")) {
692 gtalk_name = _("Google Talk"); 650 gtalk_name = _("Google Talk");
693 facebook_name = _("Facebook (XMPP)"); 651 facebook_name = _("Facebook (XMPP)");
694 } 652 }
700 plugin = (PurplePlugin *)p->data; 658 plugin = (PurplePlugin *)p->data;
701 659
702 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { 660 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) {
703 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", 661 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
704 "16", "google-talk.png", NULL); 662 "16", "google-talk.png", NULL);
705 GtkWidget *item;
706
707 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); 663 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
708 g_free(filename); 664 g_free(filename);
709 665
710 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 666 gtk_list_store_append(ls, &iter);
711 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); 667 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, gtalk_name, 2, "prpl-jabber", -1);
712 g_object_set_data(G_OBJECT(item), "fakegoogle", GINT_TO_POINTER(1));
713 668
714 if (pixbuf) 669 if (pixbuf)
715 g_object_unref(pixbuf); 670 g_object_unref(pixbuf);
716 671
717 gtalk_name = NULL; 672 gtalk_name = NULL;
719 } 674 }
720 675
721 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { 676 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) {
722 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", 677 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
723 "16", "facebook.png", NULL); 678 "16", "facebook.png", NULL);
724 GtkWidget *item;
725
726 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); 679 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
727 g_free(filename); 680 g_free(filename);
728 681
729 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 682 gtk_list_store_append(ls, &iter);
730 item = aop_menu_item_new(sg, pixbuf, facebook_name, "prpl-jabber", "protocol")); 683 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1);
731 g_object_set_data(G_OBJECT(item), "fakefacebook", GINT_TO_POINTER(1));
732 684
733 if (pixbuf) 685 if (pixbuf)
734 g_object_unref(pixbuf); 686 g_object_unref(pixbuf);
735 687
736 facebook_name = NULL; 688 facebook_name = NULL;
737 i++; 689 i++;
738 } 690 }
739 691
740 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); 692 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL);
741 693
742 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 694 gtk_list_store_append(ls, &iter);
743 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); 695 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, plugin->info->name, 2, plugin->info->id, -1);
744 696
745 if (pixbuf) 697 if (pixbuf)
746 g_object_unref(pixbuf); 698 g_object_unref(pixbuf);
747 699
748 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) 700 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id))
749 aop_menu->default_item = i; 701 aop_menu->default_item = i;
750 } 702 }
751
752 g_object_unref(sg);
753
754 return aop_menu; 703 return aop_menu;
755 } 704 }
756 705
757 GtkWidget * 706 GtkWidget *
758 pidgin_protocol_option_menu_new(const char *id, GCallback cb, 707 pidgin_protocol_option_menu_new(const char *id, GCallback cb,
762 } 711 }
763 712
764 const char * 713 const char *
765 pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu) 714 pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu)
766 { 715 {
767 return (const char *)aop_option_menu_get_selected(optmenu, NULL); 716 return (const char *)aop_option_menu_get_selected(optmenu);
768 } 717 }
769 718
770 PurpleAccount * 719 PurpleAccount *
771 pidgin_account_option_menu_get_selected(GtkWidget *optmenu) 720 pidgin_account_option_menu_get_selected(GtkWidget *optmenu)
772 { 721 {
773 return (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); 722 return (PurpleAccount *)aop_option_menu_get_selected(optmenu);
774 } 723 }
775 724
776 static AopMenu * 725 static AopMenu *
777 create_account_menu(PurpleAccount *default_account, 726 create_account_menu(PurpleAccount *default_account,
778 PurpleFilterAccountFunc filter_func, gboolean show_all) 727 PurpleFilterAccountFunc filter_func, gboolean show_all)
780 AopMenu *aop_menu = NULL; 729 AopMenu *aop_menu = NULL;
781 PurpleAccount *account; 730 PurpleAccount *account;
782 GdkPixbuf *pixbuf = NULL; 731 GdkPixbuf *pixbuf = NULL;
783 GList *list; 732 GList *list;
784 GList *p; 733 GList *p;
785 GtkSizeGroup *sg; 734 GtkListStore *ls;
735 GtkTreeIter iter;
786 int i; 736 int i;
787 char buf[256]; 737 char buf[256];
788 738
789 if (show_all) 739 if (show_all)
790 list = purple_accounts_get_all(); 740 list = purple_accounts_get_all();
791 else 741 else
792 list = purple_connections_get_all(); 742 list = purple_connections_get_all();
793 743
744 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
745
794 aop_menu = g_malloc0(sizeof(AopMenu)); 746 aop_menu = g_malloc0(sizeof(AopMenu));
795 aop_menu->default_item = -1; 747 aop_menu->default_item = -1;
796 aop_menu->menu = gtk_menu_new(); 748 aop_menu->model = GTK_TREE_MODEL(ls);
797 gtk_widget_show(aop_menu->menu);
798 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
799 749
800 for (p = list, i = 0; p != NULL; p = p->next, i++) { 750 for (p = list, i = 0; p != NULL; p = p->next, i++) {
801 if (show_all) 751 if (show_all)
802 account = (PurpleAccount *)p->data; 752 account = (PurpleAccount *)p->data;
803 else { 753 else {
828 g_snprintf(buf, sizeof(buf), "%s (%s)", 778 g_snprintf(buf, sizeof(buf), "%s (%s)",
829 purple_account_get_username(account), 779 purple_account_get_username(account),
830 purple_account_get_protocol_name(account)); 780 purple_account_get_protocol_name(account));
831 } 781 }
832 782
833 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 783 gtk_list_store_append(ls, &iter);
834 aop_menu_item_new(sg, pixbuf, buf, account, "account")); 784 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, buf, 2, account, -1);
835 785
836 if (pixbuf) 786 if (pixbuf)
837 g_object_unref(pixbuf); 787 g_object_unref(pixbuf);
838 788
839 if (default_account && account == default_account) 789 if (default_account && account == default_account)
840 aop_menu->default_item = i; 790 aop_menu->default_item = i;
841 } 791 }
842
843 g_object_unref(sg);
844
845 return aop_menu; 792 return aop_menu;
846 } 793 }
847 794
848 static void 795 static void
849 regenerate_account_menu(GtkWidget *optmenu) 796 regenerate_account_menu(GtkWidget *optmenu)
850 { 797 {
851 gboolean show_all; 798 gboolean show_all;
852 PurpleAccount *account; 799 PurpleAccount *account;
853 PurpleFilterAccountFunc filter_func; 800 PurpleFilterAccountFunc filter_func;
854 801
855 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); 802 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu);
856 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); 803 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all"));
857 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); 804 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func");
858 805
859 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); 806 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all));
860 } 807 }
920 g_object_set_data(G_OBJECT(optmenu), "filter_func", filter_func); 867 g_object_set_data(G_OBJECT(optmenu), "filter_func", filter_func);
921 868
922 return optmenu; 869 return optmenu;
923 } 870 }
924 871
925 gboolean
926 pidgin_check_if_dir(const char *path, GtkFileSelection *filesel)
927 {
928 char *dirname = NULL;
929
930 if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
931 /* append a / if needed */
932 if (path[strlen(path) - 1] != G_DIR_SEPARATOR) {
933 dirname = g_strconcat(path, G_DIR_SEPARATOR_S, NULL);
934 }
935 gtk_file_selection_set_filename(filesel, (dirname != NULL) ? dirname : path);
936 g_free(dirname);
937 return TRUE;
938 }
939
940 return FALSE;
941 }
942
943 void 872 void
944 pidgin_setup_gtkspell(GtkTextView *textview) 873 pidgin_setup_gtkspell(GtkTextView *textview)
945 { 874 {
946 #ifdef USE_GTKSPELL 875 #ifdef USE_GTKSPELL
947 GError *error = NULL; 876 GError *error = NULL;
1292 1221
1293 g_return_if_fail(GTK_IS_MENU(menu)); 1222 g_return_if_fail(GTK_IS_MENU(menu));
1294 1223
1295 widget = GTK_WIDGET(menu); 1224 widget = GTK_WIDGET(menu);
1296 screen = gtk_widget_get_screen(widget); 1225 screen = gtk_widget_get_screen(widget);
1297 xthickness = widget->style->xthickness; 1226 xthickness = gtk_widget_get_style(widget)->xthickness;
1298 ythickness = widget->style->ythickness; 1227 ythickness = gtk_widget_get_style(widget)->ythickness;
1299 rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); 1228 rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL);
1300 1229
1301 /* 1230 /*
1302 * We need the requisition to figure out the right place to 1231 * We need the requisition to figure out the right place to
1303 * popup the menu. In fact, we always need to ask here, since 1232 * popup the menu. In fact, we always need to ask here, since
1431 GtkWidget *widget = GTK_WIDGET(data); 1360 GtkWidget *widget = GTK_WIDGET(data);
1432 GtkTreeView *tv = GTK_TREE_VIEW(data); 1361 GtkTreeView *tv = GTK_TREE_VIEW(data);
1433 GtkTreePath *path; 1362 GtkTreePath *path;
1434 GtkTreeViewColumn *col; 1363 GtkTreeViewColumn *col;
1435 GdkRectangle rect; 1364 GdkRectangle rect;
1436 gint ythickness = GTK_WIDGET(menu)->style->ythickness; 1365 gint ythickness = gtk_widget_get_style(GTK_WIDGET(menu))->ythickness;
1437 1366
1438 gdk_window_get_origin (widget->window, x, y); 1367 gdk_window_get_origin (gtk_widget_get_window(widget), x, y);
1439 gtk_tree_view_get_cursor (tv, &path, &col); 1368 gtk_tree_view_get_cursor (tv, &path, &col);
1440 gtk_tree_view_get_cell_area (tv, path, col, &rect); 1369 gtk_tree_view_get_cell_area (tv, path, col, &rect);
1441 1370
1442 *x += rect.x+rect.width; 1371 *x += rect.x+rect.width;
1443 *y += rect.y+rect.height+ythickness; 1372 *y += rect.y+rect.height+ythickness;
1550 1479
1551 void 1480 void
1552 pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who) 1481 pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who)
1553 { 1482 {
1554 GdkPixbuf *pb; 1483 GdkPixbuf *pb;
1555 GList *files = purple_uri_list_extract_filenames((const gchar *)sd->data); 1484 GList *files = purple_uri_list_extract_filenames((const gchar *) gtk_selection_data_get_data(sd));
1556 PurpleConnection *gc = purple_account_get_connection(account); 1485 PurpleConnection *gc = purple_account_get_connection(account);
1557 PurplePluginProtocolInfo *prpl_info = NULL; 1486 PurplePluginProtocolInfo *prpl_info = NULL;
1558 #ifndef _WIN32 1487 #ifndef _WIN32
1559 PurpleDesktopItem *item; 1488 PurpleDesktopItem *item;
1560 #endif 1489 #endif
1868 submenu = gtk_menu_new(); 1797 submenu = gtk_menu_new();
1869 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); 1798 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
1870 1799
1871 group = gtk_menu_get_accel_group(GTK_MENU(menu)); 1800 group = gtk_menu_get_accel_group(GTK_MENU(menu));
1872 if (group) { 1801 if (group) {
1873 char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label); 1802 char *path = g_strdup_printf("%s/%s",
1803 gtk_menu_item_get_accel_path(GTK_MENU_ITEM(menuitem)),
1804 act->label);
1874 gtk_menu_set_accel_path(GTK_MENU(submenu), path); 1805 gtk_menu_set_accel_path(GTK_MENU(submenu), path);
1875 g_free(path); 1806 g_free(path);
1876 gtk_menu_set_accel_group(GTK_MENU(submenu), group); 1807 gtk_menu_set_accel_group(GTK_MENU(submenu), group);
1877 } 1808 }
1878 1809
2191 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) 2122 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type)
2192 { 2123 {
2193 GdkCursor *cursor; 2124 GdkCursor *cursor;
2194 2125
2195 g_return_if_fail(widget != NULL); 2126 g_return_if_fail(widget != NULL);
2196 if (widget->window == NULL) 2127 if (gtk_widget_get_window(widget) == NULL)
2197 return; 2128 return;
2198 2129
2199 cursor = gdk_cursor_new(cursor_type); 2130 cursor = gdk_cursor_new(cursor_type);
2200 gdk_window_set_cursor(widget->window, cursor); 2131 gdk_window_set_cursor(gtk_widget_get_window(widget), cursor);
2201 gdk_cursor_unref(cursor); 2132 gdk_cursor_unref(cursor);
2202 2133
2203 gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window))); 2134 gdk_display_flush(gdk_window_get_display(gtk_widget_get_window(widget)));
2204 } 2135 }
2205 2136
2206 void pidgin_clear_cursor(GtkWidget *widget) 2137 void pidgin_clear_cursor(GtkWidget *widget)
2207 { 2138 {
2208 g_return_if_fail(widget != NULL); 2139 g_return_if_fail(widget != NULL);
2209 if (widget->window == NULL) 2140 if (gtk_widget_get_window(widget) == NULL)
2210 return; 2141 return;
2211 2142
2212 gdk_window_set_cursor(widget->window, NULL); 2143 gdk_window_set_cursor(gtk_widget_get_window(widget), NULL);
2213 } 2144 }
2214 2145
2215 struct _icon_chooser { 2146 struct _icon_chooser {
2216 GtkWidget *icon_filesel; 2147 GtkWidget *icon_filesel;
2217 GtkWidget *icon_preview; 2148 GtkWidget *icon_preview;
2248 if (dialog->callback) 2179 if (dialog->callback)
2249 dialog->callback(filename, dialog->data); 2180 dialog->callback(filename, dialog->data);
2250 gtk_widget_destroy(dialog->icon_filesel); 2181 gtk_widget_destroy(dialog->icon_filesel);
2251 g_free(filename); 2182 g_free(filename);
2252 g_free(dialog); 2183 g_free(dialog);
2253 } 2184 }
2254 2185
2255 2186
2256 static void 2187 static void
2257 icon_preview_change_cb(GtkFileChooser *widget, struct _icon_chooser *dialog) 2188 icon_preview_change_cb(GtkFileChooser *widget, struct _icon_chooser *dialog)
2258 { 2189 {
2882 GtkStyle *style; 2813 GtkStyle *style;
2883 2814
2884 if (!widget) 2815 if (!widget)
2885 return "dim grey"; 2816 return "dim grey";
2886 2817
2887 style = gtk_widget_get_style(widget); 2818 style = gtk_widget_get_style(widget);
2888 if (!style) 2819 if (!style)
2889 return "dim grey"; 2820 return "dim grey";
2890 2821
2891 snprintf(dim_grey_string, sizeof(dim_grey_string), "#%02x%02x%02x", 2822 snprintf(dim_grey_string, sizeof(dim_grey_string), "#%02x%02x%02x",
2892 style->text_aa[GTK_STATE_NORMAL].red >> 8, 2823 style->text_aa[GTK_STATE_NORMAL].red >> 8,
2894 style->text_aa[GTK_STATE_NORMAL].blue >> 8); 2825 style->text_aa[GTK_STATE_NORMAL].blue >> 8);
2895 return dim_grey_string; 2826 return dim_grey_string;
2896 } 2827 }
2897 2828
2898 static void 2829 static void
2899 combo_box_changed_cb(GtkComboBox *combo_box, GtkEntry *entry) 2830 combo_box_changed_cb(GtkComboBoxText *combo_box, GtkEntry *entry)
2900 { 2831 {
2901 char *text = gtk_combo_box_get_active_text(combo_box); 2832 char *text = gtk_combo_box_text_get_active_text(combo_box);
2902 gtk_entry_set_text(entry, text ? text : ""); 2833 gtk_entry_set_text(entry, text ? text : "");
2903 g_free(text); 2834 g_free(text);
2904 } 2835 }
2905 2836
2906 static gboolean 2837 static gboolean
2907 entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBox *combo) 2838 entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBoxText *combo)
2908 { 2839 {
2909 if (key->keyval == GDK_Down || key->keyval == GDK_Up) { 2840 if (key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_Up) {
2910 gtk_combo_box_popup(combo); 2841 gtk_combo_box_popup(GTK_COMBO_BOX(combo));
2911 return TRUE; 2842 return TRUE;
2912 } 2843 }
2913 return FALSE; 2844 return FALSE;
2914 } 2845 }
2915 2846
2916 GtkWidget * 2847 GtkWidget *
2917 pidgin_text_combo_box_entry_new(const char *default_item, GList *items) 2848 pidgin_text_combo_box_entry_new(const char *default_item, GList *items)
2918 { 2849 {
2919 GtkComboBox *ret = NULL; 2850 GtkComboBoxText *ret = NULL;
2920 GtkWidget *the_entry = NULL; 2851 GtkWidget *the_entry = NULL;
2921 2852
2922 ret = GTK_COMBO_BOX(gtk_combo_box_entry_new_text()); 2853 ret = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new_with_entry());
2923 the_entry = gtk_entry_new(); 2854 the_entry = gtk_entry_new();
2924 gtk_container_add(GTK_CONTAINER(ret), the_entry); 2855 gtk_container_add(GTK_CONTAINER(ret), the_entry);
2925 2856
2926 if (default_item) 2857 if (default_item)
2927 gtk_entry_set_text(GTK_ENTRY(the_entry), default_item); 2858 gtk_entry_set_text(GTK_ENTRY(the_entry), default_item);
2928 2859
2929 for (; items != NULL ; items = items->next) { 2860 for (; items != NULL ; items = items->next) {
2930 char *text = items->data; 2861 char *text = items->data;
2931 if (text && *text) 2862 if (text && *text)
2932 gtk_combo_box_append_text(ret, text); 2863 gtk_combo_box_text_append_text(ret, text);
2933 } 2864 }
2934 2865
2935 g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry); 2866 g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry);
2936 g_signal_connect_after(G_OBJECT(the_entry), "key-press-event", G_CALLBACK(entry_key_pressed_cb), ret); 2867 g_signal_connect_after(G_OBJECT(the_entry), "key-press-event", G_CALLBACK(entry_key_pressed_cb), ret);
2937 2868
2938 return GTK_WIDGET(ret); 2869 return GTK_WIDGET(ret);
2939 } 2870 }
2940 2871
2941 const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget) 2872 const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget)
2942 { 2873 {
2943 return gtk_entry_get_text(GTK_ENTRY(GTK_BIN((widget))->child)); 2874 return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget)))));
2944 } 2875 }
2945 2876
2946 void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text) 2877 void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text)
2947 { 2878 {
2948 gtk_entry_set_text(GTK_ENTRY(GTK_BIN((widget))->child), (text)); 2879 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget)))), (text));
2949 } 2880 }
2950 2881
2951 GtkWidget * 2882 GtkWidget *
2952 pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label) 2883 pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label)
2953 { 2884 {
3064 while (windows) { 2995 while (windows) {
3065 GtkWidget *window = windows->data; 2996 GtkWidget *window = windows->data;
3066 windows = g_list_delete_link(windows, windows); 2997 windows = g_list_delete_link(windows, windows);
3067 2998
3068 if (window == widget || 2999 if (window == widget ||
3069 !GTK_WIDGET_VISIBLE(window)) { 3000 !gtk_widget_get_visible(window)) {
3070 continue; 3001 continue;
3071 } 3002 }
3072 3003
3073 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || 3004 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) ||
3074 (menu && menu == window->window)) { 3005 (menu && menu == gtk_widget_get_window(window))) {
3075 parent = window; 3006 parent = window;
3076 break; 3007 break;
3077 } 3008 }
3078 } 3009 }
3079 if (windows) 3010 if (windows)

mercurial