diff options
| author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-06-22 18:39:50 +0000 | 
|---|---|---|
| committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-06-22 18:39:50 +0000 | 
| commit | b4427e24489d4aaf6768041cbb3b90353a285cfe (patch) | |
| tree | 7ed87b6df8132167a55c2146e74bbf6f1c98df6d | |
| parent | 0762886602369f99a473dc95cc288def7b6e363c (diff) | |
input: missing Disconnected signal when RemoveDevice is called
| -rw-r--r-- | input/device.c | 33 | 
1 files changed, 27 insertions, 6 deletions
| diff --git a/input/device.c b/input/device.c index 99c462c8..69b7a482 100644 --- a/input/device.c +++ b/input/device.c @@ -80,6 +80,7 @@ struct device {  	char			*path;  	int			ctrl_sk;  	int			intr_sk; +	guint			watch;  };  GSList *devices = NULL; @@ -512,24 +513,29 @@ static gboolean connection_event(GIOChannel *chan, GIOCondition cond, gpointer d  		ret = FALSE;  	} -	if (ret == FALSE) +	if (ret == FALSE) {  		dbus_connection_emit_signal(idev->conn,  				idev->path,  				INPUT_DEVICE_INTERFACE,  				"Disconnected",  				DBUS_TYPE_INVALID); +		idev->watch = 0; +	}  	return ret;  } -static void create_watch(int sk, struct device *idev) +static guint create_watch(int sk, struct device *idev)  { +	guint id;  	GIOChannel *io;  	io = g_io_channel_unix_new(sk); -	g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, -					connection_event, idev); +	id = g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, +			connection_event, idev);  	g_io_channel_unref(io); + +	return id;  }  static int hidp_connadd(bdaddr_t *src, bdaddr_t *dst, int ctrl_sk, int intr_sk, const char *name) @@ -623,7 +629,7 @@ static gboolean interrupt_connect_cb(GIOChannel *chan,  	if (err < 0)  		goto failed; -	create_watch(idev->ctrl_sk, idev); +	idev->watch = create_watch(idev->ctrl_sk, idev);  	dbus_connection_emit_signal(idev->conn,  			idev->path,  			INPUT_DEVICE_INTERFACE, @@ -1109,6 +1115,21 @@ int input_device_unregister(DBusConnection *conn, const char *path)  	devices = g_slist_remove(devices, idev); +	/* +	 * Workaround: if connected, the watch will not be able +	 * to access the D-Bus data assigned to this path +	 * because the object path data was destroyed. +	 */ +	if (idev->watch) { +		g_source_remove(idev->watch); +		idev->watch  = 0; +		dbus_connection_emit_signal(conn, +				path, +				INPUT_DEVICE_INTERFACE, +				"Disconnected", +				DBUS_TYPE_INVALID); +	} +  	dbus_connection_destroy_object_path(conn, path);  	dbus_connection_emit_signal(conn, INPUT_PATH, @@ -1271,7 +1292,7 @@ int input_device_connadd(bdaddr_t *src, bdaddr_t *dst)  		return err;  	} -	create_watch(idev->ctrl_sk, idev); +	idev->watch = create_watch(idev->ctrl_sk, idev);  	dbus_connection_emit_signal(idev->conn,  			idev->path,  			INPUT_DEVICE_INTERFACE, | 
