diff --git a/include/Panel.h b/include/Panel.h index c41d2c3..20d50ba 100644 --- a/include/Panel.h +++ b/include/Panel.h @@ -41,7 +41,7 @@ typedef struct _PanelAppletHelper void (*position_menu)(GtkMenu * menu, gint * x, gint * y, gboolean * push_in, gpointer data); void (*preferences_dialog)(Panel * panel); - int (*shutdown_dialog)(void); + int (*shutdown_dialog)(Panel * panel); } PanelAppletHelper; typedef enum _PanelAppletPosition diff --git a/po/fr.po b/po/fr.po index 0908ac9..9525670 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 09:31+0100\n" +"POT-Creation-Date: 2011-02-05 12:22+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:375 ../src/panel.c:379 +#: ../src/applets/battery.c:186 ../src/panel.c:380 ../src/panel.c:384 #: ../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:669 ../src/panel.c:676 -#: ../src/panel.c:684 +#: ../src/applets/logout.c:70 ../src/panel.c:674 ../src/panel.c:681 +#: ../src/panel.c:689 msgid "Logout" msgstr "Déconnexion" @@ -168,35 +168,35 @@ msgid "" " -x\tUse icons the size of menus\n" msgstr "" -#: ../src/panel.c:88 +#: ../src/panel.c:93 msgid "large" msgstr "grande" -#: ../src/panel.c:89 +#: ../src/panel.c:94 msgid "small" msgstr "petite" -#: ../src/panel.c:90 +#: ../src/panel.c:95 msgid "smaller" msgstr "très petite" -#: ../src/panel.c:458 +#: ../src/panel.c:463 msgid "Panel preferences" msgstr "Préférences du Panel" -#: ../src/panel.c:473 +#: ../src/panel.c:478 msgid "Top size:" msgstr "Taille du haut :" -#: ../src/panel.c:484 +#: ../src/panel.c:489 msgid "Bottom size:" msgstr "Taille du bas :" -#: ../src/panel.c:495 +#: ../src/panel.c:500 msgid "General" msgstr "Générales" -#: ../src/panel.c:659 +#: ../src/panel.c:664 msgid "" "This will log you out of the current session, therefore closing any " "application currently opened and losing any unsaved data.\n" @@ -207,7 +207,7 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:753 +#: ../src/panel.c:760 msgid "" "This will shutdown your device, therefore closing any application currently " "opened and losing any unsaved data.\n" @@ -218,7 +218,7 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:758 +#: ../src/panel.c:765 msgid "" "This will shutdown your computer, therefore closing any application " "currently opened and losing any unsaved data.\n" @@ -229,14 +229,18 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:775 ../src/panel.c:780 ../src/panel.c:787 +#: ../src/panel.c:790 ../src/panel.c:805 ../src/panel.c:812 msgid "Shutdown" msgstr "Arrêter" -#: ../src/panel.c:779 +#: ../src/panel.c:797 msgid "Restart" msgstr "Redémarrer" +#: ../src/panel.c:801 +msgid "Suspend" +msgstr "Suspendre" + #: ../src/run.c:101 ../src/run.c:113 msgid "Run program..." msgstr "Exécuter..." diff --git a/src/applets/main.c b/src/applets/main.c index 95296a5..402192e 100644 --- a/src/applets/main.c +++ b/src/applets/main.c @@ -469,7 +469,7 @@ static void _on_shutdown(gpointer data) { Main * main = data; - main->helper->shutdown_dialog(); + main->helper->shutdown_dialog(main->helper->panel); } diff --git a/src/panel.c b/src/panel.c index 66d839e..6c16638 100644 --- a/src/panel.c +++ b/src/panel.c @@ -19,6 +19,11 @@ static char const _license[] = #include #include +#include +#ifdef __NetBSD__ +# include +# include +#endif #include #include #include @@ -109,7 +114,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(void); +static int _panel_helper_shutdown_dialog(Panel * panel); static char * _config_get_filename(void); @@ -745,7 +750,9 @@ static void _panel_helper_preferences_dialog(Panel * panel) /* panel_helper_shutdown_dialog */ -static int _panel_helper_shutdown_dialog(void) +static int _helper_shutdown_dialog_can_suspend(void); + +static int _panel_helper_shutdown_dialog(Panel * panel) { GtkWidget * dialog; GtkWidget * widget; @@ -760,7 +767,7 @@ static int _panel_helper_shutdown_dialog(void) " and losing any unsaved data.\n" "Do you really want to proceed?"); #endif - enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN }; + enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN, RES_SUSPEND }; int res; char * reboot[] = { "/sbin/shutdown", "shutdown", "-r", "now", NULL }; char * shutdown[] = { "/sbin/shutdown", "shutdown", @@ -770,13 +777,31 @@ static int _panel_helper_shutdown_dialog(void) "-h", #endif "now", NULL }; + char * suspend[] = { "/sbin/apm", "apm", "-s", NULL }; +#ifdef __NetBSD__ + int sleep_state = 3; +#endif + char ** argv; + GError * error = NULL; dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, - GTK_BUTTONS_NONE, "%s", _("Shutdown")); + GTK_BUTTONS_NONE, "%s", +#if GTK_CHECK_VERSION(2, 6, 0) + _("Shutdown")); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), - "%s", message); + "%s", +#endif + message); + /* reboot */ gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, RES_CANCEL, _("Restart"), RES_REBOOT, NULL); + /* suspend */ + if(_helper_shutdown_dialog_can_suspend()) + { + gtk_dialog_add_buttons(GTK_DIALOG(dialog), _("Suspend"), + RES_SUSPEND, NULL); + } + /* shutdown */ 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)); @@ -788,12 +813,40 @@ static int _panel_helper_shutdown_dialog(void) res = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if(res == RES_SHUTDOWN) - g_spawn_async(NULL, shutdown, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, - NULL, NULL, NULL, NULL); + argv = shutdown; + else if(res == RES_SUSPEND) + argv = suspend; else if(res == RES_REBOOT) - g_spawn_async(NULL, reboot, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, - NULL, NULL, NULL, NULL); + argv = reboot; else return 1; +#ifdef __NetBSD__ + if(res == RES_SUSPEND && sysctlbyname("machdep.sleep_state", NULL, NULL, + &sleep_state, sizeof(sleep_state)) != 0) + return panel_error(panel, "sysctl", 1); +#endif + 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; +} + +static int _helper_shutdown_dialog_can_suspend(void) +{ + struct stat st; +#ifdef __NetBSD__ + int sleep_state = -1; + size_t size = sizeof(sleep_state); +#endif + + if(lstat("/proc/apm", &st) == 0) + return 1; +#ifdef __NetBSD__ + if(sysctlbyname("machdep.sleep_state", &sleep_state, &size, NULL, 0) + == 0 && sleep_state == 0 + && sysctlbyname("machdep.sleep_state", &sleep_state, + &size, &sleep_state, size) == 0) + return 1; +#endif return 0; }