diff --git a/include/Panel.h b/include/Panel.h index d0f14f5..c719120 100644 --- a/include/Panel.h +++ b/include/Panel.h @@ -37,6 +37,7 @@ typedef struct _PanelAppletHelper char const * variable, char const * value); int (*error)(Panel * panel, char const * message, int ret); void (*about_dialog)(Panel * panel); + int (*lock)(Panel * panel); void (*logout_dialog)(Panel * panel); void (*position_menu)(GtkMenu * menu, gint * x, gint * y, gboolean * push_in, gpointer data); diff --git a/src/applets/lock.c b/src/applets/lock.c index df3851e..dbcee4a 100644 --- a/src/applets/lock.c +++ b/src/applets/lock.c @@ -12,8 +12,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -/* FIXME: - * - use XActivateScreenSaver() */ @@ -44,10 +42,6 @@ static GtkWidget * _lock_settings(PanelApplet * applet, gboolean apply, static void _on_clicked(gpointer data); -/* constants */ -#define PANEL_LOCK_COMMAND_DEFAULT "xset s activate" - - /* public */ /* variables */ PanelApplet applet = @@ -131,7 +125,7 @@ static GtkWidget * _lock_settings(PanelApplet * applet, gboolean apply, { if((p = applet->helper->config_get(applet->helper->panel, "lock", "command")) == NULL) - p = PANEL_LOCK_COMMAND_DEFAULT; + p = "xset s activate"; gtk_entry_set_text(GTK_ENTRY(lock->pr_command), p); } if(apply == TRUE) @@ -149,12 +143,6 @@ static GtkWidget * _lock_settings(PanelApplet * applet, gboolean apply, static void _on_clicked(gpointer data) { PanelAppletHelper * helper = data; - char const * command = PANEL_LOCK_COMMAND_DEFAULT; - char const * p; - GError * error = NULL; - 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, 1); + helper->lock(helper->panel); } diff --git a/src/applets/main.c b/src/applets/main.c index 350d907..807d077 100644 --- a/src/applets/main.c +++ b/src/applets/main.c @@ -71,8 +71,6 @@ static const MainMenu _main_menus[] = }; #define MAIN_MENUS_COUNT (sizeof(_main_menus) / sizeof(*_main_menus)) -#define PANEL_MAIN_COMMAND_LOCK_DEFAULT "xset s activate" - /* prototypes */ static GtkWidget * _main_init(PanelApplet * applet); @@ -441,16 +439,8 @@ static gint _idle_apps_compare(gconstpointer a, gconstpointer b) static void _on_lock(gpointer data) { Main * main = data; - PanelAppletHelper * helper = main->helper; - char const * command = PANEL_MAIN_COMMAND_LOCK_DEFAULT; - char const * p; - GError * error = NULL; - /* FIXME implement a helper instead */ - if((p = helper->config_get(helper->panel, "lock", "command")) != NULL) - command = p; - if(g_spawn_command_line_async(command, &error) != TRUE) - helper->error(helper->panel, error->message, 1); + main->helper->lock(main->helper->panel); } diff --git a/src/panel.c b/src/panel.c index 62982ca..9607030 100644 --- a/src/panel.c +++ b/src/panel.c @@ -112,6 +112,7 @@ static int _panel_helper_config_set(Panel * panel, char const * section, char const * variable, char const * value); static int _panel_helper_error(Panel * panel, char const * message, int ret); static void _panel_helper_about_dialog(Panel * panel); +static int _panel_helper_lock(Panel * panel); #ifndef EMBEDDED static void _panel_helper_logout_dialog(Panel * panel); #endif @@ -156,6 +157,7 @@ Panel * panel_new(PanelPrefs const * prefs) panel->top_helper.error = _panel_helper_error; panel->top_helper.icon_size = PANEL_ICON_SIZE_UNSET; panel->top_helper.about_dialog = _panel_helper_about_dialog; + panel->top_helper.lock = _panel_helper_lock; #ifndef EMBEDDED panel->top_helper.logout_dialog = _panel_helper_logout_dialog; #else @@ -463,6 +465,7 @@ int panel_load(Panel * panel, PanelPosition position, char const * applet) && (widget = pa->settings(pa, FALSE, FALSE)) != NULL) { vbox = gtk_vbox_new(FALSE, 4); + g_object_set_data(G_OBJECT(vbox), "applet", pa); /* XXX ugly */ gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); gtk_widget_show(vbox); @@ -600,8 +603,10 @@ static void _preferences_on_ok(gpointer data) { Panel * panel = data; gint i; - const gint cnt = sizeof(_panel_sizes) / sizeof(*_panel_sizes); + gint cnt = sizeof(_panel_sizes) / sizeof(*_panel_sizes); char * filename; + GtkWidget * widget; + PanelApplet * pa; gtk_widget_hide(panel->pr_window); if((i = gtk_combo_box_get_active(GTK_COMBO_BOX(panel->pr_bottom_size))) @@ -612,6 +617,17 @@ static void _preferences_on_ok(gpointer data) >= 0 && i < cnt) config_set(panel->config, NULL, "top_size", _panel_sizes[i].alias); + /* XXX applets should be known from Panel already */ + cnt = gtk_notebook_get_n_pages(GTK_NOTEBOOK(panel->pr_notebook)); + for(i = 1; i < cnt; i++) + { + widget = gtk_notebook_get_nth_page(GTK_NOTEBOOK( + panel->pr_notebook), i); + if(widget == NULL || (pa = g_object_get_data(G_OBJECT(widget), + "applet")) == NULL) + continue; + pa->settings(pa, TRUE, FALSE); + } if((filename = _config_get_filename()) != NULL) config_save(panel->config, filename); free(filename); @@ -721,6 +737,22 @@ static gboolean _about_on_closex(gpointer data) } +/* panel_helper_lock */ +static int _panel_helper_lock(Panel * panel) +{ + /* FIXME default to calling XActivateScreenSaver() */ + char const * command = "xset s activate"; + char const * p; + GError * error = NULL; + + if((p = config_get(panel->config, "lock", "command")) != NULL) + command = p; + if(g_spawn_command_line_async(command, &error) != TRUE) + return panel_error(panel, error->message, 1); + return 0; +} + + #ifndef EMBEDDED /* panel_helper_logout_dialog */ static gboolean _logout_dialog_on_closex(gpointer data); @@ -930,7 +962,8 @@ static int _panel_helper_suspend(Panel * panel) #ifdef __NetBSD__ int sleep_state = 3; #else - char * suspend[] = { "/usr/bin/sudo", "sudo", "/sbin/apm", "-s", NULL }; + char * suspend[] = { "/usr/bin/sudo", "sudo", "/usr/bin/apm", "-s", + NULL }; GError * error = NULL; #endif @@ -938,11 +971,11 @@ static int _panel_helper_suspend(Panel * panel) 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 + _panel_helper_lock(panel); /* XXX may already be suspended */ + return 0; }