From 87d7965c22643bd906ed5a82a9d9d790237cb425 Mon Sep 17 00:00:00 2001 From: "Garry R. Osgood" Date: Sat, 15 Jan 2000 16:32:02 +0000 Subject: [PATCH] app/layers_dialog.c layers_dialog_flush() now has only one entry and exit 2000-01-15 Garry R. Osgood * app/layers_dialog.c * app/global_edit.c layers_dialog.c:layers_dialog_flush() now has only one entry and exit point, so that suspend_gimage_notify is properly maintained. Has bearing on (but likely does not fully solve) bugs #4031, #4914, and #4927. see http://idt.net/~gosgood/gimp-patch/patch04.html and bug reports. global_edit.c: edit_paste_as_new() now checks if it has a valid layer from layer_new_from_tiles() --- ChangeLog | 15 +++++ app/core/gimp-edit.c | 18 +++--- app/core/gimpedit.c | 18 +++--- app/global_edit.c | 18 +++--- app/gui/layers-dialog.c | 121 +++++++++++++++++++--------------------- app/layers_dialog.c | 121 +++++++++++++++++++--------------------- 6 files changed, 164 insertions(+), 147 deletions(-) diff --git a/ChangeLog b/ChangeLog index a30be19502..c583137f4e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2000-01-15 Garry R. Osgood + + * app/layers_dialog.c + * app/global_edit.c + layers_dialog.c:layers_dialog_flush() now has + only one entry and exit point, so that + suspend_gimage_notify is properly maintained. + Has bearing on (but likely does not fully solve) + bugs #4031, #4914, and #4927. (Layers and + Channel Dialog with sticky layers. See + http://idt.net/~gosgood/gimp-patch/patch04.html + and bug reports. + global_edit.c: edit_paste_as_new() now checks + if it has a valid layer from layer_new_from_tiles() + 2000-01-15 Michael Natterer * libgimp/gimpwidgets.[ch]: added a float adjustment callback. diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c index 157a1baf95..54b0a37cf1 100644 --- a/app/core/gimp-edit.c +++ b/app/core/gimp-edit.c @@ -358,16 +358,20 @@ edit_paste_as_new (GImage *invoke, layer = layer_new_from_tiles (gimage, gimp_image_base_type_with_alpha (gimage), paste, _("Pasted Layer"), OPAQUE_OPACITY, NORMAL_MODE); - /* add the new layer to the image */ - gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - gimage_add_layer (gimage, layer, 0); + if(layer) + { + /* add the new layer to the image */ + gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); + gimage_add_layer (gimage, layer, 0); - gimage_enable_undo (gimage); + gimage_enable_undo (gimage); - gdisp = gdisplay_new (gimage, 0x0101); - gimp_context_set_display (gimp_context_get_user (), gdisp); + gdisp = gdisplay_new (gimage, 0x0101); + gimp_context_set_display (gimp_context_get_user (), gdisp); - return TRUE; + return TRUE; + } + else return FALSE; } gboolean diff --git a/app/core/gimpedit.c b/app/core/gimpedit.c index 157a1baf95..54b0a37cf1 100644 --- a/app/core/gimpedit.c +++ b/app/core/gimpedit.c @@ -358,16 +358,20 @@ edit_paste_as_new (GImage *invoke, layer = layer_new_from_tiles (gimage, gimp_image_base_type_with_alpha (gimage), paste, _("Pasted Layer"), OPAQUE_OPACITY, NORMAL_MODE); - /* add the new layer to the image */ - gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - gimage_add_layer (gimage, layer, 0); + if(layer) + { + /* add the new layer to the image */ + gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); + gimage_add_layer (gimage, layer, 0); - gimage_enable_undo (gimage); + gimage_enable_undo (gimage); - gdisp = gdisplay_new (gimage, 0x0101); - gimp_context_set_display (gimp_context_get_user (), gdisp); + gdisp = gdisplay_new (gimage, 0x0101); + gimp_context_set_display (gimp_context_get_user (), gdisp); - return TRUE; + return TRUE; + } + else return FALSE; } gboolean diff --git a/app/global_edit.c b/app/global_edit.c index 157a1baf95..54b0a37cf1 100644 --- a/app/global_edit.c +++ b/app/global_edit.c @@ -358,16 +358,20 @@ edit_paste_as_new (GImage *invoke, layer = layer_new_from_tiles (gimage, gimp_image_base_type_with_alpha (gimage), paste, _("Pasted Layer"), OPAQUE_OPACITY, NORMAL_MODE); - /* add the new layer to the image */ - gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - gimage_add_layer (gimage, layer, 0); + if(layer) + { + /* add the new layer to the image */ + gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); + gimage_add_layer (gimage, layer, 0); - gimage_enable_undo (gimage); + gimage_enable_undo (gimage); - gdisp = gdisplay_new (gimage, 0x0101); - gimp_context_set_display (gimp_context_get_user (), gdisp); + gdisp = gdisplay_new (gimage, 0x0101); + gimp_context_set_display (gimp_context_get_user (), gdisp); - return TRUE; + return TRUE; + } + else return FALSE; } gboolean diff --git a/app/gui/layers-dialog.c b/app/gui/layers-dialog.c index cc20b24456..6e96abc5a0 100644 --- a/app/gui/layers-dialog.c +++ b/app/gui/layers-dialog.c @@ -607,68 +607,67 @@ layers_dialog_flush (void) { layersD->gimage = NULL; layers_dialog_update (gimage); - - return; } - - /* Set all current layer widgets to visited = FALSE */ - for (list = layersD->layer_widgets; list; list = g_slist_next (list)) + else { - lw = (LayerWidget *) list->data; - lw->visited = FALSE; + /* Set all current layer widgets to visited = FALSE */ + for (list = layersD->layer_widgets; list; list = g_slist_next (list)) + { + lw = (LayerWidget *) list->data; + lw->visited = FALSE; + } + + /* Add any missing layers */ + for (list = gimage->layers; list; list = g_slist_next (list)) + { + layer = (Layer *) list->data; + lw = layer_widget_get_ID (layer); + + /* If the layer isn't in the layer widget list, add it */ + if (lw == NULL) + { + /* sets visited = TRUE */ + layers_dialog_add_layer (layer); + } + else + lw->visited = TRUE; + } + + /* Remove any extraneous layers */ + list = layersD->layer_widgets; + while (list) + { + lw = (LayerWidget *) list->data; + list = g_slist_next (list); + if (lw->visited == FALSE) + layers_dialog_remove_layer (lw->layer); + } + + /* Switch positions of items if necessary */ + pos = 0; + for (list = gimage->layers; list; list = g_slist_next (list)) + { + layer = (Layer *) list->data; + layers_dialog_position_layer (layer, pos++); + } + + /* Set the active layer */ + if (layersD->active_layer != gimage->active_layer) + layersD->active_layer = gimage->active_layer; + + /* Set the active channel */ + if (layersD->active_channel != gimage->active_channel) + layersD->active_channel = gimage->active_channel; + + /* set the menus if floating sel status has changed */ + if (layersD->floating_sel != gimage->floating_sel) + layersD->floating_sel = gimage->floating_sel; + + layers_dialog_set_menu_sensitivity (); + + gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), + layer_widget_layer_flush, NULL); } - - /* Add any missing layers */ - for (list = gimage->layers; list; list = g_slist_next (list)) - { - layer = (Layer *) list->data; - lw = layer_widget_get_ID (layer); - - /* If the layer isn't in the layer widget list, add it */ - if (lw == NULL) - { - /* sets visited = TRUE */ - layers_dialog_add_layer (layer); - } - else - lw->visited = TRUE; - } - - /* Remove any extraneous layers */ - list = layersD->layer_widgets; - while (list) - { - lw = (LayerWidget *) list->data; - list = g_slist_next (list); - if (lw->visited == FALSE) - layers_dialog_remove_layer (lw->layer); - } - - /* Switch positions of items if necessary */ - pos = 0; - for (list = gimage->layers; list; list = g_slist_next (list)) - { - layer = (Layer *) list->data; - layers_dialog_position_layer (layer, pos++); - } - - /* Set the active layer */ - if (layersD->active_layer != gimage->active_layer) - layersD->active_layer = gimage->active_layer; - - /* Set the active channel */ - if (layersD->active_channel != gimage->active_channel) - layersD->active_channel = gimage->active_channel; - - /* set the menus if floating sel status has changed */ - if (layersD->floating_sel != gimage->floating_sel) - layersD->floating_sel = gimage->floating_sel; - - layers_dialog_set_menu_sensitivity (); - - gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), - layer_widget_layer_flush, NULL); - suspend_gimage_notify--; } @@ -3638,12 +3637,8 @@ layers_dialog_add_mask_query (Layer *layer) (gpointer) ADD_BLACK_MASK, NULL, _("Layer's Alpha Channel"), (gpointer) ADD_ALPHA_MASK, NULL, - NULL); - gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); - gtk_widget_show (frame); - gtk_widget_show (vbox); gtk_widget_show (options->query_box); } diff --git a/app/layers_dialog.c b/app/layers_dialog.c index cc20b24456..6e96abc5a0 100644 --- a/app/layers_dialog.c +++ b/app/layers_dialog.c @@ -607,68 +607,67 @@ layers_dialog_flush (void) { layersD->gimage = NULL; layers_dialog_update (gimage); - - return; } - - /* Set all current layer widgets to visited = FALSE */ - for (list = layersD->layer_widgets; list; list = g_slist_next (list)) + else { - lw = (LayerWidget *) list->data; - lw->visited = FALSE; + /* Set all current layer widgets to visited = FALSE */ + for (list = layersD->layer_widgets; list; list = g_slist_next (list)) + { + lw = (LayerWidget *) list->data; + lw->visited = FALSE; + } + + /* Add any missing layers */ + for (list = gimage->layers; list; list = g_slist_next (list)) + { + layer = (Layer *) list->data; + lw = layer_widget_get_ID (layer); + + /* If the layer isn't in the layer widget list, add it */ + if (lw == NULL) + { + /* sets visited = TRUE */ + layers_dialog_add_layer (layer); + } + else + lw->visited = TRUE; + } + + /* Remove any extraneous layers */ + list = layersD->layer_widgets; + while (list) + { + lw = (LayerWidget *) list->data; + list = g_slist_next (list); + if (lw->visited == FALSE) + layers_dialog_remove_layer (lw->layer); + } + + /* Switch positions of items if necessary */ + pos = 0; + for (list = gimage->layers; list; list = g_slist_next (list)) + { + layer = (Layer *) list->data; + layers_dialog_position_layer (layer, pos++); + } + + /* Set the active layer */ + if (layersD->active_layer != gimage->active_layer) + layersD->active_layer = gimage->active_layer; + + /* Set the active channel */ + if (layersD->active_channel != gimage->active_channel) + layersD->active_channel = gimage->active_channel; + + /* set the menus if floating sel status has changed */ + if (layersD->floating_sel != gimage->floating_sel) + layersD->floating_sel = gimage->floating_sel; + + layers_dialog_set_menu_sensitivity (); + + gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), + layer_widget_layer_flush, NULL); } - - /* Add any missing layers */ - for (list = gimage->layers; list; list = g_slist_next (list)) - { - layer = (Layer *) list->data; - lw = layer_widget_get_ID (layer); - - /* If the layer isn't in the layer widget list, add it */ - if (lw == NULL) - { - /* sets visited = TRUE */ - layers_dialog_add_layer (layer); - } - else - lw->visited = TRUE; - } - - /* Remove any extraneous layers */ - list = layersD->layer_widgets; - while (list) - { - lw = (LayerWidget *) list->data; - list = g_slist_next (list); - if (lw->visited == FALSE) - layers_dialog_remove_layer (lw->layer); - } - - /* Switch positions of items if necessary */ - pos = 0; - for (list = gimage->layers; list; list = g_slist_next (list)) - { - layer = (Layer *) list->data; - layers_dialog_position_layer (layer, pos++); - } - - /* Set the active layer */ - if (layersD->active_layer != gimage->active_layer) - layersD->active_layer = gimage->active_layer; - - /* Set the active channel */ - if (layersD->active_channel != gimage->active_channel) - layersD->active_channel = gimage->active_channel; - - /* set the menus if floating sel status has changed */ - if (layersD->floating_sel != gimage->floating_sel) - layersD->floating_sel = gimage->floating_sel; - - layers_dialog_set_menu_sensitivity (); - - gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), - layer_widget_layer_flush, NULL); - suspend_gimage_notify--; } @@ -3638,12 +3637,8 @@ layers_dialog_add_mask_query (Layer *layer) (gpointer) ADD_BLACK_MASK, NULL, _("Layer's Alpha Channel"), (gpointer) ADD_ALPHA_MASK, NULL, - NULL); - gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); - gtk_widget_show (frame); - gtk_widget_show (vbox); gtk_widget_show (options->query_box); }