diff --git a/app/gimpconsoleapp.c b/app/gimpconsoleapp.c index 82bc5a1adf..0bfe717ef5 100644 --- a/app/gimpconsoleapp.c +++ b/app/gimpconsoleapp.c @@ -67,6 +67,7 @@ gimp_console_app_new (Gimp *gimp, GimpConsoleApp *app; app = g_object_new (GIMP_TYPE_CONSOLE_APP, + "application-id", GIMP_APPLICATION_ID, "gimp", gimp, "filenames", filenames, "as-new", as_new, diff --git a/app/gimpcoreapp.h b/app/gimpcoreapp.h index 88153d6f89..7e0a20a0d7 100644 --- a/app/gimpcoreapp.h +++ b/app/gimpcoreapp.h @@ -20,6 +20,8 @@ G_BEGIN_DECLS +#define GIMP_APPLICATION_ID "org.gimp.GIMP" + enum { GIMP_CORE_APP_PROP_0, diff --git a/app/gui/gimpapp.c b/app/gui/gimpapp.c index cb1274d4ca..53038637a0 100644 --- a/app/gui/gimpapp.c +++ b/app/gui/gimpapp.c @@ -131,6 +131,7 @@ gimp_app_new (Gimp *gimp, GimpApp *app; app = g_object_new (GIMP_TYPE_APP, + "application-id", GIMP_APPLICATION_ID, "gimp", gimp, "filenames", filenames, "as-new", as_new, diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c index a16a1c9322..5078869fa5 100644 --- a/app/gui/gui-vtable.c +++ b/app/gui/gui-vtable.c @@ -108,6 +108,8 @@ #include "icon-themes.h" #include "themes.h" +#include "gimp-intl.h" + /* local function prototypes */ @@ -186,6 +188,10 @@ static GimpMetadataRotationPolicy GimpContext *context, gboolean *dont_ask); +static void gui_inhibit (Gimp *gimp); +static void gui_image_disconnect (GimpImage *image, + Gimp *gimp); + /* public functions */ @@ -424,6 +430,25 @@ gui_display_create (Gimp *gimp, gimp_context_set_display (context, display); } + if (image) + { + g_signal_handlers_disconnect_by_func (image, + G_CALLBACK (gui_inhibit), + gimp); + g_signal_handlers_disconnect_by_func (image, + G_CALLBACK (gui_image_disconnect), + gimp); + g_signal_connect_swapped (image, "dirty", + G_CALLBACK (gui_inhibit), + gimp); + g_signal_connect_swapped (image, "clean", + G_CALLBACK (gui_inhibit), + gimp); + g_signal_connect_after (image, "disconnect", + G_CALLBACK (gui_image_disconnect), + gimp); + } + return display; } @@ -923,3 +948,79 @@ gui_query_rotation_policy (Gimp *gimp, return metadata_rotation_import_dialog_run (image, context, NULL, dont_ask); } + +static void +gui_inhibit (Gimp *gimp) +{ + static gint cookie = 0; + GtkApplication *app; + + app = GTK_APPLICATION (g_application_get_default ()); + + if (gtk_application_is_inhibited (app, GTK_APPLICATION_INHIBIT_LOGOUT)) + { + gtk_application_uninhibit (app, cookie); + cookie = 0; + } + + if (gimp_displays_dirty (gimp)) + { + GimpContainer *images; + gint num_images; + gchar *reason; + GimpImage *image; + GList *list; + GtkWindow *window = NULL; + + images = gimp_displays_get_dirty_images (gimp); + num_images = gimp_container_get_n_children (images); + image = (GimpImage *) gimp_container_get_first_child (images); + g_object_unref (images); + + for (list = gimp_get_display_iter (gimp); list; list = list->next) + { + GimpDisplay *display = list->data; + + if (gimp_display_get_image (display) == image) + { + GimpDisplayShell *shell; + GtkWidget *toplevel; + + shell = gimp_display_get_shell (display); + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell)); + + if (GTK_IS_WINDOW (toplevel)) + { + window = GTK_WINDOW (toplevel); + break; + } + } + } + + /* TRANSLATORS: unless your language msgstr[0] applies to 1 only (as in + * English), replace "one" with %d. + */ + reason = g_strdup_printf (ngettext ("There is one image with unsaved changes!", + "There are %d images with unsaved changes!", + num_images), + num_images); + cookie = gtk_application_inhibit (app, window, + GTK_APPLICATION_INHIBIT_LOGOUT, + reason); + g_free (reason); + } +} + +static void +gui_image_disconnect (GimpImage *image, + Gimp *gimp) +{ + gui_inhibit (gimp); + + g_signal_handlers_disconnect_by_func (image, + G_CALLBACK (gui_inhibit), + gimp); + g_signal_handlers_disconnect_by_func (image, + G_CALLBACK (gui_image_disconnect), + gimp); +}