xorg-x11-server/xserver-1.5.0-force-SwitchCoreKeyboard-for-evdev.patch
Peter Hutterer 3262bac3e6 * Tue Aug 05 2008 Peter Hutterer <peter.hutterer@redhat.com> 1.4.99.906-5
- xserver-1.5.0-xkb-fix-ProcXkbSetXYZ-to-work-on-all.patch: force xkb requests
  to apply to all extension devices.
- drop call-SwitchCoreKeyboard.patch
- xserver-1.5.0-force-SwitchCoreKeyboard-for-evdev.patch: force
  SwitchCoreKeyboard for evdev devices to push device keymap into core device.
2008-08-05 05:10:31 +00:00

70 lines
2.5 KiB
Diff

From 638cab7e1dc3711f7fb04155bcdabf4b8895cc5e Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
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