Keep track of request IDs so that we can do callback stuff in a bit.

This commit is contained in:
Christian Hammond 2004-06-28 03:24:08 +00:00
parent eb30d19b88
commit 755f81fbe9
2 changed files with 63 additions and 6 deletions

View File

@ -1,3 +1,14 @@
Sun Jun 27 20:23:00 PDT 2004 Christian Hammond <chipx86@gnupdate.org>
* libnotify/notify.c:
- Keep track of request IDs so that we can do callback stuff in a bit.
Sun Jun 27 20:02:09 PDT 2004 Christian Hammond <chipx86@gnupdate.org>
* libnotify/notify.c:
- Send the list of button texts as a string array, rather than appending
each one individually.
Sun Jun 27 18:30:19 PDT 2004 Christian Hammond <chipx86@gnupdate.org> Sun Jun 27 18:30:19 PDT 2004 Christian Hammond <chipx86@gnupdate.org>
* libnotify/notify.c: * libnotify/notify.c:

View File

@ -35,11 +35,23 @@
#define NOTIFY_DBUS_CORE_INTERFACE "org.freedesktop.Notifications" #define NOTIFY_DBUS_CORE_INTERFACE "org.freedesktop.Notifications"
#define NOTIFY_DBUS_CORE_OBJECT "/org/freedesktop/Notifications" #define NOTIFY_DBUS_CORE_OBJECT "/org/freedesktop/Notifications"
typedef struct
{
guint32 id;
gpointer user_data;
size_t num_buttons;
char **texts;
NotifyCallback *cbs;
} NotifyRequestData;
static DBusConnection *_dbus_conn = NULL; static DBusConnection *_dbus_conn = NULL;
static gboolean _initted = FALSE; static gboolean _initted = FALSE;
static gboolean _filters_added = FALSE; static gboolean _filters_added = FALSE;
static guint32 _init_ref_count = 0; static guint32 _init_ref_count = 0;
static char *_app_name = NULL; static char *_app_name = NULL;
static GHashTable *_request_ids = NULL;
static DBusMessage * static DBusMessage *
_notify_dbus_message_new(const char *name, DBusMessageIter *iter) _notify_dbus_message_new(const char *name, DBusMessageIter *iter)
@ -186,6 +198,21 @@ _notify_disconnect(void)
dbus_connection_unref(_dbus_conn); dbus_connection_unref(_dbus_conn);
} }
static void
_destroy_request_data(gpointer data)
{
NotifyRequestData *request_data = (NotifyRequestData *)data;
size_t i;
for (i = 0; i < request_data->num_buttons; i++)
g_free(request_data->texts[i]);
g_free(request_data->texts);
g_free(request_data->cbs);
g_free(request_data);
}
gboolean gboolean
notify_init(const char *app_name) notify_init(const char *app_name)
{ {
@ -206,6 +233,9 @@ notify_init(const char *app_name)
_app_name = g_strdup(app_name); _app_name = g_strdup(app_name);
_request_ids = g_hash_table_new_full(g_int_hash, g_int_equal,
NULL, _destroy_request_data);
#ifdef HAVE_ATEXIT #ifdef HAVE_ATEXIT
atexit(notify_uninit); atexit(notify_uninit);
#endif /* HAVE_ATEXIT */ #endif /* HAVE_ATEXIT */
@ -231,6 +261,12 @@ notify_uninit(void)
_app_name = NULL; _app_name = NULL;
} }
if (_request_ids != NULL)
{
g_hash_table_destroy(_request_ids);
_request_ids = NULL;
}
_notify_disconnect(); _notify_disconnect();
} }
@ -365,7 +401,7 @@ _notify_send_request(NotifyUrgency urgency, const char *summary,
guint32 i; guint32 i;
char *text; char *text;
NotifyCallback cb; NotifyCallback cb;
char **array; NotifyRequestData *request_data;
message = _notify_dbus_message_new("SendRequest", &iter); message = _notify_dbus_message_new("SendRequest", &iter);
@ -384,21 +420,25 @@ _notify_send_request(NotifyUrgency urgency, const char *summary,
dbus_message_iter_append_uint32(&iter, timeout); dbus_message_iter_append_uint32(&iter, timeout);
dbus_message_iter_append_uint32(&iter, default_button); dbus_message_iter_append_uint32(&iter, default_button);
array = g_new0(char *, button_count); request_data = g_new0(NotifyRequestData, 1);
request_data->texts = g_new0(char *, button_count);
request_data->cbs = g_new0(NotifyCallback, button_count);
request_data->num_buttons = button_count;
for (i = 0; i < button_count; i++) for (i = 0; i < button_count; i++)
{ {
text = va_arg(buttons, char *); text = va_arg(buttons, char *);
cb = va_arg(buttons, NotifyCallback); cb = va_arg(buttons, NotifyCallback);
array[i] = text; request_data->texts[i] = text;
request_data->cbs[i] = cb;
} }
dbus_message_iter_append_string_array(&iter, (const char **)array, dbus_message_iter_append_string_array(&iter,
(const char **)request_data->texts,
button_count); button_count);
g_free(array);
dbus_error_init(&error); dbus_error_init(&error);
reply = dbus_connection_send_with_reply_and_block(_dbus_conn, message, reply = dbus_connection_send_with_reply_and_block(_dbus_conn, message,
@ -412,6 +452,8 @@ _notify_send_request(NotifyUrgency urgency, const char *summary,
error.message); error.message);
dbus_error_free(&error); dbus_error_free(&error);
_destroy_request_data(request_data);
return 0; return 0;
} }
@ -421,6 +463,10 @@ _notify_send_request(NotifyUrgency urgency, const char *summary,
dbus_message_unref(reply); dbus_message_unref(reply);
dbus_error_free(&error); dbus_error_free(&error);
request_data->id = id;
g_hash_table_insert(_request_ids, GINT_TO_POINTER(id), request_data);
return id; return id;
} }