Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • xorg/xserver
  • avolkov/xserver
  • keithp/xserver
  • aplattner/xserver
  • ajax/xserver
  • ofourdan/xserver
  • anholt/xserver
  • abono/xserver
  • airlied/xserver
  • romangg/xserver
  • ross/xserver
  • mupuf/xserver
  • jturney/xserver
  • CendioOssman/xserver
  • kamarul6401/xserver
  • daenzer/xserver
  • afett/xserver
  • coypoop/xserver
  • 3v1n0/xserver
  • llandwerlin/xserver
  • alanc/xserver
  • lyudess/xserver
  • twaik/xserver
  • shadeslayer/xserver
  • djlucas/xserver
  • aditj/xserver
  • dbn/xserver
  • awilfox/xserver
  • rmader/xserver
  • peterh/xserver
  • dk/xserver
  • dslater38/xserver
  • yshui/xserver
  • PaulKocialkowski/xserver
  • dixler/xserver
  • bentiss/xserver
  • mbiebl/xserver
  • rarbab/xserver
  • causztic/xserver
  • agoins/xserver
  • kbrenneman/xserver
  • Hi-Angel/xserver
  • mlankhorst/xserver
  • rgfernandes/xserver
  • topimiettinen/xserver
  • bphaslett/xserver
  • adamjrichter/xserver
  • karolherbst/xserver
  • carlosg/xserver
  • jwrdegoede/xserver
  • mattrope/xserver
  • sthibaul/xserver
  • J-Bu/xserver
  • nacho.resa/xserver
  • emersion/xserver
  • xexaxo/xserver
  • 1480c1/xserver
  • knisht/xserver
  • mattst88/xserver
  • goosen78/xserver
  • zubzub/xserver
  • vsyrjala/xserver
  • gerddie/xserver
  • JeffyCN/xserver
  • gtrentalancia/xserver
  • lostgoat/xserver
  • headrush/xserver
  • jadahl/xserver
  • webi123/xserver
  • zeising/xserver
  • marv/xserver
  • puleglot/xserver
  • zwenna/xserver
  • TAAPArthur/xserver
  • doraskayo/xserver
  • maos20008/xserver
  • tjbp/xserver
  • pq/xserver
  • yarivb/xserver
  • miztake/xserver
  • lynxeye/xserver
  • zboszor/xserver
  • kwg/xserver
  • Gorg/xserver
  • lkundrak/xserver
  • justazarsky/xserver
  • HermannSW/xserver
  • E5ten/xserver
  • bbrezillon/xserver
  • manu/xserver
  • lucyllewy/xserver
  • marvinjr35/xserver
  • jbeich/xserver
  • dirbaio/xserver
  • strassek/xserver
  • mntmn/xserver
  • uvas/xserver
  • azhadchenko/xserver
  • anarsoul/xserver
  • stapelberg/xserver
  • peigongdsd/xserver
  • sjoerd/xserver
  • Ma/xserver
  • mherrb/xserver
  • pichika/xserver
  • qarmin/xserver
  • cooperch/xserver
  • davidriley/xserver
  • lucmann/xserver
  • chema/xserver
  • whot/xserver
  • xdandys/xserver
  • Spintzyk/xserver
  • mikeroyal/xserver
  • ydirson/xserver
  • SimonPilkington/xserver
  • daniels/xserver
  • andrebsguedes/xserver
  • chenhuacai/xserver
  • Vivek/xserver
  • meMuszr/xserver
  • MisterDA/xserver
  • linkmauve/xserver
  • starnight/xserver
  • ekurzinger/xserver
  • DPA/xserver
  • hmazlan/xserver
  • alagner/xserver
  • tagr/xserver
  • alex-tu-cc/xserver
  • kaniini/xserver
  • p12tic/xserver
  • valpackett/xserver
  • Kishore409/xserver
  • bernhardu/xserver
  • kaichuan.hsieh/xserver
  • icenowy/xserver
  • rilian-la-te/xserver
  • smelenius/xserver
  • vfjpl/xserver
  • mvlad/xserver
  • vliaskov/xserver
  • hitong602/xserver
  • haagch/xserver
  • freemangordon/xserver
  • tmlind/xserver
  • vitoux.pascal/xserver
  • luporl/xserver
  • hassoon1986/xserver
  • chengbo7135/xserver
  • sri-ka1ki/xserver
  • kaocher82/xserver
  • heymiaoO/xserver
  • xry111/xserver
  • jcristau/xserver
  • lanodan/xserver
  • jcourreges/xserver
  • dottedmag/xserver
  • jeremyhu/xserver
  • jcherry/xserver
  • Zamundaaa/xserver
  • gsittyz/xserver
  • OlCe/xserver
  • manuelcrack642/xserver
  • kupper.pa/xserver
  • ZhiJie.Zhang/xserver
  • Michaelypk/xserver
  • msizanoen1/xserver
  • andreyknyazev077/xserver
  • christian-rauch/xserver
  • karlosrangel337/xserver
  • niveditharau/xserver
  • antonovitch/xserver
  • galaxytgtabiday/xserver
  • ryanneph/xserver
  • ismailsiege/xserver
  • orbea/xserver
  • FeepingCreature/xserver
  • ydc-dadada/xserver
  • davidedmundson/xserver
  • arichardson/xserver
  • 1740301466jxz/xserver
  • DemiMarie/xserver
  • kennylevinsen/xserver
  • mrisaacb/xserver
  • robclark/xserver
  • JoseExposito/xserver
  • refi_64/xserver
  • kleinerm/xserver
  • Acidburn0zzz/xserver
  • vinilokorlok/xserver
  • cubanismo/xserver
  • n3rdopolis/xserver
  • mwyraz/xserver
  • halfline/xserver
  • cpmichael/modesetting
  • sherrodejjohnson/xserver
  • eschwartz/xserver
  • oreaus/xserver
  • jocelyn/xserver
  • ernstp/xserver
  • LickmeDown/xserver
  • Daasin/xserver
  • huxd1532/xserver
  • cgzones/xserver
  • davidre/xserver
  • jsg/xserver
  • zagursky/xserver
  • thesamesam/xserver
  • ashafer/xserver
  • dengbo/xserver
  • josch/xserver
  • denisfa/xserver
  • benpicco/xserver
  • Tuetuopay/xserver
  • tholin/xserver
  • tzimmermann/xserver
  • Sjecai2/xserver
  • tintou/xserver
  • zaps166/xserver
  • schreibemirhalt/xserver
  • tomty89/xserver
  • contactshashanksharma/xserver-fork-shashank
  • os369510/xserver
  • liyi42/xserver
  • Kyawswat/xserver
  • psyruss85/xserver
  • akihiko.odaki/xserver
  • StarsGreen/xserver
  • klniu/xserver
  • pekdon/xserver
  • pkubaj/xserver
  • kerneltoast/xserver
  • wengxt/xserver
  • vanvugt/xserver
  • cbur201592/xserver
  • bkylerussell/xserver
  • wujiangGitHub/xserver
  • frog/xserver
  • bafanahub/xserver
  • Ivaniku/x-taylan
  • bigon/xserver
  • jrtc27/xserver
  • djacewicz/xserver
  • kylin0061/xserver
  • Fatton1/xserver
  • gmbr3/xserver
  • devin11911191/xserver
  • guillem/xserver
  • mahkoh/xserver
  • acelan/xserver
  • dkorkmazturk/xserver
  • olv/xserver
  • SpikyCaterpillar1/xserver
  • lihongtao/xserver
  • luke-jr/xserver
  • karamjameelmoore/xserver
  • mehdigh419/xserver
  • wiz/xserver
  • ecurtin/xserver
  • muesli4/xserver
  • iv-m/xserver
  • ForTheReallys/xserver
  • BBaoVanC/xserver
  • ccullumbine2018/xserver
  • mgorse1/xserver
  • road2react/xserver
  • mwei/xserver
  • Rui511/xserver
  • ThatMG393/xserver
  • haihao/xserver
  • ipominov/xserver
  • tsutsui/xserver
  • fweimer/xserver
  • gilvbp/xserver
  • themaister/xserver
  • bbeckett/xserver
  • TMR5454/xserver
  • erwinou/xserver
  • aarondill/xserver
  • peng.jin/xserver
  • russellcnv/xserver
  • yangxiaojuan-loongson/xserver
  • LiChenG-P/xserver
  • looi/xserver
  • NSUTanghaixiang/xserver
  • XDXTHX/xserver
  • City-busz/xserver
  • arrowd/xserver
  • zzyiwei/xserver
  • dongwonk/xserver
  • EXtremeExploit/xserver
  • luyn/xserver
  • hexiaodong/xserver
  • sewn/xserver
  • cl91/xserver
  • rnpnr/xserver
  • adamdruppe/xserver
  • RyzenDew/xserver
  • jexposit/xserver
  • svalaskevicius/xserver
  • floppym/xserver
  • metux/xserver
  • YusufKhan-gamedev/xserver
  • Drakulix/xserver
  • wjp/xserver
  • dawnhan/xserver
  • noblock/xserver
  • zzag/xserver
  • catap/xserver
  • trevdave/xserver
  • ids1024/xserver
  • gabifalk/xserver
  • Emantor/xserver
  • sknsean/xserver
  • hongaoo/xserver
  • penguin42/xserver
  • heitbaum/xserver
  • fvalasiad/xserver
  • AkiSakurai/xserver
  • chenx_dust/xserver
  • jmonteiro/xserver
  • gldrk/xserver
  • dougg3/xserver
  • pepp/xserver
  • Julia/xserver
  • nathankidd/xserver
  • jannau/xserver
  • zhangyaning/xserver
  • xinbowang/xserver
  • sergiomb/xserver
  • andy-zetier/xserver
  • jayantpranjal0/xserver
  • zzxyb/xserver
  • dkg/xserver
  • GermanAizek/xserver
  • dougvj/xserver
  • volkanorhan/xserver
  • rbernon/xserver
  • matt335672/xserver
  • gfxstrand/xorg-xserver
  • nicolas-guichard/xserver
  • rc_05/xserver
  • alex.kanavin/xserver
  • fakeczg/xserver
  • sunzhguy/xserver
  • gagern/xserver
