On Sat, Jun 12, 2010 at 04:40:54PM +0800, Xiaoyang Yu (Max) wrote: > Signed-off-by: Xiaoyang Yu (Max) <max.a...@intel.com> > Reviewed-by: Mikhail Gusarov <dotted...@dottedmag.net>
Thanks, I've merged this into my tree. Keith, don't merge this patch please, i want to add a blurb to the commit message so it's identifiable what this patch actually does. Cheers, Peter > --- > hw/kdrive/ephyr/ephyr.c | 107 > ++++++++++++++++++++--------------------------- > 1 files changed, 45 insertions(+), 62 deletions(-) > > diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c > index b968516..e734522 100644 > --- a/hw/kdrive/ephyr/ephyr.c > +++ b/hw/kdrive/ephyr/ephyr.c > @@ -38,6 +38,8 @@ > #include "ephyrglxext.h" > #endif /* XF86DRI */ > > +#include "xkbsrv.h" > + > extern int KdTsPhyScreen; > #ifdef GLXEXT > extern Bool noGlxVisualInit; > @@ -748,75 +750,55 @@ ephyrScreenFini (KdScreenInfo *screen) > void > ephyrUpdateModifierState(unsigned int state) > { > -#if 0 > - DeviceIntPtr pkeydev; > - KeyClassPtr keyc; > - int i; > - CARD8 mask; > - > - pkeydev = inputInfo.keyboard; > > - if (!pkeydev) > - return; > + DeviceIntPtr pDev = inputInfo.keyboard; > + KeyClassPtr keyc = pDev->key; > + int i; > + CARD8 mask; > + int xkb_state; > > -/* This is pretty broken. > - * > - * What should happen is that focus out should do as a VT switch does in > - * traditional servers: fake releases for all keys (and buttons too, come > - * to think of it) currently down. Then, on focus in, get the state from > - * the host, and fake keypresses for everything currently down. > - * > - * So I'm leaving this broken for a little while. Sorry, folks. > - * > - * -daniels > - */ > + if (!pDev) > + return; > > - keyc = pkeydev->key; > - > + xkb_state = XkbStateFieldFromRec(&pDev->key->xkbInfo->state); > state = state & 0xff; > - > - if (keyc->state == state) > + > + if (xkb_state == state) > return; > - > - for (i = 0, mask = 1; i < 8; i++, mask <<= 1) > - { > - int key; > > - /* Modifier is down, but shouldn't be */ > - if ((keyc->state & mask) && !(state & mask)) > - { > - int count = keyc->modifierKeyCount[i]; > - > - for (key = 0; key < MAP_LENGTH; key++) > - if (keyc->xkbInfo->desc->map->modmap[key] & mask) > - { > - int bit; > - BYTE *kptr; > - > - kptr = &keyc->down[key >> 3]; > - bit = 1 << (key & 7); > - > - if (*kptr & bit && ephyrKbd && > - ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) > - KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE); /* release */ > - > - if (--count == 0) > - break; > - } > - } > - > - /* Modifier shoud be down, but isn't */ > - if (!(keyc->state & mask) && (state & mask)) > - for (key = 0; key < MAP_LENGTH; key++) > - if (keyc->xkbInfo->desc->map->modmap[key] & mask) > - { > - if (keyc->xkbInfo->desc->map->modmap[key] & mask && ephyrKbd && > - ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) > - KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */ > - break; > - } > + for (i = 0, mask = 1; i < 8; i++, mask <<= 1) { > + int key; > + > + /* Modifier is down, but shouldn't be > + */ > + if ((xkb_state & mask) && !(state & mask)) { > + int count = keyc->modifierKeyCount[i]; > + > + for (key = 0; key < MAP_LENGTH; key++) > + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { > + int bit; > + BYTE *kptr; > + > + kptr = &keyc->down[key >> 3]; > + bit = 1 << (key & 7); > + > + if (*kptr & bit) > + KdEnqueueKeyboardEvent (ephyrKbd, key, TRUE); > + > + if (--count == 0) > + break; > + } > } > -#endif > + > + /* Modifier shoud be down, but isn't > + */ > + if (!(xkb_state & mask) && (state & mask)) > + for (key = 0; key < MAP_LENGTH; key++) > + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { > + KdEnqueueKeyboardEvent (ephyrKbd, key, FALSE); > + break; > + } > + } > } > > static void > @@ -998,6 +980,7 @@ ephyrPoll(void) > if (!ephyrKbd || > !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) > continue; > + ephyrUpdateModifierState(ev.key_state); > KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE); > break; > > -- > 1.7.0 > > > From: Xiaoyang Yu (Max) <max.a...@intel.com> > Date: Fri, 4 Jun 2010 17:17:53 +0800 > Subject: [PATCH] Re-enabled Xnest fix for focus in + modifier bug. > * See https://bugs.freedesktop.org/show_bug.cgi?id=3030 > > Signed-off-by: Xiaoyang Yu (Max) <max.a...@intel.com> > Reviewed-by: Mikhail Gusarov <dotted...@dottedmag.net> > --- > hw/kdrive/ephyr/ephyr.c | 107 > ++++++++++++++++++++--------------------------- > 1 files changed, 45 insertions(+), 62 deletions(-) > > diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c > index b968516..e734522 100644 > --- a/hw/kdrive/ephyr/ephyr.c > +++ b/hw/kdrive/ephyr/ephyr.c > @@ -38,6 +38,8 @@ > #include "ephyrglxext.h" > #endif /* XF86DRI */ > > +#include "xkbsrv.h" > + > extern int KdTsPhyScreen; > #ifdef GLXEXT > extern Bool noGlxVisualInit; > @@ -748,75 +750,55 @@ ephyrScreenFini (KdScreenInfo *screen) > void > ephyrUpdateModifierState(unsigned int state) > { > -#if 0 > - DeviceIntPtr pkeydev; > - KeyClassPtr keyc; > - int i; > - CARD8 mask; > - > - pkeydev = inputInfo.keyboard; > > - if (!pkeydev) > - return; > + DeviceIntPtr pDev = inputInfo.keyboard; > + KeyClassPtr keyc = pDev->key; > + int i; > + CARD8 mask; > + int xkb_state; > > -/* This is pretty broken. > - * > - * What should happen is that focus out should do as a VT switch does in > - * traditional servers: fake releases for all keys (and buttons too, come > - * to think of it) currently down. Then, on focus in, get the state from > - * the host, and fake keypresses for everything currently down. > - * > - * So I'm leaving this broken for a little while. Sorry, folks. > - * > - * -daniels > - */ > + if (!pDev) > + return; > > - keyc = pkeydev->key; > - > + xkb_state = XkbStateFieldFromRec(&pDev->key->xkbInfo->state); > state = state & 0xff; > - > - if (keyc->state == state) > + > + if (xkb_state == state) > return; > - > - for (i = 0, mask = 1; i < 8; i++, mask <<= 1) > - { > - int key; > > - /* Modifier is down, but shouldn't be */ > - if ((keyc->state & mask) && !(state & mask)) > - { > - int count = keyc->modifierKeyCount[i]; > - > - for (key = 0; key < MAP_LENGTH; key++) > - if (keyc->xkbInfo->desc->map->modmap[key] & mask) > - { > - int bit; > - BYTE *kptr; > - > - kptr = &keyc->down[key >> 3]; > - bit = 1 << (key & 7); > - > - if (*kptr & bit && ephyrKbd && > - ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) > - KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE); /* release */ > - > - if (--count == 0) > - break; > - } > - } > - > - /* Modifier shoud be down, but isn't */ > - if (!(keyc->state & mask) && (state & mask)) > - for (key = 0; key < MAP_LENGTH; key++) > - if (keyc->xkbInfo->desc->map->modmap[key] & mask) > - { > - if (keyc->xkbInfo->desc->map->modmap[key] & mask && ephyrKbd && > - ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) > - KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */ > - break; > - } > + for (i = 0, mask = 1; i < 8; i++, mask <<= 1) { > + int key; > + > + /* Modifier is down, but shouldn't be > + */ > + if ((xkb_state & mask) && !(state & mask)) { > + int count = keyc->modifierKeyCount[i]; > + > + for (key = 0; key < MAP_LENGTH; key++) > + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { > + int bit; > + BYTE *kptr; > + > + kptr = &keyc->down[key >> 3]; > + bit = 1 << (key & 7); > + > + if (*kptr & bit) > + KdEnqueueKeyboardEvent (ephyrKbd, key, TRUE); > + > + if (--count == 0) > + break; > + } > } > -#endif > + > + /* Modifier shoud be down, but isn't > + */ > + if (!(xkb_state & mask) && (state & mask)) > + for (key = 0; key < MAP_LENGTH; key++) > + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { > + KdEnqueueKeyboardEvent (ephyrKbd, key, FALSE); > + break; > + } > + } > } > > static void > @@ -998,6 +980,7 @@ ephyrPoll(void) > if (!ephyrKbd || > !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) > continue; > + ephyrUpdateModifierState(ev.key_state); > KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE); > break; > > -- > 1.7.0 > _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel