Simple wayland pointer support.

This commit is contained in:
James Grogan 2022-11-10 14:59:59 +00:00
parent 63a93ec1a8
commit e2cc98e1fb
9 changed files with 291 additions and 11 deletions

View file

@ -0,0 +1,129 @@
#include "WaylandPointerInterface.h"
#include "FileLogger.h"
static void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value)
{
}
static void wl_pointer_axis_source(void *data, struct wl_pointer *wl_pointer, uint32_t axis_source)
{
}
static void wl_pointer_axis_stop(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis)
{
}
static void wl_pointer_axis_discrete(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete)
{
}
void WaylandPointerInterface::pointerFrameEvent(void *data, struct wl_pointer *wl_pointer)
{
auto thisClass = static_cast<WaylandPointerInterface*>(data);
thisClass->onPointerFrame();
}
void WaylandPointerInterface::pointerEnterEvent(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y)
{
auto thisClass = static_cast<WaylandPointerInterface*>(data);
thisClass->onPointerEnter(serial, surface, surface_x, surface_y);
}
void WaylandPointerInterface::pointerLeaveEvent(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface)
{
auto thisClass = static_cast<WaylandPointerInterface*>(data);
thisClass->onPointerLeave(serial);
}
void WaylandPointerInterface::pointerMotionEvent(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y)
{
auto thisClass = static_cast<WaylandPointerInterface*>(data);
thisClass->onPointerMotion(time, surface_x, surface_y);
}
void WaylandPointerInterface::pointerButtonEvent(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state)
{
auto thisClass = static_cast<WaylandPointerInterface*>(data);
thisClass->onPointerButton(serial, time, button, state);
}
void WaylandPointerInterface::onPointerFrame()
{
if (mWorkingPointerEvent.event_mask & POINTER_EVENT_ENTER)
{
const auto locx = wl_fixed_to_double(mWorkingPointerEvent.surface_x);
const auto locy = wl_fixed_to_double(mWorkingPointerEvent.surface_y);
MLOG_INFO("Enter at " << locx << " , " << locy);
}
else if (mWorkingPointerEvent.event_mask & POINTER_EVENT_LEAVE)
{
MLOG_INFO("Leave);")
}
else if (mWorkingPointerEvent.event_mask & POINTER_EVENT_MOTION)
{
}
else if (mWorkingPointerEvent.event_mask & POINTER_EVENT_BUTTON)
{
const bool released = mWorkingPointerEvent.state == WL_POINTER_BUTTON_STATE_RELEASED;
MLOG_INFO("Mouse button" << released ? "released" : "pressed");
}
mWorkingPointerEvent = WaylandPointerEvent();
}
void WaylandPointerInterface::onPointerButton(uint32_t serial, uint32_t time, uint32_t button, uint32_t state)
{
mWorkingPointerEvent.event_mask |= POINTER_EVENT_BUTTON;
mWorkingPointerEvent.time = time;
mWorkingPointerEvent.serial = serial;
mWorkingPointerEvent.button = button;
mWorkingPointerEvent.state = state;
}
void WaylandPointerInterface::onPointerEnter(uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y)
{
mWorkingPointerEvent.event_mask |= POINTER_EVENT_ENTER;
mWorkingPointerEvent.serial = serial;
mWorkingPointerEvent.surface_x = surface_x;
mWorkingPointerEvent.surface_y = surface_y;
}
void WaylandPointerInterface::onPointerLeave(uint32_t serial)
{
mWorkingPointerEvent.event_mask |= POINTER_EVENT_LEAVE;
mWorkingPointerEvent.serial = serial;
}
void WaylandPointerInterface::onPointerMotion(uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y)
{
mWorkingPointerEvent.event_mask |= POINTER_EVENT_MOTION;
mWorkingPointerEvent.time = time;
mWorkingPointerEvent.surface_x = surface_x;
mWorkingPointerEvent.surface_y = surface_y;
}
WaylandPointerInterface::WaylandPointerInterface(wl_pointer* pointer)
: mPointer(pointer)
{
mPointerListener.enter = pointerEnterEvent;
mPointerListener.leave = pointerLeaveEvent;
mPointerListener.button = pointerButtonEvent;
mPointerListener.motion = pointerMotionEvent;
mPointerListener.axis = wl_pointer_axis;
mPointerListener.axis_discrete = wl_pointer_axis_discrete;
mPointerListener.axis_source = wl_pointer_axis_source;
mPointerListener.axis_stop = wl_pointer_axis_stop;
mPointerListener.frame = pointerFrameEvent;
wl_pointer_add_listener(mPointer, &mPointerListener, this);
}
wl_pointer* WaylandPointerInterface::getPointer() const
{
return mPointer;
}