[mutter] core: Replace close dialog implementation with MetaCloseDialog



commit fe5138dfc4a7370dc383926e4a2d62573afbfaac
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Jul 11 13:19:25 2016 +0200

    core: Replace close dialog implementation with MetaCloseDialog
    
    src/core/delete.c now entirely relies on MetaCloseDialog in order
    to handle the "Application is not responding" dialog.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=711619

 po/POTFILES.in            |    1 -
 src/core/delete.c         |  149 +++++++-------------------------------------
 src/core/window-private.h |    3 +-
 src/core/window.c         |    2 -
 4 files changed, 26 insertions(+), 129 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 416c071..b802335 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 56ffa5c..3727bd2 100644
--- a/src/core/delete.c
+++ b/src/core/delete.c
@@ -25,145 +25,48 @@
 #include <config.h>
 #include "util-private.h"
 #include "window-private.h"
+#include "compositor-private.h"
 #include <meta/errors.h>
 #include <meta/workspace.h>
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <unistd.h>
 #include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
 
 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;
-
-      /* 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);
-    }
-}
+  if (window->close_dialog)
+    return;
 
-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 (
-      "<big><b>%s</b></big>\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 f54ffaf..5c8ed98 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -35,6 +35,7 @@
 #include <config.h>
 #include <meta/compositor.h>
 #include <meta/window.h>
+#include <meta/meta-close-dialog.h>
 #include "screen-private.h"
 #include <meta/util.h>
 #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 e35ed08..8f5f52f 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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]