[tracker] TrackerStatusIcon: Add config to tweak status icon visibility.



commit 24a1b7997cd47779bfc89fe9badb12776dee928c
Author: Carlos Garnacho <carlos lanedo com>
Date:   Thu Oct 15 14:41:40 2009 +0200

    TrackerStatusIcon: Add config to tweak status icon visibility.
    
    A new config file has been added for tracker-status-icon. At the moment
    the only setting is for visibility, possible values are never/always/when
    active.

 src/tracker-status-icon/Makefile.am           |    2 +
 src/tracker-status-icon/tracker-icon-config.c |  315 +++++++++++++++++++++++++
 src/tracker-status-icon/tracker-icon-config.h |   67 ++++++
 src/tracker-status-icon/tracker-main.c        |    2 +-
 src/tracker-status-icon/tracker-status-icon.c |   43 +++-
 5 files changed, 425 insertions(+), 4 deletions(-)
---
diff --git a/src/tracker-status-icon/Makefile.am b/src/tracker-status-icon/Makefile.am
index e0bb6cc..5456d34 100644
--- a/src/tracker-status-icon/Makefile.am
+++ b/src/tracker-status-icon/Makefile.am
@@ -19,6 +19,8 @@ tracker_status_icon_LDADD = 						\
 	$(GCOV_LIBS)
 
 tracker_status_icon_SOURCES =						\
+	tracker-icon-config.c						\
+	tracker-icon-config.h						\
 	tracker-status-icon.c						\
 	tracker-status-icon.h						\
 	tracker-main.c
