XKB: Remove duplicate keymap-copying loop
Previously we had:
    foreach (device + slaves of device) {
        XkbCopyDeviceKeymap(i, device);
        [...]
    }
    if (device was last slave of its MD) {
        XkbCopyDeviceKeymap(master, device);
    }
and now:
    foreach (device + slaves of device + MD if device was last slave) {
        XkbCopyDeviceKeymap(i, device);
        [...]
    }
As an extra bonus, when changing the keymap on a slave device, we now
ensure the LED info on the master is kept in sync.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
			
			
This commit is contained in:
		
							parent
							
								
									b8540d18c7
								
							
						
					
					
						commit
						c7634498d4
					
				
							
								
								
									
										14
									
								
								xkb/xkb.c
								
								
								
								
							
							
						
						
									
										14
									
								
								xkb/xkb.c
								
								
								
								
							|  | @ -5586,6 +5586,7 @@ ProcXkbGetKbdByName(ClientPtr client) | ||||||
| { | { | ||||||
|     DeviceIntPtr 		dev; |     DeviceIntPtr 		dev; | ||||||
|     DeviceIntPtr                tmpd; |     DeviceIntPtr                tmpd; | ||||||
|  |     DeviceIntPtr                master; | ||||||
|     xkbGetKbdByNameReply 	rep = {0}; |     xkbGetKbdByNameReply 	rep = {0}; | ||||||
|     xkbGetMapReply		mrep = {0}; |     xkbGetMapReply		mrep = {0}; | ||||||
|     xkbGetCompatMapReply	crep = {0}; |     xkbGetCompatMapReply	crep = {0}; | ||||||
|  | @ -5611,6 +5612,7 @@ ProcXkbGetKbdByName(ClientPtr client) | ||||||
| 	return BadAccess; | 	return BadAccess; | ||||||
| 
 | 
 | ||||||
|     CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode); |     CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode); | ||||||
|  |     master = GetMaster(dev, MASTER_KEYBOARD); | ||||||
| 
 | 
 | ||||||
|     xkb = dev->key->xkbInfo->desc; |     xkb = dev->key->xkbInfo->desc; | ||||||
|     status= Success; |     status= Success; | ||||||
|  | @ -5869,8 +5871,12 @@ ProcXkbGetKbdByName(ClientPtr client) | ||||||
| 	} | 	} | ||||||
| 	xkb->ctrls->num_groups= nTG; | 	xkb->ctrls->num_groups= nTG; | ||||||
| 
 | 
 | ||||||
|  |         /* Update the map and LED info on the device itself, as well as
 | ||||||
|  |          * any slaves if it's an MD, or its MD if it's an SD and was the | ||||||
|  |          * last device used on that MD. */ | ||||||
|         for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) { |         for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) { | ||||||
|             if (tmpd != dev && GetMaster(tmpd, MASTER_KEYBOARD) != dev) |             if (tmpd != dev && GetMaster(tmpd, MASTER_KEYBOARD) != dev && | ||||||
|  |                 (tmpd != master || dev != master->lastSlave)) | ||||||
|                 continue; |                 continue; | ||||||
| 
 | 
 | ||||||
|             if (tmpd != dev) |             if (tmpd != dev) | ||||||
|  | @ -5900,12 +5906,6 @@ ProcXkbGetKbdByName(ClientPtr client) | ||||||
| 	if (geom_changed) | 	if (geom_changed) | ||||||
| 	    nkn.changed|= XkbNKN_GeometryMask; | 	    nkn.changed|= XkbNKN_GeometryMask; | ||||||
| 	XkbSendNewKeyboardNotify(dev,&nkn); | 	XkbSendNewKeyboardNotify(dev,&nkn); | ||||||
| 
 |  | ||||||
| 	if (!IsMaster(dev)) { |  | ||||||
| 	    DeviceIntPtr master = GetMaster(dev, MASTER_KEYBOARD); |  | ||||||
| 	    if (master && master->lastSlave == dev) |  | ||||||
| 		XkbCopyDeviceKeymap(master, dev); |  | ||||||
| 	} |  | ||||||
|     } |     } | ||||||
|     if ((new!=NULL)&&(new!=xkb)) { |     if ((new!=NULL)&&(new!=xkb)) { | ||||||
| 	XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE); | 	XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue