From fd61d33c5efa36256b97e048ab6f85b3ae0200e8 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sun, 17 Aug 2003 16:58:39 +0000 Subject: [PATCH] made the layer cycling circular. Removed the static layer_select variable 2003-08-17 Michael Natterer * app/display/gimpdisplayshell-layer-select.[ch]: made the layer cycling circular. Removed the static layer_select variable and allocate a new struct for each use. Made it use Ctrl+Tab for forward cycling and Ctrl+Shift+Tab for backward so it doesn't use Alt any more. Cleanup. * app/display/gimpdisplayshell-callbacks.c: changed it from Alt to Ctrl here, too. Fixes all the stuff mentioned in bug #119236. --- ChangeLog | 13 + app/display/gimpdisplayshell-callbacks.c | 17 +- app/display/gimpdisplayshell-layer-select.c | 248 ++++++++++---------- app/display/gimpdisplayshell-layer-select.h | 4 +- 4 files changed, 142 insertions(+), 140 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23378be8ed..9bfb8d0ece 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2003-08-17 Michael Natterer + + * app/display/gimpdisplayshell-layer-select.[ch]: made the layer + cycling circular. Removed the static layer_select variable and + allocate a new struct for each use. Made it use Ctrl+Tab for + forward cycling and Ctrl+Shift+Tab for backward so it doesn't use + Alt any more. Cleanup. + + * app/display/gimpdisplayshell-callbacks.c: changed it from Alt to + Ctrl here, too. + + Fixes all the stuff mentioned in bug #119236. + 2003-08-17 Sven Neumann * plug-ins/common/mng.c: applied a patch from S. Mukund that fixes diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c index e13f3b5781..5dff7bcbcd 100644 --- a/app/display/gimpdisplayshell-callbacks.c +++ b/app/display/gimpdisplayshell-callbacks.c @@ -156,6 +156,7 @@ gimp_display_shell_events (GtkWidget *widget, case GDK_Up: case GDK_Down: case GDK_space: case GDK_Tab: + case GDK_ISO_Left_Tab: case GDK_Alt_L: case GDK_Alt_R: case GDK_Shift_L: case GDK_Shift_R: case GDK_Control_L: case GDK_Control_R: @@ -1026,6 +1027,7 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas, break; case GDK_Tab: + case GDK_ISO_Left_Tab: if (! state) { GimpDialogFactory *dialog_factory; @@ -1037,15 +1039,14 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas, } else if (! gimp_image_is_empty (gimage)) { - if (state & GDK_MOD1_MASK) + if (state & GDK_CONTROL_MASK) { - gimp_display_shell_layer_select_init (gdisp->gimage, - 1, kevent->time); - } - else if (state & GDK_CONTROL_MASK) - { - gimp_display_shell_layer_select_init (gdisp->gimage, - -1, kevent->time); + if (kevent->keyval == GDK_Tab) + gimp_display_shell_layer_select_init (gdisp->gimage, + 1, kevent->time); + else + gimp_display_shell_layer_select_init (gdisp->gimage, + -1, kevent->time); } } diff --git a/app/display/gimpdisplayshell-layer-select.c b/app/display/gimpdisplayshell-layer-select.c index 7e49132161..fb1fd9fcf7 100644 --- a/app/display/gimpdisplayshell-layer-select.c +++ b/app/display/gimpdisplayshell-layer-select.c @@ -53,19 +53,16 @@ struct _LayerSelect /* local function prototypes */ -static void layer_select_advance (LayerSelect *layer_select, - gint move); -static void layer_select_end (LayerSelect *layer_select, - guint32 time); -static void layer_select_set_image (LayerSelect *layer_select, - GimpImage *gimage); -static gint layer_select_events (GtkWidget *widget, - GdkEvent *event); - - -/* private variables */ - -static LayerSelect *layer_select = NULL; +static LayerSelect * layer_select_new (GimpImage *gimage, + GimpLayer *layer, + gint preview_size); +static void layer_select_destroy (LayerSelect *layer_select, + guint32 time); +static void layer_select_advance (LayerSelect *layer_select, + gint move); +static gboolean layer_select_events (GtkWidget *widget, + GdkEvent *event, + LayerSelect *layer_select); /* public functions */ @@ -75,11 +72,8 @@ gimp_display_shell_layer_select_init (GimpImage *gimage, gint move, guint32 time) { - GimpLayer *layer; - GtkWidget *frame1; - GtkWidget *frame2; - GtkWidget *hbox; - GtkWidget *alignment; + LayerSelect *layer_select; + GimpLayer *layer; g_return_if_fail (GIMP_IS_IMAGE (gimage)); @@ -88,71 +82,11 @@ gimp_display_shell_layer_select_init (GimpImage *gimage, if (! layer) return; - if (! layer_select) - { - layer_select = g_new0 (LayerSelect, 1); + layer_select = layer_select_new (gimage, layer, + gimage->gimp->config->layer_preview_size); + layer_select_advance (layer_select, move); - layer_select->preview = gimp_preview_new (GIMP_VIEWABLE (layer), - gimage->gimp->config->layer_preview_size, 1, - FALSE); - layer_select->label = gtk_label_new (NULL); - - layer_select_set_image (layer_select, gimage); - layer_select_advance (layer_select, move); - - /* The shell and main vbox */ - layer_select->shell = gtk_window_new (GTK_WINDOW_POPUP); - gtk_window_set_wmclass (GTK_WINDOW (layer_select->shell), - "layer_select", "Gimp"); - gtk_window_set_title (GTK_WINDOW (layer_select->shell), - _("Layer Select")); - gtk_window_set_position (GTK_WINDOW (layer_select->shell), - GTK_WIN_POS_MOUSE); - gtk_widget_set_events (layer_select->shell, (GDK_KEY_PRESS_MASK | - GDK_KEY_RELEASE_MASK | - GDK_BUTTON_PRESS_MASK)); - - g_signal_connect (layer_select->shell, "event", - G_CALLBACK (layer_select_events), - layer_select); - - frame1 = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_OUT); - gtk_container_add (GTK_CONTAINER (layer_select->shell), frame1); - frame2 = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (frame1), frame2); - - hbox = gtk_hbox_new (FALSE, 1); - gtk_container_add (GTK_CONTAINER (frame2), hbox); - - /* The preview */ - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, FALSE, 0); - gtk_widget_show (alignment); - - gtk_container_add (GTK_CONTAINER (alignment), layer_select->preview); - gtk_widget_show (layer_select->preview); - gtk_widget_show (alignment); - - /* the layer name label */ - gtk_box_pack_start (GTK_BOX (hbox), - layer_select->label, FALSE, FALSE, 2); - gtk_widget_show (layer_select->label); - - gtk_widget_show (hbox); - gtk_widget_show (frame1); - gtk_widget_show (frame2); - gtk_widget_show (layer_select->shell); - } - else - { - layer_select_set_image (layer_select, gimage); - layer_select_advance (layer_select, move); - - if (! GTK_WIDGET_VISIBLE (layer_select->shell)) - gtk_widget_show (layer_select->shell); - } + gtk_widget_show (layer_select->shell); gdk_keyboard_grab (layer_select->shell->window, FALSE, time); } @@ -160,6 +94,91 @@ gimp_display_shell_layer_select_init (GimpImage *gimage, /* private functions */ +static LayerSelect * +layer_select_new (GimpImage *gimage, + GimpLayer *layer, + gint preview_size) +{ + LayerSelect *layer_select; + GtkWidget *frame1; + GtkWidget *frame2; + GtkWidget *hbox; + GtkWidget *alignment; + + layer_select = g_new0 (LayerSelect, 1); + + layer_select->gimage = gimage; + layer_select->current_layer = layer; + + layer_select->shell = gtk_window_new (GTK_WINDOW_POPUP); + gtk_window_set_wmclass (GTK_WINDOW (layer_select->shell), + "layer_select", "Gimp"); + gtk_window_set_title (GTK_WINDOW (layer_select->shell), + _("Layer Select")); + gtk_window_set_position (GTK_WINDOW (layer_select->shell), + GTK_WIN_POS_MOUSE); + gtk_widget_set_events (layer_select->shell, (GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_BUTTON_PRESS_MASK)); + + g_signal_connect (layer_select->shell, "event", + G_CALLBACK (layer_select_events), + layer_select); + + frame1 = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_OUT); + gtk_container_add (GTK_CONTAINER (layer_select->shell), frame1); + gtk_widget_show (frame1); + + frame2 = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (frame1), frame2); + gtk_widget_show (frame2); + + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); + gtk_container_add (GTK_CONTAINER (frame2), hbox); + gtk_widget_show (hbox); + + /* The preview */ + alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, FALSE, 0); + gtk_widget_show (alignment); + + layer_select->preview = gimp_preview_new (GIMP_VIEWABLE (layer), + preview_size, 1, FALSE); + gtk_container_add (GTK_CONTAINER (alignment), layer_select->preview); + gtk_widget_show (layer_select->preview); + gtk_widget_show (alignment); + + /* the layer name label */ + layer_select->label = gtk_label_new (GIMP_OBJECT (layer)->name); + gtk_box_pack_start (GTK_BOX (hbox), layer_select->label, FALSE, FALSE, 0); + gtk_widget_show (layer_select->label); + + return layer_select; +} + +static void +layer_select_destroy (LayerSelect *layer_select, + guint32 time) +{ + gdk_keyboard_ungrab (time); + + gtk_widget_destroy (layer_select->shell); + + /* only reset the active layer if a new layer was specified */ + if (layer_select->current_layer != + gimp_image_get_active_layer (layer_select->gimage)) + { + gimp_image_set_active_layer (layer_select->gimage, + layer_select->current_layer); + gimp_image_flush (layer_select->gimage); + } + + g_free (layer_select); +} + static void layer_select_advance (LayerSelect *layer_select, gint move) @@ -167,8 +186,6 @@ layer_select_advance (LayerSelect *layer_select, GimpLayer *layer; gint index; - index = 0; - if (move == 0) return; @@ -180,8 +197,11 @@ layer_select_advance (LayerSelect *layer_select, GIMP_OBJECT (layer_select->current_layer)); index += move; - index = CLAMP (index, 0, - gimp_container_num_children (layer_select->gimage->layers) - 1); + + if (index < 0) + index = gimp_container_num_children (layer_select->gimage->layers) - 1; + else if (index >= gimp_container_num_children (layer_select->gimage->layers)) + index = 0; layer = (GimpLayer *) gimp_container_get_child_by_index (layer_select->gimage->layers, index); @@ -192,48 +212,15 @@ layer_select_advance (LayerSelect *layer_select, gimp_preview_set_viewable (GIMP_PREVIEW (layer_select->preview), GIMP_VIEWABLE (layer_select->current_layer)); - gtk_label_set_text (GTK_LABEL (layer_select->label), GIMP_OBJECT (layer_select->current_layer)->name); } } -static void -layer_select_end (LayerSelect *layer_select, - guint32 time) -{ - gdk_keyboard_ungrab (time); - - gtk_widget_hide (layer_select->shell); - - /* only reset the active layer if a new layer was specified */ - if (layer_select->current_layer != - gimp_image_get_active_layer (layer_select->gimage)) - { - gimp_image_set_active_layer (layer_select->gimage, - layer_select->current_layer); - gimp_image_flush (layer_select->gimage); - } -} - -static void -layer_select_set_image (LayerSelect *layer_select, - GimpImage *gimage) -{ - layer_select->gimage = gimage; - layer_select->current_layer = gimp_image_get_active_layer (gimage); - - gimp_preview_set_viewable (GIMP_PREVIEW (layer_select->preview), - GIMP_VIEWABLE (layer_select->current_layer)); - gimp_preview_renderer_set_size (GIMP_PREVIEW (layer_select->preview)->renderer, - gimage->gimp->config->layer_preview_size, 1); - gtk_label_set_text (GTK_LABEL (layer_select->label), - GIMP_OBJECT (layer_select->current_layer)->name); -} - -static gint -layer_select_events (GtkWidget *widget, - GdkEvent *event) +static gboolean +layer_select_events (GtkWidget *widget, + GdkEvent *event, + LayerSelect *layer_select) { GdkEventKey *kevent; GdkEventButton *bevent; @@ -242,7 +229,8 @@ layer_select_events (GtkWidget *widget, { case GDK_BUTTON_PRESS: bevent = (GdkEventButton *) event; - layer_select_end (layer_select, bevent->time); + + layer_select_destroy (layer_select, bevent->time); break; case GDK_KEY_PRESS: @@ -251,10 +239,10 @@ layer_select_events (GtkWidget *widget, switch (kevent->keyval) { case GDK_Tab: - if (kevent->state & GDK_MOD1_MASK) - layer_select_advance (layer_select, 1); - else if (kevent->state & GDK_CONTROL_MASK) - layer_select_advance (layer_select, -1); + layer_select_advance (layer_select, 1); + break; + case GDK_ISO_Left_Tab: + layer_select_advance (layer_select, -1); break; } return TRUE; @@ -276,8 +264,8 @@ layer_select_events (GtkWidget *widget, break; } - if (! (kevent->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK))) - layer_select_end (layer_select, kevent->time); + if (! (kevent->state & GDK_CONTROL_MASK)) + layer_select_destroy (layer_select, kevent->time); return TRUE; break; diff --git a/app/display/gimpdisplayshell-layer-select.h b/app/display/gimpdisplayshell-layer-select.h index 8ef4c98d24..9c435162b5 100644 --- a/app/display/gimpdisplayshell-layer-select.h +++ b/app/display/gimpdisplayshell-layer-select.h @@ -20,8 +20,8 @@ #define __GIMP_DISPLAY_SHELLLAYER_SELECT_H__ -void gimp_display_shell_layer_select_init (GimpImage *gimage, - gint move, +void gimp_display_shell_layer_select_init (GimpImage *gimage, + gint move, guint32 time);