wl_list_init(&compositor->surfaces);
wl_list_init(&compositor->seat_list);
pepper_list_init(&compositor->output_list);
- wl_list_init(&compositor->event_hook_chain);
pepper_list_init(&compositor->view_list);
wl_list_init(&compositor->regions);
- /* Install default input event handler */
- if( NULL == pepper_compositor_add_event_hook(compositor,
- pepper_compositor_event_handler,
- compositor))
- {
- PEPPER_ERROR("Failed to install event handler\n");
- goto error;
- }
-
if (wl_display_init_shm(compositor->display) != 0)
{
PEPPER_ERROR("Failed to initialze shm.\n");
pepper_object_fini((pepper_object_t *)device);
pepper_free(device);
}
-
-void
-pepper_seat_update_modifier(pepper_seat_t *seat, pepper_input_event_t *event)
-{
- /* TODO */
- seat->modifier = event->value;
-}
-
-pepper_bool_t
-pepper_compositor_event_handler(pepper_seat_t *seat, pepper_input_event_t *event, void *data)
-{
- /* TODO: */
- /* pepper_compositor_t *compositor = data; */
-
- switch(event->type)
- {
- case PEPPER_INPUT_EVENT_KEYBOARD_KEY:
- pepper_seat_update_modifier(seat, event);
- break;
-
- case PEPPER_INPUT_EVENT_POINTER_BUTTON:
- {
- /* FIXME: Send focused client only */
- struct wl_display *display = pepper_compositor_get_display(seat->compositor);
- uint32_t serial = wl_display_next_serial(display);
- struct wl_resource *pointer;
-
- wl_resource_for_each(pointer, &seat->pointer->resources)
- wl_pointer_send_button(pointer,
- serial,
- event->time,
- event->index,
- event->state);
- }
- break;
- case PEPPER_INPUT_EVENT_POINTER_MOTION:
- {
- /* FIXME: Send focused client only */
- struct wl_resource *pointer;
- wl_resource_for_each(pointer, &seat->pointer->resources)
- wl_pointer_send_motion(pointer,
- event->time,
- wl_fixed_from_double(event->x),
- wl_fixed_from_double(event->y));
- }
- break;
- default:
- PEPPER_TRACE("Unknown pepper input event type [%x]\n", event->type);
- break;
- }
-
- return PEPPER_TRUE;
-}
-
-PEPPER_API pepper_event_hook_t *
-pepper_compositor_add_event_hook(pepper_compositor_t *compositor,
- pepper_event_handler_t handler,
- void *data)
-{
- pepper_event_hook_t *hook;
-
- if( !handler )
- return NULL;
-
- hook = pepper_calloc(1, sizeof(pepper_event_hook_t));
- if (!hook)
- {
- PEPPER_ERROR("Failed to allocation\n");
- return NULL;
- }
-
- hook->handler = handler;
- hook->data = data;
-
- wl_list_insert(&compositor->event_hook_chain, &hook->link);
-
- return hook;
-}
-
-PEPPER_API void
-pepper_event_hook_destroy(pepper_event_hook_t *hook)
-{
- wl_list_remove(&hook->link);
- pepper_free(hook);
-}
-
-PEPPER_API pepper_bool_t
-pepper_seat_handle_event(pepper_seat_t *seat, pepper_input_event_t *event)
-{
- pepper_event_hook_t *hook, *tmp;
- pepper_bool_t ret = PEPPER_FALSE;
-
- /* Iterate installed hook chain. */
- /* XXX: this code is not thread-safe */
- wl_list_for_each_safe(hook, tmp, &seat->compositor->event_hook_chain, link)
- {
- ret = hook->handler(seat, event, hook->data);
-
- /* Event consumed, do not delegate to next element */
- if( PEPPER_TRUE == ret)
- break;
- }
-
- return ret;
-}
struct wl_list seat_list;
pepper_list_t output_list;
uint32_t output_id_allocator;
- struct wl_list event_hook_chain;
pepper_bool_t update_scheduled;
pepper_list_t view_list;
void
pepper_plane_update(pepper_plane_t *plane, const pepper_list_t *view_list);
-/* Event hook */
-struct pepper_event_hook
-{
- pepper_event_handler_t handler;
- void *data;
- struct wl_list link;
-
- /* TODO:
- * void *owner, *priority;
- * or something elses
- */
-};
-
-pepper_bool_t
-pepper_compositor_event_handler(pepper_seat_t *seat, pepper_input_event_t *event, void *data);
-
void
pepper_surface_flush_damage(pepper_surface_t *surface);
pepper_output_set_mode(pepper_output_t *output, const pepper_output_mode_t *mode);
/* Input. */
-enum pepper_input_event_type
-{
- PEPPER_INPUT_EVENT_POINTER_BUTTON,
- PEPPER_INPUT_EVENT_POINTER_MOTION,
- PEPPER_INPUT_EVENT_POINTER_AXIS,
- PEPPER_INPUT_EVENT_KEYBOARD_KEY,
- PEPPER_INPUT_EVENT_TOUCH_DOWN,
- PEPPER_INPUT_EVENT_TOUCH_UP,
- PEPPER_INPUT_EVENT_TOUCH_MOTION,
- PEPPER_INPUT_EVENT_TOUCH_FRAME,
- PEPPER_INPUT_EVENT_TOUCH_CANCEL,
-};
-
-enum pepper_input_event_state
-{
- PEPPER_INPUT_EVENT_STATE_RELEASED,
- PEPPER_INPUT_EVENT_STATE_PRESSED,
-};
-
-enum pepper_input_event_axis
-{
- PEPPER_INPUT_EVENT_AXIS_VERTICAL,
- PEPPER_INPUT_EVENT_AXIS_HORIZONTAL,
-};
-
-struct pepper_input_event
-{
- uint32_t type;
- uint32_t time;
- uint32_t serial;
- uint32_t index; /* button, key, touch id or axis */
- uint32_t state;
- wl_fixed_t value;
- wl_fixed_t x;
- wl_fixed_t y;
-};
-
PEPPER_API pepper_seat_t *
pepper_compositor_add_seat(pepper_compositor_t *compositor,
const char *seat_name,
PEPPER_API pepper_touch_t *
pepper_seat_get_touch(pepper_seat_t *seat);
-PEPPER_API pepper_bool_t
-pepper_seat_handle_event(pepper_seat_t *seat, pepper_input_event_t *event);
-
-/* Event hook */
-typedef pepper_bool_t (*pepper_event_handler_t)(pepper_seat_t *, pepper_input_event_t *, void *);
-
-PEPPER_API pepper_event_hook_t *
-pepper_compositor_add_event_hook(pepper_compositor_t *compositor,
- pepper_event_handler_t handler,
- void *data);
-
-PEPPER_API void
-pepper_event_hook_destroy(pepper_event_hook_t *hook);
-
/* Surface. */
PEPPER_API const char *
pepper_surface_get_role(pepper_surface_t *surface);
void
x11_handle_input_event(x11_seat_t* seat, uint32_t type, xcb_generic_event_t* xev)
{
- pepper_input_event_t event = {0,};
-
- UNUSED(event); /* disable warning */
-
switch (type)
{
case XCB_ENTER_NOTIFY:
{
case XCB_BUTTON_INDEX_1:/* FIXME: LEFT */
PEPPER_TRACE("left click\n");
- event.index = 1;
break;
case XCB_BUTTON_INDEX_3:/* FIXME: RIGHT */
PEPPER_TRACE("right click\n");
- event.index = 3;
break;
default:
PEPPER_TRACE("wheel or something pressed\n");
break;
}
- event.type = PEPPER_INPUT_EVENT_POINTER_BUTTON;
- event.time = bp->time;
- event.serial = bp->sequence;
- event.state = PEPPER_INPUT_EVENT_STATE_PRESSED;
- event.value = 0;
- event.x = bp->event_x;
- event.y = bp->event_y;;
}
break;
case XCB_BUTTON_RELEASE:
{
case XCB_BUTTON_INDEX_1:/* FIXME: LEFT */
PEPPER_TRACE("left released\n");
- event.index = 1;
break;
case XCB_BUTTON_INDEX_3:/* FIXME: RIGHT */
PEPPER_TRACE("right released\n");
- event.index = 3;
break;
default:
PEPPER_TRACE("wheel or something pressed\n");
break;
}
- event.type = PEPPER_INPUT_EVENT_POINTER_BUTTON;
- event.time = br->time;
- event.serial = br->sequence;
- event.state = PEPPER_INPUT_EVENT_STATE_RELEASED;
- event.value = 0;
- event.x = br->event_x;
- event.y = br->event_y;;
}
break;
case XCB_MOTION_NOTIFY:
{
xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)xev;
-
- event.type = PEPPER_INPUT_EVENT_POINTER_MOTION;
- event.time = motion->time;
- event.serial = motion->sequence;
- event.index = 0;
- event.state = 0;
- event.value = 0;
- event.x = motion->event_x;
- event.y = motion->event_y;
}
break;
default :