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 * * 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 #include #include #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: =================================================== 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 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 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" };