152 lines
5.7 KiB
C
152 lines
5.7 KiB
C
#include "pointer.h"
|
|
#include "common/state.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
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)
|
|
{
|
|
}
|