Added more applications into default application list
[cl-launcher] / src / cl-launcher.c
index 4d735bc..5fba321 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Camera Launcher for Maemo.
- *  Copyright (C) 2009 Roman Moravcik
+ *  Copyright (C) 2010 Roman Moravcik
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #define CAM_FOCUS_UDI "/org/freedesktop/Hal/devices/platform_cam_focus"
 #define CAM_COVER_STATE "button.state.value"
 
-#define CAMERA_APPLICATION "camera-ui.desktop"
+#define CAMERA_UI_SHOW_ON_LENSCOVER_KEY "/apps/camera/settings/extra-settings/disable-show-on-lenscover-open"
 
 typedef struct _CLLauncherData CLLauncherData;
 struct _CLLauncherData {
        GtkWidget *dialog;
 
        CLLauncherAction action;
-       gchar *application;
+       gchar *prefered_application;
+       GtkListStore *application_list;
+       gboolean application_list_empty;
+
+       gboolean camera_ui2_installed;
 
        osso_context_t *osso_context;
        GConfClient *gconf_client;
@@ -64,6 +68,7 @@ static void
 run_application (CLLauncherData *data, DesktopFileInfo *application)
 {
        g_return_if_fail (data);
+       g_return_if_fail (data->osso_context);
 
        if (application->osso_service) {
                if (strcmp (application->osso_service, "")) {
@@ -83,6 +88,33 @@ run_application (CLLauncherData *data, DesktopFileInfo *application)
        }
 }
 
+static gboolean
+check_camera_ui2 (void)
+{
+       if (system ("test -n \"`dpkg -l camera-ui | grep cssu`\"") == 0)
+               return TRUE;
+       else
+               return FALSE;
+}
+
+static gboolean
+check_camera2_show_on_lenscover (CLLauncherData *data)
+{
+       g_return_if_fail (data);
+       g_return_if_fail (data->gconf_client);
+
+       return gconf_client_get_bool (data->gconf_client, CAMERA_UI_SHOW_ON_LENSCOVER_KEY, NULL);
+}
+
+static void
+disable_camera2_show_on_lenscover (CLLauncherData *data)
+{
+       g_return_if_fail (data);
+       g_return_if_fail (data->gconf_client);
+
+       gconf_client_set_bool (data->gconf_client, CAMERA_UI_SHOW_ON_LENSCOVER_KEY, TRUE, NULL);
+}
+
 static void
 kill_camera_application (void)
 {
@@ -123,6 +155,7 @@ launcher_popup_response (GtkDialog *dialog,
        CLLauncherData *data = (CLLauncherData *) user_data;
 
        g_return_if_fail (data);
+       g_return_if_fail (data->dialog);
 
        gtk_widget_hide_all (data->dialog);
        gtk_widget_destroy (data->dialog);
@@ -145,7 +178,6 @@ static void
 launcher_popup_show (CLLauncherData *data)
 {
        GtkWidget *label, *alignment, *pannable, *tree_view;
-       GtkListStore *application_list;
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
        GtkTreeSelection *selection;
@@ -155,22 +187,16 @@ launcher_popup_show (CLLauncherData *data)
        /* popup dialog */
        data->dialog = gtk_dialog_new ();
        gtk_window_set_title (GTK_WINDOW (data->dialog), _("Select application"));
-       gtk_widget_set_size_request (GTK_WIDGET (GTK_DIALOG (data->dialog)->vbox), -1, 270);
+       gtk_widget_set_size_request (GTK_WIDGET (GTK_DIALOG (data->dialog)->vbox), -1, 292);
+       hildon_gtk_window_set_portrait_flags (GTK_WINDOW (data->dialog), HILDON_PORTRAIT_MODE_SUPPORT);
        g_signal_connect (G_OBJECT (data->dialog), "response", G_CALLBACK (launcher_popup_response), data);
 
-       /* create application list */
-       application_list = gtk_list_store_new (NUM_COLS,
-                                              GDK_TYPE_PIXBUF, /* SELECTOR_COLUMN_ICON */
-                                              G_TYPE_STRING,   /* SELECTOR_COLUMN_NAME */
-                                              G_TYPE_STRING,   /* SELECTOR_COLUMN_OSSO_SERVICE */
-                                              G_TYPE_STRING);  /* SELECTOR_COLUMN_EXEC */
-
-       /* get application list */
-       if (get_application_list (application_list)) {
+       /* check if application list is empty */
+       if (!data->application_list_empty) {
                GtkTreeSelection *selection;
 
-               /* sort list of calendars */
-               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (application_list),
+               /* sort list of applications */
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->application_list),
                                                      SELECTOR_COLUMN_NAME, GTK_SORT_ASCENDING);
 
                /* alignment */
@@ -185,7 +211,7 @@ launcher_popup_show (CLLauncherData *data)
 
                /* tree view */
                tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_EDIT,
-                                                                GTK_TREE_MODEL (application_list));
+                                                                GTK_TREE_MODEL (data->application_list));
                gtk_container_add (GTK_CONTAINER (pannable), tree_view);
 
                /* application icon */
@@ -211,12 +237,12 @@ launcher_popup_show (CLLauncherData *data)
                gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
        } else {
                label = gtk_label_new (_("No applications"));
+               hildon_helper_set_logical_color (label, GTK_RC_FG, GTK_STATE_NORMAL,
+                                                "SecondaryTextColor");
+               hildon_helper_set_logical_font (label, "LargeSystemFont");
                gtk_container_add (GTK_CONTAINER (GTK_DIALOG (data->dialog)->vbox), label);
        }
 
-       /* unref application list */
-       g_object_unref (application_list);
-
        /* show selector popup */
        gtk_widget_show_all (data->dialog);
 
@@ -238,11 +264,13 @@ camera_launcher_on_gconf_changed (GConfClient *client,
        GConfValue *value;
        CLLauncherAction action;
        const gchar *application;
+       const GSList *application_list;
+
+       g_return_if_fail (data);
 
        key = gconf_entry_get_key (entry);
        value = gconf_entry_get_value (entry);
 
-       g_return_if_fail (data);
        g_return_if_fail (value);
 
        /* Only key without absolute path is required */
@@ -250,27 +278,41 @@ camera_launcher_on_gconf_changed (GConfClient *client,
 
        if (!strcmp (key, "action")) {
                action = gconf_value_get_int (value);
-               if ((action < CL_LAUNCHER_ACTION_DO_NOTHING) ||
-                   (action > CL_LAUNCHER_ACTION_SHOW_SELECTOR_POPUP)) {
-                       g_warning("camera_launcher_on_gconf_changed: Wrong value %d of key %s/%s", action, GCONF_CL_LAUNCHER, key);
+               if ((action < CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION) ||
+                   (action > CL_LAUNCHER_ACTION_DO_NOTHING)) {
+                       g_warning("camera_launcher_on_gconf_changed: Wrong value %d of key %s/%s", action,
+                                 GCONF_CL_LAUNCHER, key);
                } else {
                        data->action = action;
                }
-       } else if (!strcmp (key, "application")) {
+       } else if (!strcmp (key, "prefered_application")) {
                application = gconf_value_get_string (value);
                if (strcmp (application, "") &&
                    g_str_has_suffix (application, ".desktop"))
                {
-                       if (data->application)
-                               g_free (data->application);
-                       data->application = g_strdup (application);
+                       if (data->prefered_application)
+                               g_free (data->prefered_application);
+                       data->prefered_application = g_strdup (application);
                } else {
-                       g_warning("camera_launcher_on_gconf_changed: Wrong value %s of key %s/%s", application, GCONF_CL_LAUNCHER, key);
+                       g_warning("camera_launcher_on_gconf_changed: Wrong value %s of key %s/%s", application,
+                                 GCONF_CL_LAUNCHER, key);
+               }
+       } else if (!strcmp (key, "application_list")) {
+               if (data->application_list) {
+                       if (gconf_value_get_list_type (value) == GCONF_VALUE_STRING) {
+                               application_list = gconf_value_get_list (value);
+
+                               /* clear previous application list */
+                               gtk_list_store_clear (data->application_list);
+
+                               /* fill application list */
+                               data->application_list_empty = get_application_list_from_list (data->application_list,
+                                                                                              application_list);
+                       }
                }
        } else {
                g_warning("camera_launcher_on_gconf_changed: Wrong %s key, %s", GCONF_CL_LAUNCHER, key);
        }
-       gconf_value_free (value);
 }
 
 static void
@@ -295,17 +337,26 @@ camera_launcher_on_hal_property_modified (LibHalContext *ctx,
                if (state) {
                        switch (data->action) {
                                case CL_LAUNCHER_ACTION_DO_NOTHING:
-                                       /* just only kill camera application if it's running */
-                                       kill_camera_application ();
+                                       /*
+                                          only just kill camera application if it's running.
+                                          do nothing if camera2 (from cssu) is installed
+                                        */
+                                       if (!data->camera_ui2_installed)
+                                               kill_camera_application ();
                                        break;
 
                                case CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION:
-                                       /* kill camera application only if it's not selected as prefered */
-                                       if (strcmp (data->application, CAMERA_APPLICATION))
-                                               kill_camera_application ();
+                                       /*
+                                          kill camera application only if it's not selected as prefered,
+                                          except camera2 (from cssu) is installed
+                                        */
+                                       if (strcmp (data->prefered_application, CAMERA_APPLICATION_DESKTOP_FILE)) {
+                                               if (!data->camera_ui2_installed)
+                                                       kill_camera_application ();
+                                       }
 
                                        /* run prefered application */
-                                       application = get_desktop_file_info (data->application);
+                                       application = get_desktop_file_info (data->prefered_application);
                                        if (application) {
                                                run_application (data, application);
                                                g_free (application);
@@ -313,8 +364,12 @@ camera_launcher_on_hal_property_modified (LibHalContext *ctx,
                                        break;
 
                                case CL_LAUNCHER_ACTION_SHOW_SELECTOR_POPUP:
-                                       /* kill camera application if it's running */
-                                       kill_camera_application ();
+                                       /*
+                                          kill camera application if it's running, expect camera2 (from cssu)
+                                          is installed.
+                                        */
+                                       if (!data->camera_ui2_installed)
+                                               kill_camera_application ();
 
                                        /* create selector popup window */
                                        launcher_popup_show (data);
@@ -336,7 +391,7 @@ camera_launcher_on_hal_property_modified (LibHalContext *ctx,
        } else if (!strcmp (udi, CAM_FOCUS_UDI)) {
                if (state) {
                        /* run camera application when focus key was pressed */
-                       application = get_desktop_file_info (CAMERA_APPLICATION);
+                       application = get_desktop_file_info (CAMERA_APPLICATION_DESKTOP_FILE);
                        if (application) {
                                run_application (data, application);
                                g_free (application);
@@ -356,12 +411,18 @@ main (int argc, char **argv)
 
        hildon_gtk_init (&argc, &argv);
 
-       /* create CLLauncherData */
+       /* allocate cllauncherdata */
        data = g_new0 (CLLauncherData, 1);
        data->dialog = NULL;
-//     data->action = CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION;
-       data->action = CL_LAUNCHER_ACTION_SHOW_SELECTOR_POPUP;
-       data->application = g_strdup (CAMERA_APPLICATION);
+       data->action = CL_LAUNCHER_ACTION_RUN_PREFERED_APPLICATION;
+       data->prefered_application = g_strdup (CAMERA_APPLICATION_DESKTOP_FILE);
+       data->application_list = gtk_list_store_new (NUM_COLS,
+                                                    G_TYPE_STRING,     /* SELECTOR_COLUMN_FILENAME */
+                                                    GDK_TYPE_PIXBUF,   /* SELECTOR_COLUMN_ICON */
+                                                    G_TYPE_STRING,     /* SELECTOR_COLUMN_NAME */
+                                                    G_TYPE_STRING,     /* SELECTOR_COLUMN_OSSO_SERVICE */
+                                                    G_TYPE_STRING);    /* SELECTOR_COLUMN_EXEC */
+       data->application_list_empty = TRUE;
 
        /* initialize osso */
        data->osso_context = osso_initialize (PACKAGE, VERSION, TRUE, NULL);
@@ -383,7 +444,8 @@ main (int argc, char **argv)
        }
 
        gconf_client_notify (data->gconf_client, GCONF_CL_LAUNCHER "/action");
-       gconf_client_notify (data->gconf_client, GCONF_CL_LAUNCHER "/application");
+       gconf_client_notify (data->gconf_client, GCONF_CL_LAUNCHER "/prefered_application");
+       gconf_client_notify (data->gconf_client, GCONF_CL_LAUNCHER "/application_list");
 
        /* initialize dbus */
        dbus_error_init (&dbus_error);
@@ -419,25 +481,54 @@ main (int argc, char **argv)
        }
 
        libhal_device_add_property_watch (hal, CAM_COVER_UDI, NULL);
-       libhal_device_add_property_watch (hal, CAM_FOCUS_UDI, NULL);
+       /* libhal_device_add_property_watch (hal, CAM_FOCUS_UDI, NULL); */
+
+       /* disable showing of camera-ui if camera application from cssu is installed */
+       if (check_camera_ui2 ()) {
+               if (!check_camera2_show_on_lenscover (data)) {
+                       disable_camera2_show_on_lenscover (data);
+
+                       /* kill camera-ui process to reload new configuration */
+                       kill_camera_application ();
+               }
+               data->camera_ui2_installed = TRUE;
+       } else {
+               data->camera_ui2_installed = FALSE;
+       }
 
        gtk_main ();
 
        /* deinitialize hal */
        if (hal) {
                libhal_device_remove_property_watch (hal, CAM_COVER_UDI, NULL);
-               libhal_device_remove_property_watch (hal, CAM_FOCUS_UDI, NULL);
+               /* libhal_device_remove_property_watch (hal, CAM_FOCUS_UDI, NULL); */
 hal_error:
                libhal_ctx_set_user_data (hal, NULL);
                libhal_ctx_shutdown (hal, NULL);
                libhal_ctx_free (hal);
        }
 
+       /* unreference dbus connection */
+       if (dbus_connection)
+               dbus_connection_unref (dbus_connection);
+
 osso_error:
        /* deinitialize osso */
        if (data->osso_context) {
                osso_deinitialize (data->osso_context);
        }
 
+       /* free cllauncherdata */
+       if (data) {
+               if (data->prefered_application)
+                       g_free (data->prefered_application);
+
+               /* unref application list */
+               g_object_unref (data->application_list);
+
+               g_free (data);
+       }
+
+
        return 0;
 }