The suspend helper is now found directly in the menu when available

This commit is contained in:
Pierre Pronchery 2011-02-05 12:00:02 +00:00
parent 42cfe3f9d3
commit 6d4a782191
4 changed files with 86 additions and 57 deletions

View File

@ -42,6 +42,7 @@ typedef struct _PanelAppletHelper
gboolean * push_in, gpointer data); gboolean * push_in, gpointer data);
void (*preferences_dialog)(Panel * panel); void (*preferences_dialog)(Panel * panel);
int (*shutdown_dialog)(Panel * panel); int (*shutdown_dialog)(Panel * panel);
int (*suspend)(Panel * panel);
} PanelAppletHelper; } PanelAppletHelper;
typedef enum _PanelAppletPosition typedef enum _PanelAppletPosition

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Panel 0.0.5\n" "Project-Id-Version: Panel 0.0.5\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2010-04-22 12:45+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n" "Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: French\n" "Language-Team: French\n"
@ -20,7 +20,7 @@ msgstr ""
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" 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 #: ../src/run.c:200 ../src/run.c:206
msgid "Error" msgid "Error"
msgstr "Erreur" msgstr "Erreur"
@ -75,7 +75,7 @@ msgstr "GPS actif"
msgid "GSM is enabled" msgid "GSM is enabled"
msgstr "GSM actif" 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" msgid "Lock screen"
msgstr "Verrouiller l'écran" msgstr "Verrouiller l'écran"
@ -83,28 +83,32 @@ msgstr "Verrouiller l'écran"
msgid "Logging out is disabled" msgid "Logging out is disabled"
msgstr "Se déconnecter est désactivé" msgstr "Se déconnecter est désactivé"
#: ../src/applets/logout.c:70 ../src/panel.c:674 ../src/panel.c:681 #: ../src/applets/logout.c:70 ../src/panel.c:702 ../src/panel.c:709
#: ../src/panel.c:689 #: ../src/panel.c:717
msgid "Logout" msgid "Logout"
msgstr "Déconnexion" msgstr "Déconnexion"
#: ../src/applets/main.c:134 #: ../src/applets/main.c:135
msgid "Main menu" msgid "Main menu"
msgstr "Menu principal" msgstr "Menu principal"
#: ../src/applets/main.c:297 #: ../src/applets/main.c:298
msgid "Applications" msgid "Applications"
msgstr "Programmes" msgstr "Programmes"
#: ../src/applets/main.c:303 #: ../src/applets/main.c:304
msgid "Run..." msgid "Run..."
msgstr "Exécuter..." msgstr "Exécuter..."
#: ../src/applets/main.c:321 #: ../src/applets/main.c:322
msgid "Logout..." msgid "Logout..."
msgstr "Déconnecter..." msgstr "Déconnecter..."
#: ../src/applets/main.c:326 #: ../src/applets/main.c:329
msgid "Suspend"
msgstr "Suspendre"
#: ../src/applets/main.c:334
msgid "Shutdown..." msgid "Shutdown..."
msgstr "Arrêter..." msgstr "Arrêter..."
@ -180,23 +184,23 @@ msgstr "petite"
msgid "smaller" msgid "smaller"
msgstr "très petite" msgstr "très petite"
#: ../src/panel.c:463 #: ../src/panel.c:469
msgid "Panel preferences" msgid "Panel preferences"
msgstr "Préférences du Panel" msgstr "Préférences du Panel"
#: ../src/panel.c:478 #: ../src/panel.c:484
msgid "Top size:" msgid "Top size:"
msgstr "Taille du haut :" msgstr "Taille du haut :"
#: ../src/panel.c:489 #: ../src/panel.c:495
msgid "Bottom size:" msgid "Bottom size:"
msgstr "Taille du bas :" msgstr "Taille du bas :"
#: ../src/panel.c:500 #: ../src/panel.c:506
msgid "General" msgid "General"
msgstr "Générales" msgstr "Générales"
#: ../src/panel.c:664 #: ../src/panel.c:692
msgid "" msgid ""
"This will log you out of the current session, therefore closing any " "This will log you out of the current session, therefore closing any "
"application currently opened and losing any unsaved data.\n" "application currently opened and losing any unsaved data.\n"
@ -207,7 +211,7 @@ msgstr ""
"sauvegardées.\n" "sauvegardées.\n"
"Voulez-vous continuer?" "Voulez-vous continuer?"
#: ../src/panel.c:760 #: ../src/panel.c:786
msgid "" msgid ""
"This will shutdown your device, therefore closing any application currently " "This will shutdown your device, therefore closing any application currently "
"opened and losing any unsaved data.\n" "opened and losing any unsaved data.\n"
@ -218,7 +222,7 @@ msgstr ""
"sauvegardées.\n" "sauvegardées.\n"
"Voulez-vous continuer?" "Voulez-vous continuer?"
#: ../src/panel.c:765 #: ../src/panel.c:791
msgid "" msgid ""
"This will shutdown your computer, therefore closing any application " "This will shutdown your computer, therefore closing any application "
"currently opened and losing any unsaved data.\n" "currently opened and losing any unsaved data.\n"
@ -229,18 +233,14 @@ msgstr ""
"sauvegardées.\n" "sauvegardées.\n"
"Voulez-vous continuer?" "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" msgid "Shutdown"
msgstr "Arrêter" msgstr "Arrêter"
#: ../src/panel.c:797 #: ../src/panel.c:818
msgid "Restart" msgid "Restart"
msgstr "Redémarrer" msgstr "Redémarrer"
#: ../src/panel.c:801
msgid "Suspend"
msgstr "Suspendre"
#: ../src/run.c:101 ../src/run.c:113 #: ../src/run.c:101 ../src/run.c:113
msgid "Run program..." msgid "Run program..."
msgstr "Exécuter..." msgstr "Exécuter..."

