From 638cab7e1dc3711f7fb04155bcdabf4b8895cc5e Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 4 Aug 2008 17:08:36 +0930 Subject: [PATCH] xfree86: force SwitchCoreKeyboard for evdev devices (updated). If an evdev keyboard device is added through the HAL mechanism, force a SwitchCoreKeyboard to load the evdev map into the VCK. This way, by the time a client starts the evdev keymap is already there, leading to less pain lateron. Works if: - all keyboards are hotplugged through HAL, and/or - the xorg.conf keyboard uses the kbd driver. Has no effect (i.e. busted keymaps) if: - an evdev keyboard device has been specified in the xorg.conf. - we don't have a device at startup and plug a device in after starting the desktop environment. - if the device we use isn't the first one reported by HAL. If HAL isn't set up, this patch is a noop. --- hw/xfree86/common/xf86Xinput.c | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+), 0 deletions(-) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 710e787..dacc3dc 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -423,6 +423,37 @@ NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev) (!is_auto || xf86Info.autoEnableDevices)) EnableDevice(dev); + /* XXX: The VCK always starts with built-in defaults for keymap. These + * defaults are different to the evdev ones. When the first key is hit on + * an extension device, the keymap is copied into the VCK's and any + * changes made at runtime to the VCK map are lost. + * + * Assumption: if we have at least one evdev keyboard device, we can + * ignore kbd devices. Force a SwitchCoreKeyboard so the VCK has the same + * keymap as we do. + * + * Next time we hit a key, we don't change the map over anymore (see + * SwitchCoreKeyboard), and live happily ever after. + * Until we have 2 physical keyboards. Or the first real keyboard isn't + * actually the one we use. Oh well. + * + */ + if (dev->key) + { + InputInfoPtr info; + + /* Search if there is one other keyboard that uses evdev. */ + for (info = xf86InputDevs; info; info = info->next) + { + if (info != pInfo && info->dev && info->dev->key && + (strcmp(info->drv->driverName, "evdev") == 0)) + break; + } + + if (!info) + SwitchCoreKeyboard(dev); + } + *pdev = dev; return Success; -- 1.5.5.1