rendered paste body There is a comment to show what I added. Not how it is exactly the same as settings_daemon_awake -
a function with no in or output
/*
* gnome-settings-dbus.c
*
* Copyright (C) 2007 Jan Arne Petersen <jap@gnome.org>
*
* This program 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 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#include <string.h>
#include <dbus/dbus-glib-bindings.h>
#include <gnome-settings-daemon.h>
#include "gnome-settings-marshal.h"
#include "gnome-settings-dbus.h"
#include "gnome-settings-display-config.h"
static GObjectClass *parent_class = NULL;
typedef struct GnomeSettingsServer GnomeSettingsServer;
typedef struct GnomeSettingsServerClass GnomeSettingsServerClass;
struct GnomeSettingsServer {
GObject parent;
/* multimedia player keys */
GList *media_players;
};
struct GnomeSettingsServerClass {
GObjectClass parent;
DBusGConnection *connection;
void (*media_player_key_pressed) (GObject *server, const gchar *application, const gchar *key);
};
enum {
MEDIA_PLAYER_KEY_PRESSED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
typedef struct {
gchar *application;
guint32 time;
} MediaPlayer;
#define GNOME_SETTINGS_TYPE_SERVER (gnome_settings_server_get_type ())
#define GNOME_SETTINGS_SERVER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GNOME_SETTINGS_TYPE_SERVER, GnomeSettingsServer))
#define GNOME_SETTINGS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_SETTINGS_TYPE_SERVER, GnomeSettingsServerClass))
#define GNOME_SETTINGS_IS_SERVER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GNOME_SETTINGS_TYPE_SERVER))
#define GNOME_SETTINGS_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_SETTINGS_TYPE_SERVER))
#define GNOME_SETTINGS_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_SETTINGS_TYPE_SERVER, GnomeSettingsServerClass))
static gint
find_by_application (gconstpointer a, gconstpointer b)
{
return strcmp (((MediaPlayer *)a)->application, b);
}
static gint
find_by_time (gconstpointer a, gconstpointer b)
{
return ((MediaPlayer *)a)->time != 0 && ((MediaPlayer *)a)->time < ((MediaPlayer *)b)->time;
}
static gboolean
settings_daemon_grab_media_player_keys (GnomeSettingsServer *server, const gchar *application, guint32 time, GError **error)
{
GList *iter;
MediaPlayer *media_player;
iter = g_list_find_custom (server->media_players, application, find_by_application);
if (iter != NULL) {
if (time == 0 || ((MediaPlayer *)iter->data)->time < time) {
g_free (((MediaPlayer *)iter->data)->application);
g_free (iter->data);
server->media_players = g_list_delete_link (server->media_players, iter);
} else {
return TRUE;
}
}
media_player = g_new0 (MediaPlayer, 1);
media_player->application = g_strdup (application);
media_player->time = time;
server->media_players = g_list_insert_sorted (server->media_players, media_player, find_by_time);
return TRUE;
}
static gboolean
settings_daemon_release_media_player_keys (GnomeSettingsServer *server, const gchar *application, GError **error)
{
GList *iter;
iter = g_list_find_custom (server->media_players, application, find_by_application);
if (iter != NULL) {
g_free (((MediaPlayer *)iter->data)->application);
g_free (iter->data);
server->media_players = g_list_delete_link (server->media_players, iter);
}
return TRUE;
}
static gboolean
settings_daemon_awake (GObject * object, GError ** error)
{
return TRUE;
}
G_DEFINE_TYPE (GnomeSettingsServer, gnome_settings_server, G_TYPE_OBJECT)
#include "gnome-settings-server.h"
GObject *
gnome_settings_server_get (void)
{
return g_object_new (GNOME_SETTINGS_TYPE_SERVER, NULL);
}
gboolean
gnome_settings_server_media_player_key_pressed (GObject *server, const gchar *key)
{
const gchar *application = NULL;
gboolean have_listeners = (GNOME_SETTINGS_SERVER (server)->media_players != NULL);
if (have_listeners) {
application = ((MediaPlayer *)GNOME_SETTINGS_SERVER (server)->media_players->data)->application;
}
g_signal_emit (server, signals[MEDIA_PLAYER_KEY_PRESSED], 0, application, key);
return !have_listeners;
}
/* Added by Pascal Schoenhardt for gnome-settings-display-config */
static gboolean
settings_daemon_method_test (GObject * object, GError ** error)
{
method_test();
return TRUE;
}
/* End addition */
static GObject*
gnome_settings_server_constructor (GType type,
guint n_construct_params,
GObjectConstructParam *construct_params)
{
static GObject *singleton = NULL;
GObject *object;
if (!singleton) {
singleton = G_OBJECT_CLASS (parent_class)->constructor (type, n_construct_params, construct_params);
object = singleton;
} else {
object = g_object_ref (singleton);
}
return object;
}
static void
gnome_settings_server_class_init (GnomeSettingsServerClass * klass)
{
GError *error = NULL;
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->constructor = gnome_settings_server_constructor;
signals[MEDIA_PLAYER_KEY_PRESSED] = g_signal_new ("media-player-key-pressed",
G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GnomeSettingsServerClass, media_player_key_pressed),
NULL, NULL, gnome_settings_marshal_VOID__STRING_STRING, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
/* Init the DBus connection, per-klass */
klass->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
if (klass->connection == NULL) {
g_warning ("Unable to connect to dbus: %s",
error->message);
g_error_free (error);
return;
}
/* &dbus_glib__object_info is provided in the server-bindings.h file */
dbus_g_object_type_install_info (GNOME_SETTINGS_TYPE_SERVER,
&dbus_glib_settings_daemon_object_info);
}
static void
gnome_settings_server_init (GnomeSettingsServer * server)
{
GError *error = NULL;
DBusGProxy *driver_proxy;
GnomeSettingsServerClass *klass =
GNOME_SETTINGS_SERVER_GET_CLASS (server);
unsigned request_ret;
if (klass->connection == NULL)
return;
/* Register DBUS path */
dbus_g_connection_register_g_object (klass->connection,
"/org/gnome/SettingsDaemon",
G_OBJECT (server));
/* Register the service name, the constant here are defined in dbus-glib-bindings.h */
driver_proxy = dbus_g_proxy_new_for_name (klass->connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
if (!org_freedesktop_DBus_request_name
(driver_proxy, "org.gnome.SettingsDaemon", 0, &request_ret,
&error)) {
if (error) {
g_warning ("Unable to register service: %s",
error->message);
g_error_free (error);
} else {
g_warning ("Unable to register service: Unknown DBUS error");
}
}
g_object_unref (driver_proxy);
}
Here is the XML file that generates the bindings:
===================================================
<?xml version="1.0" encoding="UTF-8"?>
<node name="/org/gnome/SettingsDaemon">
<interface name="org.gnome.SettingsDaemon">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="settings_daemon"/>
<method name="Awake"/>
<method name="GrabMediaPlayerKeys">
<arg type="s" name="application" direction="in"/>
<arg type="u" name="time" direction="in"/>
</method>
<method name="ReleaseMediaPlayerKeys">
<arg type="s" name="application" direction="in"/>
</method>
<signal name="MediaPlayerKeyPressed"/>
<method name="MethodTest"/>
</interface>
</node>
Again, similarity between MethodTest and Awake
The generated header file
==========================
/* Generated by dbus-binding-tool; do not edit! */
#ifndef __dbus_glib_marshal_settings_daemon_MARSHAL_H__
#define __dbus_glib_marshal_settings_daemon_MARSHAL_H__
#include <glib-object.h>
G_BEGIN_DECLS
#ifdef G_ENABLE_DEBUG
#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
#define g_marshal_value_peek_char(v) g_value_get_char (v)
#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
#define g_marshal_value_peek_int(v) g_value_get_int (v)
#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
#define g_marshal_value_peek_long(v) g_value_get_long (v)
#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
#define g_marshal_value_peek_float(v) g_value_get_float (v)
#define g_marshal_value_peek_double(v) g_value_get_double (v)
#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
#define g_marshal_value_peek_param(v) g_value_get_param (v)
#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
#define g_marshal_value_peek_object(v) g_value_get_object (v)
#else /* !G_ENABLE_DEBUG */
/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
* Do not access GValues directly in your code. Instead, use the
* g_value_get_*() functions
*/
#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
#define g_marshal_value_peek_char(v) (v)->data[0].v_int
#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
#define g_marshal_value_peek_int(v) (v)->data[0].v_int
#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
#define g_marshal_value_peek_long(v) (v)->data[0].v_long
#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
#define g_marshal_value_peek_float(v) (v)->data[0].v_float
#define g_marshal_value_peek_double(v) (v)->data[0].v_double
#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
#endif /* !G_ENABLE_DEBUG */
/* BOOLEAN:STRING,UINT,POINTER (/tmp/dbus-binding-tool-c-marshallers.SVQVUT:1) */
extern void dbus_glib_marshal_settings_daemon_BOOLEAN__STRING_UINT_POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data);
void
dbus_glib_marshal_settings_daemon_BOOLEAN__STRING_UINT_POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data)
{
typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_UINT_POINTER) (gpointer data1,
gpointer arg_1,
guint arg_2,
gpointer arg_3,
gpointer data2);
register GMarshalFunc_BOOLEAN__STRING_UINT_POINTER callback;
register GCClosure *cc = (GCClosure*) closure;
register gpointer data1, data2;
gboolean v_return;
g_return_if_fail (return_value != NULL);
g_return_if_fail (n_param_values == 4);
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_BOOLEAN__STRING_UINT_POINTER) (marshal_data ? marshal_data : cc->callback);
v_return = callback (data1,
g_marshal_value_peek_string (param_values + 1),
g_marshal_value_peek_uint (param_values + 2),
g_marshal_value_peek_pointer (param_values + 3),
data2);
g_value_set_boolean (return_value, v_return);
}
/* BOOLEAN:STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.SVQVUT:2) */
extern void dbus_glib_marshal_settings_daemon_BOOLEAN__STRING_POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data);
void
dbus_glib_marshal_settings_daemon_BOOLEAN__STRING_POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data)
{
typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_POINTER) (gpointer data1,
gpointer arg_1,
gpointer arg_2,
gpointer data2);
register GMarshalFunc_BOOLEAN__STRING_POINTER callback;
register GCClosure *cc = (GCClosure*) closure;
register gpointer data1, data2;
gboolean v_return;
g_return_if_fail (return_value != NULL);
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_BOOLEAN__STRING_POINTER) (marshal_data ? marshal_data : cc->callback);
v_return = callback (data1,
g_marshal_value_peek_string (param_values + 1),
g_marshal_value_peek_pointer (param_values + 2),
data2);
g_value_set_boolean (return_value, v_return);
}
/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.SVQVUT:3) */
extern void dbus_glib_marshal_settings_daemon_BOOLEAN__POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data);
void
dbus_glib_marshal_settings_daemon_BOOLEAN__POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
const GValue *param_values,
gpointer invocation_hint,
gpointer marshal_data)
{
typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1,
gpointer arg_1,
gpointer data2);
register GMarshalFunc_BOOLEAN__POINTER callback;
register GCClosure *cc = (GCClosure*) closure;
register gpointer data1, data2;
gboolean v_return;
g_return_if_fail (return_value != NULL);
g_return_if_fail (n_param_values == 2);
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_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback);
v_return = callback (data1,
g_marshal_value_peek_pointer (param_values + 1),
data2);
g_value_set_boolean (return_value, v_return);
}
G_END_DECLS
#endif /* __dbus_glib_marshal_settings_daemon_MARSHAL_H__ */
#include <dbus/dbus-glib.h>
static const DBusGMethodInfo dbus_glib_settings_daemon_methods[] = {
{ (GCallback) settings_daemon_awake, dbus_glib_marshal_settings_daemon_BOOLEAN__POINTER, 0 },
{ (GCallback) settings_daemon_grab_media_player_keys, dbus_glib_marshal_settings_daemon_BOOLEAN__STRING_UINT_POINTER, 34 },
{ (GCallback) settings_daemon_release_media_player_keys, dbus_glib_marshal_settings_daemon_BOOLEAN__STRING_POINTER, 107 },
{ (GCallback) settings_daemon_method_test, dbus_glib_marshal_settings_daemon_BOOLEAN__POINTER, 174 },
};
const DBusGObjectInfo dbus_glib_settings_daemon_object_info = {
0,
dbus_glib_settings_daemon_methods,
4,
"org.gnome.SettingsDaemon\0Awake\0S\0\0org.gnome.SettingsDaemon\0GrabMediaPlayerKeys\0S\0application\0I\0s\0time\0I\0u\0\0org.gnome.SettingsDaemon\0ReleaseMediaPlayerKeys\0S\0application\0I\0s\0\0org.gnome.SettingsDaemon\0MethodTest\0S\0\0\0",
"org.gnome.SettingsDaemon\0MediaPlayerKeyPressed\0\0",
"\0"
};