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