From 6d4a782191ab5575d7d5c350504dcd71051674d3 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 5 Feb 2011 12:00:02 +0000 Subject: [PATCH] The suspend helper is now found directly in the menu when available --- include/Panel.h | 1 + po/fr.po | 46 +++++++++++++-------------- src/applets/main.c | 17 ++++++++++ src/panel.c | 79 ++++++++++++++++++++++++++-------------------- 4 files changed, 86 insertions(+), 57 deletions(-) diff --git a/include/Panel.h b/include/Panel.h index 20d50ba..08e2d4b 100644 --- a/include/Panel.h +++ b/include/Panel.h @@ -42,6 +42,7 @@ typedef struct _PanelAppletHelper gboolean * push_in, gpointer data); void (*preferences_dialog)(Panel * panel); int (*shutdown_dialog)(Panel * panel); + int (*suspend)(Panel * panel); } PanelAppletHelper; typedef enum _PanelAppletPosition diff --git a/po/fr.po b/po/fr.po index 9525670..de1cfcd 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:22+0100\n" +"POT-Creation-Date: 2011-02-05 12:58+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:380 ../src/panel.c:384 +#: ../src/applets/battery.c:186 ../src/panel.c:385 ../src/panel.c:390 #: ../src/run.c:200 ../src/run.c:206 msgid "Error" msgstr "Erreur" @@ -75,7 +75,7 @@ msgstr "GPS actif" msgid "GSM is enabled" msgstr "GSM actif" -#: ../src/applets/lock.c:63 ../src/applets/main.c:315 +#: ../src/applets/lock.c:63 ../src/applets/main.c:316 msgid "Lock screen" msgstr "Verrouiller l'écran" @@ -83,28 +83,32 @@ msgstr "Verrouiller l'écran" msgid "Logging out is disabled" msgstr "Se déconnecter est désactivé" -#: ../src/applets/logout.c:70 ../src/panel.c:674 ../src/panel.c:681 -#: ../src/panel.c:689 +#: ../src/applets/logout.c:70 ../src/panel.c:702 ../src/panel.c:709 +#: ../src/panel.c:717 msgid "Logout" msgstr "Déconnexion" -#: ../src/applets/main.c:134 +#: ../src/applets/main.c:135 msgid "Main menu" msgstr "Menu principal" -#: ../src/applets/main.c:297 +#: ../src/applets/main.c:298 msgid "Applications" msgstr "Programmes" -#: ../src/applets/main.c:303 +#: ../src/applets/main.c:304 msgid "Run..." msgstr "Exécuter..." -#: ../src/applets/main.c:321 +#: ../src/applets/main.c:322 msgid "Logout..." msgstr "Déconnecter..." -#: ../src/applets/main.c:326 +#: ../src/applets/main.c:329 +msgid "Suspend" +msgstr "Suspendre" + +#: ../src/applets/main.c:334 msgid "Shutdown..." msgstr "Arrêter..." @@ -180,23 +184,23 @@ msgstr "petite" msgid "smaller" msgstr "très petite" -#: ../src/panel.c:463 +#: ../src/panel.c:469 msgid "Panel preferences" msgstr "Préférences du Panel" -#: ../src/panel.c:478 +#: ../src/panel.c:484 msgid "Top size:" msgstr "Taille du haut :" -#: ../src/panel.c:489 +#: ../src/panel.c:495 msgid "Bottom size:" msgstr "Taille du bas :" -#: ../src/panel.c:500 +#: ../src/panel.c:506 msgid "General" msgstr "Générales" -#: ../src/panel.c:664 +#: ../src/panel.c:692 msgid "" "This will log you out of the current session, therefore closing any " "application currently opened and losing any unsaved data.\n" @@ -207,7 +211,7 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:760 +#: ../src/panel.c:786 msgid "" "This will shutdown your device, therefore closing any application currently " "opened and losing any unsaved data.\n" @@ -218,7 +222,7 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:765 +#: ../src/panel.c:791 msgid "" "This will shutdown your computer, therefore closing any application " "currently opened and losing any unsaved data.\n" @@ -229,18 +233,14 @@ msgstr "" "sauvegardées.\n" "Voulez-vous continuer?" -#: ../src/panel.c:790 ../src/panel.c:805 ../src/panel.c:812 +#: ../src/panel.c:812 ../src/panel.c:819 ../src/panel.c:826 msgid "Shutdown" msgstr "Arrêter" -#: ../src/panel.c:797 +#: ../src/panel.c:818 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 402192e..6a60b06 100644 --- a/src/applets/main.c +++ b/src/applets/main.c @@ -89,6 +89,7 @@ static void _on_lock(gpointer data); static void _on_logout(gpointer data); static void _on_run(void); static void _on_shutdown(gpointer data); +static void _on_suspend(gpointer data); static gboolean _on_timeout(gpointer data); @@ -323,6 +324,13 @@ static void _on_clicked(gpointer data) G_CALLBACK(_on_logout), data); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } + if(main->helper->suspend != NULL) + { + menuitem = _main_menuitem(_("Suspend"), "gtk-media-pause"); + g_signal_connect_swapped(G_OBJECT(menuitem), "activate", + G_CALLBACK(_on_suspend), data); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } menuitem = _main_menuitem(_("Shutdown..."), "gnome-shutdown"); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK( _on_shutdown), data); @@ -473,6 +481,15 @@ static void _on_shutdown(gpointer data) } +/* on_suspend */ +static void _on_suspend(gpointer data) +{ + Main * main = data; + + main->helper->suspend(main->helper->panel); +} + + /* on_timeout */ static gboolean _on_timeout(gpointer data) { diff --git a/src/panel.c b/src/panel.c index 5f58dca..0139377 100644 --- a/src/panel.c +++ b/src/panel.c @@ -97,6 +97,8 @@ static struct /* prototypes */ +static gboolean _panel_can_suspend(void); + /* helpers */ static char const * _panel_helper_config_get(Panel * panel, char const * section, char const * variable); @@ -115,6 +117,7 @@ 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 int _panel_helper_suspend(Panel * panel); static char * _config_get_filename(void); @@ -155,6 +158,8 @@ Panel * panel_new(PanelPrefs const * prefs) panel->top_helper.position_menu = _panel_helper_position_menu_top; panel->top_helper.preferences_dialog = _panel_helper_preferences_dialog; panel->top_helper.shutdown_dialog = _panel_helper_shutdown_dialog; + panel->top_helper.suspend = (_panel_can_suspend()) + ? _panel_helper_suspend : NULL; panel->top = NULL; panel->bottom_helper = panel->top_helper; panel->bottom_helper.position_menu = _panel_helper_position_menu_bottom; @@ -381,6 +386,7 @@ int panel_error(Panel * panel, char const * message, int ret) gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), #endif "%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); @@ -597,6 +603,28 @@ static char * _config_get_filename(void) } +/* panel_can_suspend */ +static gboolean _panel_can_suspend(void) +{ +#ifdef __NetBSD__ + int sleep_state = -1; + size_t size = sizeof(sleep_state); + + 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 TRUE; +#else + struct stat st; + + if(lstat("/proc/apm", &st) == 0) + return TRUE; +#endif + return TRUE; +} + + /* helpers */ /* panel_helper_config_get */ static char const * _panel_helper_config_get(Panel * panel, @@ -750,8 +778,6 @@ static void _panel_helper_preferences_dialog(Panel * panel) /* panel_helper_shutdown_dialog */ -static int _helper_shutdown_dialog_can_suspend(void); - static int _panel_helper_shutdown_dialog(Panel * panel) { GtkWidget * dialog; @@ -767,7 +793,7 @@ 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, RES_SUSPEND }; + enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN }; int res; char * reboot[] = { "/sbin/shutdown", "shutdown", "-r", "now", NULL }; char * shutdown[] = { "/sbin/shutdown", "shutdown", @@ -777,10 +803,6 @@ static int _panel_helper_shutdown_dialog(Panel * panel) "-h", #endif "now", NULL }; - char * suspend[] = { "/usr/bin/sudo", "sudo", "/sbin/apm", "-s", NULL }; -#ifdef __NetBSD__ - int sleep_state = 3; -#endif char ** argv; GError * error = NULL; @@ -792,16 +814,8 @@ static int _panel_helper_shutdown_dialog(Panel * panel) "%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)); @@ -814,39 +828,36 @@ static int _panel_helper_shutdown_dialog(Panel * panel) gtk_widget_destroy(dialog); if(res == RES_SHUTDOWN) argv = shutdown; - else if(res == RES_SUSPEND) - argv = suspend; else if(res == RES_REBOOT) 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) + +/* panel_helper_suspend */ +static int _panel_helper_suspend(Panel * panel) { - struct stat st; #ifdef __NetBSD__ - int sleep_state = -1; - size_t size = sizeof(sleep_state); + int sleep_state = 3; +#else + char * suspend[] = { "/usr/bin/sudo", "sudo", "/sbin/apm", "-s", NULL }; + GError * error = NULL; #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 + if(sysctlbyname("machdep.sleep_state", NULL, NULL, &sleep_state, + sizeof(sleep_state)) != 0) + return panel_error(panel, "sysctl", 1); return 0; +#else + if(g_spawn_async(NULL, suspend, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, NULL, + NULL, NULL, &error) != TRUE) + return panel_error(panel, error->message, 1); + return 0; +#endif }