diff --git a/ChangeLog b/ChangeLog index 02be8b3f2..1e21463d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2002-04-12 Havoc Pennington + + * 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. + 2002-04-09 Havoc Pennington * src/theme.c (multiply_alpha): fix alpha multiplication routine 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 +#include +#include +#include + +#include +#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 #include #include +#include static GtkWidget* do_appwindow (void); @@ -472,6 +473,13 @@ static GtkItemFactoryEntry menu_items[] = { "/Windows/Des_ktop", NULL, desktop_cb, 0, NULL } }; +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