diff options
Diffstat (limited to 'input')
| -rw-r--r-- | input/input-service.c | 36 | ||||
| -rw-r--r-- | input/input-service.h | 1 | ||||
| -rw-r--r-- | input/main.c | 2 | 
3 files changed, 38 insertions, 1 deletions
| diff --git a/input/input-service.c b/input/input-service.c index 54e745a4..23dbce8b 100644 --- a/input/input-service.c +++ b/input/input-service.c @@ -51,11 +51,15 @@ static DBusConnection *connection = NULL;  static DBusHandlerResult manager_message(DBusConnection *conn,  				DBusMessage *msg, void *data); + +static void manager_unregister(DBusConnection *conn, void *data); +  static DBusHandlerResult device_message(DBusConnection *conn,  				DBusMessage *msg, void *data);  static const DBusObjectPathVTable manager_table = {  	.message_function = manager_message, +	.unregister_function = manager_unregister,  };  static const DBusObjectPathVTable device_table = { @@ -84,6 +88,10 @@ static DBusHandlerResult err_unknown_method(DBusConnection *conn, DBusMessage *m  /*   * Input Manager methods   */ +struct input_manager { +	GList *paths; +}; +  static DBusHandlerResult manager_create_device(DBusConnection *conn,  				DBusMessage *msg, void *udata)  { @@ -131,6 +139,18 @@ static DBusHandlerResult manager_message(DBusConnection *conn,  	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;  } +static void manager_unregister(DBusConnection *conn, void *data) +{ +	struct input_manager *mgr = data; + +	info("Unregistered manager path"); + +	if (mgr->paths) +		g_list_foreach(mgr->paths, (GFunc) free, NULL); + +	free(mgr); +} +  /*   * Input Device methods   */ @@ -233,13 +253,19 @@ static DBusHandlerResult device_message(DBusConnection *conn,  int input_dbus_init(void)  { +	struct input_manager *mgr;  	connection = init_dbus(INPUT_SERVICE, NULL, NULL);  	if (!connection)  		return -1; +	dbus_connection_set_exit_on_disconnect(connection, TRUE); + +	mgr = malloc(sizeof(struct input_manager)); +	memset(mgr, 0, sizeof(struct input_manager)); +  	/* Fallback to catch invalid device path */  	if (!dbus_connection_register_fallback(connection, INPUT_PATH, -						&manager_table, NULL)) { +						&manager_table, mgr)) {  		error("D-Bus failed to register %s path", INPUT_PATH);  		return -1;  	} @@ -248,3 +274,11 @@ int input_dbus_init(void)  	return 0;  } + +void input_dbus_exit(void) +{ +	dbus_connection_unregister_object_path(connection, INPUT_PATH); + +	dbus_connection_unref(connection); +} + diff --git a/input/input-service.h b/input/input-service.h index 6cc0b413..acda934d 100644 --- a/input/input-service.h +++ b/input/input-service.h @@ -25,5 +25,6 @@  #define __INPUT_SERVICE_H  int input_dbus_init(void); +void input_dbus_exit(void);  #endif /* __INPUT_SERVICE_H */ diff --git a/input/main.c b/input/main.c index 5523b67f..9386caf9 100644 --- a/input/main.c +++ b/input/main.c @@ -102,5 +102,7 @@ int main(int argc, char *argv[])  	g_main_run(main_loop); +	input_dbus_exit(); +  	return 0;  } | 
