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, CAMERA_APPLICATION_DESKTOP_FILE);
369 application_list = g_slist_append (application_list, FLASHLIGHT_APPLET_DESKTOP_FILE);
372 for (entry = application_list; entry; entry = entry->next) {
373 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->application_list));
374 tree_model = hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME);
375 for (iter_valid = gtk_tree_model_get_iter_first (tree_model, &iter); iter_valid;
376 iter_valid = gtk_tree_model_iter_next (tree_model, &iter)) {
377 const gchar *filename;
379 gtk_tree_model_get (tree_model, &iter, SELECTOR_COLUMN_FILENAME, &filename, -1);
380 if (!strcmp (entry->data, filename)) {
381 hildon_touch_selector_select_iter(selector, SELECTOR_COLUMN_NAME, &iter, FALSE);
387 /* free prefered application */
388 if (prefered_application)
389 g_free (prefered_application);
391 /* free list of applications */
392 if (application_list) {
393 g_slist_foreach (application_list, (GFunc) g_free, NULL);
394 g_slist_free (application_list);
399 save_configuration (CLLauncherAppletData *data)
401 HildonTouchSelector *selector;
402 CLLauncherAction action;
403 gchar *prefered_application = NULL;
404 GSList *application_list = NULL;
405 GList *selected_rows = NULL, *entry = NULL;
408 g_return_if_fail (data);
411 action = hildon_picker_button_get_active (HILDON_PICKER_BUTTON (data->action));
413 /* if nothing was selected, set action to CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION */
415 action = CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION;
417 /* prefered application */
418 if (hildon_picker_button_get_active (HILDON_PICKER_BUTTON (data->prefered_application)) > -1) {
419 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->prefered_application));
420 if (hildon_touch_selector_get_selected (selector, SELECTOR_COLUMN_NAME, &iter)) {
421 gtk_tree_model_get (hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME),
422 &iter, SELECTOR_COLUMN_FILENAME, &prefered_application, -1);
426 /* if nothing was selected, set prefered application to CAMERA_APPLICATION_DESKTOP_FILE */
427 if (prefered_application == NULL)
428 prefered_application = g_strdup (CAMERA_APPLICATION_DESKTOP_FILE);
430 /* application list */
431 selector = hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (data->application_list));
432 selected_rows = hildon_touch_selector_get_selected_rows (selector, SELECTOR_COLUMN_NAME);
434 for (entry = selected_rows; entry; entry = entry->next) {
435 const gchar *filename;
437 gtk_tree_model_get_iter (hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME),
438 &iter, (GtkTreePath *) (entry->data));
440 gtk_tree_model_get (hildon_touch_selector_get_model (selector, SELECTOR_COLUMN_NAME),
441 &iter, SELECTOR_COLUMN_FILENAME, &filename, -1);
443 application_list = g_slist_append (application_list, g_strdup (filename));
445 g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL);
446 g_list_free (selected_rows);
449 gconf_set_int (data->gconf_client, "action", action);
450 gconf_set_string (data->gconf_client, "prefered_application", prefered_application);
451 gconf_set_string_list (data->gconf_client, "application_list", application_list);
453 /* free prefered application */
454 if (prefered_application)
455 g_free (prefered_application);
457 /* free list of applications */
458 if (application_list) {
459 g_slist_foreach (application_list, (GFunc) g_free, NULL);
460 g_slist_free (application_list);
465 execute (osso_context_t *osso,
467 gboolean user_activated)
469 CLLauncherAppletData *priv;
470 GtkWidget *dialog, *vbox;
472 /* allocate cllauncherappletdata */
473 priv = g_new0 (CLLauncherAppletData, 1);
475 /* initialize gconf */
476 priv->gconf_client = gconf_client_get_default ();
477 if (priv->gconf_client == NULL) {
482 dialog = gtk_dialog_new ();
483 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
484 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (data));
485 gtk_window_set_title (GTK_WINDOW (dialog), _("Camera Lens Launcher"));
486 gtk_dialog_add_button(GTK_DIALOG (dialog), _HL("wdgt_bd_save"), GTK_RESPONSE_ACCEPT);
488 vbox = gtk_vbox_new (FALSE, 0);
489 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
491 /* action selector button */
492 priv->action = create_action_selector (priv);
493 gtk_box_pack_start (GTK_BOX (vbox), priv->action, TRUE, TRUE, 0);
495 /* prefered application selector */
496 priv->prefered_application = create_prefered_application_selector (priv);
497 gtk_box_pack_start (GTK_BOX (vbox), priv->prefered_application, TRUE, TRUE, 0);
499 /* application list selector */
500 priv->application_list = create_application_list_selector (priv);
501 gtk_box_pack_start (GTK_BOX (vbox), priv->application_list, TRUE, TRUE, 0);
503 /* load configuration */
504 load_configuration (priv);
507 gtk_widget_show_all (GTK_WIDGET (dialog));
508 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
509 /* save configuration */
510 save_configuration (priv);
512 gtk_widget_destroy (GTK_WIDGET (dialog));
514 /* free cllauncherdata */
523 save_state (osso_context_t *osso,