Merge commit '1ba4fde1015fc6da19dfbfdf0f77f1071416e215'
This is ofourdan/xwayland, minus: xwayland: Always update the wl_pointer cursor on pointer focus which was rejected for ABI and design issues.
This commit is contained in:
commit
b25f7d0c16
|
@ -199,6 +199,7 @@ xwl_cross_screen(ScreenPtr pScreen, Bool entering)
|
||||||
static void
|
static void
|
||||||
xwl_pointer_warp_cursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
|
xwl_pointer_warp_cursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
|
||||||
{
|
{
|
||||||
|
miPointerWarpCursor(pDev, pScreen, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static miPointerScreenFuncRec xwl_pointer_screen_funcs = {
|
static miPointerScreenFuncRec xwl_pointer_screen_funcs = {
|
||||||
|
|
|
@ -148,6 +148,61 @@ xwl_keyboard_proc(DeviceIntPtr device, int what)
|
||||||
return BadMatch;
|
return BadMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xwl_touch_proc(DeviceIntPtr device, int what)
|
||||||
|
{
|
||||||
|
#define NTOUCHPOINTS 20
|
||||||
|
#define NBUTTONS 1
|
||||||
|
#define NAXES 2
|
||||||
|
struct xwl_seat *xwl_seat = device->public.devicePrivate;
|
||||||
|
Atom btn_labels[NBUTTONS] = { 0 };
|
||||||
|
Atom axes_labels[NAXES] = { 0 };
|
||||||
|
BYTE map[NBUTTONS + 1] = { 0 };
|
||||||
|
|
||||||
|
switch (what) {
|
||||||
|
case DEVICE_INIT:
|
||||||
|
device->public.on = FALSE;
|
||||||
|
|
||||||
|
axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_MT_POSITION_X);
|
||||||
|
axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_MT_POSITION_Y);
|
||||||
|
|
||||||
|
if (!InitValuatorClassDeviceStruct(device, NAXES, axes_labels,
|
||||||
|
GetMotionHistorySize(), Absolute))
|
||||||
|
return BadValue;
|
||||||
|
|
||||||
|
if (!InitButtonClassDeviceStruct(device, NBUTTONS, btn_labels, map))
|
||||||
|
return BadValue;
|
||||||
|
|
||||||
|
if (!InitTouchClassDeviceStruct(device, NTOUCHPOINTS,
|
||||||
|
XIDirectTouch, NAXES))
|
||||||
|
return BadValue;
|
||||||
|
|
||||||
|
/* Valuators */
|
||||||
|
/* FIXME: devices might be mapped to a single wl_output */
|
||||||
|
InitValuatorAxisStruct(device, 0, axes_labels[0],
|
||||||
|
0, xwl_seat->xwl_screen->width,
|
||||||
|
10000, 0, 10000, Absolute);
|
||||||
|
InitValuatorAxisStruct(device, 1, axes_labels[1],
|
||||||
|
0, xwl_seat->xwl_screen->height,
|
||||||
|
10000, 0, 10000, Absolute);
|
||||||
|
return Success;
|
||||||
|
|
||||||
|
case DEVICE_ON:
|
||||||
|
device->public.on = TRUE;
|
||||||
|
return Success;
|
||||||
|
|
||||||
|
case DEVICE_OFF:
|
||||||
|
case DEVICE_CLOSE:
|
||||||
|
device->public.on = FALSE;
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BadMatch;
|
||||||
|
#undef NAXES
|
||||||
|
#undef NBUTTONS
|
||||||
|
#undef NTOUCHPOINTS
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pointer_handle_enter(void *data, struct wl_pointer *pointer,
|
pointer_handle_enter(void *data, struct wl_pointer *pointer,
|
||||||
uint32_t serial, struct wl_surface *surface,
|
uint32_t serial, struct wl_surface *surface,
|
||||||
|
@ -176,7 +231,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
|
||||||
xwl_seat->focus_window = wl_surface_get_user_data(surface);
|
xwl_seat->focus_window = wl_surface_get_user_data(surface);
|
||||||
|
|
||||||
(*pScreen->SetCursorPosition) (dev, pScreen, sx, sy, TRUE);
|
(*pScreen->SetCursorPosition) (dev, pScreen, sx, sy, TRUE);
|
||||||
CheckMotion(NULL, GetMaster(dev, MASTER_POINTER));
|
CheckMotion(NULL, GetMaster(dev, POINTER_OR_FLOAT));
|
||||||
|
|
||||||
/* Ideally, X clients shouldn't see these button releases. When
|
/* Ideally, X clients shouldn't see these button releases. When
|
||||||
* the pointer leaves a window with buttons down, it means that
|
* the pointer leaves a window with buttons down, it means that
|
||||||
|
@ -191,7 +246,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
|
||||||
valuator_mask_zero(&mask);
|
valuator_mask_zero(&mask);
|
||||||
for (i = 0; i < dev->button->numButtons; i++)
|
for (i = 0; i < dev->button->numButtons; i++)
|
||||||
if (BitIsOn(dev->button->down, i))
|
if (BitIsOn(dev->button->down, i))
|
||||||
QueuePointerEvents(xwl_seat->pointer, ButtonRelease, i, 0, &mask);
|
QueuePointerEvents(dev, ButtonRelease, i, 0, &mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -204,7 +259,7 @@ pointer_handle_leave(void *data, struct wl_pointer *pointer,
|
||||||
xwl_seat->xwl_screen->serial = serial;
|
xwl_seat->xwl_screen->serial = serial;
|
||||||
|
|
||||||
xwl_seat->focus_window = NULL;
|
xwl_seat->focus_window = NULL;
|
||||||
CheckMotion(NULL, GetMaster(dev, MASTER_POINTER));
|
CheckMotion(NULL, GetMaster(dev, POINTER_OR_FLOAT));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -480,6 +535,129 @@ static const struct wl_keyboard_listener keyboard_listener = {
|
||||||
keyboard_handle_repeat_info,
|
keyboard_handle_repeat_info,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct xwl_touch *
|
||||||
|
xwl_seat_lookup_touch(struct xwl_seat *xwl_seat, int32_t id)
|
||||||
|
{
|
||||||
|
struct xwl_touch *xwl_touch, *next_xwl_touch;
|
||||||
|
|
||||||
|
xorg_list_for_each_entry_safe(xwl_touch, next_xwl_touch,
|
||||||
|
&xwl_seat->touches, link_touch) {
|
||||||
|
if (xwl_touch->id == id)
|
||||||
|
return xwl_touch;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xwl_touch_send_event(struct xwl_touch *xwl_touch,
|
||||||
|
struct xwl_seat *xwl_seat, int type)
|
||||||
|
{
|
||||||
|
int32_t dx, dy;
|
||||||
|
ValuatorMask mask;
|
||||||
|
|
||||||
|
dx = xwl_touch->window->window->drawable.x;
|
||||||
|
dy = xwl_touch->window->window->drawable.y;
|
||||||
|
|
||||||
|
valuator_mask_zero(&mask);
|
||||||
|
valuator_mask_set(&mask, 0, dx + xwl_touch->x);
|
||||||
|
valuator_mask_set(&mask, 1, dy + xwl_touch->y);
|
||||||
|
QueueTouchEvents(xwl_seat->touch, type, xwl_touch->id, 0, &mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
touch_handle_down(void *data, struct wl_touch *wl_touch,
|
||||||
|
uint32_t serial, uint32_t time,
|
||||||
|
struct wl_surface *surface,
|
||||||
|
int32_t id, wl_fixed_t sx_w, wl_fixed_t sy_w)
|
||||||
|
{
|
||||||
|
struct xwl_seat *xwl_seat = data;
|
||||||
|
struct xwl_touch *xwl_touch;
|
||||||
|
|
||||||
|
if (surface == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xwl_touch = calloc(sizeof *xwl_touch, 1);
|
||||||
|
if (xwl_touch == NULL) {
|
||||||
|
ErrorF("touch_handle_down ENOMEM");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xwl_touch->window = wl_surface_get_user_data(surface);
|
||||||
|
xwl_touch->id = id;
|
||||||
|
xwl_touch->x = wl_fixed_to_int(sx_w);
|
||||||
|
xwl_touch->y = wl_fixed_to_int(sy_w);
|
||||||
|
xorg_list_add(&xwl_touch->link_touch, &xwl_seat->touches);
|
||||||
|
|
||||||
|
xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchBegin);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
touch_handle_up(void *data, struct wl_touch *wl_touch,
|
||||||
|
uint32_t serial, uint32_t time, int32_t id)
|
||||||
|
{
|
||||||
|
struct xwl_touch *xwl_touch;
|
||||||
|
struct xwl_seat *xwl_seat = data;
|
||||||
|
|
||||||
|
xwl_touch = xwl_seat_lookup_touch(xwl_seat, id);
|
||||||
|
|
||||||
|
if (!xwl_touch)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchEnd);
|
||||||
|
xorg_list_del(&xwl_touch->link_touch);
|
||||||
|
free(xwl_touch);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
touch_handle_motion(void *data, struct wl_touch *wl_touch,
|
||||||
|
uint32_t time, int32_t id,
|
||||||
|
wl_fixed_t sx_w, wl_fixed_t sy_w)
|
||||||
|
{
|
||||||
|
struct xwl_seat *xwl_seat = data;
|
||||||
|
struct xwl_touch *xwl_touch;
|
||||||
|
|
||||||
|
xwl_touch = xwl_seat_lookup_touch(xwl_seat, id);
|
||||||
|
|
||||||
|
if (!xwl_touch)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xwl_touch->x = wl_fixed_to_int(sx_w);
|
||||||
|
xwl_touch->y = wl_fixed_to_int(sy_w);
|
||||||
|
xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
touch_handle_frame(void *data, struct wl_touch *wl_touch)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
touch_handle_cancel(void *data, struct wl_touch *wl_touch)
|
||||||
|
{
|
||||||
|
struct xwl_seat *xwl_seat = data;
|
||||||
|
struct xwl_touch *xwl_touch, *next_xwl_touch;
|
||||||
|
|
||||||
|
xorg_list_for_each_entry_safe(xwl_touch, next_xwl_touch,
|
||||||
|
&xwl_seat->touches, link_touch) {
|
||||||
|
/* We can't properly notify of cancellation to the X client
|
||||||
|
* once it thinks it has the ownership, send at least a
|
||||||
|
* TouchEnd event.
|
||||||
|
*/
|
||||||
|
xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchEnd);
|
||||||
|
xorg_list_del(&xwl_touch->link_touch);
|
||||||
|
free(xwl_touch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_touch_listener touch_listener = {
|
||||||
|
touch_handle_down,
|
||||||
|
touch_handle_up,
|
||||||
|
touch_handle_motion,
|
||||||
|
touch_handle_frame,
|
||||||
|
touch_handle_cancel
|
||||||
|
};
|
||||||
|
|
||||||
static DeviceIntPtr
|
static DeviceIntPtr
|
||||||
add_device(struct xwl_seat *xwl_seat,
|
add_device(struct xwl_seat *xwl_seat,
|
||||||
const char *driver, DeviceProc device_proc)
|
const char *driver, DeviceProc device_proc)
|
||||||
|
@ -514,13 +692,13 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||||
wl_pointer_add_listener(xwl_seat->wl_pointer,
|
wl_pointer_add_listener(xwl_seat->wl_pointer,
|
||||||
&pointer_listener, xwl_seat);
|
&pointer_listener, xwl_seat);
|
||||||
|
|
||||||
if (xwl_seat->pointer)
|
if (xwl_seat->pointer == NULL) {
|
||||||
EnableDevice(xwl_seat->pointer, TRUE);
|
|
||||||
else {
|
|
||||||
xwl_seat_set_cursor(xwl_seat);
|
xwl_seat_set_cursor(xwl_seat);
|
||||||
xwl_seat->pointer =
|
xwl_seat->pointer =
|
||||||
add_device(xwl_seat, "xwayland-pointer", xwl_pointer_proc);
|
add_device(xwl_seat, "xwayland-pointer", xwl_pointer_proc);
|
||||||
|
ActivateDevice(xwl_seat->pointer, TRUE);
|
||||||
}
|
}
|
||||||
|
EnableDevice(xwl_seat->pointer, TRUE);
|
||||||
} else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && xwl_seat->wl_pointer) {
|
} else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && xwl_seat->wl_pointer) {
|
||||||
wl_pointer_release(xwl_seat->wl_pointer);
|
wl_pointer_release(xwl_seat->wl_pointer);
|
||||||
xwl_seat->wl_pointer = NULL;
|
xwl_seat->wl_pointer = NULL;
|
||||||
|
@ -534,12 +712,12 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||||
wl_keyboard_add_listener(xwl_seat->wl_keyboard,
|
wl_keyboard_add_listener(xwl_seat->wl_keyboard,
|
||||||
&keyboard_listener, xwl_seat);
|
&keyboard_listener, xwl_seat);
|
||||||
|
|
||||||
if (xwl_seat->keyboard)
|
if (xwl_seat->keyboard == NULL) {
|
||||||
EnableDevice(xwl_seat->keyboard, TRUE);
|
|
||||||
else {
|
|
||||||
xwl_seat->keyboard =
|
xwl_seat->keyboard =
|
||||||
add_device(xwl_seat, "xwayland-keyboard", xwl_keyboard_proc);
|
add_device(xwl_seat, "xwayland-keyboard", xwl_keyboard_proc);
|
||||||
|
ActivateDevice(xwl_seat->keyboard, TRUE);
|
||||||
}
|
}
|
||||||
|
EnableDevice(xwl_seat->keyboard, TRUE);
|
||||||
} else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && xwl_seat->wl_keyboard) {
|
} else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && xwl_seat->wl_keyboard) {
|
||||||
wl_keyboard_release(xwl_seat->wl_keyboard);
|
wl_keyboard_release(xwl_seat->wl_keyboard);
|
||||||
xwl_seat->wl_keyboard = NULL;
|
xwl_seat->wl_keyboard = NULL;
|
||||||
|
@ -548,8 +726,26 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||||
DisableDevice(xwl_seat->keyboard, TRUE);
|
DisableDevice(xwl_seat->keyboard, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (caps & WL_SEAT_CAPABILITY_TOUCH && xwl_seat->wl_touch == NULL) {
|
||||||
|
xwl_seat->wl_touch = wl_seat_get_touch(seat);
|
||||||
|
wl_touch_add_listener(xwl_seat->wl_touch,
|
||||||
|
&touch_listener, xwl_seat);
|
||||||
|
|
||||||
|
if (xwl_seat->touch)
|
||||||
|
EnableDevice(xwl_seat->touch, TRUE);
|
||||||
|
else {
|
||||||
|
xwl_seat->touch =
|
||||||
|
add_device(xwl_seat, "xwayland-touch", xwl_touch_proc);
|
||||||
|
}
|
||||||
|
} else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && xwl_seat->wl_touch) {
|
||||||
|
wl_touch_release(xwl_seat->wl_touch);
|
||||||
|
xwl_seat->wl_touch = NULL;
|
||||||
|
|
||||||
|
if (xwl_seat->touch)
|
||||||
|
DisableDevice(xwl_seat->touch, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
xwl_seat->xwl_screen->expecting_event--;
|
xwl_seat->xwl_screen->expecting_event--;
|
||||||
/* FIXME: Touch ... */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -586,11 +782,21 @@ create_input_device(struct xwl_screen *xwl_screen, uint32_t id, uint32_t version
|
||||||
xwl_seat->cursor = wl_compositor_create_surface(xwl_screen->compositor);
|
xwl_seat->cursor = wl_compositor_create_surface(xwl_screen->compositor);
|
||||||
wl_seat_add_listener(xwl_seat->seat, &seat_listener, xwl_seat);
|
wl_seat_add_listener(xwl_seat->seat, &seat_listener, xwl_seat);
|
||||||
wl_array_init(&xwl_seat->keys);
|
wl_array_init(&xwl_seat->keys);
|
||||||
|
|
||||||
|
xorg_list_init(&xwl_seat->touches);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xwl_seat_destroy(struct xwl_seat *xwl_seat)
|
xwl_seat_destroy(struct xwl_seat *xwl_seat)
|
||||||
{
|
{
|
||||||
|
struct xwl_touch *xwl_touch, *next_xwl_touch;
|
||||||
|
|
||||||
|
xorg_list_for_each_entry_safe(xwl_touch, next_xwl_touch,
|
||||||
|
&xwl_seat->touches, link_touch) {
|
||||||
|
xorg_list_del(&xwl_touch->link_touch);
|
||||||
|
free(xwl_touch);
|
||||||
|
}
|
||||||
|
|
||||||
wl_seat_destroy(xwl_seat->seat);
|
wl_seat_destroy(xwl_seat->seat);
|
||||||
wl_surface_destroy(xwl_seat->cursor);
|
wl_surface_destroy(xwl_seat->cursor);
|
||||||
if (xwl_seat->cursor_frame_cb)
|
if (xwl_seat->cursor_frame_cb)
|
||||||
|
@ -638,35 +844,18 @@ DDXRingBell(int volume, int pitch, int duration)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static WindowPtr
|
void
|
||||||
xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y)
|
xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window)
|
||||||
{
|
{
|
||||||
struct xwl_seat *xwl_seat = NULL;
|
struct xwl_touch *xwl_touch, *next_xwl_touch;
|
||||||
DeviceIntPtr device;
|
|
||||||
|
|
||||||
for (device = inputInfo.devices; device; device = device->next) {
|
xorg_list_for_each_entry_safe(xwl_touch, next_xwl_touch,
|
||||||
if (device->deviceProc == xwl_pointer_proc &&
|
&xwl_seat->touches, link_touch) {
|
||||||
device->spriteInfo->sprite == sprite) {
|
if (xwl_touch->window->window == window) {
|
||||||
xwl_seat = device->public.devicePrivate;
|
xorg_list_del(&xwl_touch->link_touch);
|
||||||
break;
|
free(xwl_touch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xwl_seat == NULL) {
|
|
||||||
/* XTEST device */
|
|
||||||
sprite->spriteTraceGood = 1;
|
|
||||||
return sprite->spriteTrace[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xwl_seat->focus_window) {
|
|
||||||
sprite->spriteTraceGood = 2;
|
|
||||||
sprite->spriteTrace[1] = xwl_seat->focus_window->window;
|
|
||||||
return miSpriteTrace(sprite, x, y);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sprite->spriteTraceGood = 1;
|
|
||||||
return sprite->spriteTrace[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -681,9 +870,6 @@ InitInput(int argc, char *argv[])
|
||||||
wl_registry_add_listener(xwl_screen->input_registry, &input_listener,
|
wl_registry_add_listener(xwl_screen->input_registry, &input_listener,
|
||||||
xwl_screen);
|
xwl_screen);
|
||||||
|
|
||||||
xwl_screen->XYToWindow = pScreen->XYToWindow;
|
|
||||||
pScreen->XYToWindow = xwl_xy_to_window;
|
|
||||||
|
|
||||||
xwl_screen->expecting_event = 0;
|
xwl_screen->expecting_event = 0;
|
||||||
wl_display_roundtrip(xwl_screen->display);
|
wl_display_roundtrip(xwl_screen->display);
|
||||||
while (xwl_screen->expecting_event)
|
while (xwl_screen->expecting_event)
|
||||||
|
|
|
@ -287,10 +287,10 @@ xwl_unrealize_window(WindowPtr window)
|
||||||
xwl_screen = xwl_screen_get(screen);
|
xwl_screen = xwl_screen_get(screen);
|
||||||
|
|
||||||
xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
|
xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
|
||||||
if (!xwl_seat->focus_window)
|
if (xwl_seat->focus_window && xwl_seat->focus_window->window == window)
|
||||||
continue;
|
|
||||||
if (xwl_seat->focus_window->window == window)
|
|
||||||
xwl_seat->focus_window = NULL;
|
xwl_seat->focus_window = NULL;
|
||||||
|
|
||||||
|
xwl_seat_clear_touch(xwl_seat, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
screen->UnrealizeWindow = xwl_screen->UnrealizeWindow;
|
screen->UnrealizeWindow = xwl_screen->UnrealizeWindow;
|
||||||
|
|
|
@ -62,7 +62,6 @@ struct xwl_screen {
|
||||||
DestroyWindowProcPtr DestroyWindow;
|
DestroyWindowProcPtr DestroyWindow;
|
||||||
RealizeWindowProcPtr RealizeWindow;
|
RealizeWindowProcPtr RealizeWindow;
|
||||||
UnrealizeWindowProcPtr UnrealizeWindow;
|
UnrealizeWindowProcPtr UnrealizeWindow;
|
||||||
XYToWindowProcPtr XYToWindow;
|
|
||||||
|
|
||||||
struct xorg_list output_list;
|
struct xorg_list output_list;
|
||||||
struct xorg_list seat_list;
|
struct xorg_list seat_list;
|
||||||
|
@ -107,13 +106,22 @@ struct xwl_window {
|
||||||
|
|
||||||
#define MODIFIER_META 0x01
|
#define MODIFIER_META 0x01
|
||||||
|
|
||||||
|
struct xwl_touch {
|
||||||
|
struct xwl_window *window;
|
||||||
|
int32_t id;
|
||||||
|
int x, y;
|
||||||
|
struct xorg_list link_touch;
|
||||||
|
};
|
||||||
|
|
||||||
struct xwl_seat {
|
struct xwl_seat {
|
||||||
DeviceIntPtr pointer;
|
DeviceIntPtr pointer;
|
||||||
DeviceIntPtr keyboard;
|
DeviceIntPtr keyboard;
|
||||||
|
DeviceIntPtr touch;
|
||||||
struct xwl_screen *xwl_screen;
|
struct xwl_screen *xwl_screen;
|
||||||
struct wl_seat *seat;
|
struct wl_seat *seat;
|
||||||
struct wl_pointer *wl_pointer;
|
struct wl_pointer *wl_pointer;
|
||||||
struct wl_keyboard *wl_keyboard;
|
struct wl_keyboard *wl_keyboard;
|
||||||
|
struct wl_touch *wl_touch;
|
||||||
struct wl_array keys;
|
struct wl_array keys;
|
||||||
struct xwl_window *focus_window;
|
struct xwl_window *focus_window;
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
|
@ -124,6 +132,8 @@ struct xwl_seat {
|
||||||
struct wl_callback *cursor_frame_cb;
|
struct wl_callback *cursor_frame_cb;
|
||||||
Bool cursor_needs_update;
|
Bool cursor_needs_update;
|
||||||
|
|
||||||
|
struct xorg_list touches;
|
||||||
|
|
||||||
size_t keymap_size;
|
size_t keymap_size;
|
||||||
char *keymap;
|
char *keymap;
|
||||||
struct wl_surface *keyboard_focus;
|
struct wl_surface *keyboard_focus;
|
||||||
|
@ -149,6 +159,8 @@ void xwl_seat_set_cursor(struct xwl_seat *xwl_seat);
|
||||||
|
|
||||||
void xwl_seat_destroy(struct xwl_seat *xwl_seat);
|
void xwl_seat_destroy(struct xwl_seat *xwl_seat);
|
||||||
|
|
||||||
|
void xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window);
|
||||||
|
|
||||||
Bool xwl_screen_init_output(struct xwl_screen *xwl_screen);
|
Bool xwl_screen_init_output(struct xwl_screen *xwl_screen);
|
||||||
|
|
||||||
struct xwl_output *xwl_output_create(struct xwl_screen *xwl_screen,
|
struct xwl_output *xwl_output_create(struct xwl_screen *xwl_screen,
|
||||||
|
|
Loading…
Reference in New Issue