347 results
Select Git revision
Show changes
Commits on Source (2)
...@@ -36,6 +36,7 @@ protodir = protocols_dep.get_pkgconfig_variable('pkgdatadir') ...@@ -36,6 +36,7 @@ protodir = protocols_dep.get_pkgconfig_variable('pkgdatadir')
pointer_xml = join_paths(protodir, 'unstable', 'pointer-constraints', 'pointer-constraints-unstable-v1.xml') pointer_xml = join_paths(protodir, 'unstable', 'pointer-constraints', 'pointer-constraints-unstable-v1.xml')
relative_xml = join_paths(protodir, 'unstable', 'relative-pointer', 'relative-pointer-unstable-v1.xml') relative_xml = join_paths(protodir, 'unstable', 'relative-pointer', 'relative-pointer-unstable-v1.xml')
gestures_xml = join_paths(protodir, 'unstable', 'pointer-gestures', 'pointer-gestures-unstable-v1.xml')
tablet_xml = join_paths(protodir, 'unstable', 'tablet', 'tablet-unstable-v2.xml') tablet_xml = join_paths(protodir, 'unstable', 'tablet', 'tablet-unstable-v2.xml')
kbgrab_xml = join_paths(protodir, 'unstable', 'xwayland-keyboard-grab', 'xwayland-keyboard-grab-unstable-v1.xml') kbgrab_xml = join_paths(protodir, 'unstable', 'xwayland-keyboard-grab', 'xwayland-keyboard-grab-unstable-v1.xml')
xdg_output_xml = join_paths(protodir, 'unstable', 'xdg-output', 'xdg-output-unstable-v1.xml') xdg_output_xml = join_paths(protodir, 'unstable', 'xdg-output', 'xdg-output-unstable-v1.xml')
...@@ -60,6 +61,7 @@ code = generator(scanner, ...@@ -60,6 +61,7 @@ code = generator(scanner,
) )
srcs += client_header.process(relative_xml) srcs += client_header.process(relative_xml)
srcs += client_header.process(pointer_xml) srcs += client_header.process(pointer_xml)
srcs += client_header.process(gestures_xml)
srcs += client_header.process(tablet_xml) srcs += client_header.process(tablet_xml)
srcs += client_header.process(kbgrab_xml) srcs += client_header.process(kbgrab_xml)
srcs += client_header.process(xdg_output_xml) srcs += client_header.process(xdg_output_xml)
...@@ -68,6 +70,7 @@ srcs += client_header.process(viewporter_xml) ...@@ -68,6 +70,7 @@ srcs += client_header.process(viewporter_xml)
srcs += client_header.process(xdg_shell_xml) srcs += client_header.process(xdg_shell_xml)
srcs += code.process(relative_xml) srcs += code.process(relative_xml)
srcs += code.process(pointer_xml) srcs += code.process(pointer_xml)
srcs += code.process(gestures_xml)
srcs += code.process(tablet_xml) srcs += code.process(tablet_xml)
srcs += code.process(kbgrab_xml) srcs += code.process(kbgrab_xml)
srcs += code.process(xdg_output_xml) srcs += code.process(xdg_output_xml)
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "pointer-constraints-unstable-v1-client-protocol.h" #include "pointer-constraints-unstable-v1-client-protocol.h"
#include "relative-pointer-unstable-v1-client-protocol.h" #include "relative-pointer-unstable-v1-client-protocol.h"
#include "tablet-unstable-v2-client-protocol.h" #include "tablet-unstable-v2-client-protocol.h"
#include "pointer-gestures-unstable-v1-client-protocol.h"
#include "xwayland-keyboard-grab-unstable-v1-client-protocol.h" #include "xwayland-keyboard-grab-unstable-v1-client-protocol.h"
struct axis_discrete_pending { struct axis_discrete_pending {
...@@ -242,6 +243,51 @@ xwl_pointer_proc_relative(DeviceIntPtr device, int what) ...@@ -242,6 +243,51 @@ xwl_pointer_proc_relative(DeviceIntPtr device, int what)
#undef NAXES #undef NAXES
} }
static int
xwl_pointer_proc_pointer_gestures(DeviceIntPtr device, int what)
{
#define NTOUCHPOINTS 20
#define NAXES 2
Atom axes_labels[NAXES] = { 0 };
switch (what) {
case DEVICE_INIT:
device->public.on = FALSE;
/* We need to setup a pointer device so that the device is attached to
master pointer device.
*/
axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
if (!InitValuatorClassDeviceStruct(device, NAXES, axes_labels,
GetMotionHistorySize(), Relative))
return BadValue;
InitValuatorAxisStruct(device, 0, axes_labels[0],
NO_AXIS_LIMITS, NO_AXIS_LIMITS, 0, 0, 0, Relative);
InitValuatorAxisStruct(device, 1, axes_labels[1],
NO_AXIS_LIMITS, NO_AXIS_LIMITS, 0, 0, 0, Relative);
InitGestureClassDeviceStruct(device, NTOUCHPOINTS);
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 NTOUCHPOINTS
#undef NAXES
}
static void static void
xwl_keyboard_control(DeviceIntPtr device, KeybdCtrl *ctrl) xwl_keyboard_control(DeviceIntPtr device, KeybdCtrl *ctrl)
{ {
...@@ -755,6 +801,132 @@ static const struct zwp_relative_pointer_v1_listener relative_pointer_listener = ...@@ -755,6 +801,132 @@ static const struct zwp_relative_pointer_v1_listener relative_pointer_listener =
relative_pointer_handle_relative_motion, relative_pointer_handle_relative_motion,
}; };
static void
pointer_gesture_swipe_handle_begin(void *data,
struct zwp_pointer_gesture_swipe_v1 *swipe,
uint32_t serial,
uint32_t time,
struct wl_surface *surface,
uint32_t fingers)
{
struct xwl_seat *xwl_seat = data;
xwl_seat->pointer_gesture_swipe_fingers = fingers;
QueueGestureSwipeEvents(xwl_seat->pointer_gestures,
XI_GestureSwipeBegin, fingers, 0, 0.0, 0.0, 0.0, 0.0);
}
static void
pointer_gesture_swipe_handle_update(void *data,
struct zwp_pointer_gesture_swipe_v1 *swipe,
uint32_t time,
wl_fixed_t dxf,
wl_fixed_t dyf)
{
struct xwl_seat *xwl_seat = data;
double dx = wl_fixed_to_double(dxf);
double dy = wl_fixed_to_double(dyf);
QueueGestureSwipeEvents(xwl_seat->pointer_gestures,
XI_GestureSwipeUpdate,
xwl_seat->pointer_gesture_swipe_fingers,
0,
dx, dy,
dx, dy);
}
static void
pointer_gesture_swipe_handle_end(void *data,
struct zwp_pointer_gesture_swipe_v1 *swipe,
uint32_t serial,
uint32_t time,
int32_t cancelled)
{
struct xwl_seat *xwl_seat = data;
uint32_t flags = 0;
if (cancelled)
flags |= XIGestureSwipeEventCancelled;
QueueGestureSwipeEvents(xwl_seat->pointer_gestures,
XI_GestureSwipeEnd,
xwl_seat->pointer_gesture_swipe_fingers,
flags, 0.0, 0.0, 0.0, 0.0);
}
static const struct zwp_pointer_gesture_swipe_v1_listener pointer_gesture_swipe_listener = {
pointer_gesture_swipe_handle_begin,
pointer_gesture_swipe_handle_update,
pointer_gesture_swipe_handle_end
};
static void
pointer_gesture_pinch_handle_begin(void *data,
struct zwp_pointer_gesture_pinch_v1 *pinch,
uint32_t serial,
uint32_t time,
struct wl_surface *surface,
uint32_t fingers)
{
struct xwl_seat *xwl_seat = data;
xwl_seat->pointer_gesture_pinch_fingers = fingers;
xwl_seat->pointer_gesture_pinch_last_scale = 1.0;
QueueGesturePinchEvents(xwl_seat->pointer_gestures,
XI_GesturePinchBegin, fingers, 0, 0.0, 0.0, 0.0, 0.0,
1.0, 0.0);
}
static void
pointer_gesture_pinch_handle_update(void *data,
struct zwp_pointer_gesture_pinch_v1 *pinch,
uint32_t time,
wl_fixed_t dxf,
wl_fixed_t dyf,
wl_fixed_t scalef,
wl_fixed_t rotation)
{
struct xwl_seat *xwl_seat = data;
double dx = wl_fixed_to_double(dxf);
double dy = wl_fixed_to_double(dyf);
double scale = wl_fixed_to_double(scalef);
xwl_seat->pointer_gesture_pinch_last_scale = scale;
QueueGesturePinchEvents(xwl_seat->pointer_gestures,
XI_GesturePinchUpdate,
xwl_seat->pointer_gesture_pinch_fingers,
0,
dx, dy,
dx, dy,
scale, wl_fixed_to_double(rotation));
}
static void
pointer_gesture_pinch_handle_end(void *data,
struct zwp_pointer_gesture_pinch_v1 *pinch,
uint32_t serial,
uint32_t time,
int32_t cancelled)
{
struct xwl_seat *xwl_seat = data;
uint32_t flags = 0;
if (cancelled)
flags |= XIGesturePinchEventCancelled;
QueueGesturePinchEvents(xwl_seat->pointer_gestures,
XI_GesturePinchEnd,
xwl_seat->pointer_gesture_pinch_fingers,
flags, 0.0, 0.0, 0.0, 0.0,
xwl_seat->pointer_gesture_pinch_last_scale, 0.0);
}
static const struct zwp_pointer_gesture_pinch_v1_listener pointer_gesture_pinch_listener = {
pointer_gesture_pinch_handle_begin,
pointer_gesture_pinch_handle_update,
pointer_gesture_pinch_handle_end
};
static void static void
keyboard_handle_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, keyboard_handle_key(void *data, struct wl_keyboard *keyboard, uint32_t serial,
uint32_t time, uint32_t key, uint32_t state) uint32_t time, uint32_t key, uint32_t state)
...@@ -1297,6 +1469,18 @@ release_pointer(struct xwl_seat *xwl_seat) ...@@ -1297,6 +1469,18 @@ release_pointer(struct xwl_seat *xwl_seat)
static void static void
init_relative_pointer(struct xwl_seat *xwl_seat) init_relative_pointer(struct xwl_seat *xwl_seat)
{
if (xwl_seat->relative_pointer == NULL) {
xwl_seat->relative_pointer =
add_device(xwl_seat, "xwayland-relative-pointer",
xwl_pointer_proc_relative);
ActivateDevice(xwl_seat->relative_pointer, TRUE);
}
enable_device(xwl_seat, xwl_seat->relative_pointer);
}
static void
init_relative_pointer_listener(struct xwl_seat *xwl_seat)
{ {
struct zwp_relative_pointer_manager_v1 *relative_pointer_manager = struct zwp_relative_pointer_manager_v1 *relative_pointer_manager =
xwl_seat->xwl_screen->relative_pointer_manager; xwl_seat->xwl_screen->relative_pointer_manager;
...@@ -1309,14 +1493,6 @@ init_relative_pointer(struct xwl_seat *xwl_seat) ...@@ -1309,14 +1493,6 @@ init_relative_pointer(struct xwl_seat *xwl_seat)
&relative_pointer_listener, &relative_pointer_listener,
xwl_seat); xwl_seat);
} }
if (xwl_seat->relative_pointer == NULL) {
xwl_seat->relative_pointer =
add_device(xwl_seat, "xwayland-relative-pointer",
xwl_pointer_proc_relative);
ActivateDevice(xwl_seat->relative_pointer, TRUE);
}
enable_device(xwl_seat, xwl_seat->relative_pointer);
} }
static void static void
...@@ -1331,6 +1507,64 @@ release_relative_pointer(struct xwl_seat *xwl_seat) ...@@ -1331,6 +1507,64 @@ release_relative_pointer(struct xwl_seat *xwl_seat)
disable_device(xwl_seat->relative_pointer); disable_device(xwl_seat->relative_pointer);
} }
static void
init_pointer_gestures_device(struct xwl_seat *xwl_seat)
{
if (xwl_seat->pointer_gestures == NULL) {
xwl_seat->pointer_gestures =
add_device(xwl_seat, "xwayland-pointer-gestures",
xwl_pointer_proc_pointer_gestures);
ActivateDevice(xwl_seat->pointer_gestures, TRUE);
}
enable_device(xwl_seat, xwl_seat->pointer_gestures);
}
static void
init_pointer_gestures_listener(struct xwl_seat *xwl_seat)
{
struct zwp_pointer_gestures_v1 *pointer_gestures =
xwl_seat->xwl_screen->pointer_gestures;
if (pointer_gestures && !xwl_seat->wp_pointer_gesture_swipe) {
xwl_seat->wp_pointer_gesture_swipe =
zwp_pointer_gestures_v1_get_swipe_gesture(pointer_gestures,
xwl_seat->wl_pointer);
zwp_pointer_gesture_swipe_v1_set_user_data(xwl_seat->wp_pointer_gesture_swipe,
xwl_seat);
zwp_pointer_gesture_swipe_v1_add_listener(xwl_seat->wp_pointer_gesture_swipe,
&pointer_gesture_swipe_listener,
xwl_seat);
}
if (pointer_gestures && !xwl_seat->wp_pointer_gesture_pinch) {
xwl_seat->wp_pointer_gesture_pinch =
zwp_pointer_gestures_v1_get_pinch_gesture(pointer_gestures,
xwl_seat->wl_pointer);
zwp_pointer_gesture_pinch_v1_set_user_data(xwl_seat->wp_pointer_gesture_pinch,
xwl_seat);
zwp_pointer_gesture_pinch_v1_add_listener(xwl_seat->wp_pointer_gesture_pinch,
&pointer_gesture_pinch_listener,
xwl_seat);
}
}
static void
release_pointer_gestures_device(struct xwl_seat *xwl_seat)
{
if (xwl_seat->wp_pointer_gesture_swipe) {
zwp_pointer_gesture_swipe_v1_destroy(xwl_seat->wp_pointer_gesture_swipe);
xwl_seat->wp_pointer_gesture_swipe = NULL;
}
if (xwl_seat->wp_pointer_gesture_pinch) {
zwp_pointer_gesture_pinch_v1_destroy(xwl_seat->wp_pointer_gesture_pinch);
xwl_seat->wp_pointer_gesture_pinch = NULL;
}
if (xwl_seat->pointer_gestures)
disable_device(xwl_seat->pointer_gestures);
}
static void static void
init_keyboard(struct xwl_seat *xwl_seat) init_keyboard(struct xwl_seat *xwl_seat)
{ {
...@@ -1403,9 +1637,13 @@ seat_handle_capabilities(void *data, struct wl_seat *seat, ...@@ -1403,9 +1637,13 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
if (caps & WL_SEAT_CAPABILITY_POINTER && xwl_seat->wl_pointer == NULL) { if (caps & WL_SEAT_CAPABILITY_POINTER && xwl_seat->wl_pointer == NULL) {
init_pointer(xwl_seat); init_pointer(xwl_seat);
init_relative_pointer(xwl_seat); init_relative_pointer(xwl_seat);
init_relative_pointer_listener(xwl_seat);
init_pointer_gestures_device(xwl_seat);
init_pointer_gestures_listener(xwl_seat);
} else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && xwl_seat->wl_pointer) { } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && xwl_seat->wl_pointer) {
release_pointer(xwl_seat); release_pointer(xwl_seat);
release_relative_pointer(xwl_seat); release_relative_pointer(xwl_seat);
release_pointer_gestures_device(xwl_seat);
} }
if (caps & WL_SEAT_CAPABILITY_KEYBOARD && xwl_seat->wl_keyboard == NULL) { if (caps & WL_SEAT_CAPABILITY_KEYBOARD && xwl_seat->wl_keyboard == NULL) {
...@@ -2555,6 +2793,16 @@ init_pointer_constraints(struct xwl_screen *xwl_screen, ...@@ -2555,6 +2793,16 @@ init_pointer_constraints(struct xwl_screen *xwl_screen,
1); 1);
} }
static void
init_pointer_gestures(struct xwl_screen *xwl_screen,
uint32_t id, uint32_t version)
{
xwl_screen->pointer_gestures =
wl_registry_bind(xwl_screen->registry, id,
&zwp_pointer_gestures_v1_interface,
1);
}
static void static void
init_keyboard_grab(struct xwl_screen *xwl_screen, init_keyboard_grab(struct xwl_screen *xwl_screen,
uint32_t id, uint32_t version) uint32_t id, uint32_t version)
...@@ -2576,6 +2824,34 @@ init_keyboard_grab(struct xwl_screen *xwl_screen, ...@@ -2576,6 +2824,34 @@ init_keyboard_grab(struct xwl_screen *xwl_screen,
} }
} }
/* The compositor may send us wl_seat and its capabilities before sending e.g.
relative_pointer_manager or pointer_gesture interfaces. This would result in
devices being created in capabilities handler, but listeners not, because
the interfaces weren't available at the time. So we manually attempt to setup
listeners again.
*/
static void
maybe_init_relative_pointer_listeners_after_capabilities(struct xwl_screen* xwl_screen)
{
struct xwl_seat *xwl_seat;
xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
if (xwl_seat->wl_pointer) {
init_relative_pointer_listener(xwl_seat);
}
}
}
static void
maybe_init_pointer_gesture_listeners_after_capabilities(struct xwl_screen* xwl_screen)
{
struct xwl_seat *xwl_seat;
xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
if (xwl_seat->wl_pointer) {
init_pointer_gestures_listener(xwl_seat);
}
}
}
static void static void
input_handler(void *data, struct wl_registry *registry, uint32_t id, input_handler(void *data, struct wl_registry *registry, uint32_t id,
const char *interface, uint32_t version) const char *interface, uint32_t version)
...@@ -2587,8 +2863,12 @@ input_handler(void *data, struct wl_registry *registry, uint32_t id, ...@@ -2587,8 +2863,12 @@ input_handler(void *data, struct wl_registry *registry, uint32_t id,
xwl_screen->expecting_event++; xwl_screen->expecting_event++;
} else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) { } else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) {
init_relative_pointer_manager(xwl_screen, id, version); init_relative_pointer_manager(xwl_screen, id, version);
maybe_init_relative_pointer_listeners_after_capabilities(xwl_screen);
} else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) { } else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) {
init_pointer_constraints(xwl_screen, id, version); init_pointer_constraints(xwl_screen, id, version);
} else if (strcmp(interface, "zwp_pointer_gestures_v1") == 0) {
init_pointer_gestures(xwl_screen, id, version);
maybe_init_pointer_gesture_listeners_after_capabilities(xwl_screen);
} else if (strcmp(interface, "zwp_tablet_manager_v2") == 0) { } else if (strcmp(interface, "zwp_tablet_manager_v2") == 0) {
init_tablet_manager(xwl_screen, id, version); init_tablet_manager(xwl_screen, id, version);
} else if (strcmp(interface, "zwp_xwayland_keyboard_grab_manager_v1") == 0) { } else if (strcmp(interface, "zwp_xwayland_keyboard_grab_manager_v1") == 0) {
......
...@@ -56,6 +56,7 @@ struct xwl_cursor { ...@@ -56,6 +56,7 @@ struct xwl_cursor {
struct xwl_seat { struct xwl_seat {
DeviceIntPtr pointer; DeviceIntPtr pointer;
DeviceIntPtr relative_pointer; DeviceIntPtr relative_pointer;
DeviceIntPtr pointer_gestures;
DeviceIntPtr keyboard; DeviceIntPtr keyboard;
DeviceIntPtr touch; DeviceIntPtr touch;
DeviceIntPtr stylus; DeviceIntPtr stylus;
...@@ -65,6 +66,8 @@ struct xwl_seat { ...@@ -65,6 +66,8 @@ struct xwl_seat {
struct wl_seat *seat; struct wl_seat *seat;
struct wl_pointer *wl_pointer; struct wl_pointer *wl_pointer;
struct zwp_relative_pointer_v1 *wp_relative_pointer; struct zwp_relative_pointer_v1 *wp_relative_pointer;
struct zwp_pointer_gesture_swipe_v1 *wp_pointer_gesture_swipe;
struct zwp_pointer_gesture_pinch_v1 *wp_pointer_gesture_pinch;
struct wl_keyboard *wl_keyboard; struct wl_keyboard *wl_keyboard;
struct wl_touch *wl_touch; struct wl_touch *wl_touch;
struct zwp_tablet_seat_v2 *tablet_seat; struct zwp_tablet_seat_v2 *tablet_seat;
...@@ -80,6 +83,10 @@ struct xwl_seat { ...@@ -80,6 +83,10 @@ struct xwl_seat {
struct xwl_cursor cursor; struct xwl_cursor cursor;
WindowPtr last_xwindow; WindowPtr last_xwindow;
uint32_t pointer_gesture_swipe_fingers;
uint32_t pointer_gesture_pinch_fingers;
double pointer_gesture_pinch_last_scale;
struct xorg_list touches; struct xorg_list touches;
size_t keymap_size; size_t keymap_size;
......
...@@ -82,6 +82,7 @@ struct xwl_screen { ...@@ -82,6 +82,7 @@ struct xwl_screen {
struct xdg_wm_base *xdg_wm_base; struct xdg_wm_base *xdg_wm_base;
struct zwp_relative_pointer_manager_v1 *relative_pointer_manager; struct zwp_relative_pointer_manager_v1 *relative_pointer_manager;
struct zwp_pointer_constraints_v1 *pointer_constraints; struct zwp_pointer_constraints_v1 *pointer_constraints;
struct zwp_pointer_gestures_v1 *pointer_gestures;
struct zwp_xwayland_keyboard_grab_manager_v1 *wp_grab; struct zwp_xwayland_keyboard_grab_manager_v1 *wp_grab;
struct zwp_linux_dmabuf_v1 *dmabuf; struct zwp_linux_dmabuf_v1 *dmabuf;
struct zxdg_output_manager_v1 *xdg_output_manager; struct zxdg_output_manager_v1 *xdg_output_manager;
......