diff --git a/po/POTFILES.in b/po/POTFILES.in index 416c0717d..b8023350a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -12,7 +12,6 @@ src/compositor/compositor.c src/compositor/meta-background.c src/core/bell.c src/core/core.c -src/core/delete.c src/core/display.c src/core/errors.c src/core/keybindings.c diff --git a/src/core/delete.c b/src/core/delete.c index 56ffa5c21..3727bd2db 100644 --- a/src/core/delete.c +++ b/src/core/delete.c @@ -25,145 +25,48 @@ #include #include "util-private.h" #include "window-private.h" +#include "compositor-private.h" #include #include - -#include -#include -#include -#include #include -#include -#include -#include static void -dialog_exited (GPid pid, int status, gpointer user_data) +close_dialog_response_cb (MetaCloseDialog *dialog, + MetaCloseDialogResponse response, + MetaWindow *window) { - MetaWindow *window = user_data; - - window->dialog_pid = -1; - - /* exit status of 0 means the user pressed "Force Quit" */ - if (WIFEXITED (status) && WEXITSTATUS (status) == 0) + if (response == META_CLOSE_DIALOG_RESPONSE_FORCE_CLOSE) meta_window_kill (window); } static void -present_existing_delete_dialog (MetaWindow *window, - guint32 timestamp) +meta_window_ensure_close_dialog (MetaWindow *window) { - meta_topic (META_DEBUG_PING, - "Presenting existing ping dialog for %s\n", - window->desc); + MetaDisplay *display; - if (window->dialog_pid >= 0) - { - GSList *windows; - GSList *tmp; + if (window->close_dialog) + return; - /* Activate transient for window that belongs to - * mutter-dialog - */ - - windows = meta_display_list_windows (window->display, META_LIST_DEFAULT); - tmp = windows; - while (tmp != NULL) - { - MetaWindow *w = tmp->data; - - if (w->transient_for == window && w->res_class && - g_ascii_strcasecmp (w->res_class, "mutter-dialog") == 0) - { - meta_window_activate (w, timestamp); - break; - } - - tmp = tmp->next; - } - - g_slist_free (windows); - } -} - -static void -show_delete_dialog (MetaWindow *window, - guint32 timestamp) -{ - char *window_title; - gchar *window_content, *tmp; - GPid dialog_pid; - - meta_topic (META_DEBUG_PING, - "Got delete ping timeout for %s\n", - window->desc); - - if (window->dialog_pid >= 0) - { - present_existing_delete_dialog (window, timestamp); - return; - } - - /* This is to get a better string if the title isn't representable - * in the locale encoding; actual conversion to UTF-8 is done inside - * meta_show_dialog */ - - if (window->title && window->title[0]) - { - tmp = g_locale_from_utf8 (window->title, -1, NULL, NULL, NULL); - if (tmp == NULL) - window_title = NULL; - else - window_title = window->title; - g_free (tmp); - } - else - { - window_title = NULL; - } - - if (window_title) - /* Translators: %s is a window title */ - tmp = g_strdup_printf (_("ā€œ%sā€ is not responding."), window_title); - else - tmp = g_strdup (_("Application is not responding.")); - - window_content = g_strdup_printf ( - "%s\n\n%s", - tmp, - _("You may choose to wait a short while for it to " - "continue or force the application to quit entirely.")); - - dialog_pid = - meta_show_dialog ("--question", - window_content, NULL, - window->screen->screen_name, - _("_Force Quit"), _("_Wait"), - "face-sad-symbolic", window->xwindow, - NULL, NULL); - - g_free (window_content); - g_free (tmp); - - window->dialog_pid = dialog_pid; - g_child_watch_add (dialog_pid, dialog_exited, window); -} - -static void -kill_delete_dialog (MetaWindow *window) -{ - if (window->dialog_pid > -1) - kill (window->dialog_pid, SIGTERM); + display = window->display; + window->close_dialog = meta_compositor_create_close_dialog (display->compositor, + window); + g_signal_connect (window->close_dialog, "response", + G_CALLBACK (close_dialog_response_cb), window); } void meta_window_set_alive (MetaWindow *window, gboolean is_alive) { - if (is_alive) - kill_delete_dialog (window); - else - show_delete_dialog (window, CurrentTime); + if (is_alive && window->close_dialog) + { + meta_close_dialog_hide (window->close_dialog); + } + else if (!is_alive) + { + meta_window_ensure_close_dialog (window); + meta_close_dialog_show (window->close_dialog); + } } void @@ -207,9 +110,5 @@ meta_window_kill (MetaWindow *window) void meta_window_free_delete_dialog (MetaWindow *window) { - if (window->dialog_pid >= 0) - { - kill (window->dialog_pid, 9); - window->dialog_pid = -1; - } + g_clear_object (&window->close_dialog); } diff --git a/src/core/window-private.h b/src/core/window-private.h index f54ffafbd..5c8ed98c0 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -35,6 +35,7 @@ #include #include #include +#include #include "screen-private.h" #include #include "stack.h" @@ -479,7 +480,7 @@ struct _MetaWindow int stack_position; /* see comment in stack.h */ /* Managed by delete.c */ - int dialog_pid; + MetaCloseDialog *close_dialog; /* maintained by group.c */ MetaGroup *group; diff --git a/src/core/window.c b/src/core/window.c index e35ed0838..8f5f52fe1 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -878,8 +878,6 @@ _meta_window_shared_new (MetaDisplay *display, window->constructing = TRUE; - window->dialog_pid = -1; - window->client_type = client_type; window->surface = surface; window->xwindow = xwindow;