diff options
Diffstat (limited to 'xc/programs/Xserver/xkb/xkbActions.c')
-rw-r--r-- | xc/programs/Xserver/xkb/xkbActions.c | 74 |
1 files changed, 72 insertions, 2 deletions
diff --git a/xc/programs/Xserver/xkb/xkbActions.c b/xc/programs/Xserver/xkb/xkbActions.c index 3ecdc73ba..7f3c47ebc 100644 --- a/xc/programs/Xserver/xkb/xkbActions.c +++ b/xc/programs/Xserver/xkb/xkbActions.c @@ -24,7 +24,7 @@ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86: xc/programs/Xserver/xkb/xkbActions.c,v 3.8 2002/09/16 18:06:19 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/xkb/xkbActions.c,v 3.11 2003/02/13 15:36:48 dawes Exp $ */ #include <stdio.h> #include <math.h> @@ -1018,6 +1018,69 @@ unsigned mods,mask,oldCoreState = 0,oldCorePrevState = 0; return 1; } +static int +#if NeedFunctionPrototypes +_XkbFilterSwitchScreen( XkbSrvInfoPtr xkbi, + XkbFilterPtr filter, + unsigned keycode, + XkbAction * pAction) +#else +_XkbFilterSwitchScreen(xkbi,filter,keycode,pAction) + XkbSrvInfoPtr xkbi; + XkbFilterPtr filter; + unsigned keycode; + XkbAction * pAction; +#endif +{ + if (filter->keycode==0) { /* initial press */ + DeviceIntPtr dev = xkbi->device; + filter->keycode = keycode; + filter->active = 1; + filter->filterOthers = 0; + filter->filter = _XkbFilterSwitchScreen; + AccessXCancelRepeatKey(xkbi, keycode); + XkbDDXSwitchScreen(dev,keycode,pAction); + return 0; + } + else if (filter->keycode==keycode) { + filter->active= 0; + return 0; + } + return 1; +} + +#ifdef XFree86Server +static int +#if NeedFunctionPrototypes +_XkbFilterXF86Private( XkbSrvInfoPtr xkbi, + XkbFilterPtr filter, + unsigned keycode, + XkbAction * pAction) +#else +_XkbFilterXF86Private(xkbi,filter,keycode,pAction) + XkbSrvInfoPtr xkbi; + XkbFilterPtr filter; + unsigned keycode; + XkbAction * pAction; +#endif +{ + if (filter->keycode==0) { /* initial press */ + DeviceIntPtr dev = xkbi->device; + filter->keycode = keycode; + filter->active = 1; + filter->filterOthers = 0; + filter->filter = _XkbFilterXF86Private; + XkbDDXPrivate(dev,keycode,pAction); + return 0; + } + else if (filter->keycode==keycode) { + filter->active= 0; + return 0; + } + return 1; +} +#endif + #ifdef XINPUT static int @@ -1246,7 +1309,8 @@ Bool xiEvent; sendEvent= XkbDDXTerminateServer(dev,key,&act); break; case XkbSA_SwitchScreen: - sendEvent= XkbDDXSwitchScreen(dev,key,&act); + filter = _XkbNextFreeFilter(); + sendEvent=_XkbFilterSwitchScreen(xkbi,filter,key,&act); break; case XkbSA_SetControls: case XkbSA_LockControls: @@ -1268,6 +1332,12 @@ Bool xiEvent; sendEvent= _XkbFilterDeviceBtn(xkbi,filter,key,&act); break; #endif +#ifdef XFree86Server + case XkbSA_XFree86Private: + filter = _XkbNextFreeFilter(); + sendEvent= _XkbFilterXF86Private(xkbi,filter,key,&act); + break; +#endif } } } |