diff -Naur metacity-2.34.13.orig/src/core/delete.c metacity-2.34.13/src/core/delete.c --- metacity-2.34.13.orig/src/core/delete.c 2011-11-10 15:14:34.000000000 +0100 +++ metacity-2.34.13/src/core/delete.c 2012-11-08 21:36:48.373976906 +0100 @@ -90,23 +90,41 @@ return; } - window_title = g_locale_from_utf8 (window->title, -1, NULL, NULL, NULL); + /* 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; + } /* Translators: %s is a window title */ - tmp = g_strdup_printf (_("%s is not responding."), - window_title); + if (window_title) + tmp = g_markup_printf_escaped (_("%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.")); - g_free (window_title); - dialog_pid = meta_show_dialog ("--question", - window_content, 0, - window->screen->number, + window_content, NULL, + window->screen->screen_name, _("_Wait"), _("_Force Quit"), window->xwindow, NULL, NULL); diff -Naur metacity-2.34.13.orig/src/core/session.c metacity-2.34.13/src/core/session.c --- metacity-2.34.13.orig/src/core/session.c 2011-11-10 15:14:34.000000000 +0100 +++ metacity-2.34.13/src/core/session.c 2012-11-08 21:35:56.896216322 +0100 @@ -1809,7 +1809,7 @@ "and will have to be restarted manually next time " "you log in."), "240", - meta_screen_get_screen_number (meta_get_display()->active_screen), + meta_get_display()->active_screen->screen_name, NULL, NULL, None, columns, diff -Naur metacity-2.34.13.orig/src/core/util.c metacity-2.34.13/src/core/util.c --- metacity-2.34.13.orig/src/core/util.c 2011-11-10 15:14:34.000000000 +0100 +++ metacity-2.34.13/src/core/util.c 2012-11-08 21:36:41.373828115 +0100 @@ -538,11 +538,30 @@ } } +/* Command line arguments are passed in the locale encoding; in almost + * all cases, we'd hope that is UTF-8 and no conversion is necessary. + * If it's not UTF-8, then it's possible that the message isn't + * representable in the locale encoding. + */ +static void +append_argument (GPtrArray *args, + const char *arg) +{ + char *locale_arg = g_locale_from_utf8 (arg, -1, NULL, NULL, NULL); + + /* This is cheesy, but it's better to have a few ???'s in the dialog + * for an unresponsive application than no dialog at all appear */ + if (!locale_arg) + locale_arg = g_strdup ("???"); + + g_ptr_array_add (args, locale_arg); +} + GPid meta_show_dialog (const char *type, const char *message, const char *timeout, - const gint screen_number, + const char *display, const char *ok_text, const char *cancel_text, const int transient_for, @@ -550,61 +569,58 @@ GSList *entries) { GError *error = NULL; - char *screen_number_text = g_strdup_printf("%d", screen_number); GSList *tmp; - int i=0; GPid child_pid; - const char **argvl = g_malloc(sizeof (char*) * - (17 + - g_slist_length (columns)*2 + - g_slist_length (entries))); - - argvl[i++] = "zenity"; - argvl[i++] = type; - argvl[i++] = "--screen"; - argvl[i++] = screen_number_text; - argvl[i++] = "--class"; - argvl[i++] = "metacity-dialog"; - argvl[i++] = "--title"; + GPtrArray *args; + + args = g_ptr_array_new (); + + append_argument (args, "zenity"); + append_argument (args, type); + append_argument (args, "--display"); + append_argument (args, display); + append_argument (args, "--class"); + append_argument (args, "metaicty-dialog"); + append_argument (args, "--title"); /* Translators: This is the title used on dialog boxes */ - argvl[i++] = _("Metacity"); - argvl[i++] = "--text"; - argvl[i++] = message; - + append_argument (args, _("Metacity")); + append_argument (args, "--text"); + append_argument (args, message); + if (timeout) { - argvl[i++] = "--timeout"; - argvl[i++] = timeout; + append_argument (args, "--timeout"); + append_argument (args, timeout); } if (ok_text) { - argvl[i++] = "--ok-label"; - argvl[i++] = ok_text; + append_argument (args, "--ok-label"); + append_argument (args, ok_text); } if (cancel_text) { - argvl[i++] = "--cancel-label"; - argvl[i++] = cancel_text; + append_argument (args, "--cancel-label"); + append_argument (args, cancel_text); } - + tmp = columns; while (tmp) { - argvl[i++] = "--column"; - argvl[i++] = tmp->data; + append_argument (args, "--column"); + append_argument (args, tmp->data); tmp = tmp->next; } tmp = entries; while (tmp) { - argvl[i++] = tmp->data; + append_argument (args, tmp->data); tmp = tmp->next; } - - argvl[i] = NULL; + + g_ptr_array_add (args, NULL); /* NULL-terminate */ if (transient_for) { @@ -615,7 +631,7 @@ g_spawn_async ( "/", - (gchar**) argvl, /* ugh */ + (gchar**) args->pdata, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, @@ -626,8 +642,7 @@ if (transient_for) unsetenv ("WINDOWID"); - g_free (argvl); - g_free (screen_number_text); + g_ptr_array_free (args, TRUE); if (error) { diff -Naur metacity-2.34.13.orig/src/include/util.h metacity-2.34.13/src/include/util.h --- metacity-2.34.13.orig/src/include/util.h 2011-11-10 15:14:34.000000000 +0100 +++ metacity-2.34.13/src/include/util.h 2012-11-08 21:36:27.206860608 +0100 @@ -99,9 +99,9 @@ void meta_free_gslist_and_elements (GSList *list_to_deep_free); GPid meta_show_dialog (const char *type, - const char *title, const char *message, - gint timeout, + const char *timeout, + const char *display, const char *ok_text, const char *cancel_text, const int transient_for,