* libnotify/notifymarshal.[c|h]: new files where GLib callback

marshalers are added

* libnotify/notifynotification.ci (notify_notifiaction_init): Add a
  marshaller for signals with uint, string parameters
  (_gslist_to_string_array): new internal method that coverts
  a GSList to a NULL terminated array of strings
  (_notify_notification_show_internal): send the actions list as an
  array of strings, not a GSList which does not work with the bindings

* libnotify/Makefile.am: notifymarshal.[c|h] added

* tests/test-multi-actions.c: working example of using actions
This commit is contained in:
John (J5) Palmieri 2005-12-09 19:35:13 +00:00
parent 0e3f35c15e
commit aaf003b590
5 changed files with 151 additions and 14 deletions

View File

@ -5,12 +5,14 @@ lib_LTLIBRARIES = libnotify.la
notifyinc_HEADERS = \
notify.h \
notifynotification.h \
notifycommon.h
notifycommon.h \
notifymarshal.h
libnotify_la_SOURCES = \
dbus-compat.h \
notify.c \
notifynotification.c
notifynotification.c \
notifymarshal.c
libnotify_la_LIBADD = \
$(PACKAGE_LIBS)

View File

@ -58,7 +58,8 @@ libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
am__DEPENDENCIES_1 =
libnotify_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_libnotify_la_OBJECTS = notify.lo notifynotification.lo
am_libnotify_la_OBJECTS = notify.lo notifynotification.lo \
notifymarshal.lo
libnotify_la_OBJECTS = $(am_libnotify_la_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
@ -191,12 +192,14 @@ lib_LTLIBRARIES = libnotify.la
notifyinc_HEADERS = \
notify.h \
notifynotification.h \
notifycommon.h
notifycommon.h \
notifymarshal.h
libnotify_la_SOURCES = \
dbus-compat.h \
notify.c \
notifynotification.c
notifynotification.c \
notifymarshal.c
libnotify_la_LIBADD = \
$(PACKAGE_LIBS)
@ -277,6 +280,7 @@ distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notify.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notifymarshal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notifynotification.Plo@am__quote@
.c.o:

56
libnotify/notifymarshal.c Normal file
View File

@ -0,0 +1,56 @@
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This program 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with main.c; if not, write to:
* The Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "notifymarshal.h"
void
_notify_marshal_VOID__UINT_STRING (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data)
{
typedef void (*GMarshalFunc_VOID__UINT_STRING) (gpointer data1,
gpointer arg_1,
gpointer arg_2,
gpointer data2);
register GMarshalFunc_VOID__UINT_STRING callback;
register GCClosure *cc = (GCClosure*) closure;
register gpointer data1, data2;
g_return_if_fail (n_param_values == 3);
if (G_CCLOSURE_SWAP_DATA (closure))
{
data1 = closure->data;
data2 = g_value_peek_pointer (param_values + 0);
}
else
{
data1 = g_value_peek_pointer (param_values + 0);
data2 = closure->data;
}
callback = (GMarshalFunc_VOID__UINT_STRING) (marshal_data ? marshal_data : cc->callback);
callback (data1,
g_value_get_uint (param_values + 1),
g_value_get_string (param_values + 2),
data2);
}

36
libnotify/notifymarshal.h Normal file
View File

@ -0,0 +1,36 @@
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This program 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with main.c; if not, write to:
* The Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __notify_marshal_MARSHAL_H__
#define __notify_marshal_MARSHAL_H__
#include <glib-object.h>
G_BEGIN_DECLS
void
_notify_marshal_VOID__UINT_STRING (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data);
G_END_DECLS
#endif

View File

@ -21,6 +21,7 @@
#include "notify.h"
#include "notifynotification.h"
#include "notifymarshal.h"
static void notify_notification_class_init (NotifyNotificationClass * klass);
static void notify_notification_init (NotifyNotification * sp);
@ -124,6 +125,13 @@ notify_notification_class_init (NotifyNotificationClass * klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
dbus_g_object_register_marshaller (_notify_marshal_VOID__UINT_STRING,
G_TYPE_NONE,
G_TYPE_UINT,
G_TYPE_STRING,
G_TYPE_INVALID);
}
static void
@ -167,6 +175,7 @@ notify_notification_init (NotifyNotification * obj)
obj->priv->widget_old_y = 0;
obj->priv->proxy = NULL;
}
static void
@ -417,9 +426,6 @@ _action_signal_handler (DBusGProxy *proxy,
{
g_assert (NOTIFY_IS_NOTIFICATION (notification));
printf ("Got the ActionInvoked signal for action %s (id = %i, notification->id = %i)\n",
action, id, notification->priv->id);
if (id == notification->priv->id)
{
NotifyActionCallback callback;
@ -435,6 +441,31 @@ _action_signal_handler (DBusGProxy *proxy,
}
}
static gchar **
_gslist_to_string_array (GSList *list)
{
GSList *element;
GArray *a;
gsize len;
gchar **result;
len = g_slist_length (list);
a = g_array_sized_new (TRUE, FALSE, sizeof (gchar *), len);
element = list;
while (element != NULL)
{
g_array_append_val (a, element->data);
element = g_slist_next (element);
}
result = (gchar **)g_array_free (a, FALSE);
return result;
}
static gboolean
_notify_notification_show_internal (NotifyNotification *notification,
GError **error,
@ -442,6 +473,8 @@ _notify_notification_show_internal (NotifyNotification *notification,
{
NotifyNotificationPrivate *priv;
GError *tmp_error;
gchar **action_array;
int i;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@ -466,13 +499,13 @@ _notify_notification_show_internal (NotifyNotification *notification,
NOTIFY_DBUS_CORE_INTERFACE);
dbus_g_proxy_add_signal (priv->proxy, "NotificationClosed",
G_TYPE_UINT, NULL);
G_TYPE_UINT, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "NotificationClosed",
(GCallback) _close_signal_handler,
notification, NULL);
dbus_g_proxy_add_signal (priv->proxy, "ActionInvoked",
G_TYPE_UINT, G_TYPE_STRING, NULL);
G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "ActionInvoked",
(GCallback) _action_signal_handler,
notification, NULL);
@ -484,6 +517,8 @@ _notify_notification_show_internal (NotifyNotification *notification,
/*if attached to a widget modify x and y in hints */
_notify_notification_update_applet_hints (notification);
action_array = _gslist_to_string_array (priv->actions);
/*TODO: make this nonblocking */
if (!ignore_reply)
dbus_g_proxy_call (priv->proxy, "Notify", &tmp_error,
@ -492,8 +527,8 @@ _notify_notification_show_internal (NotifyNotification *notification,
(priv->icon_name != NULL) ? priv->icon_name : "",
G_TYPE_UINT, priv->id, G_TYPE_STRING, priv->summary,
G_TYPE_STRING, priv->message,
dbus_g_type_get_collection ("GSList", G_TYPE_STRING),
priv->actions, dbus_g_type_get_map ("GHashTable",
G_TYPE_STRV,
action_array, dbus_g_type_get_map ("GHashTable",
G_TYPE_STRING,
G_TYPE_VALUE),
priv->hints, G_TYPE_INT, priv->timeout, G_TYPE_INVALID,
@ -505,12 +540,16 @@ _notify_notification_show_internal (NotifyNotification *notification,
(priv->icon_name != NULL) ? priv->icon_name : "",
G_TYPE_UINT, priv->id, G_TYPE_STRING, priv->summary,
G_TYPE_STRING, priv->message,
dbus_g_type_get_collection ("GSList", G_TYPE_STRING),
priv->actions, dbus_g_type_get_map ("GHashTable",
G_TYPE_STRV,
action_array, dbus_g_type_get_map ("GHashTable",
G_TYPE_STRING,
G_TYPE_VALUE),
priv->hints, G_TYPE_INT, priv->timeout, G_TYPE_INVALID);
/*don't free the elements because they are owned by priv->actions */
g_free (action_array);
if (tmp_error != NULL)
{