watch changes:

event data is now returned
device/event strings are now deleted after callback is complete


SVN revision: 48813
This commit is contained in:
Mike Blumenkrantz 2010-05-13 19:36:04 +00:00
parent dc91f4ebbf
commit 7c1298ea04
3 changed files with 30 additions and 17 deletions

View File

@ -11,32 +11,32 @@ typedef struct kbdmouse
static void static void
/* event will always be a syspath starting with /sys */ /* event will always be a syspath starting with /sys */
catch_events(const char *event, void *data, Eudev_Watch *watch) catch_events(const char *device, const char *event, void *data, Eudev_Watch *watch)
{ {
kbdmouse *akbdmouse = data; kbdmouse *akbdmouse = data;
Eina_List *l; Eina_List *l;
const char *name, *dev, *type; const char *name, *dev, *type;
int new = 0; int new = 0;
/* the event that comes through will be prefixed by "/sys" /* the device that comes through will be prefixed by "/sys"
* but the saved name will not, so we check for the saved name * but the saved name will not, so we check for the saved name
* inside the event name * inside the device name
*/ */
EINA_LIST_FOREACH(akbdmouse->kbds, l, name) EINA_LIST_FOREACH(akbdmouse->kbds, l, name)
if (strstr(event, name)) goto end; if (strstr(device, name)) goto end;
EINA_LIST_FOREACH(akbdmouse->mice, l, name) EINA_LIST_FOREACH(akbdmouse->mice, l, name)
if (strstr(event, name)) goto end; if (strstr(device, name)) goto end;
/* check to see if the device was just plugged in */ /* check to see if the device was just plugged in */
if (e_udev_syspath_is_kbd(event) || e_udev_syspath_is_mouse(event)) if (e_udev_syspath_is_kbd(device) || e_udev_syspath_is_mouse(device))
{ {
new = 1; new = 1;
goto end; goto end;
} }
/* if we reach here, the event is neither a keyboard nor a mouse that we saw /* if we reach here, the device is neither a keyboard nor a mouse that we saw
* previously, so we print a moderately amusing message and bail * previously, so we print a moderately amusing message and bail
*/ */
printf("Sneaky sneaky! But %s is not a keyboard or a mouse!!\n", event); printf("Sneaky sneaky! But %s is not a keyboard or a mouse!!\n", device);
return; return;
end: end:
@ -46,7 +46,7 @@ end:
*/ */
if (new) if (new)
{ {
dev = e_udev_syspath_get_devpath(event); dev = e_udev_syspath_get_devpath(device);
type = "plugged in"; type = "plugged in";
} }
else else

View File

@ -127,7 +127,7 @@ extern "C" {
EAPI Eina_Bool e_udev_syspath_is_kbd(const char *syspath); EAPI Eina_Bool e_udev_syspath_is_kbd(const char *syspath);
EAPI Eina_Bool e_udev_syspath_is_touchpad(const char *syspath); EAPI Eina_Bool e_udev_syspath_is_touchpad(const char *syspath);
EAPI Eudev_Watch *e_udev_watch_add(Eudev_Type type, void(*func)(const char *, void *, Eudev_Watch *), void *user_data); EAPI Eudev_Watch *e_udev_watch_add(Eudev_Type type, void(*func)(const char *, const char *, void *, Eudev_Watch *), void *user_data);
EAPI void *e_udev_watch_del(Eudev_Watch *watch); EAPI void *e_udev_watch_del(Eudev_Watch *watch);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -12,7 +12,7 @@ struct Eudev_Watch
/* private */ /* private */
struct _store_data struct _store_data
{ {
void(*func)(const char *, void *, Eudev_Watch *); void(*func)(const char *, const char *, void *, Eudev_Watch *);
void *data; void *data;
struct udev_monitor *mon; struct udev_monitor *mon;
Eudev_Type type; Eudev_Type type;
@ -28,7 +28,7 @@ _get_syspath_from_watch(void *data, Ecore_Fd_Handler *fd_handler)
struct _store_data *store = data; struct _store_data *store = data;
struct udev_device *device; struct udev_device *device;
const char *ret, *test; const char *ret, *test;
void(*func)(const char *, void *, Eudev_Watch *) = store->func; void(*func)(const char *, const char *, void *, Eudev_Watch *) = store->func;
void *sdata = store->data; void *sdata = store->data;
Eudev_Watch *watch = store->watch; Eudev_Watch *watch = store->watch;
int cap = 0; int cap = 0;
@ -89,13 +89,25 @@ _get_syspath_from_watch(void *data, Ecore_Fd_Handler *fd_handler)
default: default:
break; break;
} }
test = eina_stringshare_add(udev_device_get_action(device));
if (!test)
{
udev_device_unref(device);
return 0;
}
ret = eina_stringshare_add(udev_device_get_syspath(device)); ret = eina_stringshare_add(udev_device_get_syspath(device));
if (!ret) return 0; if (!ret)
{
udev_device_unref(device);
eina_stringshare_del(test);
return 0;
}
udev_device_unref(device); udev_device_unref(device);
(*func)(ret, sdata, watch); (*func)(ret, test, sdata, watch);
eina_stringshare_del(test);
eina_stringshare_del(ret);
return 1; return 1;
@ -108,7 +120,8 @@ error:
* *
* @param subsystem The subsystem type. See @ref Subsystem_Types * @param subsystem The subsystem type. See @ref Subsystem_Types
* @param device_type The device type. See @ref Device_Types * @param device_type The device type. See @ref Device_Types
* @param func The function to call when the watch receives data * @param func The function to call when the watch receives data;
* must take (const char *device, const char *event_type, void *data, Eudev_Watch *watch)
* @param user_data Data to pass to the callback function * @param user_data Data to pass to the callback function
* *
* @return A watch struct for the watch type specified, or NULL on failure * @return A watch struct for the watch type specified, or NULL on failure
@ -116,7 +129,7 @@ error:
* @ingroup udev * @ingroup udev
*/ */
EAPI Eudev_Watch * EAPI Eudev_Watch *
e_udev_watch_add(Eudev_Type type, void(*func)(const char *, void *, Eudev_Watch *), void *user_data) e_udev_watch_add(Eudev_Type type, void(*func)(const char *, const char *, void *, Eudev_Watch *), void *user_data)
{ {
struct udev *udev; struct udev *udev;
struct udev_monitor *mon; struct udev_monitor *mon;