diff options
author | Keith Packard <keithp@keithp.com> | 2010-04-18 22:01:40 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2010-04-18 22:01:40 -0700 |
commit | b3ab978df861c08298f57529e3db980489055c35 (patch) | |
tree | 8a8a2c4e3ca6b833e71f7c9057311239f4f362a6 | |
parent | a92b2c2c8dd1e86ee852168146f01bdf72bfe2d0 (diff) | |
parent | 0ad022a729bafa56cc7b5d241f567444a34514ad (diff) |
Merge remote branch 'whot/for-keith'
-rw-r--r-- | hw/xfree86/common/xf86Xinput.c | 8 | ||||
-rw-r--r-- | include/xkbsrv.h | 12 | ||||
-rw-r--r-- | xkb/Makefile.am | 4 | ||||
-rw-r--r-- | xkb/ddxDevBtn.c | 77 | ||||
-rw-r--r-- | xkb/ddxFakeMtn.c | 118 | ||||
-rw-r--r-- | xkb/xkbActions.c | 97 |
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()); +} |