/*
* 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;
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, "")) {
}
}
+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)
{
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);
launcher_popup_show (CLLauncherData *data)
{
GtkWidget *label, *alignment, *pannable, *tree_view;
- GtkListStore *application_list;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
GtkTreeSelection *selection;
/* 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 */
/* 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 */
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);
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 */
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
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);
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);
} 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);
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);
}
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);
}
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;
}