#include "pointer.h" #include "common/state.h" #include #include const struct wl_pointer_listener wl_pointer_listener = { .enter = wl_pointer_enter, .leave = wl_pointer_leave, .motion = wl_pointer_motion, .button = wl_pointer_button, .axis = wl_pointer_axis, .frame = wl_pointer_frame, .axis_source = wl_pointer_axis_source, .axis_stop = wl_pointer_axis_stop, .axis_discrete = wl_pointer_axis_discrete, }; void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) { struct client_state *client_state = data; client_state->pointer_event.event_mask |= POINTER_EVENT_ENTER; client_state->pointer_event.serial = serial; client_state->pointer_event.surface_x = surface_x; client_state->pointer_event.surface_y = surface_y; } void wl_pointer_leave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface) { struct client_state *client_state = data; client_state->pointer_event.serial = serial; client_state->pointer_event.event_mask |= POINTER_EVENT_LEAVE; } void wl_pointer_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) { struct client_state *client_state = data; client_state->pointer_event.event_mask |= POINTER_EVENT_MOTION; client_state->pointer_event.time = time; client_state->pointer_event.surface_x = surface_x; client_state->pointer_event.surface_y = surface_y; } void wl_pointer_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { struct client_state *client_state = data; client_state->pointer_event.event_mask |= POINTER_EVENT_BUTTON; client_state->pointer_event.time = time; client_state->pointer_event.serial = serial; client_state->pointer_event.button = button; client_state->pointer_event.state = state; } void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { struct client_state *client_state = data; client_state->pointer_event.event_mask |= POINTER_EVENT_AXIS; client_state->pointer_event.time = time; client_state->pointer_event.axes[axis].valid = true; client_state->pointer_event.axes[axis].value = value; } void wl_pointer_frame(void *data, struct wl_pointer *wl_pointer) { struct client_state *client_state = data; struct pointer_event *event = &client_state->pointer_event; fprintf(stderr, "pointer frame @ %d: ", event->time); if (event->event_mask & POINTER_EVENT_ENTER) { fprintf(stderr, "entered %f, %f ", wl_fixed_to_double(event->surface_x), wl_fixed_to_double(event->surface_y)); } if (event->event_mask & POINTER_EVENT_LEAVE) { fprintf(stderr, "leave"); } if (event->event_mask & POINTER_EVENT_MOTION) { fprintf(stderr, "motion %f, %f ", wl_fixed_to_double(event->surface_x), wl_fixed_to_double(event->surface_y)); } if (event->event_mask & POINTER_EVENT_BUTTON) { char *state = event->state == WL_POINTER_BUTTON_STATE_RELEASED ? "released" : "pressed"; fprintf(stderr, "button %d %s ", event->button, state); } uint32_t axis_events = POINTER_EVENT_AXIS | POINTER_EVENT_AXIS_SOURCE | POINTER_EVENT_AXIS_STOP | POINTER_EVENT_AXIS_DISCRETE; char *axis_name[2] = { [WL_POINTER_AXIS_VERTICAL_SCROLL] = "vertical", [WL_POINTER_AXIS_HORIZONTAL_SCROLL] = "horizontal", }; char *axis_source[4] = { [WL_POINTER_AXIS_SOURCE_WHEEL] = "wheel", [WL_POINTER_AXIS_SOURCE_FINGER] = "finger", [WL_POINTER_AXIS_SOURCE_CONTINUOUS] = "continuous", [WL_POINTER_AXIS_SOURCE_WHEEL_TILT] = "wheel tilt", }; if (event->event_mask & axis_events) { for (size_t i = 0; i < 2; ++i) { if (!event->axes[i].valid) { continue; } fprintf(stderr, "%s axis ", axis_name[i]); if (event->event_mask & POINTER_EVENT_AXIS) { fprintf(stderr, "value %f ", wl_fixed_to_double(event->axes[i].value)); } if (event->event_mask & POINTER_EVENT_AXIS_DISCRETE) { fprintf(stderr, "discrete %d ", event->axes[i].discrete); } if (event->event_mask & POINTER_EVENT_AXIS_SOURCE) { fprintf(stderr, "via %s ", axis_source[event->axis_source]); } if (event->event_mask & POINTER_EVENT_AXIS_STOP) { fprintf(stderr, "(stopped) "); } } } fprintf(stderr, "\n"); memset(event, 0, sizeof(*event)); } void wl_pointer_axis_source(void *data, struct wl_pointer *wl_pointer, uint32_t axis_source) { struct client_state *client_state = data; client_state->pointer_event.event_mask |= POINTER_EVENT_AXIS_SOURCE; client_state->pointer_event.axis_source = axis_source; } void wl_pointer_axis_stop(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis) { struct client_state *client_state = data; client_state->pointer_event.time = time; client_state->pointer_event.event_mask |= POINTER_EVENT_AXIS_STOP; client_state->pointer_event.axes[axis].valid = true; } void wl_pointer_axis_discrete(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete) { struct client_state *client_state = data; client_state->pointer_event.event_mask |= POINTER_EVENT_AXIS_DISCRETE; client_state->pointer_event.axes[axis].valid = true; client_state->pointer_event.axes[axis].discrete = discrete; } void wl_pointer_axis_value120(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t value120) { }