2 * Camera Launcher for Maemo.
3 * Copyright (C) 2010 Roman Moravcik
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <glib/gi18n-lib.h>
30 #include <hildon/hildon.h>
31 #include <hildon-cp-plugin/hildon-cp-plugin-interface.h>
33 #include <gconf/gconf-client.h>
37 #define _HL(str) dgettext("hildon-libs",str)
44 static Action actions[] = {
45 {CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION, N_("Automatically run prefered application")},
46 {CL_LAUNCHER_ACTION_SHOW_SELECTOR_POPUP, N_("Show application selector pop-up window")},
47 {CL_LAUNCHER_ACTION_DO_NOTHING, N_("Do nothing")}
50 typedef struct _CLLauncherAppletData CLLauncherAppletData;
51 struct _CLLauncherAppletData {
53 GtkWidget *prefered_application;
54 GtkWidget *application_list;
57 GConfClient *gconf_client;
61 gconf_get_bool (GConfClient *client,
64 gboolean value = FALSE;
67 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
69 value = gconf_client_get_bool (client, tmp, NULL);
78 gconf_set_bool (GConfClient *client,
84 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
86 gconf_client_set_bool (client, tmp, value, NULL);
93 gconf_get_int (GConfClient *client,
99 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
101 value = gconf_client_get_int (client, tmp, NULL);
110 gconf_set_int (GConfClient *client,
116 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
118 gconf_client_set_int (client, tmp, value, NULL);
125 gconf_get_string (GConfClient *client,
131 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
133 value = gconf_client_get_string (client, tmp, NULL);
142 gconf_set_string (GConfClient *client,
148 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
151 gconf_client_set_string (client, tmp, value, NULL);
153 gconf_client_unset (client, tmp, NULL);
160 gconf_get_string_list (GConfClient *client,
163 GSList *value = NULL;
166 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
168 value = gconf_client_get_list (client, tmp, GCONF_VALUE_STRING, NULL);
177 gconf_set_string_list (GConfClient *client,
183 tmp = g_strdup_printf ("%s/%s", GCONF_CL_LAUNCHER, key);
186 gconf_client_set_list (client, tmp, GCONF_VALUE_STRING, value, NULL);
188 gconf_client_unset (client, tmp, NULL);
195 create_action_selector (CLLauncherAppletData *data)
197 GtkWidget *button, *selector;
198 CLLauncherAction action;
201 g_return_val_if_fail (data, NULL);
203 button = hildon_picker_button_new (HILDON_SIZE_FINGER_HEIGHT,
204 HILDON_BUTTON_ARRANGEMENT_VERTICAL);
205 hildon_button_set_title (HILDON_BUTTON (button), _("Opening of lens cover will"));
206 hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 0.0);
207 hildon_button_set_title_alignment (HILDON_BUTTON(button), 0.0, 0.5);
208 hildon_button_set_value_alignment (HILDON_BUTTON (button), 0.0, 0.5);
210 selector = hildon_touch_selector_new_text ();
211 while (index < CL_LAUNCHER_ACTION_LAST) {
212 hildon_touch_selector_insert_text (HILDON_TOUCH_SELECTOR (selector),
213 actions[index].index,
214 _(actions[index].text));
218 hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
219 HILDON_TOUCH_SELECTOR (selector));
225 create_prefered_application_selector (CLLauncherAppletData *data)
227 GtkWidget *button, *selector;
228 GtkCellRenderer *renderer;
229 HildonTouchSelectorColumn *column;
230 GtkListStore *application_list;
233 g_return_val_if_fail (data, NULL);
235 button = hildon_picker_button_new (HILDON_SIZE_FINGER_HEIGHT,
236 HILDON_BUTTON_ARRANGEMENT_VERTICAL);
237 hildon_button_set_title (HILDON_BUTTON (button), _("Prefered application"));
238 hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 0.0);
239 hildon_button_set_title_alignment (HILDON_BUTTON(button), 0.0, 0.5);
240 hildon_button_set_value_alignment (HILDON_BUTTON (button), 0.0, 0.5);
242 application_list = gtk_list_store_new (NUM_COLS,
243 G_TYPE_STRING, /* SELECTOR_COLUMN_FILENAME */
244 GDK_TYPE_PIXBUF, /* SELECTOR_COLUMN_ICON */
245 G_TYPE_STRING, /* SELECTOR_COLUMN_NAME */
246 G_TYPE_STRING, /* SELECTOR_COLUMN_OSSO_SERVICE */
247 G_TYPE_STRING); /* SELECTOR_COLUMN_EXEC */
248 get_application_list (application_list);
250 /* sort list of applications */
251 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (application_list),
252 SELECTOR_COLUMN_NAME, GTK_SORT_ASCENDING);
254 /* create selector */
255 selector = hildon_touch_selector_new ();
257 renderer = gtk_cell_renderer_text_new ();
258 column = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector),
259 GTK_TREE_MODEL (application_list),
261 "text", SELECTOR_COLUMN_NAME,
263 hildon_touch_selector_column_set_text_column (column, SELECTOR_COLUMN_NAME);
265 g_object_unref (application_list);
267 hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
268 HILDON_TOUCH_SELECTOR (selector));
274 create_application_list_selector (CLLauncherAppletData *data)
276 GtkWidget *button, *selector;
277 GtkCellRenderer *renderer;
278 HildonTouchSelectorColumn *column;
279 GtkListStore *application_list;
282 g_return_val_if_fail (data, NULL);
284 button = hildon_picker_button_new (HILDON_SIZE_FINGER_HEIGHT,
285 HILDON_BUTTON_ARRANGEMENT_VERTICAL);
286 hildon_button_set_title (HILDON_BUTTON (button), _("Application selector pop-up window"));
287 hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 0.0);
288 hildon_button_set_title_alignment (HILDON_BUTTON(button), 0.0, 0.5);
289 hildon_button_set_value_alignment (HILDON_BUTTON (button), 0.0, 0.5);
291 application_list = gtk_list_store_new (NUM_COLS,
292 G_TYPE_STRING, /* SELECTOR_COLUMN_FILENAME */
293 GDK_TYPE_PIXBUF, /* SELECTOR_COLUMN_ICON */
294 G_TYPE_STRING, /* SELECTOR_COLUMN_NAME */
295 G_TYPE_STRING, /* SELECTOR_COLUMN_OSSO_SERVICE */
296 G_TYPE_STRING); /* SELECTOR_COLUMN_EXEC */
297 get_application_list (application_list);
299 /* sort list of applications */
300 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (application_list),
301 SELECTOR_COLUMN_NAME, GTK_SORT_ASCENDING);
303 /* create selector */
304 selector = hildon_touch_selector_new ();
306 renderer = gtk_cell_renderer_text_new ();
307 column = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector),
308 GTK_TREE_MODEL (application_list),
310 "text", SELECTOR_COLUMN_NAME,
312 hildon_touch_selector_column_set_text_column (column, SELECTOR_COLUMN_NAME);
313 hildon_touch_selector_set_column_selection_mode (HILDON_TOUCH_SELECTOR (selector),
314 HILDON_TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE);
316 g_object_unref (application_list);
318 hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
319 HILDON_TOUCH_SELECTOR (selector));
325 load_configuration (CLLauncherAppletData *data)
327 HildonTouchSelector *selector;
328 CLLauncherAction action;
329 gchar *prefered_application = NULL;
330 GSList *application_list = NULL, *entry = NULL;
331 GtkTreeModel *tree_model;
333 gboolean iter_valid = TRUE;
335 g_return_if_fail (data);
337 /* read action from gconf */
338 action = gconf_get_int (data->gconf_client, "action");
340 if ((action < CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION) ||
341 (action > CL_LAUNCHER_ACTION_DO_NOTHING))
342 action = CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION;
344 hildon_picker_button_set_active (HILDON_PICKER_BUTTON (data->action),
347 /* read prefered application from gconf */
348 prefered_application = gconf_get_string (data->gconf_client, "prefered_application");
349 if (prefered_application == NULL)
350 prefered_application = g_strdup (CAMERA_APPLICATION_DESKTOP_FILE);
352 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->prefered_application));
353 tree_model = hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME);
354 for (iter_valid = gtk_tree_model_get_iter_first (tree_model, &iter); iter_valid;
355 iter_valid = gtk_tree_model_iter_next (tree_model, &iter)) {
356 const gchar *filename;
358 gtk_tree_model_get (tree_model, &iter, SELECTOR_COLUMN_FILENAME, &filename, -1);
359 if (!strcmp (prefered_application, filename)) {
360 hildon_touch_selector_select_iter(selector, SELECTOR_COLUMN_NAME, &iter, FALSE);
365 /* read aplication list from gconf */
366 application_list = gconf_get_string_list (data->gconf_client, "application_list");
367 if (application_list == NULL) {
368 application_list = g_slist_append (application_list, g_strdup (CAMERA_APPLICATION_DESKTOP_FILE));
369 application_list = g_slist_append (application_list, g_strdup (FLASHLIGHT_APPLET_DESKTOP_FILE));
372 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->application_list));
373 tree_model = hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME);
374 hildon_touch_selector_unselect_all(selector, SELECTOR_COLUMN_NAME);
375 for (entry = application_list; entry; entry = entry->next) {
376 for (iter_valid = gtk_tree_model_get_iter_first (tree_model, &iter); iter_valid;
377 iter_valid = gtk_tree_model_iter_next (tree_model, &iter)) {
378 const gchar *filename;
380 gtk_tree_model_get (tree_model, &iter, SELECTOR_COLUMN_FILENAME, &filename, -1);
381 if (!strcmp (entry->data, filename)) {
382 hildon_touch_selector_select_iter(selector, SELECTOR_COLUMN_NAME, &iter, FALSE);
388 /* free prefered application */
389 if (prefered_application)
390 g_free (prefered_application);
392 /* free list of applications */
393 if (application_list) {
394 g_slist_foreach (application_list, (GFunc) g_free, NULL);
395 g_slist_free (application_list);
400 save_configuration (CLLauncherAppletData *data)
402 HildonTouchSelector *selector;
403 CLLauncherAction action;
404 gchar *prefered_application = NULL;
405 GSList *application_list = NULL;
406 GList *selected_rows = NULL, *entry = NULL;
409 g_return_if_fail (data);
412 action = hildon_picker_button_get_active (HILDON_PICKER_BUTTON (data->action));
414 /* if nothing was selected, set action to CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION */
416 action = CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION;
418 /* prefered application */
419 if (hildon_picker_button_get_active (HILDON_PICKER_BUTTON (data->prefered_application)) > -1) {
420 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->prefered_application));
421 if (hildon_touch_selector_get_selected (selector, SELECTOR_COLUMN_NAME, &iter)) {
422 gtk_tree_model_get (hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME),
423 &iter, SELECTOR_COLUMN_FILENAME, &prefered_application, -1);
427 /* if nothing was selected, set prefered application to CAMERA_APPLICATION_DESKTOP_FILE */
428 if (prefered_application == NULL)
429 prefered_application = g_strdup (CAMERA_APPLICATION_DESKTOP_FILE);
431 /* application list */
432 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->application_list));
433 selected_rows = hildon_touch_selector_get_selected_rows (selector, SELECTOR_COLUMN_NAME);
435 for (entry = selected_rows; entry; entry = entry->next) {
436 const gchar *filename;
438 gtk_tree_model_get_iter (hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME),
439 &iter, (GtkTreePath *) (entry->data));
441 gtk_tree_model_get (hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME),
442 &iter, SELECTOR_COLUMN_FILENAME, &filename, -1);
444 application_list = g_slist_append (application_list, g_strdup (filename));
446 g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL);
447 g_list_free (selected_rows);
450 gconf_set_int (data->gconf_client, "action", action);
451 gconf_set_string (data->gconf_client, "prefered_application", prefered_application);
452 gconf_set_string_list (data->gconf_client, "application_list", application_list);
454 /* free prefered application */
455 if (prefered_application)
456 g_free (prefered_application);
458 /* free list of applications */
459 if (application_list) {
460 g_slist_foreach (application_list, (GFunc) g_free, NULL);
461 g_slist_free (application_list);
466 execute (osso_context_t *osso,
468 gboolean user_activated)
470 CLLauncherAppletData *priv;
471 GtkWidget *dialog, *vbox;
473 /* allocate cllauncherappletdata */
474 priv = g_new0 (CLLauncherAppletData, 1);
476 /* initialize gconf */
477 priv->gconf_client = gconf_client_get_default ();
478 if (priv->gconf_client == NULL) {
483 dialog = gtk_dialog_new ();
484 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
485 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (data));
486 gtk_window_set_title (GTK_WINDOW (dialog), _("Camera Lens Launcher"));
487 gtk_dialog_add_button(GTK_DIALOG (dialog), _HL("wdgt_bd_save"), GTK_RESPONSE_ACCEPT);
489 vbox = gtk_vbox_new (FALSE, 0);
490 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
492 /* action selector button */
493 priv->action = create_action_selector (priv);
494 gtk_box_pack_start (GTK_BOX (vbox), priv->action, TRUE, TRUE, 0);
496 /* prefered application selector */
497 priv->prefered_application = create_prefered_application_selector (priv);
498 gtk_box_pack_start (GTK_BOX (vbox), priv->prefered_application, TRUE, TRUE, 0);
500 /* application list selector */
501 priv->application_list = create_application_list_selector (priv);
502 gtk_box_pack_start (GTK_BOX (vbox), priv->application_list, TRUE, TRUE, 0);
504 /* load configuration */
505 load_configuration (priv);
508 gtk_widget_show_all (GTK_WIDGET (dialog));
509 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
510 /* save configuration */
511 save_configuration (priv);
513 gtk_widget_destroy (GTK_WIDGET (dialog));
515 /* free cllauncherdata */
524 save_state (osso_context_t *osso,