Merge remote branch 'whot/for-keith'
This commit is contained in:
commit
b3ab978df8
|
@ -86,6 +86,7 @@
|
||||||
#include "windowstr.h" /* screenIsSaved */
|
#include "windowstr.h" /* screenIsSaved */
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdint.h> /* for int64_t */
|
||||||
|
|
||||||
#include <X11/Xpoll.h>
|
#include <X11/Xpoll.h>
|
||||||
|
|
||||||
|
@ -1177,12 +1178,11 @@ xf86ScaleAxis(int Cx,
|
||||||
int Rxlow )
|
int Rxlow )
|
||||||
{
|
{
|
||||||
int X;
|
int X;
|
||||||
int dSx = Sxhigh - Sxlow;
|
int64_t dSx = Sxhigh - Sxlow;
|
||||||
int dRx = Rxhigh - Rxlow;
|
int64_t dRx = Rxhigh - Rxlow;
|
||||||
|
|
||||||
dSx = Sxhigh - Sxlow;
|
|
||||||
if (dRx) {
|
if (dRx) {
|
||||||
X = ((dSx * (Cx - Rxlow)) / dRx) + Sxlow;
|
X = (int)(((dSx * (Cx - Rxlow)) / dRx) + Sxlow);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
X = 0;
|
X = 0;
|
||||||
|
|
|
@ -768,18 +768,6 @@ extern _X_EXPORT void XkbDDXUpdateDeviceIndicators(
|
||||||
CARD32 /* newState */
|
CARD32 /* newState */
|
||||||
);
|
);
|
||||||
|
|
||||||
extern _X_EXPORT void XkbDDXFakePointerMotion(
|
|
||||||
unsigned int /* flags */,
|
|
||||||
int /* x */,
|
|
||||||
int /* y */
|
|
||||||
);
|
|
||||||
|
|
||||||
extern _X_EXPORT void XkbDDXFakeDeviceButton(
|
|
||||||
DeviceIntPtr /* dev */,
|
|
||||||
Bool /* press */,
|
|
||||||
int /* button */
|
|
||||||
);
|
|
||||||
|
|
||||||
extern _X_EXPORT int XkbDDXTerminateServer(
|
extern _X_EXPORT int XkbDDXTerminateServer(
|
||||||
DeviceIntPtr /* dev */,
|
DeviceIntPtr /* dev */,
|
||||||
KeyCode /* key */,
|
KeyCode /* key */,
|
||||||
|
|
|
@ -5,11 +5,9 @@ AM_CFLAGS = $(DIX_CFLAGS)
|
||||||
DDX_SRCS = \
|
DDX_SRCS = \
|
||||||
ddxBeep.c \
|
ddxBeep.c \
|
||||||
ddxCtrls.c \
|
ddxCtrls.c \
|
||||||
ddxFakeMtn.c \
|
|
||||||
ddxLEDs.c \
|
ddxLEDs.c \
|
||||||
ddxLoad.c \
|
ddxLoad.c \
|
||||||
ddxList.c \
|
ddxList.c
|
||||||
ddxDevBtn.c
|
|
||||||
|
|
||||||
DIX_SRCS = \
|
DIX_SRCS = \
|
||||||
xkb.c \
|
xkb.c \
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
/************************************************************
|
|
||||||
Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this
|
|
||||||
software and its documentation for any purpose and without
|
|
||||||
fee is hereby granted, provided that the above copyright
|
|
||||||
notice appear in all copies and that both that copyright
|
|
||||||
notice and this permission notice appear in supporting
|
|
||||||
documentation, and that the name of Silicon Graphics not be
|
|
||||||
used in advertising or publicity pertaining to distribution
|
|
||||||
of the software without specific prior written permission.
|
|
||||||
Silicon Graphics makes no representation about the suitability
|
|
||||||
of this software for any purpose. It is provided "as is"
|
|
||||||
without any express or implied warranty.
|
|
||||||
|
|
||||||
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
|
||||||
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
|
||||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
||||||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
||||||
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
********************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include <X11/keysym.h>
|
|
||||||
#include "inputstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "eventstr.h"
|
|
||||||
#include <xkbsrv.h>
|
|
||||||
#include "mi.h"
|
|
||||||
#include <X11/extensions/XI.h>
|
|
||||||
#include <X11/extensions/XIproto.h>
|
|
||||||
|
|
||||||
void
|
|
||||||
XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
|
|
||||||
{
|
|
||||||
EventListPtr events;
|
|
||||||
int nevents, i;
|
|
||||||
DeviceIntPtr ptr;
|
|
||||||
|
|
||||||
/* If dev is a slave device, and the SD is attached, do nothing. If we'd
|
|
||||||
* post through the attached master pointer we'd get duplicate events.
|
|
||||||
*
|
|
||||||
* if dev is a master keyboard, post through the master pointer.
|
|
||||||
*
|
|
||||||
* if dev is a floating slave, post through the device itself.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (IsMaster(dev))
|
|
||||||
ptr = GetMaster(dev, MASTER_POINTER);
|
|
||||||
else if (!dev->u.master)
|
|
||||||
ptr = dev;
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
events = InitEventList(GetMaximumEventsNum());
|
|
||||||
nevents = GetPointerEvents(events, ptr,
|
|
||||||
press ? ButtonPress : ButtonRelease, button,
|
|
||||||
0 /* flags */, 0 /* first */,
|
|
||||||
0 /* num_val */, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < nevents; i++)
|
|
||||||
mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
|
|
||||||
|
|
||||||
FreeEventList(events, GetMaximumEventsNum());
|
|
||||||
}
|
|
118
xkb/ddxFakeMtn.c
118
xkb/ddxFakeMtn.c
|
@ -1,118 +0,0 @@
|
||||||
/************************************************************
|
|
||||||
Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this
|
|
||||||
software and its documentation for any purpose and without
|
|
||||||
fee is hereby granted, provided that the above copyright
|
|
||||||
notice appear in all copies and that both that copyright
|
|
||||||
notice and this permission notice appear in supporting
|
|
||||||
documentation, and that the name of Silicon Graphics not be
|
|
||||||
used in advertising or publicity pertaining to distribution
|
|
||||||
of the software without specific prior written permission.
|
|
||||||
Silicon Graphics makes no representation about the suitability
|
|
||||||
of this software for any purpose. It is provided "as is"
|
|
||||||
without any express or implied warranty.
|
|
||||||
|
|
||||||
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
|
||||||
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
|
||||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
||||||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
||||||
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
********************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include <X11/keysym.h>
|
|
||||||
#include "inputstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include <xkbsrv.h>
|
|
||||||
#include <X11/extensions/XI.h>
|
|
||||||
|
|
||||||
#ifdef PANORAMIX
|
|
||||||
#include "panoramiX.h"
|
|
||||||
#include "panoramiXsrv.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mipointer.h"
|
|
||||||
#include "mipointrst.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
XkbDDXFakePointerMotion(unsigned flags,int x,int y)
|
|
||||||
{
|
|
||||||
int oldX,oldY;
|
|
||||||
ScreenPtr pScreen, oldScreen;
|
|
||||||
|
|
||||||
GetSpritePosition(inputInfo.pointer, &oldX, &oldY);
|
|
||||||
pScreen = oldScreen = GetSpriteWindow(inputInfo.pointer)->drawable.pScreen;
|
|
||||||
|
|
||||||
#ifdef PANORAMIX
|
|
||||||
if (!noPanoramiXExtension) {
|
|
||||||
BoxRec box;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum],
|
|
||||||
oldX, oldY, &box)) {
|
|
||||||
FOR_NSCREENS(i) {
|
|
||||||
if(i == pScreen->myNum)
|
|
||||||
continue;
|
|
||||||
if(POINT_IN_REGION(pScreen, &XineramaScreenRegions[i],
|
|
||||||
oldX, oldY, &box)) {
|
|
||||||
pScreen = screenInfo.screens[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
oldScreen = pScreen;
|
|
||||||
|
|
||||||
if (flags&XkbSA_MoveAbsoluteX)
|
|
||||||
oldX= x;
|
|
||||||
else oldX+= x;
|
|
||||||
if (flags&XkbSA_MoveAbsoluteY)
|
|
||||||
oldY= y;
|
|
||||||
else oldY+= y;
|
|
||||||
|
|
||||||
if(!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum],
|
|
||||||
oldX, oldY, &box)) {
|
|
||||||
FOR_NSCREENS(i) {
|
|
||||||
if(i == pScreen->myNum)
|
|
||||||
continue;
|
|
||||||
if(POINT_IN_REGION(pScreen, &XineramaScreenRegions[i],
|
|
||||||
oldX, oldY, &box)) {
|
|
||||||
pScreen = screenInfo.screens[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
oldX -= panoramiXdataPtr[pScreen->myNum].x;
|
|
||||||
oldY -= panoramiXdataPtr[pScreen->myNum].y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if (flags&XkbSA_MoveAbsoluteX)
|
|
||||||
oldX= x;
|
|
||||||
else oldX+= x;
|
|
||||||
if (flags&XkbSA_MoveAbsoluteY)
|
|
||||||
oldY= y;
|
|
||||||
else oldY+= y;
|
|
||||||
|
|
||||||
#define GetScreenPrivate(s) ((miPointerScreenPtr)dixLookupPrivate(&(s)->devPrivates, miPointerScreenKey))
|
|
||||||
(*(GetScreenPrivate(oldScreen))->screenFuncs->CursorOffScreen)
|
|
||||||
(&pScreen, &oldX, &oldY);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pScreen != oldScreen)
|
|
||||||
NewCurrentScreen(inputInfo.pointer, pScreen, oldX, oldY);
|
|
||||||
if (pScreen->SetCursorPosition)
|
|
||||||
(*pScreen->SetCursorPosition)(inputInfo.pointer, pScreen, oldX, oldY, TRUE);
|
|
||||||
}
|
|
|
@ -40,11 +40,15 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <xkbsrv.h>
|
#include <xkbsrv.h>
|
||||||
#include "xkb.h"
|
#include "xkb.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include "mi.h"
|
||||||
#define EXTENSION_EVENT_BASE 64
|
#define EXTENSION_EVENT_BASE 64
|
||||||
|
|
||||||
static int xkbDevicePrivateKeyIndex;
|
static int xkbDevicePrivateKeyIndex;
|
||||||
DevPrivateKey xkbDevicePrivateKey = &xkbDevicePrivateKeyIndex;
|
DevPrivateKey xkbDevicePrivateKey = &xkbDevicePrivateKeyIndex;
|
||||||
|
|
||||||
|
static void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button);
|
||||||
|
static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y);
|
||||||
|
|
||||||
void
|
void
|
||||||
xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
|
xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
|
||||||
pointer data)
|
pointer data)
|
||||||
|
@ -479,7 +483,7 @@ int dx,dy;
|
||||||
dx= xkbi->mouseKeysDX;
|
dx= xkbi->mouseKeysDX;
|
||||||
dy= xkbi->mouseKeysDY;
|
dy= xkbi->mouseKeysDY;
|
||||||
}
|
}
|
||||||
XkbDDXFakePointerMotion(xkbi->mouseKeysFlags,dx,dy);
|
XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
|
||||||
return xkbi->desc->ctrls->mk_interval;
|
return xkbi->desc->ctrls->mk_interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,7 +511,7 @@ Bool accel;
|
||||||
accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
|
accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
|
||||||
x= XkbPtrActionX(&pAction->ptr);
|
x= XkbPtrActionX(&pAction->ptr);
|
||||||
y= XkbPtrActionY(&pAction->ptr);
|
y= XkbPtrActionY(&pAction->ptr);
|
||||||
XkbDDXFakePointerMotion(pAction->ptr.flags,x,y);
|
XkbFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
|
||||||
AccessXCancelRepeatKey(xkbi,keycode);
|
AccessXCancelRepeatKey(xkbi,keycode);
|
||||||
xkbi->mouseKeysAccel= accel&&
|
xkbi->mouseKeysAccel= accel&&
|
||||||
(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
|
(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
|
||||||
|
@ -554,7 +558,7 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
|
||||||
((pAction->btn.flags&XkbSA_LockNoLock)==0)) {
|
((pAction->btn.flags&XkbSA_LockNoLock)==0)) {
|
||||||
xkbi->lockedPtrButtons|= (1<<button);
|
xkbi->lockedPtrButtons|= (1<<button);
|
||||||
AccessXCancelRepeatKey(xkbi,keycode);
|
AccessXCancelRepeatKey(xkbi,keycode);
|
||||||
XkbDDXFakeDeviceButton(xkbi->device, 1, button);
|
XkbFakeDeviceButton(xkbi->device, 1, button);
|
||||||
filter->upAction.type= XkbSA_NoAction;
|
filter->upAction.type= XkbSA_NoAction;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -565,12 +569,12 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
|
||||||
if (pAction->btn.count>0) {
|
if (pAction->btn.count>0) {
|
||||||
nClicks= pAction->btn.count;
|
nClicks= pAction->btn.count;
|
||||||
for (i=0;i<nClicks;i++) {
|
for (i=0;i<nClicks;i++) {
|
||||||
XkbDDXFakeDeviceButton(xkbi->device, 1, button);
|
XkbFakeDeviceButton(xkbi->device, 1, button);
|
||||||
XkbDDXFakeDeviceButton(xkbi->device, 0, button);
|
XkbFakeDeviceButton(xkbi->device, 0, button);
|
||||||
}
|
}
|
||||||
filter->upAction.type= XkbSA_NoAction;
|
filter->upAction.type= XkbSA_NoAction;
|
||||||
}
|
}
|
||||||
else XkbDDXFakeDeviceButton(xkbi->device, 1, button);
|
else XkbFakeDeviceButton(xkbi->device, 1, button);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case XkbSA_SetPtrDflt:
|
case XkbSA_SetPtrDflt:
|
||||||
|
@ -626,7 +630,7 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
|
||||||
}
|
}
|
||||||
xkbi->lockedPtrButtons&= ~(1<<button);
|
xkbi->lockedPtrButtons&= ~(1<<button);
|
||||||
case XkbSA_PtrBtn:
|
case XkbSA_PtrBtn:
|
||||||
XkbDDXFakeDeviceButton(xkbi->device, 0, button);
|
XkbFakeDeviceButton(xkbi->device, 0, button);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
filter->active = 0;
|
filter->active = 0;
|
||||||
|
@ -964,7 +968,7 @@ int button;
|
||||||
if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
|
if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
|
||||||
BitIsOn(dev->button->down, button))
|
BitIsOn(dev->button->down, button))
|
||||||
return 0;
|
return 0;
|
||||||
XkbDDXFakeDeviceButton(dev,TRUE,button);
|
XkbFakeDeviceButton(dev,TRUE,button);
|
||||||
filter->upAction.type= XkbSA_NoAction;
|
filter->upAction.type= XkbSA_NoAction;
|
||||||
break;
|
break;
|
||||||
case XkbSA_DeviceBtn:
|
case XkbSA_DeviceBtn:
|
||||||
|
@ -972,12 +976,12 @@ int button;
|
||||||
int nClicks,i;
|
int nClicks,i;
|
||||||
nClicks= pAction->btn.count;
|
nClicks= pAction->btn.count;
|
||||||
for (i=0;i<nClicks;i++) {
|
for (i=0;i<nClicks;i++) {
|
||||||
XkbDDXFakeDeviceButton(dev,TRUE,button);
|
XkbFakeDeviceButton(dev,TRUE,button);
|
||||||
XkbDDXFakeDeviceButton(dev,FALSE,button);
|
XkbFakeDeviceButton(dev,FALSE,button);
|
||||||
}
|
}
|
||||||
filter->upAction.type= XkbSA_NoAction;
|
filter->upAction.type= XkbSA_NoAction;
|
||||||
}
|
}
|
||||||
else XkbDDXFakeDeviceButton(dev,TRUE,button);
|
else XkbFakeDeviceButton(dev,TRUE,button);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -996,10 +1000,10 @@ int button;
|
||||||
if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
|
if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
|
||||||
!BitIsOn(dev->button->down, button))
|
!BitIsOn(dev->button->down, button))
|
||||||
return 0;
|
return 0;
|
||||||
XkbDDXFakeDeviceButton(dev,FALSE,button);
|
XkbFakeDeviceButton(dev,FALSE,button);
|
||||||
break;
|
break;
|
||||||
case XkbSA_DeviceBtn:
|
case XkbSA_DeviceBtn:
|
||||||
XkbDDXFakeDeviceButton(dev,FALSE,button);
|
XkbFakeDeviceButton(dev,FALSE,button);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
filter->active = 0;
|
filter->active = 0;
|
||||||
|
@ -1316,3 +1320,70 @@ xkbStateNotify sn;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
|
||||||
|
{
|
||||||
|
EventListPtr events;
|
||||||
|
int nevents, i;
|
||||||
|
DeviceIntPtr ptr;
|
||||||
|
int gpe_flags = 0;
|
||||||
|
|
||||||
|
if (!dev->u.master)
|
||||||
|
ptr = dev;
|
||||||
|
else
|
||||||
|
ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
|
||||||
|
|
||||||
|
if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
|
||||||
|
gpe_flags = POINTER_ABSOLUTE;
|
||||||
|
else
|
||||||
|
gpe_flags = POINTER_RELATIVE;
|
||||||
|
|
||||||
|
events = InitEventList(GetMaximumEventsNum());
|
||||||
|
OsBlockSignals();
|
||||||
|
nevents = GetPointerEvents(events, ptr,
|
||||||
|
MotionNotify, 0,
|
||||||
|
gpe_flags, 0, 2, (int[]){x, y});
|
||||||
|
OsReleaseSignals();
|
||||||
|
|
||||||
|
for (i = 0; i < nevents; i++)
|
||||||
|
mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
|
||||||
|
|
||||||
|
FreeEventList(events, GetMaximumEventsNum());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
|
||||||
|
{
|
||||||
|
EventListPtr events;
|
||||||
|
int nevents, i;
|
||||||
|
DeviceIntPtr ptr;
|
||||||
|
|
||||||
|
/* If dev is a slave device, and the SD is attached, do nothing. If we'd
|
||||||
|
* post through the attached master pointer we'd get duplicate events.
|
||||||
|
*
|
||||||
|
* if dev is a master keyboard, post through the XTEST device
|
||||||
|
*
|
||||||
|
* if dev is a floating slave, post through the device itself.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (IsMaster(dev))
|
||||||
|
ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
|
||||||
|
else if (!dev->u.master)
|
||||||
|
ptr = dev;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
events = InitEventList(GetMaximumEventsNum());
|
||||||
|
OsBlockSignals();
|
||||||
|
nevents = GetPointerEvents(events, ptr,
|
||||||
|
press ? ButtonPress : ButtonRelease, button,
|
||||||
|
0 /* flags */, 0 /* first */,
|
||||||
|
0 /* num_val */, NULL);
|
||||||
|
OsReleaseSignals();
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < nevents; i++)
|
||||||
|
mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
|
||||||
|
|
||||||
|
FreeEventList(events, GetMaximumEventsNum());
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user