[tracker] TrackerStatusIcon: Add config to tweak status icon visibility.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] TrackerStatusIcon: Add config to tweak status icon visibility.
- Date: Thu, 15 Oct 2009 15:15:22 +0000 (UTC)
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]