X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=config-ui%2Fbrowser-switchboard-cp.c;h=c34778b90021428ec76de70637a494cfad9d2186;hp=616d7b340bce7020a8129dd527054fff906423a2;hb=e9c581ab58322ed67df8429a43cfbc836f84ca75;hpb=aafcd0647bb77a5464f907a181767399283c0220 diff --git a/config-ui/browser-switchboard-cp.c b/config-ui/browser-switchboard-cp.c index 616d7b3..c34778b 100644 --- a/config-ui/browser-switchboard-cp.c +++ b/config-ui/browser-switchboard-cp.c @@ -2,7 +2,8 @@ * browser-switchboard-cp.c -- a hildon-control-panel applet for * selecting the default browser for Browser Switchboard * - * Copyright (C) 2009 Steven Luo + * Copyright (C) 2009-2010 Steven Luo + * Copyright (C) 2009-2010 Faheem Pervez * * Derived from services-cp.c from maemo-control-services * Copyright (c) 2008 Janne Kataja @@ -33,18 +34,31 @@ #include #include #include + #ifdef HILDON #include #include + +#ifdef FREMANTLE +#include +#include +#include +#include +#endif /* FREMANTLE */ + #ifdef HILDON_CP_APPLET #include -#endif -#endif +#endif /* HILDON_CP_APPLET */ +#endif /* HILDON */ #include "configfile.h" #define CONTINUOUS_MODE_DEFAULT 0 +#if defined(HILDON) && defined(FREMANTLE) +#define _HILDON_SIZE_DEFAULT (HILDON_SIZE_AUTO_WIDTH|HILDON_SIZE_FINGER_HEIGHT) +#endif + struct browser_entry { char *config; char *displayname; @@ -58,10 +72,17 @@ struct browser_entry browsers[] = { { NULL, NULL }, }; +char *logger_name = NULL; + struct config_widgets { +#if defined(HILDON) && defined(FREMANTLE) + GtkWidget *continuous_mode_selector; + GtkWidget *default_browser_selector; +#else GtkWidget *continuous_mode_off_radio; GtkWidget *continuous_mode_on_radio; GtkWidget *default_browser_combo; +#endif GtkWidget *other_browser_cmd_entry; GtkWidget *other_browser_cmd_entry_label; }; @@ -73,6 +94,21 @@ GtkWidget *dialog; * Configuration routines **********************************************************************/ +#if defined(HILDON) && defined(FREMANTLE) + +static inline int get_continuous_mode(void) { + return hildon_touch_selector_get_active(HILDON_TOUCH_SELECTOR(cw.continuous_mode_selector), 0); +} +static inline void set_continuous_mode(int state) { + hildon_touch_selector_set_active(HILDON_TOUCH_SELECTOR(cw.continuous_mode_selector), 0, state); +} + +static inline char *get_default_browser(void) { + return browsers[hildon_touch_selector_get_active(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), 0)].config; +} + +#else /* !defined(HILDON) || !defined(FREMANTLE) */ + static inline int get_continuous_mode(void) { return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cw.continuous_mode_on_radio)); } @@ -86,6 +122,9 @@ static inline void set_continuous_mode(int state) { static inline char *get_default_browser(void) { return browsers[gtk_combo_box_get_active(GTK_COMBO_BOX(cw.default_browser_combo))].config; } + +#endif /* defined(HILDON) && defined(FREMANTLE) */ + static void set_default_browser(char *browser) { gint i; @@ -97,7 +136,11 @@ static void set_default_browser(char *browser) { /* No match found, set to the default browser */ i = 0; +#if defined(HILDON) && defined(FREMANTLE) + hildon_touch_selector_set_active(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), 0, i); +#else gtk_combo_box_set_active(GTK_COMBO_BOX(cw.default_browser_combo), i); +#endif } static inline char *get_other_browser_cmd(void) { @@ -128,20 +171,25 @@ static void load_config(void) { set_continuous_mode(atoi(line.value)); continuous_mode_seen = 1; } + free(line.value); } else if (!strcmp(line.key, "default_browser")) { if (!default_browser_seen) { set_default_browser(line.value); default_browser_seen = 1; } + free(line.value); } else if (!strcmp(line.key, "other_browser_cmd")) { if (!other_browser_cmd_seen) { set_other_browser_cmd(line.value); other_browser_cmd_seen = 1; } + free(line.value); + } else if (!strcmp(line.key, "logging")) { + if (!logger_name) + logger_name = line.value; } } free(line.key); - free(line.value); } parse_config_file_end(); @@ -220,6 +268,15 @@ static void save_config(void) { get_other_browser_cmd()); other_browser_cmd_seen = 1; } + } else if (!strcmp(line.key, + "logging")) { + if (logger_name) { + fprintf(tmpfp, "%s = \"%s\"\n", + line.key, + logger_name); + free(logger_name); + logger_name = NULL; + } } } else { /* Just copy the old line over */ @@ -241,6 +298,9 @@ static void save_config(void) { if (!other_browser_cmd_seen && strlen(get_other_browser_cmd()) > 0) fprintf(tmpfp, "%s = \"%s\"\n", "other_browser_cmd", get_other_browser_cmd()); + if (logger_name) + fprintf(tmpfp, "%s = \"%s\"\n", + "logging", logger_name); /* Replace the old config file with the new one */ fclose(tmpfp); @@ -257,56 +317,141 @@ out: return; } +static void do_reconfig(void) { + save_config(); + + /* Try to send SIGHUP to any running browser-switchboard process + This causes it to reread config files if in continuous_mode, or + die so that the config will be reloaded on next start otherwise */ + system("kill -HUP `pidof browser-switchboard` > /dev/null 2>&1"); +} + + /********************************************************************** * Callbacks **********************************************************************/ +#if defined(HILDON) && defined(FREMANTLE) +static void default_browser_selector_callback(GtkWidget *widget, + gint column, gpointer data) { +#else static void default_browser_combo_callback(GtkWidget *widget, gpointer data) { +#endif if (!strcmp(get_default_browser(), "other")) { + gtk_editable_set_editable(GTK_EDITABLE(cw.other_browser_cmd_entry), TRUE); gtk_widget_set_sensitive(cw.other_browser_cmd_entry, TRUE); gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, TRUE); } else { + gtk_editable_set_editable(GTK_EDITABLE(cw.other_browser_cmd_entry), FALSE); /* FREMANTLE: give the text the greyed-out look */ gtk_widget_set_sensitive(cw.other_browser_cmd_entry, FALSE); gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, FALSE); } } -static inline void close_dialog(void) { - gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_NONE); -} - -static void ok_callback(GtkWidget *widget, gpointer data) { - save_config(); - /* TODO: is there any cleanup necessary? */ - close_dialog(); -} - -static void cancel_callback(GtkWidget *widget, gpointer data) { - /* TODO: is there any cleanup necessary? */ - close_dialog(); -} - /********************************************************************** * Interface **********************************************************************/ -static GtkDialog *swb_config_dialog(void) { +#if defined(HILDON) && defined(FREMANTLE) +/* + * Fremantle Hildon dialog + */ +static GtkDialog *swb_config_dialog(gpointer cp_window) { + GtkWidget *dialog_vbox; + + GtkWidget *default_browser_selector_button; + GtkWidget *continuous_mode_selector_button; + int i; + HildonGtkInputMode input_mode; + + dialog = gtk_dialog_new_with_buttons( + "Browser Switchboard", + GTK_WINDOW(cp_window), + GTK_DIALOG_MODAL, + GTK_STOCK_OK, + GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + NULL); + + dialog_vbox = GTK_DIALOG(dialog)->vbox; + + /* Config options */ + cw.default_browser_selector = hildon_touch_selector_new_text(); + for (i = 0; browsers[i].config; ++i) + hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), browsers[i].displayname); + hildon_touch_selector_set_active(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), 0, 0); + default_browser_selector_button = hildon_picker_button_new(_HILDON_SIZE_DEFAULT, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL); + hildon_button_set_title(HILDON_BUTTON(default_browser_selector_button), + "Default browser:"); + hildon_picker_button_set_selector(HILDON_PICKER_BUTTON(default_browser_selector_button), HILDON_TOUCH_SELECTOR(cw.default_browser_selector)); + hildon_button_set_alignment(HILDON_BUTTON(default_browser_selector_button), + 0, 0.5, 0, 0); + g_signal_connect(G_OBJECT(cw.default_browser_selector), "changed", + G_CALLBACK(default_browser_selector_callback), NULL); + gtk_box_pack_start(GTK_BOX(dialog_vbox), + default_browser_selector_button, FALSE, FALSE, 0); + + cw.other_browser_cmd_entry = hildon_entry_new(_HILDON_SIZE_DEFAULT); + /* Disable autocapitalization and dictionary features for the entry */ + input_mode = hildon_gtk_entry_get_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry)); + input_mode &= ~(HILDON_GTK_INPUT_MODE_AUTOCAP | + HILDON_GTK_INPUT_MODE_DICTIONARY); + hildon_gtk_entry_set_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry), input_mode); + + cw.other_browser_cmd_entry_label = hildon_caption_new(NULL, + "Command (%s for URI):", + cw.other_browser_cmd_entry, + NULL, HILDON_CAPTION_OPTIONAL); + gtk_widget_set_sensitive(cw.other_browser_cmd_entry, FALSE); + gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, FALSE); + hildon_gtk_widget_set_theme_size(cw.other_browser_cmd_entry_label, _HILDON_SIZE_DEFAULT); + gtk_box_pack_start(GTK_BOX(dialog_vbox), + cw.other_browser_cmd_entry_label, FALSE, FALSE, 0); + + cw.continuous_mode_selector = hildon_touch_selector_new_text(); + hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(cw.continuous_mode_selector), "Lower memory usage"); + hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(cw.continuous_mode_selector), "Faster browser startup time"); + + continuous_mode_selector_button = hildon_picker_button_new(_HILDON_SIZE_DEFAULT, HILDON_BUTTON_ARRANGEMENT_VERTICAL); + hildon_button_set_title(HILDON_BUTTON(continuous_mode_selector_button), + "Optimize Browser Switchboard for:"); + hildon_picker_button_set_selector(HILDON_PICKER_BUTTON(continuous_mode_selector_button), HILDON_TOUCH_SELECTOR(cw.continuous_mode_selector)); + hildon_button_set_alignment(HILDON_BUTTON(continuous_mode_selector_button), + 0, 0, 0, 0); + set_continuous_mode(CONTINUOUS_MODE_DEFAULT); + gtk_box_pack_start(GTK_BOX(dialog_vbox), + continuous_mode_selector_button, FALSE, FALSE, 0); + + gtk_widget_show_all(dialog); + return GTK_DIALOG(dialog); +} + +#else /* !defined(HILDON) || !defined(FREMANTLE) */ +/* + * GTK+/Diablo Hildon dialog + */ +static GtkDialog *swb_config_dialog(gpointer cp_window) { GtkWidget *dialog_vbox; GtkWidget *options_table; GtkWidget *default_browser_combo_label; GtkWidget *continuous_mode_label; int i; +#ifdef HILDON + HildonGtkInputMode input_mode; +#endif - GtkWidget *action_area; - GtkWidget *okbutton, *cancelbutton; - - dialog = gtk_dialog_new(); - /* Doesn't seem to be necessary? - gtk_widget_set_size_request(GTK_WIDGET(dialog), 580, 180); */ - gtk_window_set_title (GTK_WINDOW(dialog), "Browser Switchboard"); - gtk_window_set_type_hint (GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); + dialog = gtk_dialog_new_with_buttons( + "Browser Switchboard", + GTK_WINDOW(cp_window), + GTK_DIALOG_MODAL, + GTK_STOCK_OK, + GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + NULL); dialog_vbox = GTK_DIALOG(dialog)->vbox; @@ -338,6 +483,13 @@ static GtkDialog *swb_config_dialog(void) { 5, 0); cw.other_browser_cmd_entry = gtk_entry_new(); +#ifdef HILDON + /* Disable autocapitalization and dictionary features for the entry */ + input_mode = hildon_gtk_entry_get_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry)); + input_mode &= ~(HILDON_GTK_INPUT_MODE_AUTOCAP | + HILDON_GTK_INPUT_MODE_DICTIONARY); + hildon_gtk_entry_set_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry), input_mode); +#endif cw.other_browser_cmd_entry_label = gtk_label_new("Command (%s for URI):"); gtk_misc_set_alignment(GTK_MISC(cw.other_browser_cmd_entry_label), 1, 0.5); gtk_widget_set_sensitive(cw.other_browser_cmd_entry, FALSE); @@ -385,23 +537,12 @@ static GtkDialog *swb_config_dialog(void) { gtk_table_set_row_spacing(GTK_TABLE(options_table), 3, 0); - /* Dialog buttons */ - action_area = GTK_DIALOG(dialog)->action_area; - - okbutton = gtk_button_new_from_stock(GTK_STOCK_OK); - g_signal_connect(G_OBJECT(okbutton), "clicked", - G_CALLBACK(ok_callback), NULL); - gtk_box_pack_start(GTK_BOX(action_area), okbutton, FALSE, FALSE, 0); - - cancelbutton = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - g_signal_connect(G_OBJECT(cancelbutton), "clicked", - G_CALLBACK(cancel_callback), NULL); - gtk_box_pack_start(GTK_BOX(action_area), cancelbutton, FALSE, FALSE, 0); - gtk_widget_show_all(dialog); return GTK_DIALOG(dialog); } +#endif /* defined(HILDON) && defined(FREMANTLE) */ + /********************************************************************** * Entry @@ -413,16 +554,19 @@ static GtkDialog *swb_config_dialog(void) { */ osso_return_t execute(osso_context_t *osso, gpointer userdata, gboolean user_activated) { - HildonProgram *program; GtkDialog *dialog; + gint response; - program = HILDON_PROGRAM(hildon_program_get_instance()); if (osso == NULL) return OSSO_ERROR; - dialog = GTK_DIALOG(swb_config_dialog()); + dialog = GTK_DIALOG(swb_config_dialog(userdata)); load_config(); - gtk_dialog_run(dialog); + + response = gtk_dialog_run(dialog); + if (response == GTK_RESPONSE_OK) + do_reconfig(); + gtk_widget_destroy(GTK_WIDGET(dialog)); return OSSO_OK; @@ -433,20 +577,27 @@ osso_return_t execute(osso_context_t *osso, */ int main(int argc, char *argv[]) { GtkDialog *dialog; + gint response; #ifdef HILDON HildonProgram *program = NULL; - program = HILDON_PROGRAM(hildon_program_get_instance()); #endif gtk_init(&argc, &argv); +#ifdef HILDON + program = HILDON_PROGRAM(hildon_program_get_instance()); +#endif g_set_application_name("Browser Switchboard"); - dialog = GTK_DIALOG(swb_config_dialog()); + dialog = GTK_DIALOG(swb_config_dialog(NULL)); load_config(); - gtk_dialog_run(dialog); + + response = gtk_dialog_run(dialog); + if (response == GTK_RESPONSE_OK) + do_reconfig(); + gtk_widget_destroy(GTK_WIDGET(dialog)); exit(0); } -#endif +#endif /* HILDON_CP_APPLET */