xnest: restore xnestUpdateModifierState
The meat of xnestUpdateModifierState was ifdef'd out in
6ef46c40e6. This resulted in stuck modifiers
when a modifier key release event wasn't sent to Xnest (e.g. Alt-Tab away).
See X.Org Bug 3664 <https://bugs.freedesktop.org/show_bug.cgi?id=3664> for
the original bug report.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
			
			
This commit is contained in:
		
							parent
							
								
									44afc7577a
								
							
						
					
					
						commit
						5904ef2ccd
					
				| 
						 | 
					@ -206,29 +206,19 @@ LegalModifier(unsigned int key, DeviceIntPtr pDev)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
xnestUpdateModifierState(unsigned int state)
 | 
					xnestUpdateModifierState(unsigned int state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
  DeviceIntPtr pDev = xnestKeyboardDevice;
 | 
					  DeviceIntPtr pDev = xnestKeyboardDevice;
 | 
				
			||||||
  KeyClassPtr keyc = pDev->key;
 | 
					  KeyClassPtr keyc = pDev->key;
 | 
				
			||||||
  int i;
 | 
					  int i;
 | 
				
			||||||
  CARD8 mask;
 | 
					  CARD8 mask;
 | 
				
			||||||
 | 
					  int xkb_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!pDev)
 | 
					  if (!pDev)
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* This is pretty broken.
 | 
					  xkb_state = XkbStateFieldFromRec(&pDev->key->xkbInfo->state);
 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * 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
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
  state = state & 0xff;
 | 
					  state = state & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (keyc->state == state)
 | 
					  if (xkb_state == state)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 0, mask = 1; i < 8; i++, mask <<= 1) {
 | 
					  for (i = 0, mask = 1; i < 8; i++, mask <<= 1) {
 | 
				
			||||||
| 
						 | 
					@ -236,7 +226,7 @@ xnestUpdateModifierState(unsigned int state)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Modifier is down, but shouldn't be
 | 
					    /* Modifier is down, but shouldn't be
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    if ((keyc->state & mask) && !(state & mask)) {
 | 
					    if ((xkb_state & mask) && !(state & mask)) {
 | 
				
			||||||
      int count = keyc->modifierKeyCount[i];
 | 
					      int count = keyc->modifierKeyCount[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for (key = 0; key < MAP_LENGTH; key++)
 | 
					      for (key = 0; key < MAP_LENGTH; key++)
 | 
				
			||||||
| 
						 | 
					@ -257,12 +247,11 @@ xnestUpdateModifierState(unsigned int state)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Modifier shoud be down, but isn't
 | 
					    /* Modifier shoud be down, but isn't
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    if (!(keyc->state & mask) && (state & mask))
 | 
					    if (!(xkb_state & mask) && (state & mask))
 | 
				
			||||||
      for (key = 0; key < MAP_LENGTH; key++)
 | 
					      for (key = 0; key < MAP_LENGTH; key++)
 | 
				
			||||||
	if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
 | 
						if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
 | 
				
			||||||
	  xnestQueueKeyEvent(KeyPress, key);
 | 
						  xnestQueueKeyEvent(KeyPress, key);
 | 
				
			||||||
	  break;
 | 
						  break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue