diff --git a/include/Panel.h b/include/Panel.h index 23d74da..1b06b4d 100644 --- a/include/Panel.h +++ b/include/Panel.h @@ -33,6 +33,8 @@ typedef struct _PanelAppletHelper GtkIconSize icon_size; char const * (*config_get)(Panel * panel, char const * section, char const * variable); + int (*config_set)(Panel * panel, char const * section, + char const * variable, char const * value); int (*error)(Panel * panel, char const * message, int ret); int (*logout_dialog)(void); void (*position_menu)(GtkMenu * menu, gint * x, gint * y, @@ -41,9 +43,6 @@ typedef struct _PanelAppletHelper int (*shutdown_dialog)(void); } PanelAppletHelper; -typedef GtkWidget * (*PanelAppletInitFunc)(PanelApplet * applet); -typedef void (*PanelAppletDestroyFunc)(PanelApplet * applet); - typedef enum _PanelAppletPosition { PANEL_APPLET_POSITION_START = 0, @@ -55,8 +54,12 @@ typedef enum _PanelAppletPosition struct _PanelApplet { PanelAppletHelper * helper; - PanelAppletInitFunc init; - PanelAppletDestroyFunc destroy; + char const * name; + char const * icon; + GtkWidget * (*init)(PanelApplet * applet); + void (*destroy)(PanelApplet * applet); + GtkWidget * (*settings)(PanelApplet * applet, gboolean apply, + gboolean reset); PanelAppletPosition position; gboolean expand; gboolean fill; diff --git a/src/applets/battery.c b/src/applets/battery.c index 873c1ef..26c6f8b 100644 --- a/src/applets/battery.c +++ b/src/applets/battery.c @@ -88,9 +88,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Battery", NULL, _battery_init, _battery_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/bluetooth.c b/src/applets/bluetooth.c index aa169a3..f83b345 100644 --- a/src/applets/bluetooth.c +++ b/src/applets/bluetooth.c @@ -63,9 +63,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Bluetooth", NULL, _bluetooth_init, _bluetooth_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/clock.c b/src/applets/clock.c index bb99566..e349d46 100644 --- a/src/applets/clock.c +++ b/src/applets/clock.c @@ -51,9 +51,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Clock", NULL, _clock_init, _clock_destroy, + NULL, PANEL_APPLET_POSITION_LAST, FALSE, TRUE, diff --git a/src/applets/cpu.c b/src/applets/cpu.c index d075cce..89b6a4c 100644 --- a/src/applets/cpu.c +++ b/src/applets/cpu.c @@ -58,9 +58,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "CPU", NULL, _cpu_init, _cpu_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/cpufreq.c b/src/applets/cpufreq.c index d68176f..0b05c4e 100644 --- a/src/applets/cpufreq.c +++ b/src/applets/cpufreq.c @@ -59,9 +59,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "CPU frequency", NULL, _cpufreq_init, _cpufreq_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/desktop.c b/src/applets/desktop.c index 042b9ef..dd31673 100644 --- a/src/applets/desktop.c +++ b/src/applets/desktop.c @@ -36,9 +36,12 @@ static void _on_clicked(GtkWidget * widget); /* variables */ PanelApplet applet = { + NULL, + "Desktop switch", NULL, _desktop_init, NULL, + NULL, PANEL_APPLET_POSITION_FIRST, FALSE, TRUE, diff --git a/src/applets/gps.c b/src/applets/gps.c index ac6c0d2..f5a84c6 100644 --- a/src/applets/gps.c +++ b/src/applets/gps.c @@ -55,9 +55,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "GPS", NULL, _gps_init, _gps_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/gsm.c b/src/applets/gsm.c index a3fb935..e12a76b 100644 --- a/src/applets/gsm.c +++ b/src/applets/gsm.c @@ -60,9 +60,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "GSM", NULL, _gsm_init, _gsm_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/keyboard.c b/src/applets/keyboard.c index 0c3a251..803e572 100644 --- a/src/applets/keyboard.c +++ b/src/applets/keyboard.c @@ -21,6 +21,9 @@ #include #include +#ifdef DEBUG +# include +#endif #include #include #include @@ -37,12 +40,17 @@ typedef struct _Keyboard PanelAppletHelper * helper; GPid pid; GtkWidget * window; + /* preferences */ + GtkWidget * pr_box; + GtkWidget * pr_command; } Keyboard; /* prototypes */ static GtkWidget * _keyboard_init(PanelApplet * applet); static void _keyboard_destroy(PanelApplet * applet); +static GtkWidget * _keyboard_settings(PanelApplet * applet, gboolean apply, + gboolean reset); /* callbacks */ static void _on_keyboard_toggled(GtkWidget * widget, gpointer data); @@ -52,9 +60,12 @@ static void _on_keyboard_toggled(GtkWidget * widget, gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Keyboard", NULL, _keyboard_init, _keyboard_destroy, + _keyboard_settings, PANEL_APPLET_POSITION_START, FALSE, TRUE, @@ -75,9 +86,11 @@ static GtkWidget * _keyboard_init(PanelApplet * applet) if((keyboard = malloc(sizeof(*keyboard))) == NULL) return NULL; + applet->priv = keyboard; keyboard->helper = applet->helper; keyboard->pid = -1; keyboard->window = NULL; + keyboard->pr_box = NULL; ret = gtk_toggle_button_new(); gtk_button_set_relief(GTK_BUTTON(ret), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(ret), "toggled", G_CALLBACK( @@ -139,6 +152,43 @@ static void _keyboard_destroy(PanelApplet * applet) } +/* keyboard_settings */ +static GtkWidget * _keyboard_settings(PanelApplet * applet, gboolean apply, + gboolean reset) +{ + Keyboard * keyboard = applet->priv; + char const * p; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(%p, %s, %s)\n", __func__, (void*)applet, + apply ? "TRUE" : "FALSE", reset ? "TRUE" : "FALSE"); +#endif + if(keyboard->pr_box == NULL) + { + keyboard->pr_box = gtk_vbox_new(FALSE, 0); + keyboard->pr_command = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(keyboard->pr_box), + keyboard->pr_command, FALSE, TRUE, 4); + gtk_widget_show_all(keyboard->pr_box); + reset = TRUE; + } + if(reset == TRUE) + { + p = applet->helper->config_get(applet->helper->panel, + "keyboard", "command"); + if(p != NULL) + gtk_entry_set_text(GTK_ENTRY(keyboard->pr_command), p); + } + if(apply == TRUE) + { + p = gtk_entry_get_text(GTK_ENTRY(keyboard->pr_command)); + applet->helper->config_set(applet->helper->panel, "keyboard", + "command", p); + } + return keyboard->pr_box; +} + + /* callbacks */ /* on_keyboard_toggled */ static void _on_keyboard_toggled(GtkWidget * widget, gpointer data) diff --git a/src/applets/lock.c b/src/applets/lock.c index 717c78d..15d6947 100644 --- a/src/applets/lock.c +++ b/src/applets/lock.c @@ -33,9 +33,12 @@ static void _on_clicked(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Lock screen", NULL, _lock_init, NULL, + NULL, PANEL_APPLET_POSITION_START, FALSE, TRUE, diff --git a/src/applets/logout.c b/src/applets/logout.c index b3ba6b7..494c2d3 100644 --- a/src/applets/logout.c +++ b/src/applets/logout.c @@ -34,9 +34,12 @@ static void _on_clicked(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Logout", NULL, _logout_init, NULL, + NULL, PANEL_APPLET_POSITION_START, FALSE, TRUE, diff --git a/src/applets/main.c b/src/applets/main.c index 15036a4..86ffba0 100644 --- a/src/applets/main.c +++ b/src/applets/main.c @@ -96,9 +96,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Main menu", NULL, _main_init, _main_destroy, + NULL, PANEL_APPLET_POSITION_FIRST, FALSE, TRUE, diff --git a/src/applets/memory.c b/src/applets/memory.c index b67e952..c677ada 100644 --- a/src/applets/memory.c +++ b/src/applets/memory.c @@ -54,9 +54,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Memory", NULL, _memory_init, _memory_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/pager.c b/src/applets/pager.c index 4966ed0..627876e 100644 --- a/src/applets/pager.c +++ b/src/applets/pager.c @@ -85,9 +85,12 @@ static void _on_screen_changed(GtkWidget * widget, GdkScreen * previous, /* variables */ PanelApplet applet = { + NULL, + "Pager", NULL, _pager_init, _pager_destroy, + NULL, PANEL_APPLET_POSITION_START, FALSE, TRUE, diff --git a/src/applets/phone.c b/src/applets/phone.c index a574fd0..ab4b3b1 100644 --- a/src/applets/phone.c +++ b/src/applets/phone.c @@ -44,9 +44,12 @@ static void _on_screen_changed(GtkWidget * widget); /* variables */ PanelApplet applet = { + NULL, + "Phone", NULL, _phone_init, NULL, + NULL, PANEL_APPLET_POSITION_START, FALSE, TRUE, diff --git a/src/applets/swap.c b/src/applets/swap.c index 30ed943..cdcd65f 100644 --- a/src/applets/swap.c +++ b/src/applets/swap.c @@ -54,9 +54,12 @@ static gboolean _on_timeout(gpointer data); /* variables */ PanelApplet applet = { + NULL, + "Swap", NULL, _swap_init, _swap_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/applets/systray.c b/src/applets/systray.c index 7be8791..68b732a 100644 --- a/src/applets/systray.c +++ b/src/applets/systray.c @@ -59,9 +59,12 @@ static void _on_screen_changed(GtkWidget * widget, GdkScreen * previous, /* variables */ PanelApplet applet = { + NULL, + "System tray", NULL, _systray_init, _systray_destroy, + NULL, PANEL_APPLET_POSITION_LAST, FALSE, TRUE, diff --git a/src/applets/tasks.c b/src/applets/tasks.c index 8134530..34b0ab0 100644 --- a/src/applets/tasks.c +++ b/src/applets/tasks.c @@ -135,9 +135,12 @@ static void _on_screen_changed(GtkWidget * widget, GdkScreen * previous, /* variables */ PanelApplet applet = { + NULL, + "Tasks", NULL, _tasks_init, _tasks_destroy, + NULL, PANEL_APPLET_POSITION_START, #ifndef EMBEDDED TRUE, diff --git a/src/applets/volume.c b/src/applets/volume.c index 6e95b50..e6e4809 100644 --- a/src/applets/volume.c +++ b/src/applets/volume.c @@ -43,9 +43,12 @@ static void _volume_destroy(PanelApplet * applet); /* variables */ PanelApplet applet = { + NULL, + "Volume", NULL, _volume_init, _volume_destroy, + NULL, PANEL_APPLET_POSITION_END, FALSE, TRUE, diff --git a/src/panel.c b/src/panel.c index 3c03737..2bd9aeb 100644 --- a/src/panel.c +++ b/src/panel.c @@ -52,6 +52,7 @@ struct _Panel /* preferences */ GtkWidget * pr_window; + GtkWidget * pr_notebook; }; @@ -69,6 +70,8 @@ struct _Panel /* helpers */ static char const * _panel_helper_config_get(Panel * panel, char const * section, char const * variable); +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); #ifndef EMBEDDED static int _panel_helper_logout_dialog(void); @@ -115,6 +118,7 @@ Panel * panel_new(PanelPrefs * prefs) error_set_print(PACKAGE, 0, _("Invalid panel size")); panel->helper.panel = panel; panel->helper.config_get = _panel_helper_config_get; + panel->helper.config_set = _panel_helper_config_set; panel->helper.error = _panel_helper_error; panel->helper.icon_size = prefs->iconsize; #ifndef EMBEDDED @@ -140,8 +144,9 @@ Panel * panel_new(PanelPrefs * prefs) panel->root_width, panel->root_height); #endif /* panel */ - g_idle_add(_on_idle, panel); panel->pr_window = NULL; + panel->pr_notebook = gtk_notebook_new(); + g_idle_add(_on_idle, panel); panel->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); panel->height = panel->icon_height + (PANEL_BORDER_WIDTH * 4); #ifdef DEBUG @@ -348,12 +353,19 @@ int panel_load(Panel * panel, char const * applet) fill, 0); break; } + if(pa->settings != NULL + && (widget = pa->settings(pa, FALSE, FALSE)) != NULL) + /* FIXME doesn't seem to work (needs a container first?) */ + gtk_notebook_append_page(GTK_NOTEBOOK(panel->pr_notebook), + widget, gtk_label_new(pa->name)); return 0; } /* panel_show_preferences */ +static void _on_preferences_cancel(gpointer data); static gboolean _on_preferences_delete_event(gpointer data); +static void _on_preferences_ok(gpointer data); void panel_show_preferences(Panel * panel, gboolean show) { @@ -379,29 +391,49 @@ void panel_show_preferences(Panel * panel, gboolean show) g_signal_connect_swapped(G_OBJECT(panel->pr_window), "delete-event", G_CALLBACK(_on_preferences_delete_event), panel); vbox = gtk_vbox_new(FALSE, 0); - /* FIXME implement */ + gtk_box_pack_start(GTK_BOX(vbox), panel->pr_notebook, TRUE, TRUE, 0); + /* FIXME implement a way to enable plug-ins per panel (and in order) */ bbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 4); widget = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - /* FIXME connect callback */ + g_signal_connect_swapped(G_OBJECT(widget), "clicked", G_CALLBACK( + _on_preferences_cancel), panel); gtk_container_add(GTK_CONTAINER(bbox), widget); widget = gtk_button_new_from_stock(GTK_STOCK_OK); - /* FIXME connect callback */ + g_signal_connect_swapped(G_OBJECT(widget), "clicked", G_CALLBACK( + _on_preferences_ok), panel); gtk_container_add(GTK_CONTAINER(bbox), widget); gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(panel->pr_window), vbox); + _on_preferences_cancel(panel); gtk_widget_show_all(panel->pr_window); } +static void _on_preferences_cancel(gpointer data) +{ + Panel * panel = data; + + gtk_widget_hide(panel->pr_window); + /* FIXME reset configuration */ +} + static gboolean _on_preferences_delete_event(gpointer data) { Panel * panel = data; - gtk_widget_hide(panel->pr_window); + _on_preferences_cancel(panel); return TRUE; } +static void _on_preferences_ok(gpointer data) +{ + Panel * panel = data; + + gtk_widget_hide(panel->pr_window); + /* FIXME apply configuration */ +} + /* private */ /* functions */ @@ -414,6 +446,15 @@ static char const * _panel_helper_config_get(Panel * panel, } +/* panel_helper_config_set */ +static int _panel_helper_config_set(Panel * panel, char const * section, + char const * variable, char const * value) +{ + /* FIXME also save the configuration */ + return config_set(panel->config, section, variable, value); +} + + /* panel_helper_error */ static int _error_text(char const * message, int ret); @@ -445,9 +486,13 @@ static int _panel_helper_logout_dialog(void) int res; dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, - GTK_BUTTONS_NONE, "%s", _("Logout")); + GTK_BUTTONS_NONE, "%s", +#if GTK_CHECK_VERSION(2, 6, 0) + _("Logout")); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), - "%s", message); + "%s", +#endif + message); gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); widget = gtk_button_new_with_label(_("Logout"));