From 4ecb017600d6525929a44e30c13c1a044db6f4a8 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 24 Feb 2011 12:02:55 +0000 Subject: [PATCH] No longer using gtk_dialog_run() for helper windows --- include/Panel.h | 4 +- po/fr.po | 32 ++++---- src/applets/logout.c | 2 +- src/applets/main.c | 16 ++-- src/panel.c | 176 ++++++++++++++++++++++++++++++------------- 5 files changed, 151 insertions(+), 79 deletions(-) diff --git a/include/Panel.h b/include/Panel.h index 08e2d4b..d0f14f5 100644 --- a/include/Panel.h +++ b/include/Panel.h @@ -37,11 +37,11 @@ typedef struct _PanelAppletHelper char const * variable, char const * value); int (*error)(Panel * panel, char const * message, int ret); void (*about_dialog)(Panel * panel); - int (*logout_dialog)(void); + void (*logout_dialog)(Panel * panel); void (*position_menu)(GtkMenu * menu, gint * x, gint * y, gboolean * push_in, gpointer data); void (*preferences_dialog)(Panel * panel); - int (*shutdown_dialog)(Panel * panel); + void (*shutdown_dialog)(Panel * panel); int (*suspend)(Panel * panel); } PanelAppletHelper; diff --git a/po/fr.po b/po/fr.po index de1cfcd..48c414d 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Panel 0.0.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-02-05 12:58+0100\n" +"POT-Creation-Date: 2011-02-24 13:01+0100\n" "PO-Revision-Date: 2010-04-22 12:45+0200\n" "Last-Translator: Pierre Pronchery \n" "Language-Team: French\n" @@ -20,7 +20,7 @@ msgstr "" msgid "Unknown" msgstr "Inconnu" -#: ../src/applets/battery.c:186 ../src/panel.c:385 ../src/panel.c:390 +#: ../src/applets/battery.c:186 ../src/panel.c:391 ../src/panel.c:396 #: ../src/run.c:200 ../src/run.c:206 msgid "Error" msgstr "Erreur" @@ -83,8 +83,8 @@ msgstr "Verrouiller l'écran" msgid "Logging out is disabled" msgstr "Se déconnecter est désactivé" -#: ../src/applets/logout.c:70 ../src/panel.c:702 ../src/panel.c:709 -#: ../src/panel.c:717 +#: ../src/applets/logout.c:70 ../src/panel.c:728 ../src/panel.c:735 +#: ../src/panel.c:744 msgid "Logout" msgstr "Déconnexion" @@ -172,35 +172,35 @@ msgid "" " -x\tUse icons the size of menus\n" msgstr "" -#: ../src/panel.c:93 +#: ../src/panel.c:97 msgid "large" msgstr "grande" -#: ../src/panel.c:94 +#: ../src/panel.c:98 msgid "small" msgstr "petite" -#: ../src/panel.c:95 +#: ../src/panel.c:99 msgid "smaller" msgstr "très petite" -#: ../src/panel.c:469 +#: ../src/panel.c:489 msgid "Panel preferences" msgstr "Préférences du Panel" -#: ../src/panel.c:484 +#: ../src/panel.c:504 msgid "Top size:" msgstr "Taille du haut :" -#: ../src/panel.c:495 +#: ../src/panel.c:515 msgid "Bottom size:" msgstr "Taille du bas :" -#: ../src/panel.c:506 +#: ../src/panel.c:526 msgid "General" msgstr "Générales" -#: ../src/panel.c:692 +#: ../src/panel.c:714 msgid "" "This will log you out of the current session, therefore closing any " "application currently opened and losing any unsaved data.\n" @@ -211,7 +211,7 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:786 +#: ../src/panel.c:831 msgid "" "This will shutdown your device, therefore closing any application currently " "opened and losing any unsaved data.\n" @@ -222,7 +222,7 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:791 +#: ../src/panel.c:836 msgid "" "This will shutdown your computer, therefore closing any application " "currently opened and losing any unsaved data.\n" @@ -233,11 +233,11 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:812 ../src/panel.c:819 ../src/panel.c:826 +#: ../src/panel.c:850 ../src/panel.c:857 ../src/panel.c:866 msgid "Shutdown" msgstr "Arrêter" -#: ../src/panel.c:818 +#: ../src/panel.c:856 msgid "Restart" msgstr "Redémarrer" diff --git a/src/applets/logout.c b/src/applets/logout.c index 494c2d3..eb3c901 100644 --- a/src/applets/logout.c +++ b/src/applets/logout.c @@ -82,5 +82,5 @@ static void _on_clicked(gpointer data) { PanelApplet * applet = data; - applet->helper->logout_dialog(); + applet->helper->logout_dialog(applet->helper->panel); } diff --git a/src/applets/main.c b/src/applets/main.c index 6a60b06..ae5a0c8 100644 --- a/src/applets/main.c +++ b/src/applets/main.c @@ -87,7 +87,7 @@ static void _on_clicked(gpointer data); static gboolean _on_idle(gpointer data); static void _on_lock(gpointer data); static void _on_logout(gpointer data); -static void _on_run(void); +static void _on_run(gpointer data); static void _on_shutdown(gpointer data); static void _on_suspend(gpointer data); static gboolean _on_timeout(gpointer data); @@ -303,7 +303,7 @@ static void _on_clicked(gpointer data) gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); menuitem = _main_menuitem(_("Run..."), GTK_STOCK_EXECUTE); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK( - _on_run), NULL); + _on_run), main); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); @@ -447,7 +447,7 @@ static void _on_lock(gpointer data) if((p = helper->config_get(helper->panel, "lock", "command")) != NULL) command = p; if(g_spawn_command_line_async(command, &error) != TRUE) - helper->error(NULL, error->message, 0); + helper->error(helper->panel, error->message, 1); } @@ -456,19 +456,23 @@ static void _on_logout(gpointer data) { Main * main = data; - main->helper->logout_dialog(); + main->helper->logout_dialog(main->helper->panel); } /* on_run */ -static void _on_run(void) +static void _on_run(gpointer data) { + Main * main = data; char * argv[] = { "run", NULL }; GSpawnFlags flags = G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL; + GError * error = NULL; - g_spawn_async(NULL, argv, NULL, flags, NULL, NULL, NULL, NULL); + if(g_spawn_async(NULL, argv, NULL, flags, NULL, NULL, NULL, &error) + != TRUE) + main->helper->error(main->helper->panel, error->message, 1); } diff --git a/src/panel.c b/src/panel.c index 0139377..554a41b 100644 --- a/src/panel.c +++ b/src/panel.c @@ -70,8 +70,12 @@ struct _Panel GtkWidget * pr_bottom_size; GtkWidget * pr_top_size; - /* about */ + /* dialogs */ GtkWidget * ab_window; +#ifndef EMBEDDED + GtkWidget * lo_window; +#endif + GtkWidget * sh_window; }; @@ -107,7 +111,7 @@ static int _panel_helper_config_set(Panel * panel, char const * section, static int _panel_helper_error(Panel * panel, char const * message, int ret); static void _panel_helper_about_dialog(Panel * panel); #ifndef EMBEDDED -static int _panel_helper_logout_dialog(void); +static void _panel_helper_logout_dialog(Panel * panel); #endif static void _panel_helper_position_menu(GtkMenu * menu, gint * x, gint * y, gboolean * push_in, PanelPosition position, gpointer data); @@ -116,7 +120,7 @@ static void _panel_helper_position_menu_bottom(GtkMenu * menu, gint * x, static void _panel_helper_position_menu_top(GtkMenu * menu, gint * x, gint * y, gboolean * push_in, gpointer data); static void _panel_helper_preferences_dialog(Panel * panel); -static int _panel_helper_shutdown_dialog(Panel * panel); +static void _panel_helper_shutdown_dialog(Panel * panel); static int _panel_helper_suspend(Panel * panel); static char * _config_get_filename(void); @@ -372,6 +376,8 @@ void panel_delete(Panel * panel) /* useful */ /* panel_error */ static int _error_text(char const * message, int ret); +static gboolean _error_on_closex(GtkWidget * widget); +static void _error_on_response(GtkWidget * widget); int panel_error(Panel * panel, char const * message, int ret) { @@ -388,8 +394,11 @@ int panel_error(Panel * panel, char const * message, int ret) "%s: %s", message, strerror(errno)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ALWAYS); gtk_window_set_title(GTK_WINDOW(dialog), _("Error")); - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); + g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK( + _error_on_closex), NULL); + g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( + _error_on_response), NULL); + gtk_widget_show_all(dialog); return ret; } @@ -400,6 +409,17 @@ static int _error_text(char const * message, int ret) return ret; } +static gboolean _error_on_closex(GtkWidget * widget) +{ + gtk_widget_hide(widget); + return FALSE; +} + +static void _error_on_response(GtkWidget * widget) +{ + gtk_widget_destroy(widget); +} + /* panel_load */ int panel_load(Panel * panel, PanelPosition position, char const * applet) @@ -686,41 +706,62 @@ static gboolean _about_on_closex(gpointer data) #ifndef EMBEDDED /* panel_helper_logout_dialog */ -static int _panel_helper_logout_dialog(void) +static gboolean _logout_dialog_on_closex(gpointer data); +static void _logout_dialog_on_response(GtkWidget * widget, gint response); + +static void _panel_helper_logout_dialog(Panel * panel) { - GtkWidget * dialog; const char * message = _("This will log you out of the current session," " therefore closing any application currently opened" " and losing any unsaved data.\n" "Do you really want to proceed?"); GtkWidget * widget; - int res; - dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, - GTK_BUTTONS_NONE, "%s", + if(panel->lo_window != NULL) + { + gtk_window_present(GTK_WINDOW(panel->lo_window)); + return; + } + panel->lo_window = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, + GTK_BUTTONS_NONE, #if GTK_CHECK_VERSION(2, 6, 0) - _("Logout")); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), - "%s", + "%s", _("Logout")); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG( + panel->lo_window), #endif - message); - gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, + "%s", message); + gtk_dialog_add_buttons(GTK_DIALOG(panel->lo_window), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); widget = gtk_button_new_with_label(_("Logout")); gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_icon_name( "gnome-logout", GTK_ICON_SIZE_BUTTON)); gtk_widget_show_all(widget); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), widget, + gtk_dialog_add_action_widget(GTK_DIALOG(panel->lo_window), widget, GTK_RESPONSE_ACCEPT); - gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE); - gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ALWAYS); - gtk_window_set_title(GTK_WINDOW(dialog), _("Logout")); - res = gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); - if(res != GTK_RESPONSE_ACCEPT) - return 1; - gtk_main_quit(); - return 0; + gtk_window_set_keep_above(GTK_WINDOW(panel->lo_window), TRUE); + gtk_window_set_position(GTK_WINDOW(panel->lo_window), + GTK_WIN_POS_CENTER_ALWAYS); + gtk_window_set_title(GTK_WINDOW(panel->lo_window), _("Logout")); + g_signal_connect(G_OBJECT(panel->lo_window), "delete-event", G_CALLBACK( + _logout_dialog_on_closex), panel); + g_signal_connect(G_OBJECT(panel->lo_window), "response", G_CALLBACK( + _logout_dialog_on_response), panel); + gtk_widget_show_all(panel->lo_window); +} + +static gboolean _logout_dialog_on_closex(gpointer data) +{ + Panel * panel = data; + + gtk_widget_hide(panel->lo_window); + return TRUE; +} + +static void _logout_dialog_on_response(GtkWidget * widget, gint response) +{ + gtk_widget_hide(widget); + if(response == GTK_RESPONSE_ACCEPT) + gtk_main_quit(); } #endif @@ -778,9 +819,13 @@ static void _panel_helper_preferences_dialog(Panel * panel) /* panel_helper_shutdown_dialog */ -static int _panel_helper_shutdown_dialog(Panel * panel) +static gboolean _shutdown_dialog_on_closex(gpointer data); +static void _shutdown_dialog_on_response(GtkWidget * widget, gint response, + gpointer data); +enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN }; + +static void _panel_helper_shutdown_dialog(Panel * panel) { - GtkWidget * dialog; GtkWidget * widget; #ifdef EMBEDDED const char * message = _("This will shutdown your device," @@ -793,8 +838,51 @@ static int _panel_helper_shutdown_dialog(Panel * panel) " and losing any unsaved data.\n" "Do you really want to proceed?"); #endif - enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN }; - int res; + + if(panel->sh_window != NULL) + { + gtk_window_present(GTK_WINDOW(panel->sh_window)); + return; + } + panel->sh_window = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, + GTK_BUTTONS_NONE, "%s", +#if GTK_CHECK_VERSION(2, 6, 0) + _("Shutdown")); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG( + panel->sh_window), +#endif + "%s", message); + gtk_dialog_add_buttons(GTK_DIALOG(panel->sh_window), GTK_STOCK_CANCEL, + RES_CANCEL, _("Restart"), RES_REBOOT, NULL); + widget = gtk_button_new_with_label(_("Shutdown")); + gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_icon_name( + "gnome-shutdown", GTK_ICON_SIZE_BUTTON)); + gtk_widget_show_all(widget); + gtk_dialog_add_action_widget(GTK_DIALOG(panel->sh_window), widget, + RES_SHUTDOWN); + gtk_window_set_keep_above(GTK_WINDOW(panel->sh_window), TRUE); + gtk_window_set_position(GTK_WINDOW(panel->sh_window), + GTK_WIN_POS_CENTER_ALWAYS); + gtk_window_set_title(GTK_WINDOW(panel->sh_window), _("Shutdown")); + g_signal_connect(G_OBJECT(panel->lo_window), "delete-event", G_CALLBACK( + _shutdown_dialog_on_closex), panel); + g_signal_connect(G_OBJECT(panel->lo_window), "response", G_CALLBACK( + _shutdown_dialog_on_response), panel); + gtk_widget_show_all(panel->lo_window); +} + +static gboolean _shutdown_dialog_on_closex(gpointer data) +{ + Panel * panel = data; + + gtk_widget_hide(panel->sh_window); + return TRUE; +} + +static void _shutdown_dialog_on_response(GtkWidget * widget, gint response, + gpointer data) +{ + Panel * panel = data; char * reboot[] = { "/sbin/shutdown", "shutdown", "-r", "now", NULL }; char * shutdown[] = { "/sbin/shutdown", "shutdown", #ifdef __NetBSD__ @@ -806,36 +894,16 @@ static int _panel_helper_shutdown_dialog(Panel * panel) char ** argv; GError * error = NULL; - dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, - GTK_BUTTONS_NONE, "%s", -#if GTK_CHECK_VERSION(2, 6, 0) - _("Shutdown")); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), - "%s", -#endif - message); - gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, RES_CANCEL, - _("Restart"), RES_REBOOT, NULL); - widget = gtk_button_new_with_label(_("Shutdown")); - gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_icon_name( - "gnome-shutdown", GTK_ICON_SIZE_BUTTON)); - gtk_widget_show_all(widget); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), widget, RES_SHUTDOWN); - gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE); - gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ALWAYS); - gtk_window_set_title(GTK_WINDOW(dialog), _("Shutdown")); - res = gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); - if(res == RES_SHUTDOWN) + gtk_widget_hide(widget); + if(response == RES_SHUTDOWN) argv = shutdown; - else if(res == RES_REBOOT) + else if(response == RES_REBOOT) argv = reboot; else - return 1; + return; if(g_spawn_async(NULL, argv, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, NULL, NULL, NULL, &error) != TRUE) - return panel_error(panel, error->message, 1); - return 0; + panel_error(panel, error->message, 1); }