Wed, 12 Feb 2014 19:36:11 -0500
Use GtkFontButton and GtkColorButton widgets.
These are nicer since they show the actual setting with the user having
to attempt to change it.
--- a/pidgin/gtk3compat.h Wed Feb 12 19:32:57 2014 -0500 +++ b/pidgin/gtk3compat.h Wed Feb 12 19:36:11 2014 -0500 @@ -38,14 +38,31 @@ #define gtk_color_chooser_dialog_new(title, parent) \ gtk_color_selection_dialog_new(title) -#define GTK_COLOR_CHOOSER(widget) GTK_COLOR_SELECTION( \ - gtk_color_selection_dialog_get_color_selection( \ - GTK_COLOR_SELECTION_DIALOG(widget))) -#define gtk_color_chooser_set_use_alpha(chooser, val) -#define pidgin_color_chooser_set_rgb(chooser, color) \ - gtk_color_selection_set_current_color(chooser, color) -#define pidgin_color_chooser_get_rgb(chooser, color) \ - gtk_color_selection_get_current_color(chooser, color) +#define GTK_COLOR_CHOOSER(widget) (widget) +#define gtk_color_chooser_set_use_alpha(widget, val) do { \ + if (GTK_IS_COLOR_BUTTON(widget)) \ + gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(widget), val); \ +} while (0) +#define pidgin_color_chooser_set_rgb(widget, color) do { \ + if (GTK_IS_COLOR_SELECTION_DIALOG(widget)) \ + gtk_color_selection_set_current_color( \ + GTK_COLOR_SELECTION( \ + gtk_color_selection_dialog_get_color_selection( \ + GTK_COLOR_SELECTION_DIALOG(widget))), \ + color); \ + else \ + gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), color); \ +} while (0) +#define pidgin_color_chooser_get_rgb(chooser, color) do { \ + if (GTK_IS_COLOR_SELECTION_DIALOG(widget)) \ + gtk_color_selection_get_current_color( \ + GTK_COLOR_SELECTION( \ + gtk_color_selection_dialog_get_color_selection( \ + GTK_COLOR_SELECTION_DIALOG(widget))), \ + color); \ + else \ + gtk_color_button_get_color(GTK_COLOR_BUTTON(widget), color); \ +} while (0) #else
--- a/pidgin/gtkwhiteboard.c Wed Feb 12 19:32:57 2014 -0500 +++ b/pidgin/gtkwhiteboard.c Wed Feb 12 19:36:11 2014 -0500 @@ -113,7 +113,7 @@ static void pidgin_whiteboard_rgb24_to_rgb48(int color_rgb, GdkColor *color); -static void color_select_dialog(GtkWidget *widget, PidginWhiteboard *gtkwb); +static void color_selected(GtkColorButton *button, PidginWhiteboard *gtkwb); /****************************************************************************** * Globals @@ -169,6 +169,7 @@ GtkWidget *clear_button; GtkWidget *save_button; GtkWidget *color_button; + GdkColor color; PidginWhiteboard *gtkwb = g_new0(PidginWhiteboard, 1); gtkwb->priv = g_new0(PidginWhiteboardPrivate, 1); @@ -272,11 +273,16 @@ G_CALLBACK(pidgin_whiteboard_button_save_press), gtkwb); /* Add a color selector */ - color_button = gtk_button_new_from_stock(GTK_STOCK_SELECT_COLOR); + color_button = gtk_color_button_new(); gtk_box_pack_start(GTK_BOX(vbox_controls), color_button, FALSE, FALSE, PIDGIN_HIG_BOX_SPACE); gtk_widget_show(color_button); - g_signal_connect(G_OBJECT(color_button), "clicked", - G_CALLBACK(color_select_dialog), gtkwb); + + gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(color_button), FALSE); + pidgin_whiteboard_rgb24_to_rgb48(gtkwb->brush_color, &color); + pidgin_color_chooser_set_rgb(GTK_COLOR_CHOOSER(color_button), &color); + + g_signal_connect(G_OBJECT(color_button), "color-set", + G_CALLBACK(color_selected), gtkwb); /* Make all this (window) visible */ gtk_widget_show(window); @@ -867,20 +873,14 @@ } static void -color_selected(GtkDialog *dialog, gint response, gpointer _gtkwb) +color_selected(GtkColorButton *button, PidginWhiteboard *gtkwb) { GdkColor color; - PidginWhiteboard *gtkwb = _gtkwb; PurpleWhiteboard *wb = gtkwb->wb; int old_size, old_color; int new_color; - pidgin_color_chooser_get_rgb(GTK_COLOR_CHOOSER(dialog), &color); - g_object_set_data(G_OBJECT(gtkwb->window), "colour-dialog", NULL); - gtk_widget_destroy(GTK_WIDGET(dialog)); - - if (response != GTK_RESPONSE_OK) - return; + pidgin_color_chooser_get_rgb(GTK_COLOR_CHOOSER(button), &color); new_color = (color.red & 0xFF00) << 8; new_color |= (color.green & 0xFF00); @@ -890,21 +890,3 @@ purple_whiteboard_send_brush(wb, old_size, new_color); } -static void color_select_dialog(GtkWidget *widget, PidginWhiteboard *gtkwb) -{ - GdkColor color; - GtkWidget *dialog; - - dialog = gtk_color_chooser_dialog_new(_("Select color"), - GTK_WINDOW(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW))); - gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(dialog), FALSE); - g_object_set_data(G_OBJECT(gtkwb->window), "colour-dialog", dialog); - - g_signal_connect(G_OBJECT(dialog), "response", - G_CALLBACK(color_selected), gtkwb); - - pidgin_whiteboard_rgb24_to_rgb48(gtkwb->brush_color, &color); - pidgin_color_chooser_set_rgb(GTK_COLOR_CHOOSER(dialog), &color); - - gtk_widget_show_all(GTK_WIDGET(dialog)); -}
--- a/pidgin/plugins/themeedit.c Wed Feb 12 19:32:57 2014 -0500 +++ b/pidgin/plugins/themeedit.c Wed Feb 12 19:36:11 2014 -0500 @@ -60,51 +60,43 @@ } static void -theme_color_selected(GtkDialog *dialog, gint response, const char *prop) +theme_color_selected(GtkColorButton *button, const char *prop) { - if (response == GTK_RESPONSE_OK) { - GdkColor color; - PidginBlistTheme *theme; + GdkColor color; + PidginBlistTheme *theme; + + pidgin_color_chooser_get_rgb(GTK_COLOR_CHOOSER(button), &color); + + theme = pidgin_blist_get_theme(); - pidgin_color_chooser_get_rgb(GTK_COLOR_CHOOSER(dialog), &color); - - theme = pidgin_blist_get_theme(); - - if (prop_type_is_color(theme, prop)) { - g_object_set(G_OBJECT(theme), prop, &color, NULL); + if (prop_type_is_color(theme, prop)) { + g_object_set(G_OBJECT(theme), prop, &color, NULL); + } else { + PidginThemeFont *font = NULL; + g_object_get(G_OBJECT(theme), prop, &font, NULL); + if (!font) { + font = pidgin_theme_font_new(NULL, &color); + g_object_set(G_OBJECT(theme), prop, font, NULL); + pidgin_theme_font_free(font); } else { - PidginThemeFont *font = NULL; - g_object_get(G_OBJECT(theme), prop, &font, NULL); - if (!font) { - font = pidgin_theme_font_new(NULL, &color); - g_object_set(G_OBJECT(theme), prop, font, NULL); - pidgin_theme_font_free(font); - } else { - pidgin_theme_font_set_color(font, &color); - } + pidgin_theme_font_set_color(font, &color); } - pidgin_blist_set_theme(theme); } - - gtk_widget_destroy(GTK_WIDGET(dialog)); + pidgin_blist_set_theme(theme); } static void -theme_font_face_selected(GtkWidget *dialog, gint response, gpointer font) +theme_font_face_selected(GtkFontButton *button, PidginThemeFont *font) { - if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY) { - const char *fontname = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(dialog)); - pidgin_theme_font_set_font_face(font, fontname); - pidgin_blist_refresh(purple_blist_get_buddy_list()); - } - gtk_widget_destroy(dialog); + const char *fontname = gtk_font_button_get_font_name(button); + pidgin_theme_font_set_font_face(font, fontname); + pidgin_blist_refresh(purple_blist_get_buddy_list()); } -static void -theme_font_select_face(GtkWidget *widget, gpointer prop) +static GtkWidget * +theme_font_select_face_widget(const char *prop) { - GtkWindow *window; - GtkWidget *dialog; + GtkWidget *widget; PidginBlistTheme *theme; PidginThemeFont *font = NULL; const char *face; @@ -120,19 +112,20 @@ } face = pidgin_theme_font_get_font_face(font); - window = GTK_WINDOW(gtk_widget_get_toplevel(widget)); - dialog = gtk_font_chooser_dialog_new(_("Select Font"), window); + widget = gtk_font_button_new(); + gtk_font_button_set_title(GTK_FONT_BUTTON(widget), _("Select Font")); if (face && *face) - gtk_font_chooser_set_font(GTK_FONT_CHOOSER(dialog), face); - g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(theme_font_face_selected), + gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), face); + g_signal_connect(G_OBJECT(widget), "font-set", G_CALLBACK(theme_font_face_selected), font); - gtk_widget_show_all(dialog); + + return widget; } -static void -theme_color_select(GtkWidget *widget, gpointer prop) +static GtkWidget * +theme_color_select_widget(const char *prop) { - GtkWidget *dialog; + GtkWidget *widget; PidginBlistTheme *theme; const GdkColor *color = NULL; @@ -147,15 +140,15 @@ color = pidgin_theme_font_get_color(pair); } - dialog = gtk_color_chooser_dialog_new(_("Select Color"), - GTK_WINDOW(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW))); - gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(dialog), FALSE); + widget = gtk_color_button_new(); + gtk_color_button_set_title(GTK_COLOR_BUTTON(widget), _("Select Color")); + gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(widget), FALSE); if (color) - pidgin_color_chooser_set_rgb(GTK_COLOR_CHOOSER(dialog), color); - g_signal_connect(G_OBJECT(dialog), "response", - G_CALLBACK(theme_color_selected), prop); + pidgin_color_chooser_set_rgb(GTK_COLOR_CHOOSER(widget), color); + g_signal_connect(G_OBJECT(widget), "color-set", + G_CALLBACK(theme_color_selected), (gpointer)prop); - gtk_widget_show_all(dialog); + return widget; } static GtkWidget * @@ -173,10 +166,7 @@ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(label, blurb); - color = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_COLOR, - PIDGIN_BUTTON_HORIZONTAL); - g_signal_connect(G_OBJECT(color), "clicked", G_CALLBACK(theme_color_select), - (gpointer)prop); + color = theme_color_select_widget(prop); gtk_box_pack_start(GTK_BOX(hbox), color, FALSE, FALSE, 0); return hbox; @@ -197,16 +187,10 @@ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(label, blurb); - font = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT, - PIDGIN_BUTTON_HORIZONTAL); - g_signal_connect(G_OBJECT(font), "clicked", G_CALLBACK(theme_font_select_face), - (gpointer)prop); + font = theme_font_select_face_widget(prop); gtk_box_pack_start(GTK_BOX(hbox), font, FALSE, FALSE, 0); - color = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_COLOR, - PIDGIN_BUTTON_HORIZONTAL); - g_signal_connect(G_OBJECT(color), "clicked", G_CALLBACK(theme_color_select), - (gpointer)prop); + color = theme_color_select_widget(prop); gtk_box_pack_start(GTK_BOX(hbox), color, FALSE, FALSE, 0); return hbox;