diff --git a/src/tracker-status-icon/tracker-icon-config.c b/src/tracker-status-icon/tracker-icon-config.c
new file mode 100644
index 0000000..7ea0688
--- /dev/null
+++ b/src/tracker-status-icon/tracker-icon-config.c
@@ -0,0 +1,315 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <libtracker-common/tracker-keyfile-object.h>
+
+#include "tracker-icon-config.h"
+
+#define TRACKER_ICON_CONFIG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_ICON_CONFIG, TrackerIconConfigPrivate))
+
+/* GKeyFile defines */
+#define GROUP_GENERAL				 "General"
+
+/* Default values */
+#define DEFAULT_VISIBILITY TRACKER_SHOW_ACTIVE
+
+typedef struct {
+        gint     visibility;
+} TrackerIconConfigPrivate;
+
+typedef struct {
+	GType  type;
+	const gchar *property;
+	const gchar *group;
+	const gchar *key;
+} ObjectToKeyFile;
+
+static void     config_set_property         (GObject           *object,
+					     guint              param_id,
+					     const GValue      *value,
+					     GParamSpec        *pspec);
+static void     config_get_property         (GObject           *object,
+					     guint              param_id,
+					     GValue            *value,
+					     GParamSpec        *pspec);
+static void     config_constructed          (GObject           *object);
+static void     config_changed              (TrackerConfigFile *file);
+static void     config_load                 (TrackerIconConfig *config);
+static gboolean config_save                 (TrackerIconConfig *config);
+static void     config_create_with_defaults (TrackerIconConfig *config,
+					     GKeyFile          *key_file,
+					     gboolean           overwrite);
+
+enum {
+	PROP_0,
+        PROP_VISIBILITY
+};
+
+static ObjectToKeyFile conversions[] = {
+	/* General */
+        { G_TYPE_INT, "visibility", GROUP_GENERAL,  "Visibility" }
+};
+
+G_DEFINE_TYPE (TrackerIconConfig, tracker_icon_config, TRACKER_TYPE_CONFIG_FILE);
+
+static void
+tracker_icon_config_class_init (TrackerIconConfigClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	TrackerConfigFileClass *config_file_class = TRACKER_CONFIG_FILE_CLASS (klass);
+
+	object_class->set_property = config_set_property;
+	object_class->get_property = config_get_property;
+	object_class->constructed  = config_constructed;
+
+	config_file_class->changed = config_changed;
+
+	/* General */
+	g_object_class_install_property (object_class,
+					 PROP_VISIBILITY,
+					 g_param_spec_int ("visibility",
+                                                           "Status icon visibility",
+                                                           "Status icon visibility (0=Never, 1=When active, 2=Always)",
+                                                           TRACKER_SHOW_NEVER, TRACKER_SHOW_ALWAYS,
+                                                           DEFAULT_VISIBILITY,
+                                                           G_PARAM_READWRITE));
+
+	g_type_class_add_private (object_class, sizeof (TrackerIconConfigPrivate));
+}
+
+static void
+tracker_icon_config_init (TrackerIconConfig *object)
+{
+}
+
+static void
+config_set_property (GObject	  *object,
+		     guint	   param_id,
+		     const GValue *value,
+		     GParamSpec	  *pspec)
+{
+	switch (param_id) {
+		/* General */
+        case PROP_VISIBILITY:
+                tracker_icon_config_set_visibility (TRACKER_ICON_CONFIG (object),
+						    g_value_get_int (value));
+                break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+static void
+config_get_property (GObject	*object,
+		     guint	 param_id,
+		     GValue	*value,
+		     GParamSpec *pspec)
+{
+	TrackerIconConfigPrivate *priv;
+
+	priv = TRACKER_ICON_CONFIG_GET_PRIVATE (object);
+
+	switch (param_id) {
+		/* General */
+	case PROP_VISIBILITY:
+		g_value_set_int (value, priv->visibility);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+static void
+config_constructed (GObject *object)
+{
+	(G_OBJECT_CLASS (tracker_icon_config_parent_class)->constructed) (object);
+
+	config_load (TRACKER_ICON_CONFIG (object));
+}
+
+static void
+config_changed (TrackerConfigFile *file)
+{
+	/* Reload config */
+	config_load (TRACKER_ICON_CONFIG (file));
+}
+
+static void
+config_create_with_defaults (TrackerIconConfig *config,
+			     GKeyFile          *key_file,
+			     gboolean           overwrite)
+{
+	gint i;
+
+	g_message ("Loading defaults into GKeyFile...");
+
+	for (i = 0; i < G_N_ELEMENTS (conversions); i++) {
+		gboolean has_key;
+
+		has_key = g_key_file_has_key (key_file,
+					      conversions[i].group,
+					      conversions[i].key,
+					      NULL);
+		if (!overwrite && has_key) {
+			continue;
+		}
+
+		switch (conversions[i].type) {
+		case G_TYPE_INT:
+			g_key_file_set_integer (key_file,
+						conversions[i].group,
+						conversions[i].key,
+						tracker_keyfile_object_default_int (config,
+										    conversions[i].property));
+			break;
+		default:
+			g_assert_not_reached ();
+		}
+
+		g_key_file_set_comment (key_file,
+					conversions[i].group,
+					conversions[i].key,
+					tracker_keyfile_object_blurb (config, conversions[i].property),
+					NULL);
+	}
+}
+
+static void
+config_load (TrackerIconConfig *config)
+{
+	TrackerConfigFile *file;
+	gint i;
+
+	file = TRACKER_CONFIG_FILE (config);
+	config_create_with_defaults (config, file->key_file, FALSE);
+
+	if (!file->file_exists) {
+		tracker_config_file_save (file);
+	}
+
+	for (i = 0; i < G_N_ELEMENTS (conversions); i++) {
+		gboolean has_key;
+
+		has_key = g_key_file_has_key (file->key_file,
+					      conversions[i].group,
+					      conversions[i].key,
+					      NULL);
+
+		switch (conversions[i].type) {
+		case G_TYPE_INT:
+			tracker_keyfile_object_load_int (G_OBJECT (file),
+							 conversions[i].property,
+							 file->key_file,
+							 conversions[i].group,
+							 conversions[i].key);
+			break;
+		}
+	}
+}
+
+static gboolean
+config_save (TrackerIconConfig *config)
+{
+	TrackerConfigFile *file;
+	gint i;
+
+	file = TRACKER_CONFIG_FILE (config);
+
+	if (!file->key_file) {
+		g_critical ("Could not save config, GKeyFile was NULL, has the config been loaded?");
+
+		return FALSE;
+	}
+
+	g_message ("Setting details to GKeyFile object...");
+
+	for (i = 0; i < G_N_ELEMENTS (conversions); i++) {
+		switch (conversions[i].type) {
+		case G_TYPE_INT:
+			tracker_keyfile_object_save_int (file,
+							 conversions[i].property,
+							 file->key_file,
+							 conversions[i].group,
+							 conversions[i].key);
+			break;
+		default:
+			g_assert_not_reached ();
+			break;
+		}
+	}
+
+	return tracker_config_file_save (file);
+}
+
+TrackerIconConfig *
+tracker_icon_config_new (void)
+{
+	return g_object_new (TRACKER_TYPE_ICON_CONFIG, NULL);
+}
+
+TrackerIconConfig *
+tracker_icon_config_new_with_domain (const gchar *domain)
+{
+	return g_object_new (TRACKER_TYPE_ICON_CONFIG,  "domain", domain, NULL);
+}
+
+gboolean
+tracker_icon_config_save (TrackerIconConfig *config)
+{
+	g_return_val_if_fail (TRACKER_IS_ICON_CONFIG (config), FALSE);
+
+	return config_save (config);
+}
+
+TrackerVisibility
+tracker_icon_config_get_visibility (TrackerIconConfig *config)
+{
+	TrackerIconConfigPrivate *priv;
+
+	g_return_val_if_fail (TRACKER_IS_ICON_CONFIG (config), DEFAULT_VISIBILITY);
+
+	priv = TRACKER_ICON_CONFIG_GET_PRIVATE (config);
+
+	return priv->visibility;
+}
+
+void
+tracker_icon_config_set_visibility (TrackerIconConfig *config,
+				    TrackerVisibility  visibility)
+{
+	TrackerIconConfigPrivate *priv;
+
+	g_return_if_fail (TRACKER_IS_ICON_CONFIG (config));
+
+	priv = TRACKER_ICON_CONFIG_GET_PRIVATE (config);
+
+	priv->visibility = visibility;
+	g_object_notify (G_OBJECT (config), "visibility");
+}
diff --git a/src/tracker-status-icon/tracker-icon-config.h b/src/tracker-status-icon/tracker-icon-config.h
new file mode 100644
index 0000000..6b02937
--- /dev/null
+++ b/src/tracker-status-icon/tracker-icon-config.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009%, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __TRACKER_STATUS_ICON_CONFIG_H__
+#define __TRACKER_STATUS_ICON_CONFIG_H__
+
+#include <glib-object.h>
+
+#include <libtracker-common/tracker-config-file.h>
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_ICON_CONFIG         (tracker_icon_config_get_type ())
+#define TRACKER_ICON_CONFIG(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_ICON_CONFIG, TrackerIconConfig))
+#define TRACKER_ICON_CONFIG_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), TRACKER_TYPE_ICON_CONFIG, TrackerIconConfigClass))
+#define TRACKER_IS_ICON_CONFIG(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_ICON_CONFIG))
+#define TRACKER_IS_ICON_CONFIG_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), TRACKER_TYPE_ICON_CONFIG))
+#define TRACKER_ICON_CONFIG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_ICON_CONFIG, TrackerIconConfigClass))
+
+typedef struct TrackerIconConfig	  TrackerIconConfig;
+typedef struct TrackerIconConfigClass TrackerIconConfigClass;
+
+typedef enum {
+        TRACKER_SHOW_NEVER,
+        TRACKER_SHOW_ACTIVE,
+        TRACKER_SHOW_ALWAYS
+} TrackerVisibility;
+
+struct TrackerIconConfig {
+	TrackerConfigFile parent;
+};
+
+struct TrackerIconConfigClass {
+	TrackerConfigFileClass parent_class;
+};
+
+GType	           tracker_icon_config_get_type				   (void) G_GNUC_CONST;
+
+TrackerIconConfig *tracker_icon_config_new                                  (void);
+TrackerIconConfig *tracker_icon_config_new_with_domain                      (const gchar *domain);
+
+gboolean           tracker_icon_config_save                                 (TrackerIconConfig *config);
+
+TrackerVisibility  tracker_icon_config_get_visibility                       (TrackerIconConfig *config);
+void               tracker_icon_config_set_visibility                       (TrackerIconConfig *config,
+									     TrackerVisibility  value);
+
+G_END_DECLS
+
+#endif /* __TRACKER_STATUS_ICON_CONFIG_H__ */
diff --git a/src/tracker-status-icon/tracker-main.c b/src/tracker-status-icon/tracker-main.c
index 230c19f..2ee2c15 100644
--- a/src/tracker-status-icon/tracker-main.c
+++ b/src/tracker-status-icon/tracker-main.c
@@ -61,7 +61,7 @@ main (int argc, char *argv[])
         gtk_init (&argc, &argv);
 
 	gtk_window_set_default_icon_name ("tracker");
-	g_set_application_name (_("Tracker"));
+	g_set_application_name ("tracker-status-icon");
 
         icon = tracker_status_icon_new ();
 
diff --git a/src/tracker-status-icon/tracker-status-icon.c b/src/tracker-status-icon/tracker-status-icon.c
index 6bcd40c..52b837e 100644
--- a/src/tracker-status-icon/tracker-status-icon.c
+++ b/src/tracker-status-icon/tracker-status-icon.c
@@ -20,6 +20,7 @@
 
 #include "config.h"
 #include "tracker-status-icon.h"
+#include "tracker-icon-config.h"
 #include <libtracker-miner/tracker-miner-manager.h>
 #include <string.h>
 #include <locale.h>
@@ -48,6 +49,7 @@ typedef enum {
 struct TrackerStatusIconPrivate {
 	GdkPixbuf *icons [ICON_LAST];
 	TrackerStatus current_status;
+	TrackerVisibility current_visibility;
 	guint animation_id;
 
 	TrackerMinerManager *manager;
@@ -56,6 +58,8 @@ struct TrackerStatusIconPrivate {
 	GtkSizeGroup *size_group;
 
 	GHashTable *miners;
+
+	TrackerIconConfig *config;
 };
 
 struct MinerMenuEntry {
@@ -95,6 +99,9 @@ static void status_icon_miner_activated   (TrackerMinerManager *manager,
 static void status_icon_miner_deactivated (TrackerMinerManager *manager,
 					   const gchar         *miner_name,
 					   gpointer             user_data);
+static void status_icon_visibility_notify (TrackerIconConfig   *config,
+					   GParamSpec          *pspec,
+					   gpointer             user_data);
 
 static void        status_icon_initialize_miners_menu (TrackerStatusIcon *icon);
 static GtkWidget * status_icon_create_context_menu    (TrackerStatusIcon *icon);
@@ -168,6 +175,10 @@ tracker_status_icon_init (TrackerStatusIcon *icon)
 	g_signal_connect (priv->manager, "miner-deactivated",
 			  G_CALLBACK (status_icon_miner_deactivated), icon);
 	status_icon_initialize_miners_menu (icon);
+
+	priv->config = tracker_icon_config_new ();
+	g_signal_connect (priv->config, "notify::visibility",
+			  G_CALLBACK (status_icon_visibility_notify), icon);
 }
 
 static void
@@ -202,6 +213,7 @@ status_icon_finalize (GObject *object)
 
 	g_object_unref (priv->manager);
 	g_object_unref (priv->size_group);
+	g_object_unref (priv->config);
 
 	G_OBJECT_CLASS (tracker_status_icon_parent_class)->finalize (object);
 }
@@ -419,6 +431,16 @@ status_icon_miner_deactivated (TrackerMinerManager *manager,
 }
 
 static void
+status_icon_visibility_notify (TrackerIconConfig *config,
+			       GParamSpec        *pspec,
+			       gpointer           user_data)
+{
+	TrackerStatusIcon *icon = user_data;
+
+	update_icon_status (icon);
+}
+
+static void
 miner_menu_entry_activate_cb (GtkMenuItem *item,
 			      gpointer     user_data)
 {
@@ -799,16 +821,32 @@ status_icon_set_status (TrackerStatusIcon *icon,
 			TrackerStatus      status)
 {
 	TrackerStatusIconPrivate *priv;
+	TrackerVisibility visibility;
 
 	priv = TRACKER_STATUS_ICON_GET_PRIVATE (icon);
+	visibility = tracker_icon_config_get_visibility (priv->config);
 
-	if (priv->current_status == status) {
+	if (priv->current_status == status &&
+	    priv->current_visibility == visibility) {
+		return;
+	}
+
+	priv->current_status = status;
+	priv->current_visibility = visibility;
+
+	if (visibility == TRACKER_SHOW_NEVER) {
+		gtk_menu_popdown (GTK_MENU (priv->miner_menu));
+		gtk_status_icon_set_visible (GTK_STATUS_ICON (icon), FALSE);
 		return;
 	}
 
 	switch (status) {
 	case STATUS_IDLE:
 		animate_indexing (icon, FALSE);
+
+		gtk_status_icon_set_visible (GTK_STATUS_ICON (icon),
+					     (visibility == TRACKER_SHOW_ALWAYS));
+
 		gtk_status_icon_set_from_pixbuf (GTK_STATUS_ICON (icon),
 						 priv->icons [ICON_IDLE]);
 		break;
@@ -818,14 +856,13 @@ status_icon_set_status (TrackerStatusIcon *icon,
 						 priv->icons [ICON_PAUSED]);
 		break;
 	case STATUS_INDEXING:
+		gtk_status_icon_set_visible (GTK_STATUS_ICON (icon), TRUE);
 		animate_indexing (icon, TRUE);
 		break;
 	default:
 		g_critical ("Unknown status '%d'", status);
 		g_assert_not_reached ();
 	}
-
-	priv->current_status = status;
 }
 
 GtkStatusIcon *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]