--- /dev/null
+#ifndef PEPPER_EVDEV_INTERNAL_H
+#define PEPPER_EVDEV_INTERNAL_H
+
+#include <pepper.h>
+
+typedef struct pepper_evdev pepper_evdev_t;
+typedef struct evdev_device_info evdev_device_info_t;
+typedef struct evdev_key_event evdev_key_event_t;
+
+struct pepper_evdev
+{
+ pepper_compositor_t *compositor;
+ struct wl_display *display;
+ struct wl_event_loop *event_loop;
+ pepper_list_t key_event_queue;
+ pepper_list_t device_list;
+};
+
+struct evdev_device_info
+{
+ pepper_evdev_t *evdev;
+ pepper_input_device_t *device;
+ struct wl_event_source *event_source;
+ pepper_list_t link;
+};
+
+struct evdev_key_event
+{
+ pepper_evdev_t *evdev;
+ pepper_input_device_t *device;
+ unsigned int keycode;
+ unsigned int state;
+ unsigned int time;
+ pepper_list_t link;
+};
+
+#endif /* PEPPER_EVDEV_INTERNAL_H */
--- /dev/null
+#include <evdev-internal.h>
+#include <pepper-evdev.h>
+
+PEPPER_API pepper_evdev_t *
+pepper_evdev_create(pepper_compositor_t *compositor)
+{
+ pepper_evdev_t *evdev = NULL;
+
+ evdev = (pepper_evdev_t *)calloc(1, sizeof(pepper_evdev_t));
+ PEPPER_CHECK(evdev, return NULL, "[%s] Failed to allocate memory for pepper evdev...\n", __FUNCTION__);
+
+ evdev->compositor = compositor;
+ evdev->display = pepper_compositor_get_display(compositor);
+ evdev->event_loop = wl_display_get_event_loop(evdev->display);
+
+ pepper_list_init(&evdev->device_list);
+ pepper_list_init(&evdev->key_event_queue);
+
+ return evdev;
+}
+
+PEPPER_API void
+pepper_evdev_destroy(pepper_evdev_t *evdev)
+{
+ if (!evdev)
+ return;
+
+ pepper_list_remove(&evdev->key_event_queue);
+ pepper_list_remove(&evdev->device_list);
+
+ free(evdev);
+}
+
--- /dev/null
+#ifndef PEPPER_EVDEV_H
+#define PEPPER_EVDEV_H
+
+#include <pepper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+PEPPER_API pepper_evdev_t *
+pepper_evdev_create(pepper_compositor_t *compositor);
+
+PEPPER_API void
+pepper_evdev_destroy(pepper_evdev_t *evdev);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PEPPER_EVDEV_H */