From 5927e070b45fbe3fea4b394920ffd6f7d036f1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkki=20Sepp=C3=A4l=C3=A4?= Date: Fri, 21 Jan 2011 15:56:22 +0200 Subject: [PATCH 01/13] xkb: Cancel a key's repetition when its autorepeat is disabled. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When XkbChangeEnabledControls is called to disable key repetition of a certain key (or keys), currently ongoing repetition of that key was not cancelled. It was cancelled if ChangeKeyboardControl was used to disable key repetition globally. Reviewed-by: Rami Ylimäki Reviewed-by: Dirk Wallenstein Signed-off-by: Peter Hutterer --- xkb/xkb.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xkb/xkb.c b/xkb/xkb.c index bbb1d9df8..6fd66c5e5 100644 --- a/xkb/xkb.c +++ b/xkb/xkb.c @@ -915,9 +915,14 @@ ProcXkbSetControls(ClientPtr client) stuff->axtOptsMask); } - if (stuff->changeCtrls & XkbPerKeyRepeatMask) + if (stuff->changeCtrls & XkbPerKeyRepeatMask) { memcpy(new.per_key_repeat, stuff->perKeyRepeat, XkbPerKeyBitArraySize); + if (xkbi->repeatKey && + !BitIsOn(new.per_key_repeat, xkbi->repeatKey)) { + AccessXCancelRepeatKey(xkbi, xkbi->repeatKey); + } + } old= *ctrl; *ctrl= new; From 77af0dc5217fc9c446097d6d487c8ddaf00bdd2a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 24 Jan 2011 10:06:34 +1000 Subject: [PATCH 02/13] xfree86: bump input minor ABI The new valuator_mask_free() call requires a minor bump. Signed-off-by: Peter Hutterer --- hw/xfree86/common/xf86Module.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h index 609819b52..49a98bd05 100644 --- a/hw/xfree86/common/xf86Module.h +++ b/hw/xfree86/common/xf86Module.h @@ -83,7 +83,7 @@ typedef enum { */ #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) #define ABI_VIDEODRV_VERSION SET_ABI_VERSION(9, 0) -#define ABI_XINPUT_VERSION SET_ABI_VERSION(12, 1) +#define ABI_XINPUT_VERSION SET_ABI_VERSION(12, 2) #define ABI_EXTENSION_VERSION SET_ABI_VERSION(5, 0) #define ABI_FONT_VERSION SET_ABI_VERSION(0, 6) From a2c481821997ae14aa5816895ae36db2ca2e4dec Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:39 +0200 Subject: [PATCH 03/13] include: Fix a copy/paste error in a comment Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- include/eventstr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/eventstr.h b/include/eventstr.h index 377cceba2..673207ce3 100644 --- a/include/eventstr.h +++ b/include/eventstr.h @@ -177,7 +177,7 @@ struct _DGAEvent Time time; /**< Time in ms */ int subtype; /**< KeyPress, KeyRelease, ButtonPress, ButtonRelease, MotionNotify */ - int detail; /**< Relative x coordinate */ + int detail; /**< Button number or key code */ int dx; /**< Relative x coordinate */ int dy; /**< Relative y coordinate */ int screen; /**< Screen number this event applies to */ From 7b16e8633d5a95167aac0c19e43fcfe38bd4a6a4 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:40 +0200 Subject: [PATCH 04/13] xfree86/input: Restore DGAStealKeyEvent() DGA key event support was lost in commit 8da0ff2d51086666d10ca7330d428e8610a4a0e3. Bring it back. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86Xinput.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index b9006ab07..6fdf1eb06 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -1240,6 +1240,19 @@ xf86PostKeyEventM(DeviceIntPtr device, { int i = 0, nevents = 0; +#if XFreeXDGA + int index; + DeviceIntPtr pointer; + + /* Some pointers send key events, paired device is wrong then. */ + pointer = IsPointerDevice(device) ? device : GetPairedDevice(device); + if (miPointerGetScreen(pointer)) { + index = miPointerGetScreen(pointer)->myNum; + if (DGAStealKeyEvent(device, index, key_code, is_down)) + return; + } +#endif + if (is_absolute) { nevents = GetKeyboardValuatorEvents(xf86Events, device, is_down ? KeyPress : KeyRelease, From e1547a9f1f6d7991219b7711f4cacc2852dbf88c Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:41 +0200 Subject: [PATCH 05/13] xfree86/dga: Install the DGA event handler when DGA2 is used The ET_DGAEvent handler is only installed when a client requests relative events via DGA1. Do it also when a client requests DGA2 events. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 1058a466c..3cded85bf 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -446,6 +446,11 @@ xf86SetDGAMode( pScreenPriv->grabMouse = TRUE; pScreenPriv->grabKeyboard = TRUE; + if (!mieq_installed) { + mieqSetHandler(ET_DGAEvent, DGAHandleEvent); + mieq_installed = 1; + } + return Success; } From f4cb25c2ed832bf4cfcd4d25198fe5a895430fed Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:42 +0200 Subject: [PATCH 06/13] xfree86/dga: Remove the ET_DGAEvent handler only if it was installed Remove the handler only if it was installed. Also mark it as uninstalled, otherwise it wouldn't get reinstalled after a server reset. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 3cded85bf..c4b2d7d9a 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -250,9 +250,10 @@ DGACloseScreen(int i, ScreenPtr pScreen) { DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen); - if (XDGAEventBase) { + if (mieq_installed) { mieqSetHandler(ET_DGAEvent, NULL); - } + mieq_installed = 0; + } FreeMarkedVisuals(pScreen); From e3fef815cf85cf59256f3edeaa21c1267898b42c Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:43 +0200 Subject: [PATCH 07/13] xfree86/dga: Make mieq_install Bool mieq_installed is used as a boolean, so why not make it such. Also it's a static variable, so the the explicit zero initialization can be removed. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index c4b2d7d9a..9d0c621aa 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -53,7 +53,7 @@ static DevPrivateKeyRec DGAScreenKeyRec; #define DGAScreenKeyRegistered dixPrivateKeyRegistered(&DGAScreenKeyRec) -static int mieq_installed = 0; +static Bool mieq_installed; static Bool DGACloseScreen(int i, ScreenPtr pScreen); static void DGADestroyColormap(ColormapPtr pmap); @@ -252,7 +252,7 @@ DGACloseScreen(int i, ScreenPtr pScreen) if (mieq_installed) { mieqSetHandler(ET_DGAEvent, NULL); - mieq_installed = 0; + mieq_installed = FALSE; } FreeMarkedVisuals(pScreen); @@ -449,7 +449,7 @@ xf86SetDGAMode( if (!mieq_installed) { mieqSetHandler(ET_DGAEvent, DGAHandleEvent); - mieq_installed = 1; + mieq_installed = TRUE; } return Success; @@ -472,7 +472,7 @@ DGASetInputMode(int index, Bool keyboard, Bool mouse) if (!mieq_installed) { mieqSetHandler(ET_DGAEvent, DGAHandleEvent); - mieq_installed = 1; + mieq_installed = TRUE; } } } From ee8faeadb60f51a36edce19e568600dab7c8b357 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:44 +0200 Subject: [PATCH 08/13] xfree86/dga: DGA2 events are missing the dx/dy information Copy dx/dy from the internal event to the DGA2 Motion/Button events. Do the same for Key events for the sake of keeping the code consistent. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 9d0c621aa..309350590 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -1064,8 +1064,8 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr keybd) de.u.u.type = *XDGAEventBase + GetCoreType((InternalEvent*)&ev); de.u.u.detail = event->detail; de.u.event.time = event->time; - de.u.event.dx = 0; - de.u.event.dy = 0; + de.u.event.dx = event->dx; + de.u.event.dy = event->dy; de.u.event.screen = pScreen->myNum; de.u.event.state = ev.corestate; @@ -1120,8 +1120,8 @@ DGAProcessPointerEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr mouse) de.u.u.type = *XDGAEventBase + coreEquiv; de.u.u.detail = event->detail; de.u.event.time = event->time; - de.u.event.dx = 0; - de.u.event.dy = 0; + de.u.event.dx = event->dx; + de.u.event.dy = event->dy; de.u.event.screen = pScreen->myNum; de.u.event.state = ev.corestate; From ce4e0f660beb097e90110c97d039981702f0b0bd Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:45 +0200 Subject: [PATCH 09/13] xfree86/dga: Remove DGAMouseX and DGAMouseY Previously some sort of absolute coordinates were sent out in the padding of the DGA2 Motion and Button events. DGAMouseX and DGAMouseY were used to keep track of said coordinates. libXxf86dga doesn't use that data for anything, and at least git history didn't show any past usage either. So let's just remove the last remnants of of this mess. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 309350590..77d1ff881 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -942,8 +942,6 @@ DGAStealKeyEvent(DeviceIntPtr dev, int index, int key_code, int is_down) return TRUE; } -static int DGAMouseX, DGAMouseY; - Bool DGAStealMotionEvent(DeviceIntPtr dev, int index, int dx, int dy) { @@ -958,17 +956,6 @@ DGAStealMotionEvent(DeviceIntPtr dev, int index, int dx, int dy) if(!pScreenPriv || !pScreenPriv->grabMouse) /* no direct mode */ return FALSE; - DGAMouseX += dx; - if (DGAMouseX < 0) - DGAMouseX = 0; - else if (DGAMouseX > screenInfo.screens[index]->width) - DGAMouseX = screenInfo.screens[index]->width; - DGAMouseY += dy; - if (DGAMouseY < 0) - DGAMouseY = 0; - else if (DGAMouseY > screenInfo.screens[index]->height) - DGAMouseY = screenInfo.screens[index]->height; - memset(&event, 0, sizeof(event)); event.header = ET_Internal; event.type = ET_DGAEvent; From 5c941c04ca68cdc2b236c524970bc23f91906af4 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:46 +0200 Subject: [PATCH 10/13] xfree86/dga: DGAProcessKeyboardEvent() forgot ET_Internal Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 77d1ff881..d3c057747 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -1032,6 +1032,7 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr keybd) DeviceEvent ev; memset(&ev, 0, sizeof(ev)); + ev.header = ET_Internal; ev.length = sizeof(ev); ev.detail.key = event->detail; ev.type = event->subtype; From 9f09b62e594321a8e45a33f4f13559827d660ed3 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:47 +0200 Subject: [PATCH 11/13] xfree86/dga: Remove useless ifdefs Move some variables to the scope where they are used. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86Xinput.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 6fdf1eb06..74365e10b 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -1011,11 +1011,6 @@ xf86PostMotionEventM(DeviceIntPtr device, DeviceEvent *event; int flags = 0; -#if XFreeXDGA - int index; - int dx = 0, dy = 0; -#endif - if (valuator_mask_num_valuators(mask) > 0) { if (is_absolute) @@ -1029,7 +1024,9 @@ xf86PostMotionEventM(DeviceIntPtr device, if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1)) if (miPointerGetScreen(device)) { - index = miPointerGetScreen(device)->myNum; + int index = miPointerGetScreen(device)->myNum; + int dx = 0, dy = 0; + if (valuator_mask_isset(mask, 0)) { dx = valuator_mask_get(mask, 0); @@ -1160,10 +1157,6 @@ xf86PostButtonEventM(DeviceIntPtr device, int i = 0, nevents = 0; int flags = 0; -#if XFreeXDGA - int index; -#endif - if (valuator_mask_num_valuators(mask) > 0) { if (is_absolute) @@ -1174,7 +1167,8 @@ xf86PostButtonEventM(DeviceIntPtr device, #if XFreeXDGA if (miPointerGetScreen(device)) { - index = miPointerGetScreen(device)->myNum; + int index = miPointerGetScreen(device)->myNum; + if (DGAStealButtonEvent(device, index, button, is_down)) return; } @@ -1241,13 +1235,13 @@ xf86PostKeyEventM(DeviceIntPtr device, int i = 0, nevents = 0; #if XFreeXDGA - int index; DeviceIntPtr pointer; /* Some pointers send key events, paired device is wrong then. */ pointer = IsPointerDevice(device) ? device : GetPairedDevice(device); if (miPointerGetScreen(pointer)) { - index = miPointerGetScreen(pointer)->myNum; + int index = miPointerGetScreen(pointer)->myNum; + if (DGAStealKeyEvent(device, index, key_code, is_down)) return; } From 2081728b7432e949c274e0dbbabc296fa4db17f9 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:48 +0200 Subject: [PATCH 12/13] xfree86/dga: Only send DGA events for master devices Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index d3c057747..28fffc1d5 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -1210,6 +1210,9 @@ DGAHandleEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device) if (!pScreenPriv) return; + if (!IsMaster(device)) + return; + switch (event->subtype) { case KeyPress: case KeyRelease: From 53602c36217487e0a80880e8328f89ab302d85c8 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Mon, 24 Jan 2011 01:06:49 +0200 Subject: [PATCH 13/13] xfree86/dga: Remove DGAIsDgaEvent() DGAIsDgaEvent() is not used anymore. Signed-off-by: Ville Syrjala Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- hw/xfree86/common/xf86DGA.c | 12 ------------ hw/xfree86/dixmods/extmod/dgaproc.h | 1 - 2 files changed, 13 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 28fffc1d5..74eb739e4 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -999,18 +999,6 @@ DGAStealButtonEvent(DeviceIntPtr dev, int index, int button, int is_down) /* We have the power to steal or modify events that are about to get queued */ -Bool -DGAIsDgaEvent (xEvent *e) -{ - int coreEquiv; - if (!DGAScreenKeyRegistered || XDGAEventBase == 0) - return FALSE; - coreEquiv = e->u.u.type - *XDGAEventBase; - if (KeyPress <= coreEquiv && coreEquiv <= MotionNotify) - return TRUE; - return FALSE; -} - #define NoSuchEvent 0x80000000 /* so doesn't match NoEventMask */ static Mask filters[] = { diff --git a/hw/xfree86/dixmods/extmod/dgaproc.h b/hw/xfree86/dixmods/extmod/dgaproc.h index 6745a6e7a..a13a51794 100644 --- a/hw/xfree86/dixmods/extmod/dgaproc.h +++ b/hw/xfree86/dixmods/extmod/dgaproc.h @@ -124,7 +124,6 @@ extern _X_EXPORT Bool DGAStealButtonEvent(DeviceIntPtr dev, int Index, int butto int is_down); extern _X_EXPORT Bool DGAStealMotionEvent(DeviceIntPtr dev, int Index, int dx, int dy); extern _X_EXPORT Bool DGAStealKeyEvent(DeviceIntPtr dev, int Index, int key_code, int is_down); -extern _X_EXPORT Bool DGAIsDgaEvent (xEvent *e); extern _X_EXPORT Bool DGAOpenFramebuffer(int Index, char **name, unsigned char **mem, int *size, int *offset, int *flags);