aboutsummaryrefslogtreecommitdiff
path: root/libindicate/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'libindicate/server.c')
-rw-r--r--libindicate/server.c108
1 files changed, 79 insertions, 29 deletions
diff --git a/libindicate/server.c b/libindicate/server.c
index 497debd..cd35871 100644
--- a/libindicate/server.c
+++ b/libindicate/server.c
@@ -27,6 +27,24 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
+/* Private area */
+typedef struct _IndicateServerPrivate IndicateServerPrivate;
+struct _IndicateServerPrivate
+{
+ gchar * path;
+ GSList * indicators;
+ gboolean visible;
+ guint current_id;
+
+ // TODO: Should have a more robust way to track this, but this'll work for now
+ guint num_hidden;
+};
+
+#define INDICATE_SERVER_GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATE_TYPE_SERVER, IndicateServerPrivate))
+
+
+/* Define Type */
G_DEFINE_TYPE (IndicateServer, indicate_server, G_TYPE_OBJECT);
/* Prototypes */
@@ -50,6 +68,8 @@ indicate_server_class_init (IndicateServerClass * class)
GObjectClass * gobj;
gobj = G_OBJECT_CLASS(class);
+ g_type_class_add_private (class, sizeof (IndicateServerPrivate));
+
gobj->finalize = indicate_server_finalize;
signals[INDICATOR_ADDED] = g_signal_new("indicator-added",
@@ -96,11 +116,13 @@ indicate_server_init (IndicateServer * server)
{
g_debug("Server Object Initialized");
- server->path = g_strdup("/org/freedesktop/indicate");
- server->indicators = NULL;
- server->num_hidden = 0;
- server->visible = FALSE;
- server->current_id = 0;
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
+ priv->path = g_strdup("/org/freedesktop/indicate");
+ priv->indicators = NULL;
+ priv->num_hidden = 0;
+ priv->visible = FALSE;
+ priv->current_id = 0;
return;
}
@@ -109,9 +131,10 @@ static void
indicate_server_finalize (GObject * obj)
{
IndicateServer * server = INDICATE_SERVER(obj);
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
- if (server->path) {
- g_free(server->path);
+ if (priv->path) {
+ g_free(priv->path);
}
return;
@@ -132,8 +155,9 @@ void
indicate_server_show (IndicateServer * server)
{
g_return_if_fail(INDICATE_IS_SERVER(server));
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
- if (server->visible)
+ if (priv->visible)
return;
DBusGConnection * connection;
@@ -141,9 +165,9 @@ indicate_server_show (IndicateServer * server)
connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
dbus_g_connection_register_g_object(connection,
- server->path,
+ priv->path,
G_OBJECT(server));
- server->visible = TRUE;
+ priv->visible = TRUE;
return;
}
@@ -151,14 +175,16 @@ indicate_server_show (IndicateServer * server)
static guint
get_next_id (IndicateServer * server)
{
- server->current_id++;
- return server->current_id;
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+ priv->current_id++;
+ return priv->current_id;
}
static void
indicator_show_cb (IndicateIndicator * indicator, IndicateServer * server)
{
- server->num_hidden--;
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+ priv->num_hidden--;
g_signal_emit(server, signals[INDICATOR_ADDED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE);
return;
}
@@ -166,25 +192,35 @@ indicator_show_cb (IndicateIndicator * indicator, IndicateServer * server)
static void
indicator_hide_cb (IndicateIndicator * indicator, IndicateServer * server)
{
- server->num_hidden++;
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+ priv->num_hidden++;
g_signal_emit(server, signals[INDICATOR_REMOVED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE);
return;
}
+static void
+indicator_modified_cb (IndicateIndicator * indicator, gchar * property, IndicateServer * server)
+{
+ g_signal_emit(server, signals[INDICATOR_MODIFIED], 0, indicate_indicator_get_id(indicator), property, TRUE);
+}
+
void
indicate_server_add_indicator (IndicateServer * server, IndicateIndicator * indicator)
{
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
g_object_ref(indicator);
- server->indicators = g_slist_prepend(server->indicators, indicator);
+ priv->indicators = g_slist_prepend(priv->indicators, indicator);
if (!indicate_indicator_is_visible(indicator)) {
- server->num_hidden++;
+ priv->num_hidden++;
} else {
g_signal_emit(server, signals[INDICATOR_ADDED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE);
}
g_signal_connect(indicator, INDICATE_INDICATOR_SIGNAL_SHOW, G_CALLBACK(indicator_show_cb), server);
g_signal_connect(indicator, INDICATE_INDICATOR_SIGNAL_HIDE, G_CALLBACK(indicator_hide_cb), server);
+ g_signal_connect(indicator, INDICATE_INDICATOR_SIGNAL_MODIFIED, G_CALLBACK(indicator_modified_cb), server);
return;
}
@@ -192,15 +228,18 @@ indicate_server_add_indicator (IndicateServer * server, IndicateIndicator * indi
void
indicate_server_remove_indicator (IndicateServer * server, IndicateIndicator * indicator)
{
- server->indicators = g_slist_remove(server->indicators, indicator);
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
+ priv->indicators = g_slist_remove(priv->indicators, indicator);
if (indicate_indicator_is_visible(indicator)) {
g_signal_emit(server, signals[INDICATOR_REMOVED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE);
} else {
- server->num_hidden--;
+ priv->num_hidden--;
}
g_signal_handlers_disconnect_by_func(indicator, indicator_show_cb, server);
g_signal_handlers_disconnect_by_func(indicator, indicator_hide_cb, server);
+ g_signal_handlers_disconnect_by_func(indicator, indicator_modified_cb, server);
g_object_unref(indicator);
return;
@@ -241,9 +280,11 @@ indicate_server_set_default (IndicateServer * server)
static gboolean
get_desktop (IndicateServer * server, gchar ** desktop_path, GError **error)
{
- if (server->path != NULL) {
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
+ if (priv->path != NULL) {
// TODO: This might be a memory leak, check into that.
- *desktop_path = g_strdup(server->path);
+ *desktop_path = g_strdup(priv->path);
}
return TRUE;
}
@@ -251,11 +292,13 @@ get_desktop (IndicateServer * server, gchar ** desktop_path, GError **error)
static gboolean
get_indicator_count (IndicateServer * server, guint * count, GError **error)
{
- guint lstcnt = g_slist_length(server->indicators);
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
- g_return_val_if_fail(server->num_hidden < lstcnt, TRUE);
+ guint lstcnt = g_slist_length(priv->indicators);
+
+ g_return_val_if_fail(priv->num_hidden < lstcnt, TRUE);
- *count = lstcnt - server->num_hidden;
+ *count = lstcnt - priv->num_hidden;
return TRUE;
}
@@ -300,7 +343,9 @@ get_indicator_count_by_type (IndicateServer * server, gchar * type, guint * coun
cbt.type = NULL;
}
- g_slist_foreach(server->indicators, (GFunc)count_by_type, &cbt);
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
+ g_slist_foreach(priv->indicators, (GFunc)count_by_type, &cbt);
*count = cbt.count;
return TRUE;
@@ -314,11 +359,13 @@ get_indicator_list (IndicateServer * server, GArray ** indicators, GError ** err
IndicateServerClass * class = INDICATE_SERVER_GET_CLASS(server);
g_return_val_if_fail(class->get_indicator_count != NULL, TRUE);
- *indicators = g_array_sized_new(FALSE, FALSE, sizeof(guint), g_slist_length(server->indicators) - server->num_hidden);
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
+ *indicators = g_array_sized_new(FALSE, FALSE, sizeof(guint), g_slist_length(priv->indicators) - priv->num_hidden);
GSList * iter;
int i;
- for (iter = server->indicators, i = 0; iter != NULL; iter = iter->next, i++) {
+ for (iter = priv->indicators, i = 0; iter != NULL; iter = iter->next, i++) {
IndicateIndicator * indicator = INDICATE_INDICATOR(iter->data);
if (indicate_indicator_is_visible(indicator)) {
guint id = indicate_indicator_get_id(indicator);
@@ -341,13 +388,15 @@ get_indicator_list_by_type (IndicateServer * server, gchar * type, guint ** indi
type = NULL;
}
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
+
/* Can't be larger than this and it's not worth the reallocation
for the small number we have. The memory isn't worth the time. */
- *indicators = g_array_sized_new(FALSE, FALSE, sizeof(guint), g_slist_length(server->indicators) - server->num_hidden);
+ *indicators = g_array_sized_new(FALSE, FALSE, sizeof(guint), g_slist_length(priv->indicators) - priv->num_hidden);
GSList * iter;
int i;
- for (iter = server->indicators, i = 0; iter != NULL; iter = iter->next) {
+ for (iter = priv->indicators, i = 0; iter != NULL; iter = iter->next) {
IndicateIndicator * indicator = INDICATE_INDICATOR(iter->data);
if (indicate_indicator_is_visible(indicator)) {
const gchar * itype = indicate_indicator_get_indicator_type(indicator);
@@ -369,9 +418,10 @@ static IndicateIndicator *
get_indicator (IndicateServer * server, guint id, GError **error)
{
g_return_val_if_fail(INDICATE_IS_SERVER(server), NULL);
+ IndicateServerPrivate * priv = INDICATE_SERVER_GET_PRIVATE(server);
GSList * iter;
- for (iter = server->indicators; iter != NULL; iter = iter->next) {
+ for (iter = priv->indicators; iter != NULL; iter = iter->next) {
IndicateIndicator * indicator = INDICATE_INDICATOR(iter->data);
if (indicate_indicator_get_id(indicator) == id) {
return indicator;