Replace event type check switch statements with a helper macro/function

The helper function now prints an error message if the event type passed is
not allowed.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Peter Hutterer 2015-03-13 09:32:37 +10:00
parent 44f7446b2a
commit 7f28b714d8
4 changed files with 88 additions and 78 deletions

View file

@ -35,6 +35,42 @@
#include "evdev.h" #include "evdev.h"
#include "timer.h" #include "timer.h"
#define require_event_type(li_, type_, retval_, ...) \
if (type_ == LIBINPUT_EVENT_NONE) abort(); \
if (!check_event_type(li_, __func__, type_, __VA_ARGS__, -1)) \
return retval_; \
static inline bool
check_event_type(struct libinput *libinput,
const char *function_name,
enum libinput_event_type type_in,
...)
{
bool rc = false;
va_list args;
unsigned int type_permitted;
va_start(args, type_in);
type_permitted = va_arg(args, unsigned int);
while (type_permitted != (unsigned int)-1) {
if (type_permitted == type_in) {
rc = true;
break;
}
type_permitted = va_arg(args, unsigned int);
}
va_end(args);
if (!rc)
log_bug_client(libinput,
"Invalid event type %d passed to %s()\n",
type_in, function_name);
return rc;
}
struct libinput_source { struct libinput_source {
libinput_source_dispatch_t dispatch; libinput_source_dispatch_t dispatch;
void *user_data; void *user_data;
@ -165,103 +201,53 @@ libinput_event_get_device(struct libinput_event *event)
LIBINPUT_EXPORT struct libinput_event_pointer * LIBINPUT_EXPORT struct libinput_event_pointer *
libinput_event_get_pointer_event(struct libinput_event *event) libinput_event_get_pointer_event(struct libinput_event *event)
{ {
switch (event->type) { require_event_type(libinput_event_get_context(event),
case LIBINPUT_EVENT_NONE: event->type,
abort(); /* not used as actual event type */ NULL,
case LIBINPUT_EVENT_DEVICE_ADDED: LIBINPUT_EVENT_POINTER_MOTION,
case LIBINPUT_EVENT_DEVICE_REMOVED: LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE,
case LIBINPUT_EVENT_KEYBOARD_KEY: LIBINPUT_EVENT_POINTER_BUTTON,
break; LIBINPUT_EVENT_POINTER_AXIS);
case LIBINPUT_EVENT_POINTER_MOTION:
case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
case LIBINPUT_EVENT_POINTER_BUTTON:
case LIBINPUT_EVENT_POINTER_AXIS:
return (struct libinput_event_pointer *) event;
case LIBINPUT_EVENT_TOUCH_DOWN:
case LIBINPUT_EVENT_TOUCH_UP:
case LIBINPUT_EVENT_TOUCH_MOTION:
case LIBINPUT_EVENT_TOUCH_CANCEL:
case LIBINPUT_EVENT_TOUCH_FRAME:
break;
}
return NULL; return (struct libinput_event_pointer *) event;
} }
LIBINPUT_EXPORT struct libinput_event_keyboard * LIBINPUT_EXPORT struct libinput_event_keyboard *
libinput_event_get_keyboard_event(struct libinput_event *event) libinput_event_get_keyboard_event(struct libinput_event *event)
{ {
switch (event->type) { require_event_type(libinput_event_get_context(event),
case LIBINPUT_EVENT_NONE: event->type,
abort(); /* not used as actual event type */ NULL,
case LIBINPUT_EVENT_DEVICE_ADDED: LIBINPUT_EVENT_KEYBOARD_KEY);
case LIBINPUT_EVENT_DEVICE_REMOVED:
break;
case LIBINPUT_EVENT_KEYBOARD_KEY:
return (struct libinput_event_keyboard *) event;
case LIBINPUT_EVENT_POINTER_MOTION:
case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
case LIBINPUT_EVENT_POINTER_BUTTON:
case LIBINPUT_EVENT_POINTER_AXIS:
case LIBINPUT_EVENT_TOUCH_DOWN:
case LIBINPUT_EVENT_TOUCH_UP:
case LIBINPUT_EVENT_TOUCH_MOTION:
case LIBINPUT_EVENT_TOUCH_CANCEL:
case LIBINPUT_EVENT_TOUCH_FRAME:
break;
}
return NULL; return (struct libinput_event_keyboard *) event;
} }
LIBINPUT_EXPORT struct libinput_event_touch * LIBINPUT_EXPORT struct libinput_event_touch *
libinput_event_get_touch_event(struct libinput_event *event) libinput_event_get_touch_event(struct libinput_event *event)
{ {
switch (event->type) { require_event_type(libinput_event_get_context(event),
case LIBINPUT_EVENT_NONE: event->type,
abort(); /* not used as actual event type */ NULL,
case LIBINPUT_EVENT_DEVICE_ADDED: LIBINPUT_EVENT_TOUCH_DOWN,
case LIBINPUT_EVENT_DEVICE_REMOVED: LIBINPUT_EVENT_TOUCH_UP,
case LIBINPUT_EVENT_KEYBOARD_KEY: LIBINPUT_EVENT_TOUCH_MOTION,
case LIBINPUT_EVENT_POINTER_MOTION: LIBINPUT_EVENT_TOUCH_CANCEL,
case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: LIBINPUT_EVENT_TOUCH_FRAME);
case LIBINPUT_EVENT_POINTER_BUTTON:
case LIBINPUT_EVENT_POINTER_AXIS:
break;
case LIBINPUT_EVENT_TOUCH_DOWN:
case LIBINPUT_EVENT_TOUCH_UP:
case LIBINPUT_EVENT_TOUCH_MOTION:
case LIBINPUT_EVENT_TOUCH_CANCEL:
case LIBINPUT_EVENT_TOUCH_FRAME:
return (struct libinput_event_touch *) event;
}
return NULL; return (struct libinput_event_touch *) event;
} }
LIBINPUT_EXPORT struct libinput_event_device_notify * LIBINPUT_EXPORT struct libinput_event_device_notify *
libinput_event_get_device_notify_event(struct libinput_event *event) libinput_event_get_device_notify_event(struct libinput_event *event)
{ {
switch (event->type) { require_event_type(libinput_event_get_context(event),
case LIBINPUT_EVENT_NONE: event->type,
abort(); /* not used as actual event type */ NULL,
case LIBINPUT_EVENT_DEVICE_ADDED: LIBINPUT_EVENT_DEVICE_ADDED,
case LIBINPUT_EVENT_DEVICE_REMOVED: LIBINPUT_EVENT_DEVICE_REMOVED);
return (struct libinput_event_device_notify *) event;
case LIBINPUT_EVENT_KEYBOARD_KEY:
case LIBINPUT_EVENT_POINTER_MOTION:
case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
case LIBINPUT_EVENT_POINTER_BUTTON:
case LIBINPUT_EVENT_POINTER_AXIS:
case LIBINPUT_EVENT_TOUCH_DOWN:
case LIBINPUT_EVENT_TOUCH_UP:
case LIBINPUT_EVENT_TOUCH_MOTION:
case LIBINPUT_EVENT_TOUCH_CANCEL:
case LIBINPUT_EVENT_TOUCH_FRAME:
break;
}
return NULL; return (struct libinput_event_device_notify *) event;
} }
LIBINPUT_EXPORT uint32_t LIBINPUT_EXPORT uint32_t

View file

@ -642,6 +642,18 @@ litest_create_context(void)
return libinput; return libinput;
} }
void
litest_disable_log_handler(struct libinput *libinput)
{
libinput_log_set_handler(libinput, NULL);
}
void
litest_restore_log_handler(struct libinput *libinput)
{
libinput_log_set_handler(libinput, litest_log_handler);
}
struct litest_device * struct litest_device *
litest_add_device_with_overrides(struct libinput *libinput, litest_add_device_with_overrides(struct libinput *libinput,
enum litest_device_type which, enum litest_device_type which,

View file

@ -92,6 +92,8 @@ struct litest_device {
}; };
struct libinput *litest_create_context(void); struct libinput *litest_create_context(void);
void litest_disable_log_handler(struct libinput *libinput);
void litest_restore_log_handler(struct libinput *libinput);
void litest_add(const char *name, void *func, void litest_add(const char *name, void *func,
enum litest_device_feature required_feature, enum litest_device_feature required_feature,

View file

@ -126,9 +126,11 @@ START_TEST(event_conversion_device_notify)
else if (type == LIBINPUT_EVENT_DEVICE_REMOVED) else if (type == LIBINPUT_EVENT_DEVICE_REMOVED)
device_removed++; device_removed++;
litest_disable_log_handler(li);
ck_assert(libinput_event_get_pointer_event(event) == NULL); ck_assert(libinput_event_get_pointer_event(event) == NULL);
ck_assert(libinput_event_get_keyboard_event(event) == NULL); ck_assert(libinput_event_get_keyboard_event(event) == NULL);
ck_assert(libinput_event_get_touch_event(event) == NULL); ck_assert(libinput_event_get_touch_event(event) == NULL);
litest_restore_log_handler(li);
} }
libinput_event_destroy(event); libinput_event_destroy(event);
@ -178,9 +180,11 @@ START_TEST(event_conversion_pointer)
else if (type == LIBINPUT_EVENT_POINTER_BUTTON) else if (type == LIBINPUT_EVENT_POINTER_BUTTON)
button++; button++;
litest_disable_log_handler(li);
ck_assert(libinput_event_get_device_notify_event(event) == NULL); ck_assert(libinput_event_get_device_notify_event(event) == NULL);
ck_assert(libinput_event_get_keyboard_event(event) == NULL); ck_assert(libinput_event_get_keyboard_event(event) == NULL);
ck_assert(libinput_event_get_touch_event(event) == NULL); ck_assert(libinput_event_get_touch_event(event) == NULL);
litest_restore_log_handler(li);
} }
libinput_event_destroy(event); libinput_event_destroy(event);
} }
@ -224,9 +228,11 @@ START_TEST(event_conversion_pointer_abs)
else if (type == LIBINPUT_EVENT_POINTER_BUTTON) else if (type == LIBINPUT_EVENT_POINTER_BUTTON)
button++; button++;
litest_disable_log_handler(li);
ck_assert(libinput_event_get_device_notify_event(event) == NULL); ck_assert(libinput_event_get_device_notify_event(event) == NULL);
ck_assert(libinput_event_get_keyboard_event(event) == NULL); ck_assert(libinput_event_get_keyboard_event(event) == NULL);
ck_assert(libinput_event_get_touch_event(event) == NULL); ck_assert(libinput_event_get_touch_event(event) == NULL);
litest_restore_log_handler(li);
} }
libinput_event_destroy(event); libinput_event_destroy(event);
} }
@ -263,9 +269,11 @@ START_TEST(event_conversion_key)
key++; key++;
litest_disable_log_handler(li);
ck_assert(libinput_event_get_device_notify_event(event) == NULL); ck_assert(libinput_event_get_device_notify_event(event) == NULL);
ck_assert(libinput_event_get_pointer_event(event) == NULL); ck_assert(libinput_event_get_pointer_event(event) == NULL);
ck_assert(libinput_event_get_touch_event(event) == NULL); ck_assert(libinput_event_get_touch_event(event) == NULL);
litest_restore_log_handler(li);
} }
libinput_event_destroy(event); libinput_event_destroy(event);
} }
@ -309,9 +317,11 @@ START_TEST(event_conversion_touch)
touch++; touch++;
litest_disable_log_handler(li);
ck_assert(libinput_event_get_device_notify_event(event) == NULL); ck_assert(libinput_event_get_device_notify_event(event) == NULL);
ck_assert(libinput_event_get_pointer_event(event) == NULL); ck_assert(libinput_event_get_pointer_event(event) == NULL);
ck_assert(libinput_event_get_keyboard_event(event) == NULL); ck_assert(libinput_event_get_keyboard_event(event) == NULL);
litest_restore_log_handler(li);
} }
libinput_event_destroy(event); libinput_event_destroy(event);
} }