From 123d1fb81cdd03b601ea162bdcf7e41eeff0a0e3 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Mon, 7 Oct 2002 21:53:59 +0000 Subject: [PATCH] Use a pixbuf to set the drag icon, combine code to create drag icons Mon Oct 7 16:28:11 2002 Owen Taylor * gtk/gtkcolorsel.c (palette_drag_begin): Use a pixbuf to set the drag icon, combine code to create drag icons (Fixes #80092, #80093) * gtk/gtkcolorsel.c (get_screen_color): Don't warn on failure to grab keyboard/mouse. (#80085) * gtk/gtkcolorsel.c (palette_press): Return FALSE, so DND initiation is possible. * gtk/gtkcolorsel.c (palette_release): Set the color from the palette on release, not press. * tests/testgtk.c (create_color_selection): Use gtk_widget_show_all() --- ChangeLog | 18 +++++ ChangeLog.pre-2-10 | 18 +++++ ChangeLog.pre-2-2 | 18 +++++ ChangeLog.pre-2-4 | 18 +++++ ChangeLog.pre-2-6 | 18 +++++ ChangeLog.pre-2-8 | 18 +++++ gtk/gtkcolorsel.c | 170 +++++++++++++++++++++++++-------------------- tests/testgtk.c | 4 +- 8 files changed, 203 insertions(+), 79 deletions(-) diff --git a/ChangeLog b/ChangeLog index a5fd957451..46b7f4832b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Mon Oct 7 16:28:11 2002 Owen Taylor + + * gtk/gtkcolorsel.c (palette_drag_begin): Use + a pixbuf to set the drag icon, combine code + to create drag icons (Fixes #80092, #80093) + + * gtk/gtkcolorsel.c (get_screen_color): Don't warn + on failure to grab keyboard/mouse. (#80085) + + * gtk/gtkcolorsel.c (palette_press): Return FALSE, + so DND initiation is possible. + + * gtk/gtkcolorsel.c (palette_release): Set the color + from the palette on release, not press. + + * tests/testgtk.c (create_color_selection): Use + gtk_widget_show_all() + Mon Oct 7 15:48:44 2002 Owen Taylor * gdk/gdkdnd.[ch] gdk/x11/gdkdnd-x11.c: Add diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index a5fd957451..46b7f4832b 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,21 @@ +Mon Oct 7 16:28:11 2002 Owen Taylor + + * gtk/gtkcolorsel.c (palette_drag_begin): Use + a pixbuf to set the drag icon, combine code + to create drag icons (Fixes #80092, #80093) + + * gtk/gtkcolorsel.c (get_screen_color): Don't warn + on failure to grab keyboard/mouse. (#80085) + + * gtk/gtkcolorsel.c (palette_press): Return FALSE, + so DND initiation is possible. + + * gtk/gtkcolorsel.c (palette_release): Set the color + from the palette on release, not press. + + * tests/testgtk.c (create_color_selection): Use + gtk_widget_show_all() + Mon Oct 7 15:48:44 2002 Owen Taylor * gdk/gdkdnd.[ch] gdk/x11/gdkdnd-x11.c: Add diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index a5fd957451..46b7f4832b 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,21 @@ +Mon Oct 7 16:28:11 2002 Owen Taylor + + * gtk/gtkcolorsel.c (palette_drag_begin): Use + a pixbuf to set the drag icon, combine code + to create drag icons (Fixes #80092, #80093) + + * gtk/gtkcolorsel.c (get_screen_color): Don't warn + on failure to grab keyboard/mouse. (#80085) + + * gtk/gtkcolorsel.c (palette_press): Return FALSE, + so DND initiation is possible. + + * gtk/gtkcolorsel.c (palette_release): Set the color + from the palette on release, not press. + + * tests/testgtk.c (create_color_selection): Use + gtk_widget_show_all() + Mon Oct 7 15:48:44 2002 Owen Taylor * gdk/gdkdnd.[ch] gdk/x11/gdkdnd-x11.c: Add diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index a5fd957451..46b7f4832b 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,21 @@ +Mon Oct 7 16:28:11 2002 Owen Taylor + + * gtk/gtkcolorsel.c (palette_drag_begin): Use + a pixbuf to set the drag icon, combine code + to create drag icons (Fixes #80092, #80093) + + * gtk/gtkcolorsel.c (get_screen_color): Don't warn + on failure to grab keyboard/mouse. (#80085) + + * gtk/gtkcolorsel.c (palette_press): Return FALSE, + so DND initiation is possible. + + * gtk/gtkcolorsel.c (palette_release): Set the color + from the palette on release, not press. + + * tests/testgtk.c (create_color_selection): Use + gtk_widget_show_all() + Mon Oct 7 15:48:44 2002 Owen Taylor * gdk/gdkdnd.[ch] gdk/x11/gdkdnd-x11.c: Add diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index a5fd957451..46b7f4832b 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,21 @@ +Mon Oct 7 16:28:11 2002 Owen Taylor + + * gtk/gtkcolorsel.c (palette_drag_begin): Use + a pixbuf to set the drag icon, combine code + to create drag icons (Fixes #80092, #80093) + + * gtk/gtkcolorsel.c (get_screen_color): Don't warn + on failure to grab keyboard/mouse. (#80085) + + * gtk/gtkcolorsel.c (palette_press): Return FALSE, + so DND initiation is possible. + + * gtk/gtkcolorsel.c (palette_release): Set the color + from the palette on release, not press. + + * tests/testgtk.c (create_color_selection): Use + gtk_widget_show_all() + Mon Oct 7 15:48:44 2002 Owen Taylor * gdk/gdkdnd.[ch] gdk/x11/gdkdnd-x11.c: Add diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index a5fd957451..46b7f4832b 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,21 @@ +Mon Oct 7 16:28:11 2002 Owen Taylor + + * gtk/gtkcolorsel.c (palette_drag_begin): Use + a pixbuf to set the drag icon, combine code + to create drag icons (Fixes #80092, #80093) + + * gtk/gtkcolorsel.c (get_screen_color): Don't warn + on failure to grab keyboard/mouse. (#80085) + + * gtk/gtkcolorsel.c (palette_press): Return FALSE, + so DND initiation is possible. + + * gtk/gtkcolorsel.c (palette_release): Set the color + from the palette on release, not press. + + * tests/testgtk.c (create_color_selection): Use + gtk_widget_show_all() + Mon Oct 7 15:48:44 2002 Owen Taylor * gdk/gdkdnd.[ch] gdk/x11/gdkdnd-x11.c: Add diff --git a/gtk/gtkcolorsel.c b/gtk/gtkcolorsel.c index dc43894d7a..fa3828c68e 100644 --- a/gtk/gtkcolorsel.c +++ b/gtk/gtkcolorsel.c @@ -157,6 +157,7 @@ static void gtk_color_selection_get_property (GObject *object static void gtk_color_selection_realize (GtkWidget *widget); static void gtk_color_selection_unrealize (GtkWidget *widget); +static void gtk_color_selection_show_all (GtkWidget *widget); static gint gtk_color_selection_get_palette_size (GtkColorSelection *colorsel); static gboolean gtk_color_selection_get_palette_color (GtkColorSelection *colorsel, @@ -216,6 +217,26 @@ static guchar dropper_mask[] = { static void color_sample_draw_sample (GtkColorSelection *colorsel, int which); static void color_sample_draw_samples (GtkColorSelection *colorsel); +static void +set_color_icon (GdkDragContext *context, + gdouble *colors) +{ + GdkPixbuf *pixbuf; + guint32 pixel; + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, + 8, 48, 32); + + pixel = (((UNSCALE (colors[COLORSEL_RED]) & 0xff00) << 16) | + ((UNSCALE (colors[COLORSEL_GREEN]) & 0xff00) << 8) | + ((UNSCALE (colors[COLORSEL_BLUE]) & 0xff00))); + + gdk_pixbuf_fill (pixbuf, pixel); + + gtk_drag_set_icon_pixbuf (context, pixbuf, -2, -2); + gdk_pixbuf_unref (pixbuf); +} + static void color_sample_drag_begin (GtkWidget *widget, GdkDragContext *context, @@ -223,47 +244,16 @@ color_sample_drag_begin (GtkWidget *widget, { GtkColorSelection *colorsel = data; ColorSelectionPrivate *priv; - GtkWidget *window; - gdouble colors[4]; gdouble *colsrc; - GdkColor bg; - gint n, i; priv = colorsel->private_data; - window = gtk_window_new (GTK_WINDOW_POPUP); - gtk_window_set_screen (GTK_WINDOW (window), - gtk_widget_get_screen (widget)); - gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE); - gtk_widget_set_usize (window, 48, 32); - gtk_widget_realize (window); - gtk_object_set_data_full (GTK_OBJECT (widget), - "gtk-color-selection-drag-window", - window, - (GtkDestroyNotify) gtk_widget_destroy); if (widget == priv->old_sample) colsrc = priv->old_color; else colsrc = priv->color; - - for (i=0, n = COLORSEL_RED; n <= COLORSEL_BLUE; n++) - { - colors[i++] = colsrc[n]; - } - - if (priv->has_opacity) - { - colors[i] = colsrc[COLORSEL_OPACITY]; - } - - bg.red = 0xffff * colors[0]; - bg.green = 0xffff * colors[1]; - bg.blue = 0xffff * colors[2]; - - gdk_color_alloc (gtk_widget_get_colormap (window), &bg); - gdk_window_set_background (window->window, &bg); - - gtk_drag_set_icon_widget (context, window, -2, -2); + + set_color_icon (context, colsrc); } static void @@ -650,33 +640,10 @@ palette_drag_begin (GtkWidget *widget, GdkDragContext *context, gpointer data) { - GtkColorSelection *colorsel = data; - ColorSelectionPrivate *priv; - GtkWidget *window; gdouble colors[4]; - GdkColor bg; - - priv = colorsel->private_data; - window = gtk_window_new (GTK_WINDOW_POPUP); - gtk_window_set_screen (GTK_WINDOW (window), - gtk_widget_get_screen (widget)); - gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE); - gtk_widget_set_usize (window, 48, 32); - gtk_widget_realize (window); - gtk_object_set_data_full (GTK_OBJECT (widget), - "gtk-color-selection-drag-window", - window, - (GtkDestroyNotify) gtk_widget_destroy); palette_get_color (widget, colors); - bg.red = 0xffff * colors[0]; - bg.green = 0xffff * colors[1]; - bg.blue = 0xffff * colors[2]; - - gdk_color_alloc (gtk_widget_get_colormap (window), &bg); - gdk_window_set_background (window->window, &bg); - - gtk_drag_set_icon_widget (context, window, -2, -2); + set_color_icon (context, colors); } static void @@ -948,7 +915,31 @@ do_popup (GtkColorSelection *colorsel, } -static gint +static gboolean +palette_enter (GtkWidget *drawing_area, + GdkEventCrossing *event, + gpointer data) +{ + g_object_set_data (G_OBJECT (drawing_area), + "gtk-colorsel-have-pointer", + GUINT_TO_POINTER (TRUE)); + + return FALSE; +} + +static gboolean +palette_leave (GtkWidget *drawing_area, + GdkEventCrossing *event, + gpointer data) +{ + g_object_set_data (G_OBJECT (drawing_area), + "gtk-colorsel-have-pointer", + NULL); + + return FALSE; +} + +static gboolean palette_press (GtkWidget *drawing_area, GdkEventButton *event, gpointer data) @@ -957,24 +948,38 @@ palette_press (GtkWidget *drawing_area, gtk_widget_grab_focus (drawing_area); - if (event->button == 1 && - event->type == GDK_BUTTON_PRESS) - { - if (GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (drawing_area), "color_set")) != 0) - { - gdouble color[4]; - palette_get_color (drawing_area, color); - gtk_color_selection_set_color (GTK_COLOR_SELECTION (data), color); - } - } - if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { do_popup (colorsel, drawing_area, event->time); + return TRUE; } - - return TRUE; + + return FALSE; +} + +static gboolean +palette_release (GtkWidget *drawing_area, + GdkEventButton *event, + gpointer data) +{ + GtkColorSelection *colorsel = GTK_COLOR_SELECTION (data); + + gtk_widget_grab_focus (drawing_area); + + if (event->button == 1 && + g_object_get_data (G_OBJECT (drawing_area), + "gtk-colorsel-have-pointer") != NULL) + { + if (GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (drawing_area), "color_set")) != 0) + { + gdouble color[4]; + palette_get_color (drawing_area, color); + gtk_color_selection_set_color (colorsel, color); + } + } + + return FALSE; } static void @@ -1082,6 +1087,12 @@ palette_new (GtkColorSelection *colorsel) GTK_SIGNAL_FUNC (palette_expose), colorsel); gtk_signal_connect (GTK_OBJECT (retval), "button_press_event", GTK_SIGNAL_FUNC (palette_press), colorsel); + gtk_signal_connect (GTK_OBJECT (retval), "button_release_event", + GTK_SIGNAL_FUNC (palette_release), colorsel); + gtk_signal_connect (GTK_OBJECT (retval), "enter_notify_event", + GTK_SIGNAL_FUNC (palette_enter), colorsel); + gtk_signal_connect (GTK_OBJECT (retval), "leave_notify_event", + GTK_SIGNAL_FUNC (palette_leave), colorsel); gtk_signal_connect (GTK_OBJECT (retval), "key_press_event", GTK_SIGNAL_FUNC (palette_activate), colorsel); gtk_signal_connect (GTK_OBJECT (retval), "popup_menu", @@ -1306,10 +1317,7 @@ get_screen_color (GtkWidget *button) if (gdk_keyboard_grab (priv->dropper_grab_widget->window, FALSE, gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS) - { - g_warning ("Failed to grab keyboard to do eyedropper"); - return; - } + return; picker_cursor = make_picker_cursor (screen); grab_status = gdk_pointer_grab (priv->dropper_grab_widget->window, @@ -1323,7 +1331,6 @@ get_screen_color (GtkWidget *button) if (grab_status != GDK_GRAB_SUCCESS) { gdk_display_keyboard_ungrab (gtk_widget_get_display (button), GDK_CURRENT_TIME); - g_warning ("Failed to grab pointer to do eyedropper"); return; } @@ -1710,6 +1717,7 @@ gtk_color_selection_class_init (GtkColorSelectionClass *klass) widget_class->realize = gtk_color_selection_realize; widget_class->unrealize = gtk_color_selection_unrealize; + widget_class->show_all = gtk_color_selection_show_all; g_object_class_install_property (gobject_class, PROP_HAS_OPACITY_CONTROL, @@ -1974,6 +1982,16 @@ gtk_color_selection_unrealize (GtkWidget *widget) GTK_WIDGET_CLASS (parent_class)->unrealize (widget); } +/* We override show-all since we have internal widgets that + * shouldn't be shown when you call show_all(), like the + * palette and opacity sliders. + */ +static void +gtk_color_selection_show_all (GtkWidget *widget) +{ + gtk_widget_show (widget); +} + /** * gtk_color_selection_new: * diff --git a/tests/testgtk.c b/tests/testgtk.c index 845780d59f..d51756bcbb 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -6827,8 +6827,6 @@ create_color_selection (GtkWidget *widget) gtk_signal_connect (GTK_OBJECT (check_button), "toggled", GTK_SIGNAL_FUNC (palette_toggled_cb), window); - gtk_widget_show_all (options_hbox); - gtk_signal_connect ( GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (window)->colorsel), "color_changed", @@ -6849,7 +6847,7 @@ create_color_selection (GtkWidget *widget) } if (!GTK_WIDGET_VISIBLE (window)) - gtk_widget_show (window); + gtk_widget_show_all (window); else gtk_widget_destroy (window); }