2 * browser-switchboard-cp.c -- a hildon-control-panel applet for
3 * selecting the default browser for Browser Switchboard
5 * Copyright (C) 2009-2010 Steven Luo
6 * Copyright (C) 2009-2010 Faheem Pervez
8 * Derived from services-cp.c from maemo-control-services
9 * Copyright (c) 2008 Janne Kataja <janne.kataja@iki.fi>
10 * Copyright (c) 2008 Nokia Corporation
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2, or (at your option)
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
35 #include <glib/gstdio.h>
39 #include <hildon/hildon-banner.h>
40 #include <hildon/hildon-program.h>
43 #include <hildon/hildon-touch-selector.h>
44 #include <hildon/hildon-picker-button.h>
45 #include <hildon/hildon-caption.h>
46 #include <hildon/hildon-entry.h>
47 #endif /* FREMANTLE */
49 #ifdef HILDON_CP_APPLET
50 #include <hildon-cp-plugin/hildon-cp-plugin-interface.h>
51 #endif /* HILDON_CP_APPLET */
55 #include "save-config.h"
58 #define CONTINUOUS_MODE_DEFAULT 0
60 #if defined(HILDON) && defined(FREMANTLE)
61 #define _HILDON_SIZE_DEFAULT (HILDON_SIZE_AUTO_WIDTH|HILDON_SIZE_FINGER_HEIGHT)
64 struct swb_config orig_cfg;
66 struct config_widgets {
67 #if defined(HILDON) && defined(FREMANTLE)
68 GtkWidget *default_browser_selector;
70 GtkWidget *continuous_mode_off_radio;
71 GtkWidget *continuous_mode_on_radio;
72 GtkWidget *default_browser_combo;
74 GtkWidget *other_browser_cmd_entry;
75 GtkWidget *other_browser_cmd_entry_label;
77 struct config_widgets cw;
81 struct browser_entry *installed_browsers;
82 void init_installed_browsers(void) {
83 struct browser_entry *cur = browsers;
84 unsigned int count = 0;
86 installed_browsers = calloc(sizeof browsers, 1);
87 if (!installed_browsers)
91 for (; cur->config; ++cur)
92 if (!cur->binary || !access(cur->binary, X_OK))
93 installed_browsers[count++] = *cur;
96 /**********************************************************************
97 * Configuration routines
98 **********************************************************************/
100 #if defined(HILDON) && defined(FREMANTLE)
102 static inline char *get_default_browser(void) {
103 return installed_browsers[hildon_touch_selector_get_active(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), 0)].config;
106 #else /* !defined(HILDON) || !defined(FREMANTLE) */
108 static inline int get_continuous_mode(void) {
109 return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cw.continuous_mode_on_radio));
111 static inline void set_continuous_mode(int state) {
113 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cw.continuous_mode_on_radio), TRUE);
115 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cw.continuous_mode_off_radio), TRUE);
118 static inline char *get_default_browser(void) {
119 return installed_browsers[gtk_combo_box_get_active(GTK_COMBO_BOX(cw.default_browser_combo))].config;
122 #endif /* defined(HILDON) && defined(FREMANTLE) */
124 static void set_default_browser(char *browser) {
127 /* Loop through browsers looking for a match */
129 installed_browsers[i].config && strcmp(installed_browsers[i].config, browser);
132 if (!installed_browsers[i].config)
133 /* No match found, set to the default browser */
136 #if defined(HILDON) && defined(FREMANTLE)
137 hildon_touch_selector_set_active(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), 0, i);
139 gtk_combo_box_set_active(GTK_COMBO_BOX(cw.default_browser_combo), i);
143 static inline char *get_other_browser_cmd(void) {
144 return (char *)gtk_entry_get_text(GTK_ENTRY(cw.other_browser_cmd_entry));
146 static inline void set_other_browser_cmd(char *cmd) {
147 gtk_entry_set_text(GTK_ENTRY(cw.other_browser_cmd_entry), cmd);
150 static void load_config(void) {
151 swb_config_init(&orig_cfg);
153 swb_config_load(&orig_cfg);
156 set_continuous_mode(orig_cfg.continuous_mode);
158 set_default_browser(orig_cfg.default_browser);
159 if (orig_cfg.other_browser_cmd)
160 set_other_browser_cmd(orig_cfg.other_browser_cmd);
163 static void save_config(void) {
164 struct swb_config new_cfg;
166 swb_config_copy(&new_cfg, &orig_cfg);
169 if (get_continuous_mode() != orig_cfg.continuous_mode) {
170 new_cfg.continuous_mode = get_continuous_mode();
171 new_cfg.flags |= SWB_CONFIG_CONTINUOUS_MODE_SET;
174 if (strcmp(get_default_browser(), orig_cfg.default_browser)) {
175 new_cfg.default_browser = get_default_browser();
176 new_cfg.flags |= SWB_CONFIG_DEFAULT_BROWSER_SET;
178 if (strlen(get_other_browser_cmd()) == 0) {
179 new_cfg.other_browser_cmd = NULL;
180 new_cfg.flags &= ~SWB_CONFIG_OTHER_BROWSER_CMD_SET;
181 } else if (!(orig_cfg.other_browser_cmd &&
182 !strcmp(get_other_browser_cmd(),
183 orig_cfg.other_browser_cmd))) {
184 new_cfg.other_browser_cmd = get_other_browser_cmd();
185 new_cfg.flags |= SWB_CONFIG_OTHER_BROWSER_CMD_SET;
188 swb_config_save(&new_cfg);
190 /* Reconfigure a running browser-switchboard, if present */
191 swb_reconfig(&orig_cfg, &new_cfg);
195 /**********************************************************************
197 **********************************************************************/
199 #if defined(HILDON) && defined(FREMANTLE)
200 static void default_browser_selector_callback(GtkWidget *widget,
201 gint column, gpointer data) {
203 static void default_browser_combo_callback(GtkWidget *widget, gpointer data) {
205 if (!strcmp(get_default_browser(), "other")) {
206 gtk_editable_set_editable(GTK_EDITABLE(cw.other_browser_cmd_entry), TRUE);
207 gtk_widget_set_sensitive(cw.other_browser_cmd_entry, TRUE);
208 gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, TRUE);
210 gtk_editable_set_editable(GTK_EDITABLE(cw.other_browser_cmd_entry), FALSE); /* FREMANTLE: give the text the greyed-out look */
211 gtk_widget_set_sensitive(cw.other_browser_cmd_entry, FALSE);
212 gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, FALSE);
217 /**********************************************************************
219 **********************************************************************/
221 #if defined(HILDON) && defined(FREMANTLE)
223 * Fremantle Hildon dialog
225 static GtkDialog *swb_config_dialog(gpointer cp_window) {
226 GtkWidget *dialog_vbox;
228 GtkWidget *default_browser_selector_button;
230 HildonGtkInputMode input_mode;
232 dialog = gtk_dialog_new_with_buttons(
233 "Browser Switchboard",
234 GTK_WINDOW(cp_window),
242 dialog_vbox = GTK_DIALOG(dialog)->vbox;
245 init_installed_browsers();
246 cw.default_browser_selector = hildon_touch_selector_new_text();
247 for (i = 0; installed_browsers[i].config; ++i)
248 hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), installed_browsers[i].displayname);
249 hildon_touch_selector_set_active(HILDON_TOUCH_SELECTOR(cw.default_browser_selector), 0, 0);
250 default_browser_selector_button = hildon_picker_button_new(_HILDON_SIZE_DEFAULT, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL);
251 hildon_button_set_title(HILDON_BUTTON(default_browser_selector_button),
253 hildon_picker_button_set_selector(HILDON_PICKER_BUTTON(default_browser_selector_button), HILDON_TOUCH_SELECTOR(cw.default_browser_selector));
254 hildon_button_set_alignment(HILDON_BUTTON(default_browser_selector_button),
256 g_signal_connect(G_OBJECT(cw.default_browser_selector), "changed",
257 G_CALLBACK(default_browser_selector_callback), NULL);
258 gtk_box_pack_start(GTK_BOX(dialog_vbox),
259 default_browser_selector_button, FALSE, FALSE, 0);
261 cw.other_browser_cmd_entry = hildon_entry_new(_HILDON_SIZE_DEFAULT);
262 /* Disable autocapitalization and dictionary features for the entry */
263 input_mode = hildon_gtk_entry_get_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry));
264 input_mode &= ~(HILDON_GTK_INPUT_MODE_AUTOCAP |
265 HILDON_GTK_INPUT_MODE_DICTIONARY);
266 hildon_gtk_entry_set_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry), input_mode);
268 cw.other_browser_cmd_entry_label = hildon_caption_new(NULL,
269 "Command (%s for URI):",
270 cw.other_browser_cmd_entry,
271 NULL, HILDON_CAPTION_OPTIONAL);
272 gtk_widget_set_sensitive(cw.other_browser_cmd_entry, FALSE);
273 gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, FALSE);
274 hildon_gtk_widget_set_theme_size(cw.other_browser_cmd_entry_label, _HILDON_SIZE_DEFAULT);
275 gtk_box_pack_start(GTK_BOX(dialog_vbox),
276 cw.other_browser_cmd_entry_label, FALSE, FALSE, 0);
278 gtk_widget_show_all(dialog);
279 return GTK_DIALOG(dialog);
282 #else /* !defined(HILDON) || !defined(FREMANTLE) */
284 * GTK+/Diablo Hildon dialog
286 static GtkDialog *swb_config_dialog(gpointer cp_window) {
287 GtkWidget *dialog_vbox;
289 GtkWidget *options_table;
290 GtkWidget *default_browser_combo_label;
291 GtkWidget *continuous_mode_label;
294 HildonGtkInputMode input_mode;
297 dialog = gtk_dialog_new_with_buttons(
298 "Browser Switchboard",
299 GTK_WINDOW(cp_window),
307 dialog_vbox = GTK_DIALOG(dialog)->vbox;
310 options_table = gtk_table_new(3, 2, FALSE);
311 gtk_table_set_row_spacings(GTK_TABLE(options_table), 5);
312 gtk_box_pack_start(GTK_BOX(dialog_vbox), options_table, FALSE, FALSE, 0);
314 init_installed_browsers();
315 cw.default_browser_combo = gtk_combo_box_new_text();
316 for (i = 0; installed_browsers[i].config; ++i)
317 gtk_combo_box_append_text(GTK_COMBO_BOX(cw.default_browser_combo),
318 installed_browsers[i].displayname);
319 gtk_combo_box_set_active(GTK_COMBO_BOX(cw.default_browser_combo), 0);
320 default_browser_combo_label = gtk_label_new("Default browser:");
321 gtk_misc_set_alignment(GTK_MISC(default_browser_combo_label), 1, 0.5);
322 g_signal_connect(G_OBJECT(cw.default_browser_combo), "changed",
323 G_CALLBACK(default_browser_combo_callback), NULL);
324 gtk_table_attach(GTK_TABLE(options_table),
325 default_browser_combo_label,
328 GTK_FILL, GTK_FILL|GTK_EXPAND,
330 gtk_table_attach(GTK_TABLE(options_table),
331 cw.default_browser_combo,
334 GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND,
337 cw.other_browser_cmd_entry = gtk_entry_new();
339 /* Disable autocapitalization and dictionary features for the entry */
340 input_mode = hildon_gtk_entry_get_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry));
341 input_mode &= ~(HILDON_GTK_INPUT_MODE_AUTOCAP |
342 HILDON_GTK_INPUT_MODE_DICTIONARY);
343 hildon_gtk_entry_set_input_mode(GTK_ENTRY(cw.other_browser_cmd_entry), input_mode);
345 cw.other_browser_cmd_entry_label = gtk_label_new("Command (%s for URI):");
346 gtk_misc_set_alignment(GTK_MISC(cw.other_browser_cmd_entry_label), 1, 0.5);
347 gtk_widget_set_sensitive(cw.other_browser_cmd_entry, FALSE);
348 gtk_widget_set_sensitive(cw.other_browser_cmd_entry_label, FALSE);
349 gtk_table_attach(GTK_TABLE(options_table),
350 cw.other_browser_cmd_entry_label,
353 GTK_FILL, GTK_FILL|GTK_EXPAND,
355 gtk_table_attach(GTK_TABLE(options_table),
356 cw.other_browser_cmd_entry,
359 GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND,
361 gtk_table_set_row_spacing(GTK_TABLE(options_table), 1, 15);
363 continuous_mode_label = gtk_label_new("Optimize Browser Switchboard for:");
364 gtk_misc_set_alignment(GTK_MISC(continuous_mode_label), 0, 0.5);
365 cw.continuous_mode_off_radio = gtk_radio_button_new_with_label(NULL,
366 "Lower memory usage");
367 cw.continuous_mode_on_radio = gtk_radio_button_new_with_label_from_widget(
368 GTK_RADIO_BUTTON(cw.continuous_mode_off_radio),
369 "Faster browser startup time");
370 set_continuous_mode(CONTINUOUS_MODE_DEFAULT);
371 gtk_table_attach(GTK_TABLE(options_table),
372 continuous_mode_label,
375 GTK_FILL, GTK_FILL|GTK_EXPAND,
377 gtk_table_attach(GTK_TABLE(options_table),
378 cw.continuous_mode_off_radio,
381 GTK_FILL, GTK_FILL|GTK_EXPAND,
383 gtk_table_attach(GTK_TABLE(options_table),
384 cw.continuous_mode_on_radio,
387 GTK_FILL, GTK_FILL|GTK_EXPAND,
389 gtk_table_set_row_spacing(GTK_TABLE(options_table), 3, 0);
392 gtk_widget_show_all(dialog);
393 return GTK_DIALOG(dialog);
396 #endif /* defined(HILDON) && defined(FREMANTLE) */
399 /**********************************************************************
401 **********************************************************************/
403 #ifdef HILDON_CP_APPLET
405 * Application was started from control panel.
407 osso_return_t execute(osso_context_t *osso,
408 gpointer userdata, gboolean user_activated) {
415 dialog = GTK_DIALOG(swb_config_dialog(userdata));
418 response = gtk_dialog_run(dialog);
419 if (response == GTK_RESPONSE_OK)
422 gtk_widget_destroy(GTK_WIDGET(dialog));
428 * Application was started from command line.
430 int main(int argc, char *argv[]) {
434 HildonProgram *program = NULL;
437 gtk_init(&argc, &argv);
439 program = HILDON_PROGRAM(hildon_program_get_instance());
442 g_set_application_name("Browser Switchboard");
444 dialog = GTK_DIALOG(swb_config_dialog(NULL));
447 response = gtk_dialog_run(dialog);
448 if (response == GTK_RESPONSE_OK)
451 gtk_widget_destroy(GTK_WIDGET(dialog));
455 #endif /* HILDON_CP_APPLET */