Xi: don't care about CoreDevicePrivateKey when copying keys
If we get here, we must copy. Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com> Signed-off-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
		
							parent
							
								
									23862ede59
								
							
						
					
					
						commit
						58a6b5b9ef
					
				|  | @ -203,67 +203,56 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master) | ||||||
|     dk = device->key; |     dk = device->key; | ||||||
|     mk = master->key; |     mk = master->key; | ||||||
| 
 | 
 | ||||||
|     if (device != dixLookupPrivate(&master->devPrivates, |     memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH); | ||||||
|                                    CoreDevicePrivateKey)) { |  | ||||||
|         memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH); |  | ||||||
| 
 | 
 | ||||||
|         if (dk->maxKeysPerModifier) |     if (dk->maxKeysPerModifier) | ||||||
|         { |     { | ||||||
|             mk->modifierKeyMap = xrealloc(mk->modifierKeyMap, |         mk->modifierKeyMap = xrealloc(mk->modifierKeyMap, | ||||||
|                                           8 * dk->maxKeysPerModifier); |                                       8 * dk->maxKeysPerModifier); | ||||||
|             if (!mk->modifierKeyMap) |         if (!mk->modifierKeyMap) | ||||||
|                 FatalError("[Xi] no memory for class shift.\n"); |             FatalError("[Xi] no memory for class shift.\n"); | ||||||
|             memcpy(mk->modifierKeyMap, dk->modifierKeyMap, |         memcpy(mk->modifierKeyMap, dk->modifierKeyMap, | ||||||
|                     (8 * dk->maxKeysPerModifier)); |                 (8 * dk->maxKeysPerModifier)); | ||||||
|         } else |     } else | ||||||
|         { |     { | ||||||
|             xfree(mk->modifierKeyMap); |         xfree(mk->modifierKeyMap); | ||||||
|             mk->modifierKeyMap = NULL; |         mk->modifierKeyMap = NULL; | ||||||
|         } |     } | ||||||
| 
 | 
 | ||||||
|         mk->maxKeysPerModifier = dk->maxKeysPerModifier; |     mk->maxKeysPerModifier = dk->maxKeysPerModifier; | ||||||
|         mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode; |     mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode; | ||||||
|         mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode; |     mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode; | ||||||
|         SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms); |     SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms); | ||||||
| 
 | 
 | ||||||
|         /*
 |     /*
 | ||||||
|          * Copy state from the extended keyboard to core.  If you omit this, |      * Copy state from the extended keyboard to core.  If you omit this, | ||||||
|          * holding Ctrl on keyboard one, and pressing Q on keyboard two, will |      * holding Ctrl on keyboard one, and pressing Q on keyboard two, will | ||||||
|          * cause your app to quit.  This feels wrong to me, hence the below |      * cause your app to quit.  This feels wrong to me, hence the below | ||||||
|          * code. |      * code. | ||||||
|          * |      * | ||||||
|          * XXX: If you synthesise core modifier events, the state will get |      * XXX: If you synthesise core modifier events, the state will get | ||||||
|          *      clobbered here.  You'll have to work out something sensible |      *      clobbered here.  You'll have to work out something sensible | ||||||
|          *      to fix that.  Good luck. |      *      to fix that.  Good luck. | ||||||
|          */ |      */ | ||||||
| 
 | 
 | ||||||
| #define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \ | #define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \ | ||||||
|         Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) |         Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) | ||||||
|         mk->state &= ~(KEYBOARD_MASK); |     mk->state &= ~(KEYBOARD_MASK); | ||||||
|         mk->state |= (dk->state & KEYBOARD_MASK); |     mk->state |= (dk->state & KEYBOARD_MASK); | ||||||
| #undef KEYBOARD_MASK | #undef KEYBOARD_MASK | ||||||
|         for (i = 0; i < 8; i++) |     for (i = 0; i < 8; i++) | ||||||
|             mk->modifierKeyCount[i] = dk->modifierKeyCount[i]; |         mk->modifierKeyCount[i] = dk->modifierKeyCount[i]; | ||||||
| 
 | 
 | ||||||
| #ifdef XKB |     if (dk->xkbInfo && dk->xkbInfo->desc) { | ||||||
|         if (!noXkbExtension && dk->xkbInfo && dk->xkbInfo->desc) { |         if (!mk->xkbInfo || !mk->xkbInfo->desc) { | ||||||
|             if (!mk->xkbInfo || !mk->xkbInfo->desc) |             XkbInitDevice(master); | ||||||
|             { |             XkbFinishDeviceInit(master); | ||||||
|                 XkbInitDevice(master); |  | ||||||
|                 XkbFinishDeviceInit(master); |  | ||||||
|             } |  | ||||||
|             if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True)) |  | ||||||
|                 FatalError("Couldn't pivot keymap from device to core!\n"); |  | ||||||
|         } |         } | ||||||
| #endif |         if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True)) | ||||||
|  |             FatalError("Couldn't pivot keymap from device to core!\n"); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|         dixSetPrivate(&master->devPrivates, CoreDevicePrivateKey, device); |     if (lastMapNotifyDevice != master) { | ||||||
|         sendNotify = TRUE; |  | ||||||
|     } else if (lastMapNotifyDevice != master) |  | ||||||
|         sendNotify = TRUE; |  | ||||||
| 
 |  | ||||||
|     if (sendNotify) |  | ||||||
|     { |  | ||||||
|         SendMappingNotify(master, MappingKeyboard, |         SendMappingNotify(master, MappingKeyboard, | ||||||
|                            mk->curKeySyms.minKeyCode, |                            mk->curKeySyms.minKeyCode, | ||||||
|                           (mk->curKeySyms.maxKeyCode - |                           (mk->curKeySyms.maxKeyCode - | ||||||
|  | @ -271,6 +260,13 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master) | ||||||
|                           serverClient); |                           serverClient); | ||||||
|         lastMapNotifyDevice = master; |         lastMapNotifyDevice = master; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /* Copy the state here.  This means we'll only have consistency
 | ||||||
|  |      * between state and active keymap, rather than between state and | ||||||
|  |      * keycodes pressed, but there's pretty much no way to win here, | ||||||
|  |      * so might as well go for the one that would seem to give the | ||||||
|  |      * least nonsensical result. */ | ||||||
|  |     mk->xkbInfo->state = dk->xkbInfo->state; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue