aboutsummaryrefslogtreecommitdiff
path: root/libindicator
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2013-06-28 14:30:33 -0400
committerLars Uebernickel <lars.uebernickel@canonical.com>2013-06-28 14:30:33 -0400
commite744e385675fb948ffd888668c22ea93c706e1fa (patch)
tree9307463becafe5928be717262bd30a2bbdc8bb49 /libindicator
parent3470db7e3e7df1c4490f9faa3eb2df7df9a630eb (diff)
downloadlibayatana-indicator-e744e385675fb948ffd888668c22ea93c706e1fa.tar.gz
libayatana-indicator-e744e385675fb948ffd888668c22ea93c706e1fa.tar.bz2
libayatana-indicator-e744e385675fb948ffd888668c22ea93c706e1fa.zip
Allow indicators to tell the panel where they want to appear
Only implemented in IndicatorNg right now, which gets that information from the indicator file.
Diffstat (limited to 'libindicator')
-rw-r--r--libindicator/indicator-ng.c35
-rw-r--r--libindicator/indicator-object.c18
-rw-r--r--libindicator/indicator-object.h5
3 files changed, 57 insertions, 1 deletions
diff --git a/libindicator/indicator-ng.c b/libindicator/indicator-ng.c
index b372e2e..d8ac840 100644
--- a/libindicator/indicator-ng.c
+++ b/libindicator/indicator-ng.c
@@ -33,6 +33,7 @@ struct _IndicatorNg
gchar *bus_name;
gchar *profile;
gchar *header_action;
+ gint position;
guint name_watch_id;
@@ -169,6 +170,14 @@ indicator_ng_get_entries (IndicatorObject *io)
return g_list_append (NULL, &self->entry);
}
+static gint
+indicator_ng_get_position (IndicatorObject *io)
+{
+ IndicatorNg *self = INDICATOR_NG (io);
+
+ return self->position;
+}
+
static void
indicator_ng_set_accessible_desc (IndicatorNg *self,
const gchar *accessible_desc)
@@ -458,6 +467,27 @@ indicator_ng_service_vanished (GDBusConnection *connection,
}
}
+/* Get an integer from a keyfile. Returns @default_value if the key
+ * doesn't exist exists or is not an integer */
+static gint
+g_key_file_maybe_get_integer (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ gint default_value)
+{
+ GError *error = NULL;
+ gint i;
+
+ i = g_key_file_get_integer (keyfile, group, key, &error);
+ if (error)
+ {
+ g_error_free (error);
+ return default_value;
+ }
+
+ return i;
+}
+
static gboolean
indicator_ng_load_from_keyfile (IndicatorNg *self,
GKeyFile *keyfile,
@@ -475,6 +505,8 @@ indicator_ng_load_from_keyfile (IndicatorNg *self,
if (self->object_path == NULL)
return FALSE;
+ self->position = g_key_file_maybe_get_integer (keyfile, "Indicator Service", "Position", -1);
+
/*
* Don't throw an error when the profile doesn't exist. Non-existant
* profiles are silently ignored by not showing an indicator at all.
@@ -537,6 +569,7 @@ indicator_ng_class_init (IndicatorNgClass *class)
object_class->finalize = indicator_ng_finalize;
io_class->get_entries = indicator_ng_get_entries;
+ io_class->get_position = indicator_ng_get_position;
properties[PROP_SERVICE_FILE] = g_param_spec_string ("service-file",
"Service file",
@@ -575,6 +608,8 @@ indicator_ng_init (IndicatorNg *self)
self->accessible_desc = g_strdup ("");
self->entry.accessible_desc = self->accessible_desc;
+ self->position = -1;
+
indicator_object_set_visible (INDICATOR_OBJECT (self), FALSE);
}
diff --git a/libindicator/indicator-object.c b/libindicator/indicator-object.c
index 30a6543..1a4ed17 100644
--- a/libindicator/indicator-object.c
+++ b/libindicator/indicator-object.c
@@ -115,6 +115,7 @@ static GList * get_entries_default (IndicatorObject*);
static GList * get_all_entries (IndicatorObject*);
static void indicator_object_entry_being_removed (IndicatorObject*, IndicatorObjectEntry*);
static void indicator_object_entry_was_added (IndicatorObject*, IndicatorObjectEntry*);
+static gint indicator_object_real_get_position (IndicatorObject*);
static IndicatorObjectEntryPrivate * entry_get_private (IndicatorObject*, IndicatorObjectEntry*);
G_DEFINE_TYPE (IndicatorObject, indicator_object, G_TYPE_OBJECT);
@@ -141,6 +142,7 @@ indicator_object_class_init (IndicatorObjectClass *klass)
klass->get_location = NULL;
klass->entry_being_removed = NULL;
klass->entry_was_added = NULL;
+ klass->get_position = indicator_object_real_get_position;
klass->entry_activate = NULL;
klass->entry_activate_window = NULL;
@@ -778,6 +780,14 @@ indicator_object_entry_was_added (IndicatorObject * io, IndicatorObjectEntry * e
}
}
+static gint
+indicator_object_real_get_position (IndicatorObject *io)
+{
+ g_return_if_fail (INDICATOR_IS_OBJECT (io));
+
+ return -1;
+}
+
/**
indicator_object_set_environment:
@io: #IndicatorObject to set on
@@ -942,3 +952,11 @@ indicator_object_entry_is_visible (IndicatorObject * io, IndicatorObjectEntry *
return entry_get_private (io, entry)->visibility == ENTRY_VISIBLE;
}
+
+gint
+indicator_object_get_position (IndicatorObject *io)
+{
+ g_return_val_if_fail (INDICATOR_IS_OBJECT (io), FALSE);
+
+ return INDICATOR_OBJECT_GET_CLASS (io)->get_position (io);
+}
diff --git a/libindicator/indicator-object.h b/libindicator/indicator-object.h
index 3c1a203..5c8de4b 100644
--- a/libindicator/indicator-object.h
+++ b/libindicator/indicator-object.h
@@ -111,6 +111,7 @@ typedef struct _IndicatorObjectEntry IndicatorObjectEntry;
@show_now_changed: Slot for #IndicatorObject::show-now-changed
@accessible_desc_update: Slot for #IndicatorObject::accessible-desc-update
@secondary_activate: Slot for #IndicatorObject::secondary-activate
+ @get_position: returns the desired position on the panel (0 is right-most), or -1
*/
struct _IndicatorObjectClass {
GObjectClass parent_class;
@@ -143,12 +144,13 @@ struct _IndicatorObjectClass {
void (*accessible_desc_update) (IndicatorObject * io, IndicatorObjectEntry * entry, gpointer user_data);
void (*secondary_activate) (IndicatorObject * io, IndicatorObjectEntry * entry, guint timestamp, gpointer user_data);
+ gint (*get_position) (IndicatorObject *io);
+
/* Reserved */
void (*reserved1) (void);
void (*reserved2) (void);
void (*reserved3) (void);
void (*reserved4) (void);
- void (*reserved5) (void);
};
/**
@@ -203,6 +205,7 @@ gboolean indicator_object_entry_is_visible (IndicatorObject * io, IndicatorObjec
void indicator_object_entry_activate (IndicatorObject * io, IndicatorObjectEntry * entry, guint timestamp);
void indicator_object_entry_activate_window (IndicatorObject * io, IndicatorObjectEntry * entry, guint windowid, guint timestamp);
void indicator_object_entry_close (IndicatorObject * io, IndicatorObjectEntry * entry, guint timestamp);
+gint indicator_object_get_position (IndicatorObject *io);
void indicator_object_set_environment (IndicatorObject * io, GStrv env);
GStrv indicator_object_get_environment (IndicatorObject * io);