summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2002-04-12 23:00:46 +0000
committerHavoc Pennington <hp@src.gnome.org>2002-04-12 23:00:46 +0000
commitf965726d15950bc4e83409fe73bb2b7588781e81 (patch)
tree58a9446fd2591e67028600d9a4c0e90fb1ecfe1d /src
parent38ff6a49c4c8584dda82eeccfb5a447cfdfdcfef (diff)
downloadmutter-f965726d15950bc4e83409fe73bb2b7588781e81.tar.gz
make one of the toolbar buttons lock up the demo
2002-04-12 Havoc Pennington <hp@redhat.com> * src/tools/metacity-window-demo.c (do_appwindow): make one of the toolbar buttons lock up the demo * src/window.c (meta_window_delete): move error trap to be around a narrower part of the function, and add part of the ping stuff, nothing user-visible yet * src/metacity-dialog.c (main): metacity-dialog executable to live in libexecdir and pop up dialogs for us.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am5
-rw-r--r--src/metacity-dialog.c90
-rw-r--r--src/tools/metacity-window-demo.c12
-rw-r--r--src/window.c65
4 files changed, 168 insertions, 4 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index f27768088..d78f57250 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -76,10 +76,15 @@ metacity_theme_viewer_SOURCES= \
util.c \
util.h
+metacity_dialog_SOURCES= \
+ metacity-dialog.c
+
bin_PROGRAMS=metacity metacity-theme-viewer
+libexec_PROGRAMS=metacity-dialog
metacity_LDADD= @METACITY_LIBS@
metacity_theme_viewer_LDADD= @METACITY_LIBS@
+metacity_dialog_LDADD=@METACITY_LIBS@
testgradient_SOURCES=gradient.h gradient.c testgradient.c
diff --git a/src/metacity-dialog.c b/src/metacity-dialog.c
new file mode 100644
index 000000000..538b845d5
--- /dev/null
+++ b/src/metacity-dialog.c
@@ -0,0 +1,90 @@
+/* Metacity dialog process */
+
+/*
+ * Copyright (C) 2001 Havoc Pennington
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <libintl.h>
+#define _(x) dgettext (GETTEXT_PACKAGE, x)
+#define N_(x) x
+
+static int
+kill_window_question (const char *window_name)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (NULL, 0,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("The window \"%s\" is not responding.\n"
+ "Force this application to exit?"),
+ window_name);
+
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ _("Kill application"),
+ GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_REJECT);
+
+ /* return 0 if we should kill the application */
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+ g_print ("Y");
+ else
+ g_print ("N");
+
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ bindtextdomain (GETTEXT_PACKAGE, METACITY_LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ gtk_init (&argc, &argv);
+
+ if (argc < 2)
+ {
+ g_printerr ("bad args to metacity-dialog\n");
+ return 1;
+ }
+
+ if (strcmp (argv[1], "--kill-window-question") == 0)
+ {
+ if (argc < 3)
+ {
+ g_printerr ("bad args to metacity-dialog\n");
+ return 1;
+ }
+
+ return kill_window_question (argv[2]);
+ }
+
+ g_printerr ("bad args to metacity-dialog\n");
+ return 1;
+}
+
diff --git a/src/tools/metacity-window-demo.c b/src/tools/metacity-window-demo.c
index 96a65d06a..dc64952de 100644
--- a/src/tools/metacity-window-demo.c
+++ b/src/tools/metacity-window-demo.c
@@ -22,6 +22,7 @@
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <X11/Xatom.h>
+#include <unistd.h>
static GtkWidget* do_appwindow (void);
@@ -473,6 +474,13 @@ static GtkItemFactoryEntry menu_items[] =
};
static void
+sleep_cb (GtkWidget *button,
+ gpointer data)
+{
+ sleep (1000);
+}
+
+static void
toolbar_cb (GtkWidget *button,
gpointer data)
{
@@ -611,9 +619,9 @@ do_appwindow (void)
gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
GTK_STOCK_OPEN,
- "This is a demo button with an 'open' icon",
+ "This is a demo button that locks up the demo",
NULL,
- G_CALLBACK (toolbar_cb),
+ G_CALLBACK (sleep_cb),
window, /* user data for callback */
-1); /* -1 means "append" */
diff --git a/src/window.c b/src/window.c
index 329b22220..a40af438f 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2483,6 +2483,61 @@ meta_window_get_outer_rect (MetaWindow *window,
*rect = window->rect;
}
+static void
+delete_ping_reply_func (MetaDisplay *display,
+ Window xwindow,
+ void *user_data)
+{
+ MetaWindow *window = user_data;
+
+ meta_topic (META_DEBUG_PING,
+ "Got reply to delete ping for %s\n",
+ window->desc);
+
+ /* we do nothing */
+}
+
+static void
+delete_ping_timeout_func (MetaDisplay *display,
+ Window xwindow,
+ void *user_data)
+{
+ MetaWindow *window = user_data;
+ GError *err;
+ int child_pid;
+ int outpipe;
+ char *argv[4];
+
+ meta_topic (META_DEBUG_PING,
+ "Got delete ping timeout for %s\n",
+ window->desc);
+
+#if 0
+ argv[0] = METACITY_LIBEXECDIR"/metacity-dialog";
+ argv[1] = "--kill-window-question";
+ argv[2] = window->title;
+ argv[3] = NULL;
+
+ err = NULL;
+ if (!g_spawn_async_with_pipes ("/",
+ argv,
+ NULL,
+ 0,
+ NULL, NULL,
+ &child_pid,
+ NULL,
+ &outpipe,
+ NULL,
+ &err))
+ {
+ meta_warning (_("Error launching metacity-dialog to ask about killing an application: %s\n"),
+ err->message);
+ g_error_free (err);
+ return;
+ }
+#endif
+}
+
void
meta_window_delete (MetaWindow *window,
Time timestamp)
@@ -2504,6 +2559,14 @@ meta_window_delete (MetaWindow *window,
window->desc);
XKillClient (window->display->xdisplay, window->xwindow);
}
+ meta_error_trap_pop (window->display);
+
+ meta_display_ping_window (window->display,
+ window,
+ timestamp,
+ delete_ping_reply_func,
+ delete_ping_timeout_func,
+ window);
if (window->has_focus)
{
@@ -2522,8 +2585,6 @@ meta_window_delete (MetaWindow *window,
"Window %s was deleted/killed but didn't have focus\n",
window->desc);
}
-
- meta_error_trap_pop (window->display);
}
void