summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2010-04-18 22:01:40 -0700
committerKeith Packard <keithp@keithp.com>2010-04-18 22:01:40 -0700
commitb3ab978df861c08298f57529e3db980489055c35 (patch)
tree8a8a2c4e3ca6b833e71f7c9057311239f4f362a6
parenta92b2c2c8dd1e86ee852168146f01bdf72bfe2d0 (diff)
parent0ad022a729bafa56cc7b5d241f567444a34514ad (diff)
Merge remote branch 'whot/for-keith'
-rw-r--r--hw/xfree86/common/xf86Xinput.c8
-rw-r--r--include/xkbsrv.h12
-rw-r--r--xkb/Makefile.am4
-rw-r--r--xkb/ddxDevBtn.c77
-rw-r--r--xkb/ddxFakeMtn.c118
-rw-r--r--xkb/xkbActions.c97
6 files changed, 89 insertions, 227 deletions
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 7723ba683..dba3370f3 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -86,6 +86,7 @@
#include "windowstr.h" /* screenIsSaved */
#include <stdarg.h>
+#include <stdint.h> /* for int64_t */
#include <X11/Xpoll.h>
@@ -1177,12 +1178,11 @@ xf86ScaleAxis(int Cx,
int Rxlow )
{
int X;
- int dSx = Sxhigh - Sxlow;
- int dRx = Rxhigh - Rxlow;
+ int64_t dSx = Sxhigh - Sxlow;
+ int64_t dRx = Rxhigh - Rxlow;
- dSx = Sxhigh - Sxlow;
if (dRx) {
- X = ((dSx * (Cx - Rxlow)) / dRx) + Sxlow;
+ X = (int)(((dSx * (Cx - Rxlow)) / dRx) + Sxlow);
}
else {
X = 0;
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 278ff769d..a5d25d009 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -768,18 +768,6 @@ extern _X_EXPORT void XkbDDXUpdateDeviceIndicators(
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(
DeviceIntPtr /* dev */,
KeyCode /* key */,
diff --git a/xkb/Makefile.am b/xkb/Makefile.am
index e54ce59f0..fb3ccbf6f 100644
--- a/xkb/Makefile.am
+++ b/xkb/Makefile.am
@@ -5,11 +5,9 @@ AM_CFLAGS = $(DIX_CFLAGS)
DDX_SRCS = \
ddxBeep.c \
ddxCtrls.c \
- ddxFakeMtn.c \
ddxLEDs.c \
ddxLoad.c \
- ddxList.c \
- ddxDevBtn.c
+ ddxList.c
DIX_SRCS = \
xkb.c \
diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c
deleted file mode 100644
index 94630d1c9..000000000
--- a/xkb/ddxDevBtn.c
+++ /dev/null
@@ -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());
-}
diff --git a/xkb/ddxFakeMtn.c b/xkb/ddxFakeMtn.c
deleted file mode 100644
index f90d2099a..000000000
--- a/xkb/ddxFakeMtn.c
+++ /dev/null
@@ -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);
-}
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 2cdb6fcea..6a9943fbc 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -40,11 +40,15 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <xkbsrv.h>
#include "xkb.h"
#include <ctype.h>
+#include "mi.h"
#define EXTENSION_EVENT_BASE 64
static int 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
xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
pointer data)
@@ -479,7 +483,7 @@ int dx,dy;
dx= xkbi->mouseKeysDX;
dy= xkbi->mouseKeysDY;
}
- XkbDDXFakePointerMotion(xkbi->mouseKeysFlags,dx,dy);
+ XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
return xkbi->desc->ctrls->mk_interval;
}
@@ -507,7 +511,7 @@ Bool accel;
accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
x= XkbPtrActionX(&pAction->ptr);
y= XkbPtrActionY(&pAction->ptr);
- XkbDDXFakePointerMotion(pAction->ptr.flags,x,y);
+ XkbFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
AccessXCancelRepeatKey(xkbi,keycode);
xkbi->mouseKeysAccel= accel&&
(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
@@ -554,7 +558,7 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
((pAction->btn.flags&XkbSA_LockNoLock)==0)) {
xkbi->lockedPtrButtons|= (1<<button);
AccessXCancelRepeatKey(xkbi,keycode);
- XkbDDXFakeDeviceButton(xkbi->device, 1, button);
+ XkbFakeDeviceButton(xkbi->device, 1, button);
filter->upAction.type= XkbSA_NoAction;
}
break;
@@ -565,12 +569,12 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
if (pAction->btn.count>0) {
nClicks= pAction->btn.count;
for (i=0;i<nClicks;i++) {
- XkbDDXFakeDeviceButton(xkbi->device, 1, button);
- XkbDDXFakeDeviceButton(xkbi->device, 0, button);
+ XkbFakeDeviceButton(xkbi->device, 1, button);
+ XkbFakeDeviceButton(xkbi->device, 0, button);
}
filter->upAction.type= XkbSA_NoAction;
}
- else XkbDDXFakeDeviceButton(xkbi->device, 1, button);
+ else XkbFakeDeviceButton(xkbi->device, 1, button);
}
break;
case XkbSA_SetPtrDflt:
@@ -626,7 +630,7 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
}
xkbi->lockedPtrButtons&= ~(1<<button);
case XkbSA_PtrBtn:
- XkbDDXFakeDeviceButton(xkbi->device, 0, button);
+ XkbFakeDeviceButton(xkbi->device, 0, button);
break;
}
filter->active = 0;
@@ -964,7 +968,7 @@ int button;
if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
BitIsOn(dev->button->down, button))
return 0;
- XkbDDXFakeDeviceButton(dev,TRUE,button);
+ XkbFakeDeviceButton(dev,TRUE,button);
filter->upAction.type= XkbSA_NoAction;
break;
case XkbSA_DeviceBtn:
@@ -972,12 +976,12 @@ int button;
int nClicks,i;
nClicks= pAction->btn.count;
for (i=0;i<nClicks;i++) {
- XkbDDXFakeDeviceButton(dev,TRUE,button);
- XkbDDXFakeDeviceButton(dev,FALSE,button);
+ XkbFakeDeviceButton(dev,TRUE,button);
+ XkbFakeDeviceButton(dev,FALSE,button);
}
filter->upAction.type= XkbSA_NoAction;
}
- else XkbDDXFakeDeviceButton(dev,TRUE,button);
+ else XkbFakeDeviceButton(dev,TRUE,button);
break;
}
}
@@ -996,10 +1000,10 @@ int button;
if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
!BitIsOn(dev->button->down, button))
return 0;
- XkbDDXFakeDeviceButton(dev,FALSE,button);
+ XkbFakeDeviceButton(dev,FALSE,button);
break;
case XkbSA_DeviceBtn:
- XkbDDXFakeDeviceButton(dev,FALSE,button);
+ XkbFakeDeviceButton(dev,FALSE,button);
break;
}
filter->active = 0;
@@ -1316,3 +1320,70 @@ xkbStateNotify sn;
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());
+}