1 /**************************************************************************
\r
3 xorg-server/gesture/gesture.c
\r
5 Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
\r
7 Contact: Sung-Jin Park <sj76.park@samsung.com>
\r
8 Sangjin LEE <lsj119@samsung.com>
\r
10 Permission is hereby granted, free of charge, to any person obtaining a
\r
11 copy of this software and associated documentation files (the
\r
12 "Software"), to deal in the Software without restriction, including
\r
13 without limitation the rights to use, copy, modify, merge, publish,
\r
14 distribute, sub license, and/or sell copies of the Software, and to
\r
15 permit persons to whom the Software is furnished to do so, subject to
\r
16 the following conditions:
\r
18 The above copyright notice and this permission notice (including the
\r
19 next paragraph) shall be included in all copies or substantial portions
\r
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
\r
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
\r
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
\r
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
\r
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
\r
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
30 **************************************************************************/
\r
32 #ifdef HAVE_DIX_CONFIG_H
\r
33 #include <dix-config.h>
\r
37 #include "dixstruct.h"
\r
38 #include "globals.h"
\r
39 #include "extnsionst.h"
\r
40 #include "windowstr.h"
\r
41 #include "servermd.h"
\r
42 #include "swaprep.h"
\r
43 #include <X11/extensions/gestureproto.h>
\r
44 #include "gestureext.h"
\r
45 #include "protocol-versions.h"
\r
46 #include "inputstr.h"
\r
48 //#define __DEBUG_GESTURE_EXT__
\r
50 DevPrivateKeyRec gestureWindowPrivateKeyRec;
\r
51 #define gestureWindowPrivateKey (&gestureWindowPrivateKeyRec)
\r
53 static Mask grabbed_events_mask = 0;
\r
54 static int max_num_finger = 0;
\r
55 static GestureGrabEventRec grabbed_events[GestureNumberEvents];
\r
57 extern CallbackListPtr ResourceStateCallback;
\r
59 static unsigned char GestureReqCode = 0;
\r
60 static int GestureEventBase = 0;
\r
61 static int GestureErrorBase;
\r
63 static GestureProcsPtr GestureProcs;
\r
64 static GestureProcsRec GestureExtProcs = {
\r
67 static DISPATCH_PROC(ProcGestureDispatch);
\r
68 static DISPATCH_PROC(ProcGestureQueryVersion);
\r
69 static DISPATCH_PROC(ProcGestureSelectEvents);
\r
70 static DISPATCH_PROC(ProcGestureGetSelectedEvents);
\r
71 static DISPATCH_PROC(ProcGestureGrabEvent);
\r
72 static DISPATCH_PROC(ProcGestureUngrabEvent);
\r
73 static DISPATCH_PROC(SProcGestureDispatch);
\r
74 static DISPATCH_PROC(SProcGestureQueryVersion);
\r
75 static DISPATCH_PROC(SProcGestureSelectEvents);
\r
76 static DISPATCH_PROC(SProcGestureGetSelectedEvents);
\r
77 static DISPATCH_PROC(SProcGestureGrabEvent);
\r
78 static DISPATCH_PROC(SProcGestureUngrabEvent);
\r
80 //event swap functions
\r
81 static void SGestureNotifyGroupEvent(xGestureNotifyGroupEvent *from, xGestureNotifyGroupEvent *to);
\r
82 static void SGestureNotifyFlickEvent(xGestureNotifyFlickEvent *from, xGestureNotifyFlickEvent *to);
\r
83 static void SGestureNotifyPanEvent(xGestureNotifyPanEvent *from, xGestureNotifyPanEvent *to);
\r
84 static void SGestureNotifyPinchRotationEvent(xGestureNotifyPinchRotationEvent *from, xGestureNotifyPinchRotationEvent *to);
\r
85 static void SGestureNotifyTapEvent(xGestureNotifyTapEvent *from, xGestureNotifyTapEvent *to);
\r
86 static void SGestureNotifyTapNHoldEvent(xGestureNotifyTapNHoldEvent *from, xGestureNotifyTapNHoldEvent *to);
\r
87 static void SGestureNotifyHoldEvent(xGestureNotifyHoldEvent *from, xGestureNotifyHoldEvent *to);
\r
88 static void SGestureNotifyEvent(xEvent * from, xEvent * to);
\r
90 void GestureExtInit(void)
\r
92 GestureExtensionInit();
\r
96 GestureExtensionInit(void)
\r
98 ExtensionEntry* extEntry;
\r
100 if (extEntry = AddExtension(GESTURE_EXT_NAME,
\r
101 GestureNumberEvents,
\r
102 GestureNumberErrors,
\r
103 ProcGestureDispatch,
\r
104 SProcGestureDispatch,
\r
106 StandardMinorOpcode))
\r
108 GestureReqCode = (unsigned char)extEntry->base;
\r
109 GestureErrorBase = extEntry->errorBase;
\r
110 GestureEventBase = extEntry->eventBase;
\r
111 EventSwapVector[GestureEventBase] = (EventSwapPtr) SGestureNotifyEvent;
\r
113 if (!dixRegisterPrivateKey(&gestureWindowPrivateKeyRec, PRIVATE_WINDOW, 0))
\r
115 ErrorF("[X11][GestureExtensionInit] Failed to register private key object !\n");
\r
119 memset(grabbed_events, 0, sizeof(GestureGrabEventRec)*GestureNumberEvents);
\r
127 * functions for gesture driver
\r
129 Bool GestureSetMaxNumberOfFingers(int num_finger)
\r
133 if( !grabbed_events )
\r
136 max_num_finger = num_finger + 1;
\r
137 #ifdef __DEBUG_GESTURE_EXT__
\r
138 ErrorF("[X11][GestureSetMaxNumberOfFingers] num_finger=%d, max_num_finger=%d\n", num_finger, max_num_finger);
\r
139 #endif//__DEBUG_GESTURE_EXT__
\r
141 for( i = 0 ; i < GestureNumberEvents ; i++ )
\r
143 grabbed_events[i].pGestureGrabWinInfo = malloc(sizeof(GestureGrabWinInfoRec)*max_num_finger);
\r
144 if( !grabbed_events[i].pGestureGrabWinInfo )
\r
146 ErrorF("[X11][GestureSetMaxNumberOfFingers] Failed to allocate memory for grabbed_events[%d].pGestureGrabWinInfo !\n", i);
\r
149 memset(grabbed_events[i].pGestureGrabWinInfo, 0, sizeof(GestureGrabWinInfoRec)*max_num_finger);
\r
155 Bool GestureUnsetMaxNumberOfFingers(void)
\r
159 if( !grabbed_events )
\r
162 for( i = 0 ; i < GestureNumberEvents ; i++ )
\r
164 if( grabbed_events[i].pGestureGrabWinInfo )
\r
166 free(grabbed_events[i].pGestureGrabWinInfo);
\r
169 max_num_finger = 0;
\r
171 #ifdef __DEBUG_GESTURE_EXT__
\r
172 ErrorF("[X11][GestureUnsetMaxNumberOfFingers] max_num_finger=%d\n", max_num_finger);
\r
173 #endif//__DEBUG_GESTURE_EXT__
\r
178 Bool GestureHasGrabbedEvents(Mask *pGrabMask, GestureGrabEventPtr *pGrabEvent)
\r
182 if( !pGrabEvent || !pGrabMask )
\r
184 ErrorF("[X11][GestureHasGrabbedEvents] pGrabEvent or pGrabMask is NULL !\n");
\r
188 *pGrabMask = grabbed_events_mask;
\r
189 *pGrabEvent = grabbed_events;
\r
191 if( !grabbed_events_mask )
\r
193 #ifdef __DEBUG_GESTURE_EXT__
\r
194 ErrorF("[X11][GestureHasGrabbedEvents] grabbed_events_mask is zero !\n");
\r
195 #endif//__DEBUG_GESTURE_EXT__
\r
198 #ifdef __DEBUG_GESTURE_EXT__
\r
201 ErrorF("[X11][GestureHasGrabbedEvents] grabbed_events_mask=0x%x\n", *pGrabMask);
\r
203 #endif//__DEBUG_GESTURE_EXT__
\r
208 Bool GestureHasSelectedEvents(WindowPtr pWin, Mask *pEventMask)
\r
211 GestureWindowPrivatePtr pPriv;
\r
213 if( !pWin || !pEventMask )
\r
215 ErrorF("[X11][GestureHasSelectedEvents] pWin or pEventMask is NULL !\n");
\r
219 pPriv = dixLookupPrivate(&pWin->devPrivates, gestureWindowPrivateKey);
\r
223 #ifdef __DEBUG_GESTURE_EXT__
\r
224 ErrorF("[X11][GestureHasSelectedEvents] no mask exist on window(0x%x)\n", pWin->drawable.id);
\r
225 #endif//__DEBUG_GESTURE_EXT__
\r
230 #ifdef __DEBUG_GESTURE_EXT__
\r
231 ErrorF("[X11][GestureHasSelectedEvents] mask=0x%x on window(0x%x)\n", pPriv->mask, pWin->drawable.id);
\r
232 #endif//__DEBUG_GESTURE_EXT__
\r
234 *pEventMask = pPriv->mask;
\r
240 * Hooking functions for tracing destroy of grab window(s)
\r
242 static void GestureResourceStateCallback(CallbackListPtr *pcbl, pointer closure, pointer calldata)
\r
244 int i, j, none_win_count;
\r
245 GestureWindowPrivatePtr pPriv;
\r
246 ResourceStateInfoRec *rec = calldata;
\r
247 WindowPtr pWin = (WindowPtr)rec->value;
\r
249 if (rec->type != RT_WINDOW)
\r
251 if (rec->state != ResourceStateFreeing)
\r
253 if( !grabbed_events_mask )
\r
256 #ifdef __DEBUG_GESTURE_EXT__
\r
257 ErrorF("[X11][GestureResourceStateCallback] rec->id=0x%x, pWin->drawable.id=0x%x\n", rec->id, pWin->drawable.id);
\r
258 ErrorF("[X11][GestureResourceStateCallback][start] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
259 #endif//__DEBUG_GESTURE_EXT__
\r
261 for( i = 0 ; i < GestureNumberEvents ; i++ )
\r
263 none_win_count = 0;
\r
264 for( j = 0 ; j < max_num_finger ; j++ )
\r
266 if( grabbed_events[i].pGestureGrabWinInfo[j].window == pWin->drawable.id )
\r
268 #ifdef __DEBUG_GESTURE_EXT__
\r
269 ErrorF("[X11][GestureResourceStateCallback][1.5] i=%d, j=%d\n", i, j);
\r
270 #endif//__DEBUG_GESTURE_EXT__
\r
271 grabbed_events[i].pGestureGrabWinInfo[j].window = None;
\r
272 grabbed_events[i].pGestureGrabWinInfo[j].pWin = NULL;
\r
275 if( None == grabbed_events[i].pGestureGrabWinInfo[j].window )
\r
281 if( none_win_count == max_num_finger )
\r
283 #ifdef __DEBUG_GESTURE_EXT__
\r
284 ErrorF("[X11][GestureResourceStateCallback][before] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
285 #endif//__DEBUG_GESTURE_EXT__
\r
286 grabbed_events_mask = grabbed_events_mask & ~(1 << i);
\r
287 #ifdef __DEBUG_GESTURE_EXT__
\r
288 ErrorF("[X11][GestureResourceStateCallback][after] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
289 #endif//__DEBUG_GESTURE_EXT__
\r
293 #ifdef __DEBUG_GESTURE_EXT__
\r
294 ErrorF("[X11][GestureResourceStateCallback][end] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
295 #endif//__DEBUG_GESTURE_EXT__
\r
301 GestureInstallResourceStateHooks(void)
\r
305 res = AddCallback(&ResourceStateCallback, GestureResourceStateCallback, NULL);
\r
309 ErrorF("[X11][GestureInstallResourceStateHooks] Failed to register one or more callbacks ! (res=%d)\n", res);
\r
313 #ifdef __DEBUG_GESTURE_EXT__
\r
314 ErrorF("[X11][GestureInstallResourceStateHooks] AddCallback result = %d\n", res);
\r
315 #endif//__DEBUG_GESTURE_EXT__
\r
320 GestureUninstallResourceStateHooks(void)
\r
324 res = DeleteCallback(&ResourceStateCallback, GestureResourceStateCallback, NULL);
\r
326 #ifdef __DEBUG_GESTURE_EXT__
\r
327 ErrorF("[X11][GestureUninstallResourceStateHooks] DeleteCallback result = %d\n", res);
\r
328 #endif//__DEBUG_GESTURE_EXT__
\r
333 * deliver the event
\r
336 GestureSendEvent (WindowPtr pWin, int type, unsigned int mask, xGestureCommonEvent *gce)
\r
339 Mask access_mode = 0;
\r
340 GestureWindowPrivatePtr pPriv;
\r
341 WindowPtr pTmp = NULL;
\r
345 access_mode |= DixReceiveAccess;
\r
346 rc = dixLookupWindow(&pWin, gce->any.window, serverClient, access_mode);
\r
347 if( rc != Success || !pWin )
\r
349 ErrorF("[X11][GestureSendEvent] Failed to lookup window !\n");
\r
353 pPriv = dixLookupPrivate(&pWin->devPrivates, gestureWindowPrivateKey);
\r
357 #ifdef __DEBUG_GESTURE_EXT__
\r
358 ErrorF("[X11][GestureSendEvent] no mask exist on win(0x%x)\n", pWin->drawable.id);
\r
359 #endif//__DEBUG_GESTURE_EXT__
\r
363 #ifdef __DEBUG_GESTURE_EXT__
\r
364 ErrorF("[X11][GestureSendEvent] type=%d, mask=%d\n", type, mask);
\r
365 #endif//__DEBUG_GESTURE_EXT__
\r
367 if( !(pPriv->mask & mask) )
\r
369 #ifdef __DEBUG_GESTURE_EXT__
\r
370 ErrorF("[X11][GestureSendEvent] selected window doesn't have valid event mask ! (pPriv->mask=0x%x, mask=0x%x)\n", pPriv->mask, mask);
\r
371 #endif//__DEBUG_GESTURE_EXT__
\r
376 gce->any.type = type + GestureEventBase;
\r
377 gce->any.time = currentTime.milliseconds;
\r
378 WriteEventsToClient(wClient(pWin), 1, (xEvent *) gce);
\r
379 #ifdef __DEBUG_GESTURE_EXT__
\r
380 ErrorF("[X11][GestureSendEvent] Send gesture event(type:%x) to win(0x%x)\n", type, pWin->drawable.id);
\r
381 #endif//__DEBUG_GESTURE_EXT__
\r
385 SGestureNotifyGroupEvent(xGestureNotifyGroupEvent *from, xGestureNotifyGroupEvent *to)
\r
387 to->type = from->type;
\r
388 to->kind = from->kind;
\r
389 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
390 cpswapl(from->window, to->window);
\r
391 cpswapl(from->time, to->time);
\r
392 to->groupid = from->groupid;
\r
393 to->num_group = from->num_group;
\r
402 SGestureNotifyFlickEvent(xGestureNotifyFlickEvent *from, xGestureNotifyFlickEvent *to)
\r
404 to->type = from->type;
\r
405 to->kind = from->kind;
\r
406 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
407 cpswapl(from->window, to->window);
\r
408 cpswapl(from->time, to->time);
\r
409 to->num_finger = from->num_finger;
\r
410 to->direction = from->direction;
\r
411 cpswaps(from->distance, to->distance);
\r
412 cpswapl(from->duration, to->duration);
\r
413 cpswapl(from->angle, to->angle);
\r
419 SGestureNotifyPanEvent(xGestureNotifyPanEvent *from, xGestureNotifyPanEvent *to)
\r
421 to->type = from->type;
\r
422 to->kind = from->kind;
\r
423 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
424 cpswapl(from->window, to->window);
\r
425 cpswapl(from->time, to->time);
\r
426 to->num_finger = from->num_finger;
\r
427 to->direction = from->direction;
\r
428 cpswaps(from->distance, to->distance);
\r
429 cpswapl(from->duration, to->duration);
\r
430 cpswaps(from->dx, to->dx);
\r
431 cpswaps(from->dy, to->dy);
\r
437 SGestureNotifyPinchRotationEvent(xGestureNotifyPinchRotationEvent *from, xGestureNotifyPinchRotationEvent *to)
\r
439 to->type = from->type;
\r
440 to->kind = from->kind;
\r
441 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
442 cpswapl(from->window, to->window);
\r
443 cpswapl(from->time, to->time);
\r
444 to->num_finger = from->num_finger;
\r
446 cpswaps(from->distance, to->distance);
\r
447 cpswaps(from->cx, to->cx);
\r
448 cpswaps(from->cy, to->cy);
\r
449 cpswapl(from->zoom, to->zoom);
\r
450 cpswapl(from->angle, to->angle);
\r
455 SGestureNotifyTapEvent(xGestureNotifyTapEvent *from, xGestureNotifyTapEvent *to)
\r
457 to->type = from->type;
\r
458 to->kind = from->kind;
\r
459 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
460 cpswapl(from->window, to->window);
\r
461 cpswapl(from->time, to->time);
\r
462 to->num_finger = from->num_finger;
\r
464 cpswaps(from->cx, to->cx);
\r
465 cpswaps(from->cy, to->cy);
\r
466 to->tap_repeat = from->tap_repeat;
\r
468 cpswapl(from->interval, to->interval);
\r
474 SGestureNotifyTapNHoldEvent(xGestureNotifyTapNHoldEvent *from, xGestureNotifyTapNHoldEvent *to)
\r
476 to->type = from->type;
\r
477 to->kind = from->kind;
\r
478 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
479 cpswapl(from->window, to->window);
\r
480 cpswapl(from->time, to->time);
\r
481 to->num_finger = from->num_finger;
\r
483 cpswaps(from->cx, to->cx);
\r
484 cpswaps(from->cy, to->cy);
\r
486 cpswapl(from->interval, to->interval);
\r
487 cpswapl(from->holdtime, to->holdtime);
\r
492 SGestureNotifyHoldEvent(xGestureNotifyHoldEvent *from, xGestureNotifyHoldEvent *to)
\r
494 to->type = from->type;
\r
495 to->kind = from->kind;
\r
496 cpswaps(from->sequenceNumber, to->sequenceNumber);
\r
497 cpswapl(from->window, to->window);
\r
498 cpswapl(from->time, to->time);
\r
499 to->num_finger = from->num_finger;
\r
501 cpswaps(from->cx, to->cx);
\r
502 cpswaps(from->cy, to->cy);
\r
504 cpswapl(from->holdtime, to->holdtime);
\r
510 SGestureNotifyEvent(xEvent * from, xEvent * to)
\r
512 switch (from->u.u.detail) {
\r
513 case GestureNotifyGroup:
\r
514 SGestureNotifyGroupEvent((xGestureNotifyGroupEvent *)from,
\r
515 (xGestureNotifyGroupEvent *)to);
\r
517 case GestureNotifyFlick:
\r
518 SGestureNotifyFlickEvent((xGestureNotifyFlickEvent *)from,
\r
519 (xGestureNotifyFlickEvent *)to);
\r
521 case GestureNotifyPan:
\r
522 SGestureNotifyPanEvent((xGestureNotifyPanEvent *)from,
\r
523 (xGestureNotifyPanEvent *)to);
\r
525 case GestureNotifyPinchRotation:
\r
526 SGestureNotifyPinchRotationEvent((xGestureNotifyPinchRotationEvent *)from,
\r
527 (xGestureNotifyPinchRotationEvent *)to);
\r
529 case GestureNotifyTap:
\r
530 SGestureNotifyTapEvent((xGestureNotifyTapEvent *)from,
\r
531 (xGestureNotifyTapEvent *)to);
\r
533 case GestureNotifyTapNHold:
\r
534 SGestureNotifyTapNHoldEvent((xGestureNotifyTapNHoldEvent *)from,
\r
535 (xGestureNotifyTapNHoldEvent *)to);
\r
537 case GestureNotifyHold:
\r
538 SGestureNotifyHoldEvent((xGestureNotifyHoldEvent *)from,
\r
539 (xGestureNotifyHoldEvent *)to);
\r
542 #ifdef __DEBUG_GESTURE_EXT__
\r
543 ErrorF("[X11][SGestureNotifyEvent] ...\n");
\r
544 #endif//__DEBUG_GESTURE_EXT__
\r
548 ProcGestureQueryVersion(register ClientPtr client)
\r
550 xGestureQueryVersionReply rep;
\r
553 REQUEST_SIZE_MATCH(xGestureQueryVersionReq);
\r
554 rep.type = X_Reply;
\r
556 rep.sequenceNumber = client->sequence;
\r
557 rep.majorVersion = SERVER_GESTURE_MAJOR_VERSION;
\r
558 rep.minorVersion = SERVER_GESTURE_MINOR_VERSION;
\r
559 rep.patchVersion = SERVER_GESTURE_PATCH_VERSION;
\r
560 if (client->swapped)
\r
562 swaps(&rep.sequenceNumber, n);
\r
563 swapl(&rep.length, n);
\r
564 swaps(&rep.majorVersion, n);
\r
565 swaps(&rep.minorVersion, n);
\r
566 swapl(&rep.patchVersion, n);
\r
568 WriteToClient(client, sizeof(xGestureQueryVersionReply), (char *)&rep);
\r
570 #ifdef __DEBUG_GESTURE_EXT__
\r
571 ErrorF("[X11][ProcGestureQueryVersion] return Success !\n");
\r
572 #endif//__DEBUG_GESTURE_EXT__
\r
578 SProcGestureQueryVersion(register ClientPtr client)
\r
581 REQUEST(xGestureQueryVersionReq);
\r
582 swaps(&stuff->length, n);
\r
583 return ProcGestureQueryVersion(client);
\r
587 SProcGestureSelectEvents(register ClientPtr client)
\r
590 REQUEST(xGestureSelectEventsReq);
\r
591 swaps(&stuff->length, n);
\r
592 swapl(&stuff->window, n);
\r
593 swapl(&stuff->mask, n);
\r
594 return ProcGestureSelectEvents(client);
\r
598 ProcGestureSelectEvents (register ClientPtr client)
\r
602 Mask access_mode = 0;
\r
603 GestureWindowPrivatePtr pPriv;
\r
605 REQUEST(xGestureSelectEventsReq);
\r
606 REQUEST_SIZE_MATCH (xGestureSelectEventsReq);
\r
608 #ifdef __DEBUG_GESTURE_EXT__
\r
609 ErrorF("[X11][ProcGestureSelectEvents] after REQUEST_SIZE_MATCH !\n");
\r
610 #endif//__DEBUG_GESTURE_EXT__
\r
612 access_mode |= DixReceiveAccess;
\r
613 rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
\r
614 if( rc != Success || !pWin )
\r
616 ErrorF("[X11][ProcGestureSelectEvents] Failed to lookup window !\n");
\r
620 #ifdef __DEBUG_GESTURE_EXT__
\r
621 ErrorF("[X11][ProcGestureSelectEvents] pWin->drawable.id=0x%x\n", pWin->drawable.id);
\r
622 #endif//__DEBUG_GESTURE_EXT__
\r
624 pPriv = dixLookupPrivate(&pWin->devPrivates, gestureWindowPrivateKey);
\r
626 if( NULL == pPriv )//no mask was set
\r
628 if( stuff->mask != 0 )
\r
630 pPriv = malloc(sizeof *pPriv);
\r
633 ErrorF("[X11][ProcGestureSelectEvents] Failed to allocate memory !\n");
\r
637 pPriv->mask = stuff->mask;
\r
638 dixSetPrivate(&pWin->devPrivates, gestureWindowPrivateKey, pPriv);
\r
639 #ifdef __DEBUG_GESTURE_EXT__
\r
640 ErrorF("[X11][ProcGestureSelectEvents] mask(0x%x) was addded on win(0x%x) !\n", stuff->mask, stuff->window);
\r
641 #endif//__DEBUG_GESTURE_EXT__
\r
644 else//mask was set already
\r
646 if( stuff->mask == 0 )
\r
649 dixSetPrivate(&pWin->devPrivates, gestureWindowPrivateKey, NULL);
\r
650 #ifdef __DEBUG_GESTURE_EXT__
\r
651 ErrorF("[X11][ProcGestureSelectEvents] mask was removed on win(0x%x) !\n", stuff->window);
\r
652 #endif//__DEBUG_GESTURE_EXT__
\r
656 pPriv->mask = stuff->mask;
\r
657 dixSetPrivate(&pWin->devPrivates, gestureWindowPrivateKey, pPriv);
\r
658 #ifdef __DEBUG_GESTURE_EXT__
\r
659 ErrorF("[X11][ProcGestureSelectEvents] mask(0x%x) was updated on win(0x%x) !\n", stuff->mask, stuff->window);
\r
660 #endif//__DEBUG_GESTURE_EXT__
\r
664 #ifdef __DEBUG_GESTURE_EXT__
\r
665 ErrorF("[X11][ProcGestureSelectEvents] Success !\n");
\r
666 #endif//__DEBUG_GESTURE_EXT__
\r
672 SProcGestureGetSelectedEvents(register ClientPtr client)
\r
675 REQUEST(xGestureGetSelectedEventsReq);
\r
676 swaps(&stuff->length, n);
\r
677 swapl(&stuff->window, n);
\r
678 return ProcGestureGetSelectedEvents(client);
\r
682 ProcGestureGetSelectedEvents (register ClientPtr client)
\r
685 int rc, ret = Success;
\r
687 Mask access_mode = 0;
\r
689 GestureWindowPrivatePtr pPriv;
\r
690 xGestureGetSelectedEventsReply rep;
\r
692 REQUEST(xGestureGetSelectedEventsReq);
\r
693 REQUEST_SIZE_MATCH (xGestureGetSelectedEventsReq);
\r
695 #ifdef __DEBUG_GESTURE_EXT__
\r
696 ErrorF("[X11][ProcGestureGetSelectedEvents] after REQUEST_SIZE_MATCH !\n");
\r
697 #endif//__DEBUG_GESTURE_EXT__
\r
699 rep.type = X_Reply;
\r
701 rep.sequenceNumber = client->sequence;
\r
703 access_mode |= DixReceiveAccess;
\r
704 rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
\r
705 if( rc != Success || !pWin )
\r
707 ErrorF("[X11][ProcGestureGetSelectedEvents] Failed to lookup window !\n");
\r
712 #ifdef __DEBUG_GESTURE_EXT__
\r
713 ErrorF("[X11][ProcGestureGetSelectedEvents] pWin->drawable.id=0x%x\n", pWin->drawable.id);
\r
714 #endif//__DEBUG_GESTURE_EXT__
\r
716 pPriv = dixLookupPrivate(&pWin->devPrivates, gestureWindowPrivateKey);
\r
718 if( NULL == pPriv )//no mask was set
\r
722 else//mask was set already
\r
724 mask_out = pPriv->mask;
\r
727 rep.mask = mask_out;
\r
728 if (client->swapped)
\r
730 swaps(&rep.sequenceNumber, n);
\r
731 swapl(&rep.length, n);
\r
732 swapl(&rep.mask, n);
\r
734 WriteToClient(client, sizeof(xGestureGetSelectedEventsReply), (char *)&rep);
\r
736 #ifdef __DEBUG_GESTURE_EXT__
\r
737 ErrorF("[X11][ProcGestureGetSelectedEvents] Success !\n");
\r
738 #endif//__DEBUG_GESTURE_EXT__
\r
745 if (client->swapped)
\r
747 swaps(&rep.sequenceNumber, n);
\r
748 swapl(&rep.length, n);
\r
749 swapl(&rep.mask, n);
\r
751 WriteToClient(client, sizeof(xGestureGetSelectedEventsReply), (char *)&rep);
\r
753 #ifdef __DEBUG_GESTURE_EXT__
\r
754 ErrorF("[X11][ProcGestureGetSelectedEvents] Failed !\n");
\r
755 #endif//__DEBUG_GESTURE_EXT__
\r
761 SProcGestureGrabEvent(register ClientPtr client)
\r
764 REQUEST(xGestureGrabEventReq);
\r
765 swaps(&stuff->length, n);
\r
766 swapl(&stuff->window, n);
\r
767 swapl(&stuff->eventType, n);
\r
768 swapl(&stuff->num_finger, n);
\r
769 swapl(&stuff->time, n);
\r
770 return ProcGestureGrabEvent(client);
\r
774 ProcGestureGrabEvent (register ClientPtr client)
\r
777 int i, rc, ret = Success;
\r
781 Mask access_mode = 0;
\r
782 GestureWindowPrivatePtr pPriv;
\r
783 xGestureGrabEventReply rep;
\r
785 REQUEST(xGestureGrabEventReq);
\r
786 REQUEST_SIZE_MATCH (xGestureGrabEventReq);
\r
788 eventmask = (1L << stuff->eventType);
\r
790 #ifdef __DEBUG_GESTURE_EXT__
\r
791 ErrorF("[X11][ProcGestureGrabEvent] after REQUEST_SIZE_MATCH !\n");
\r
792 ErrorF("[X11][ProcGestureGrabEvent] stuff->window=0x%x, stuff->eventType=%d, stuff->num_finger=%d\n", stuff->window, stuff->eventType, stuff->num_finger);
\r
793 #endif//__DEBUG_GESTURE_EXT__
\r
796 rep.type = X_Reply;
\r
798 rep.sequenceNumber = client->sequence;
\r
800 if( stuff->eventType >= GestureNumberEvents )
\r
802 ErrorF("[X11][ProcGestureGrabEvent] GestureGrabAbnormal !(eventType(%d) >= GestureNumberEvents(%d))\n", stuff->eventType, (int)GestureNumberEvents);
\r
803 rep.status = GestureGrabAbnormal;
\r
808 if( stuff->num_finger >= max_num_finger )
\r
810 ErrorF("[X11][ProcGestureGrabEvent] GestureGrabAbnormal !(num_finger(%d) >= max num finger(%d))\n", stuff->num_finger, max_num_finger);
\r
811 rep.status = GestureGrabAbnormal;
\r
816 ctime = ClientTimeToServerTime((CARD32)stuff->time);
\r
818 if ( CompareTimeStamps(ctime, currentTime) == LATER )
\r
820 if ( (CompareTimeStamps(ctime, currentTime) == LATER ) ||
\r
821 (CompareTimeStamps(ctime, grabInfo->grabTime) == EARLIER) )
\r
824 ErrorF("[X11][ProcGestureGrabEvent] GestureGrabInvalidTime !(ctime=%d, currentTime=%d)\n", ctime, currentTime);
\r
825 rep.status = GestureGrabInvalidTime;
\r
830 //check the event was grabbed already
\r
831 if( grabbed_events_mask & eventmask )
\r
833 if( grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].window != None &&
\r
834 grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].window != stuff->window )
\r
836 ErrorF("[X11][ProcGestureGrabEvent] GestureGrabbedAlready ! (org_mask=0x%x, eventmask=0x%x)\n",
\r
837 grabbed_events_mask, eventmask);
\r
838 rep.status = GestureGrabbedAlready;
\r
844 #ifdef __DEBUG_GESTURE_EXT__
\r
845 ErrorF("[X11][ProcGestureGrabEvent] Gesture(s) are available ! (org_mask=0x%x, eventmask=0x%x, eventType=%d, num_finger=%d)\n",
\r
846 grabbed_events_mask, eventmask, stuff->eventType, stuff->num_finger);
\r
847 #endif//__DEBUG_GESTURE_EXT__
\r
849 access_mode |= DixReceiveAccess;
\r
850 rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
\r
851 if( rc != Success || !pWin )
\r
853 ErrorF("[X11][ProcGestureGrabEvent] Failed to lookup window !\n");
\r
854 rep.status = GestureGrabAbnormal;
\r
859 #ifdef __DEBUG_GESTURE_EXT__
\r
860 ErrorF("[X11][ProcGestureGrabEvent] pWin->drawable.id=0x%x\n", pWin->drawable.id);
\r
861 ErrorF("[X11][ProcGestureGrabEvent][before] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
862 #endif//__DEBUG_GESTURE_EXT__
\r
865 grabbed_events_mask |= eventmask;
\r
866 grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].pWin = pWin;
\r
867 grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].window = stuff->window;
\r
869 #ifdef __DEBUG_GESTURE_EXT__
\r
870 ErrorF("[X11][ProcGestureGrabEvent][after] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
871 #endif//__DEBUG_GESTURE_EXT__
\r
873 rep.status = GestureGrabSuccess;
\r
875 if (client->swapped)
\r
877 swaps(&rep.sequenceNumber, n);
\r
878 swapl(&rep.length, n);
\r
880 WriteToClient(client, sizeof(xGestureGrabEventReply), (char *)&rep);
\r
882 #ifdef __DEBUG_GESTURE_EXT__
\r
883 ErrorF("[X11][ProcGestureGrabEvent] Success !\n");
\r
884 #endif//__DEBUG_GESTURE_EXT__
\r
890 if (client->swapped)
\r
892 swaps(&rep.sequenceNumber, n);
\r
893 swapl(&rep.length, n);
\r
896 WriteToClient(client, sizeof(xGestureGrabEventReply), (char *)&rep);
\r
898 #ifdef __DEBUG_GESTURE_EXT__
\r
899 ErrorF("[X11][ProcGestureGrabEvent] Failed !\n");
\r
900 #endif//__DEBUG_GESTURE_EXT__
\r
906 SProcGestureUngrabEvent(register ClientPtr client)
\r
909 REQUEST(xGestureUngrabEventReq);
\r
910 swaps(&stuff->length, n);
\r
911 swapl(&stuff->window, n);
\r
912 swapl(&stuff->eventType, n);
\r
913 swapl(&stuff->num_finger, n);
\r
914 swapl(&stuff->time, n);
\r
915 return ProcGestureUngrabEvent(client);
\r
919 ProcGestureUngrabEvent (register ClientPtr client)
\r
922 int i, none_win_count, rc, ret = Success;
\r
926 Mask access_mode = 0;
\r
927 GestureWindowPrivatePtr pPriv;
\r
928 xGestureUngrabEventReply rep;
\r
930 REQUEST(xGestureUngrabEventReq);
\r
931 REQUEST_SIZE_MATCH (xGestureUngrabEventReq);
\r
933 eventmask = (1L << stuff->eventType);
\r
935 #ifdef __DEBUG_GESTURE_EXT__
\r
936 ErrorF("[X11][ProcGestureUngrabEvent] after REQUEST_SIZE_MATCH !\n");
\r
937 #endif//__DEBUG_GESTURE_EXT__
\r
940 rep.type = X_Reply;
\r
942 rep.sequenceNumber = client->sequence;
\r
943 rep.status = GestureUngrabNotGrabbed;
\r
945 if( stuff->eventType >= GestureNumberEvents )
\r
947 ErrorF("[X11][ProcGestureUngrabEvent] GestureGrabAbnormal !(eventType(%d) >= GestureNumberEvents(%d))\n", stuff->eventType, (int)GestureNumberEvents);
\r
948 rep.status = GestureUngrabAbnormal;
\r
950 goto ungrab_failed;
\r
953 if( stuff->num_finger >= max_num_finger )
\r
955 ErrorF("[X11][ProcGestureUngrabEvent] GestureGrabAbnormal !(num_finger(%d) >= max num finger(%d))\n", stuff->num_finger, max_num_finger);
\r
956 rep.status = GestureUngrabAbnormal;
\r
958 goto ungrab_failed;
\r
961 ctime = ClientTimeToServerTime((CARD32)stuff->time);
\r
963 if ( CompareTimeStamps(ctime, currentTime) == LATER )
\r
965 if ( (CompareTimeStamps(ctime, currentTime) == LATER ) ||
\r
966 (CompareTimeStamps(ctime, grabInfo->grabTime) == EARLIER) )
\r
969 ErrorF("[X11][ProcGestureUngrabEvent] GestureGrabInvalidTime !(ctime=%d, currentTime=%d)\n", ctime, currentTime);
\r
970 rep.status = GestureGrabInvalidTime;
\r
972 goto ungrab_failed;
\r
975 if( grabbed_events_mask & eventmask )
\r
977 if( grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].window == stuff->window )
\r
979 grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].window = None;
\r
980 grabbed_events[stuff->eventType].pGestureGrabWinInfo[stuff->num_finger].pWin = NULL;
\r
983 none_win_count = 0;
\r
984 for( i = 0 ; i < max_num_finger ; i++ )
\r
986 if( None == grabbed_events[stuff->eventType].pGestureGrabWinInfo[i].window )
\r
992 if( none_win_count == max_num_finger )
\r
994 #ifdef __DEBUG_GESTURE_EXT__
\r
995 ErrorF("[X11][ProcGestureUngrabEvent][before] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
996 #endif//__DEBUG_GESTURE_EXT__
\r
997 grabbed_events_mask = grabbed_events_mask & ~(1<< stuff->eventType);
\r
998 #ifdef __DEBUG_GESTURE_EXT__
\r
999 ErrorF("[X11][ProcGestureUngrabEvent][after] grabbed_events_mask=0x%x\n", grabbed_events_mask);
\r
1000 #endif//__DEBUG_GESTURE_EXT__
\r
1002 rep.status = GestureUngrabSuccess;
\r
1005 if( rep.status == GestureUngrabNotGrabbed )
\r
1007 ErrorF("[X11][ProcGestureUngrabEvent] No event(s) were grabbed by window(0x%x) !\n", stuff->window);
\r
1009 goto ungrab_failed;
\r
1012 //rep.status == GestureUngrabSuccess )
\r
1013 #ifdef __DEBUG_GESTURE_EXT__
\r
1014 ErrorF("[X11][ProcGestureUngrabEvent] Event(s) were grabbed by window(0x%x) exist !\n", stuff->window);
\r
1015 #endif//__DEBUG_GESTURE_EXT__
\r
1017 access_mode |= DixReceiveAccess;
\r
1018 rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
\r
1019 if( rc != Success || !pWin )
\r
1021 ErrorF("[X11][ProcGestureUngrabEvent] Failed to lookup window !\n");
\r
1022 rep.status = GestureUngrabAbnormal;
\r
1024 goto ungrab_failed;
\r
1027 #ifdef __DEBUG_GESTURE_EXT__
\r
1028 ErrorF("[X11][ProcGestureUngrabEvent] pWin->drawable.id=0x%x\n", pWin->drawable.id);
\r
1029 #endif//__DEBUG_GESTURE_EXT__
\r
1031 rep.status = GestureUngrabSuccess;
\r
1033 if (client->swapped)
\r
1035 swaps(&rep.sequenceNumber, n);
\r
1036 swapl(&rep.length, n);
\r
1038 WriteToClient(client, sizeof(xGestureUngrabEventReply), (char *)&rep);
\r
1040 #ifdef __DEBUG_GESTURE_EXT__
\r
1041 ErrorF("[X11][ProcGestureUngrabEvent] Success !\n");
\r
1042 #endif//__DEBUG_GESTURE_EXT__
\r
1048 if (client->swapped)
\r
1050 swaps(&rep.sequenceNumber, n);
\r
1051 swapl(&rep.length, n);
\r
1053 WriteToClient(client, sizeof(xGestureUngrabEventReply), (char *)&rep);
\r
1055 #ifdef __DEBUG_GESTURE_EXT__
\r
1056 ErrorF("[X11][ProcGestureUngrabEvent] Failed !\n");
\r
1057 #endif//__DEBUG_GESTURE_EXT__
\r
1064 ProcGestureDispatch(register ClientPtr client)
\r
1068 switch (stuff->data)
\r
1070 case X_GestureQueryVersion:
\r
1071 return ProcGestureQueryVersion(client);
\r
1074 #ifdef _F_GESTURE_DENY_REMOTE_CLIENT_
\r
1075 if (!LocalClient(client))
\r
1076 return GestureErrorBase + GestureClientNotLocal;
\r
1077 #endif//_F_GESTURE_DENY_REMOTE_CLIENT_
\r
1079 switch (stuff->data)
\r
1081 case X_GestureSelectEvents:
\r
1082 return ProcGestureSelectEvents(client);
\r
1083 case X_GestureGetSelectedEvents:
\r
1084 return ProcGestureGetSelectedEvents(client);
\r
1085 case X_GestureGrabEvent:
\r
1086 return ProcGestureGrabEvent(client);
\r
1087 case X_GestureUngrabEvent:
\r
1088 return ProcGestureUngrabEvent(client);
\r
1090 return BadRequest;
\r
1096 SProcGestureDispatch (register ClientPtr client)
\r
1100 switch (stuff->data)
\r
1102 case X_GestureQueryVersion:
\r
1103 return SProcGestureQueryVersion(client);
\r
1106 #ifdef _F_GESTURE_DENY_REMOTE_CLIENT_
\r
1107 /* It is bound to be non-local when there is byte swapping */
\r
1108 if (!LocalClient(client))
\r
1109 return GestureErrorBase + GestureClientNotLocal;
\r
1110 #endif//_F_GESTURE_DENY_REMOTE_CLIENT_
\r
1112 /* only local clients are allowed Gesture access */
\r
1113 switch (stuff->data)
\r
1115 case X_GestureSelectEvents:
\r
1116 return SProcGestureSelectEvents(client);
\r
1117 case X_GestureGetSelectedEvents:
\r
1118 return SProcGestureGetSelectedEvents(client);
\r
1119 case X_GestureGrabEvent:
\r
1120 return SProcGestureGrabEvent(client);
\r
1121 case X_GestureUngrabEvent:
\r
1122 return SProcGestureUngrabEvent(client);
\r
1124 return BadRequest;
\r