diff -r a0a4b018f9eb -r be4a642b2d45 pidgin/gtkutils.c --- a/pidgin/gtkutils.c Mon Mar 14 04:34:34 2011 +0000 +++ b/pidgin/gtkutils.c Mon Mar 14 06:09:47 2011 +0000 @@ -70,7 +70,7 @@ #include "pidgin/minidialog.h" typedef struct { - GtkWidget *menu; + GtkTreeModel *model; gint default_item; } AopMenu; @@ -180,7 +180,6 @@ wnd = GTK_WINDOW(gtk_dialog_new()); pidgin_window_init(wnd, title, border_width, role, resizable); - g_object_set(G_OBJECT(wnd), "has-separator", FALSE, NULL); return GTK_WIDGET(wnd); } @@ -188,7 +187,7 @@ GtkWidget * pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing) { - GtkBox *vbox = GTK_BOX(GTK_DIALOG(dialog)->vbox); + GtkBox *vbox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); gtk_box_set_homogeneous(vbox, homogeneous); gtk_box_set_spacing(vbox, spacing); return GTK_WIDGET(vbox); @@ -196,12 +195,12 @@ GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog) { - return GTK_DIALOG(dialog)->vbox; + return gtk_dialog_get_content_area(GTK_DIALOG(dialog)); } GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog) { - return GTK_DIALOG(dialog)->action_area; + return gtk_dialog_get_action_area(GTK_DIALOG(dialog)); } GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label, @@ -292,7 +291,7 @@ if (to_toggle == NULL) return; - sensitivity = GTK_WIDGET_IS_SENSITIVE(to_toggle); + sensitivity = gtk_widget_get_sensitive(to_toggle); gtk_widget_set_sensitive(to_toggle, !sensitivity); } @@ -309,7 +308,7 @@ if (element == NULL) continue; - sensitivity = GTK_WIDGET_IS_SENSITIVE(element); + sensitivity = gtk_widget_get_sensitive(element); gtk_widget_set_sensitive(element, !sensitivity); } @@ -321,7 +320,7 @@ if (to_toggle == NULL) return; - if (GTK_WIDGET_VISIBLE(to_toggle)) + if (gtk_widget_get_visible(to_toggle)) gtk_widget_hide(to_toggle); else gtk_widget_show(to_toggle); @@ -522,68 +521,35 @@ } static gpointer -aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) +aop_option_menu_get_selected(GtkWidget *optmenu) { - GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); - GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); - if (p_item) - (*p_item) = item; - return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL; + gpointer data = NULL; + GtkTreeIter iter; + + g_return_val_if_fail(optmenu != NULL, NULL); + + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter)) + gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), &iter, 2, &data, -1); + + return data; } static void aop_menu_cb(GtkWidget *optmenu, GCallback cb) { - GtkWidget *item; - gpointer per_item_data; - - per_item_data = aop_option_menu_get_selected(optmenu, &item); - if (cb != NULL) { - ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); + ((void (*)(GtkWidget *, gpointer, gpointer))cb)(optmenu, + aop_option_menu_get_selected(optmenu), + g_object_get_data(G_OBJECT(optmenu), "user_data")); } } -static GtkWidget * -aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) +static void +aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) { - GtkWidget *item; - GtkWidget *hbox; - GtkWidget *image; - GtkWidget *label; - - item = gtk_menu_item_new(); - gtk_widget_show(item); - - hbox = gtk_hbox_new(FALSE, 4); - gtk_widget_show(hbox); - - /* Create the image */ - if (pixbuf == NULL) - image = gtk_image_new(); - else - image = gtk_image_new_from_pixbuf(pixbuf); - gtk_widget_show(image); - - if (sg) - gtk_size_group_add_widget(sg, image); - - /* Create the label */ - label = gtk_label_new (lbl); - gtk_widget_show (label); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - - gtk_container_add(GTK_CONTAINER(item), hbox); - gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); - - g_object_set_data(G_OBJECT (item), data, per_item_data); - g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); - - pidgin_set_accessible_label(item, label); - - return item; + gtk_combo_box_set_model(GTK_COMBO_BOX(optmenu), new_aop_menu->model); + gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), new_aop_menu->default_item); + g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); } static GdkPixbuf * @@ -624,16 +590,19 @@ static GtkWidget * aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) { - GtkWidget *optmenu; - - optmenu = gtk_option_menu_new(); + GtkWidget *optmenu = NULL; + GtkCellRenderer *cr = NULL; + + optmenu = gtk_combo_box_new(); gtk_widget_show(optmenu); - gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), aop_menu->menu); - - if (aop_menu->default_item != -1) - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item); - - g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", 0); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", 1); + + aop_option_menu_replace_menu(optmenu, aop_menu); + if (aop_menu->default_item == -1) + gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0); g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); @@ -642,32 +611,20 @@ } static void -aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) -{ - if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))) - gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); - - gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu); - - if (new_aop_menu->default_item != -1) - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item); - - g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); -} - -static void aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) { - guint idx; - GList *llItr = NULL; - - for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children; - llItr != NULL; - llItr = llItr->next, idx++) { - if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); - break; - } + GtkTreeModel *model; + GtkTreeIter iter; + gpointer iter_data; + model = gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)); + if (gtk_tree_model_get_iter_first(model, &iter)) { + do { + gtk_tree_model_get(model, &iter, 2, &iter_data, -1); + if (iter_data == data) { + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optmenu), &iter); + return; + } + } while (gtk_tree_model_iter_next(model, &iter)); } } @@ -677,16 +634,17 @@ AopMenu *aop_menu = NULL; PurplePlugin *plugin; GdkPixbuf *pixbuf = NULL; - GtkSizeGroup *sg; + GtkTreeIter iter; + GtkListStore *ls; GList *p; const char *gtalk_name = NULL, *facebook_name = NULL; int i; + ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); + aop_menu = g_malloc0(sizeof(AopMenu)); aop_menu->default_item = -1; - aop_menu->menu = gtk_menu_new(); - gtk_widget_show(aop_menu->menu); - sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + aop_menu->model = GTK_TREE_MODEL(ls); if (purple_find_prpl("prpl-jabber")) { gtalk_name = _("Google Talk"); @@ -702,14 +660,11 @@ if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", "google-talk.png", NULL); - GtkWidget *item; - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); - gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), - item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); - g_object_set_data(G_OBJECT(item), "fakegoogle", GINT_TO_POINTER(1)); + gtk_list_store_append(ls, &iter); + gtk_list_store_set(ls, &iter, 0, pixbuf, 1, gtalk_name, 2, "prpl-jabber", -1); if (pixbuf) g_object_unref(pixbuf); @@ -721,14 +676,11 @@ if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", "facebook.png", NULL); - GtkWidget *item; - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); - gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), - item = aop_menu_item_new(sg, pixbuf, facebook_name, "prpl-jabber", "protocol")); - g_object_set_data(G_OBJECT(item), "fakefacebook", GINT_TO_POINTER(1)); + gtk_list_store_append(ls, &iter); + gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1); if (pixbuf) g_object_unref(pixbuf); @@ -739,8 +691,8 @@ pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), - aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); + gtk_list_store_append(ls, &iter); + gtk_list_store_set(ls, &iter, 0, pixbuf, 1, plugin->info->name, 2, plugin->info->id, -1); if (pixbuf) g_object_unref(pixbuf); @@ -748,9 +700,6 @@ if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) aop_menu->default_item = i; } - - g_object_unref(sg); - return aop_menu; } @@ -764,13 +713,13 @@ const char * pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu) { - return (const char *)aop_option_menu_get_selected(optmenu, NULL); + return (const char *)aop_option_menu_get_selected(optmenu); } PurpleAccount * pidgin_account_option_menu_get_selected(GtkWidget *optmenu) { - return (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); + return (PurpleAccount *)aop_option_menu_get_selected(optmenu); } static AopMenu * @@ -782,7 +731,8 @@ GdkPixbuf *pixbuf = NULL; GList *list; GList *p; - GtkSizeGroup *sg; + GtkListStore *ls; + GtkTreeIter iter; int i; char buf[256]; @@ -791,11 +741,11 @@ else list = purple_connections_get_all(); + ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); + aop_menu = g_malloc0(sizeof(AopMenu)); aop_menu->default_item = -1; - aop_menu->menu = gtk_menu_new(); - gtk_widget_show(aop_menu->menu); - sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + aop_menu->model = GTK_TREE_MODEL(ls); for (p = list, i = 0; p != NULL; p = p->next, i++) { if (show_all) @@ -830,8 +780,8 @@ purple_account_get_protocol_name(account)); } - gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), - aop_menu_item_new(sg, pixbuf, buf, account, "account")); + gtk_list_store_append(ls, &iter); + gtk_list_store_set(ls, &iter, 0, pixbuf, 1, buf, 2, account, -1); if (pixbuf) g_object_unref(pixbuf); @@ -839,9 +789,6 @@ if (default_account && account == default_account) aop_menu->default_item = i; } - - g_object_unref(sg); - return aop_menu; } @@ -852,7 +799,7 @@ PurpleAccount *account; PurpleFilterAccountFunc filter_func; - account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); + account = (PurpleAccount *)aop_option_menu_get_selected(optmenu); show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); @@ -922,24 +869,6 @@ return optmenu; } -gboolean -pidgin_check_if_dir(const char *path, GtkFileSelection *filesel) -{ - char *dirname = NULL; - - if (g_file_test(path, G_FILE_TEST_IS_DIR)) { - /* append a / if needed */ - if (path[strlen(path) - 1] != G_DIR_SEPARATOR) { - dirname = g_strconcat(path, G_DIR_SEPARATOR_S, NULL); - } - gtk_file_selection_set_filename(filesel, (dirname != NULL) ? dirname : path); - g_free(dirname); - return TRUE; - } - - return FALSE; -} - void pidgin_setup_gtkspell(GtkTextView *textview) { @@ -1294,8 +1223,8 @@ widget = GTK_WIDGET(menu); screen = gtk_widget_get_screen(widget); - xthickness = widget->style->xthickness; - ythickness = widget->style->ythickness; + xthickness = gtk_widget_get_style(widget)->xthickness; + ythickness = gtk_widget_get_style(widget)->ythickness; rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); /* @@ -1433,9 +1362,9 @@ GtkTreePath *path; GtkTreeViewColumn *col; GdkRectangle rect; - gint ythickness = GTK_WIDGET(menu)->style->ythickness; - - gdk_window_get_origin (widget->window, x, y); + gint ythickness = gtk_widget_get_style(GTK_WIDGET(menu))->ythickness; + + gdk_window_get_origin (gtk_widget_get_window(widget), x, y); gtk_tree_view_get_cursor (tv, &path, &col); gtk_tree_view_get_cell_area (tv, path, col, &rect); @@ -1552,7 +1481,7 @@ pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who) { GdkPixbuf *pb; - GList *files = purple_uri_list_extract_filenames((const gchar *)sd->data); + GList *files = purple_uri_list_extract_filenames((const gchar *) gtk_selection_data_get_data(sd)); PurpleConnection *gc = purple_account_get_connection(account); PurplePluginProtocolInfo *prpl_info = NULL; #ifndef _WIN32 @@ -1870,7 +1799,9 @@ group = gtk_menu_get_accel_group(GTK_MENU(menu)); if (group) { - char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label); + char *path = g_strdup_printf("%s/%s", + gtk_menu_item_get_accel_path(GTK_MENU_ITEM(menuitem)), + act->label); gtk_menu_set_accel_path(GTK_MENU(submenu), path); g_free(path); gtk_menu_set_accel_group(GTK_MENU(submenu), group); @@ -2193,23 +2124,23 @@ GdkCursor *cursor; g_return_if_fail(widget != NULL); - if (widget->window == NULL) + if (gtk_widget_get_window(widget) == NULL) return; cursor = gdk_cursor_new(cursor_type); - gdk_window_set_cursor(widget->window, cursor); + gdk_window_set_cursor(gtk_widget_get_window(widget), cursor); gdk_cursor_unref(cursor); - gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window))); + gdk_display_flush(gdk_window_get_display(gtk_widget_get_window(widget))); } void pidgin_clear_cursor(GtkWidget *widget) { g_return_if_fail(widget != NULL); - if (widget->window == NULL) + if (gtk_widget_get_window(widget) == NULL) return; - gdk_window_set_cursor(widget->window, NULL); + gdk_window_set_cursor(gtk_widget_get_window(widget), NULL); } struct _icon_chooser { @@ -2250,7 +2181,7 @@ gtk_widget_destroy(dialog->icon_filesel); g_free(filename); g_free(dialog); - } +} static void @@ -2884,7 +2815,7 @@ if (!widget) return "dim grey"; - style = gtk_widget_get_style(widget); + style = gtk_widget_get_style(widget); if (!style) return "dim grey"; @@ -2896,18 +2827,18 @@ } static void -combo_box_changed_cb(GtkComboBox *combo_box, GtkEntry *entry) +combo_box_changed_cb(GtkComboBoxText *combo_box, GtkEntry *entry) { - char *text = gtk_combo_box_get_active_text(combo_box); + char *text = gtk_combo_box_text_get_active_text(combo_box); gtk_entry_set_text(entry, text ? text : ""); g_free(text); } static gboolean -entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBox *combo) +entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBoxText *combo) { - if (key->keyval == GDK_Down || key->keyval == GDK_Up) { - gtk_combo_box_popup(combo); + if (key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_Up) { + gtk_combo_box_popup(GTK_COMBO_BOX(combo)); return TRUE; } return FALSE; @@ -2916,10 +2847,10 @@ GtkWidget * pidgin_text_combo_box_entry_new(const char *default_item, GList *items) { - GtkComboBox *ret = NULL; + GtkComboBoxText *ret = NULL; GtkWidget *the_entry = NULL; - ret = GTK_COMBO_BOX(gtk_combo_box_entry_new_text()); + ret = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new_with_entry()); the_entry = gtk_entry_new(); gtk_container_add(GTK_CONTAINER(ret), the_entry); @@ -2929,7 +2860,7 @@ for (; items != NULL ; items = items->next) { char *text = items->data; if (text && *text) - gtk_combo_box_append_text(ret, text); + gtk_combo_box_text_append_text(ret, text); } g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry); @@ -2940,12 +2871,12 @@ const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget) { - return gtk_entry_get_text(GTK_ENTRY(GTK_BIN((widget))->child)); + return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget))))); } void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text) { - gtk_entry_set_text(GTK_ENTRY(GTK_BIN((widget))->child), (text)); + gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget)))), (text)); } GtkWidget * @@ -3066,12 +2997,12 @@ windows = g_list_delete_link(windows, windows); if (window == widget || - !GTK_WIDGET_VISIBLE(window)) { + !gtk_widget_get_visible(window)) { continue; } if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || - (menu && menu == window->window)) { + (menu && menu == gtk_widget_get_window(window))) { parent = window; break; }