View File

@ -89,6 +89,7 @@ static void _on_lock(gpointer data);
static void _on_logout(gpointer data); static void _on_logout(gpointer data);
static void _on_run(void); static void _on_run(void);
static void _on_shutdown(gpointer data); static void _on_shutdown(gpointer data);
static void _on_suspend(gpointer data);
static gboolean _on_timeout(gpointer data); static gboolean _on_timeout(gpointer data);
@ -323,6 +324,13 @@ static void _on_clicked(gpointer data)
G_CALLBACK(_on_logout), data); G_CALLBACK(_on_logout), data);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 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"); menuitem = _main_menuitem(_("Shutdown..."), "gnome-shutdown");
g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK( g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(
_on_shutdown), data); _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 */ /* on_timeout */
static gboolean _on_timeout(gpointer data) static gboolean _on_timeout(gpointer data)
{ {

View File

@ -97,6 +97,8 @@ static struct
/* prototypes */ /* prototypes */
static gboolean _panel_can_suspend(void);
/* helpers */ /* helpers */
static char const * _panel_helper_config_get(Panel * panel, static char const * _panel_helper_config_get(Panel * panel,
char const * section, char const * variable); 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); gboolean * push_in, gpointer data);
static void _panel_helper_preferences_dialog(Panel * panel); static void _panel_helper_preferences_dialog(Panel * panel);
static int _panel_helper_shutdown_dialog(Panel * panel); static int _panel_helper_shutdown_dialog(Panel * panel);
static int _panel_helper_suspend(Panel * panel);
static char * _config_get_filename(void); 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.position_menu = _panel_helper_position_menu_top;
panel->top_helper.preferences_dialog = _panel_helper_preferences_dialog; panel->top_helper.preferences_dialog = _panel_helper_preferences_dialog;
panel->top_helper.shutdown_dialog = _panel_helper_shutdown_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->top = NULL;
panel->bottom_helper = panel->top_helper; panel->bottom_helper = panel->top_helper;
panel->bottom_helper.position_menu = _panel_helper_position_menu_bottom; 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), gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
#endif #endif
"%s: %s", message, strerror(errno)); "%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_window_set_title(GTK_WINDOW(dialog), _("Error"));
gtk_dialog_run(GTK_DIALOG(dialog)); gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(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 */ /* helpers */
/* panel_helper_config_get */ /* panel_helper_config_get */
static char const * _panel_helper_config_get(Panel * panel, 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 */ /* panel_helper_shutdown_dialog */
static int _helper_shutdown_dialog_can_suspend(void);
static int _panel_helper_shutdown_dialog(Panel * panel) static int _panel_helper_shutdown_dialog(Panel * panel)
{ {
GtkWidget * dialog; GtkWidget * dialog;
@ -767,7 +793,7 @@ static int _panel_helper_shutdown_dialog(Panel * panel)
" and losing any unsaved data.\n" " and losing any unsaved data.\n"
"Do you really want to proceed?"); "Do you really want to proceed?");
#endif #endif
enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN, RES_SUSPEND }; enum { RES_CANCEL, RES_REBOOT, RES_SHUTDOWN };
int res; int res;
char * reboot[] = { "/sbin/shutdown", "shutdown", "-r", "now", NULL }; char * reboot[] = { "/sbin/shutdown", "shutdown", "-r", "now", NULL };
char * shutdown[] = { "/sbin/shutdown", "shutdown", char * shutdown[] = { "/sbin/shutdown", "shutdown",
@ -777,10 +803,6 @@ static int _panel_helper_shutdown_dialog(Panel * panel)
"-h", "-h",
#endif #endif
"now", NULL }; "now", NULL };
char * suspend[] = { "/usr/bin/sudo", "sudo", "/sbin/apm", "-s", NULL };
#ifdef __NetBSD__
int sleep_state = 3;
#endif
char ** argv; char ** argv;
GError * error = NULL; GError * error = NULL;
@ -792,16 +814,8 @@ static int _panel_helper_shutdown_dialog(Panel * panel)
"%s", "%s",
#endif #endif
message); message);
/* reboot */
gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, RES_CANCEL, gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, RES_CANCEL,
_("Restart"), RES_REBOOT, NULL); _("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")); widget = gtk_button_new_with_label(_("Shutdown"));
gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_icon_name( gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_icon_name(
"gnome-shutdown", GTK_ICON_SIZE_BUTTON)); "gnome-shutdown", GTK_ICON_SIZE_BUTTON));
@ -814,39 +828,36 @@ static int _panel_helper_shutdown_dialog(Panel * panel)
gtk_widget_destroy(dialog); gtk_widget_destroy(dialog);
if(res == RES_SHUTDOWN) if(res == RES_SHUTDOWN)
argv = shutdown; argv = shutdown;
else if(res == RES_SUSPEND)
argv = suspend;
else if(res == RES_REBOOT) else if(res == RES_REBOOT)
argv = reboot; argv = reboot;
else else
return 1; 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, if(g_spawn_async(NULL, argv, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, NULL,
NULL, NULL, &error) != TRUE) NULL, NULL, &error) != TRUE)
return panel_error(panel, error->message, 1); return panel_error(panel, error->message, 1);
return 0; 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__ #ifdef __NetBSD__
int sleep_state = -1; int sleep_state = 3;
size_t size = sizeof(sleep_state); #else
char * suspend[] = { "/usr/bin/sudo", "sudo", "/sbin/apm", "-s", NULL };
GError * error = NULL;
#endif #endif
if(lstat("/proc/apm", &st) == 0)
return 1;
#ifdef __NetBSD__ #ifdef __NetBSD__
if(sysctlbyname("machdep.sleep_state", &sleep_state, &size, NULL, 0) if(sysctlbyname("machdep.sleep_state", NULL, NULL, &sleep_state,
== 0 && sleep_state == 0 sizeof(sleep_state)) != 0)
&& sysctlbyname("machdep.sleep_state", &sleep_state, return panel_error(panel, "sysctl", 1);
&size, &sleep_state, size) == 0)
return 1;
#endif
return 0; 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
} }