ChangeLog | 127 + Xext/geext.c | 9 Xi/xiproperty.c | 5 configure.ac | 10 debian/changelog | 10 debian/control | 6 debian/local/64-xorg-xkb.rules | 8 debian/patches/11-Move-config_init-after-CreateWellKnownSockets-and-In.diff | 37 debian/patches/12-Add-libudev-input-hotplug-backend.diff | 714 ++++++++++ debian/patches/13-configure-config-udev-defaults-to-off-for-now.diff | 26 debian/patches/14-config-add-example-udev-rules.diff | 27 debian/patches/15-config-udev-look-for-xkb-rules-model-layout-variant-.diff | 40 debian/patches/series | 5 debian/rules | 22 fb/fb.h | 3 fb/fbpict.c | 118 - fb/fbtrap.c | 4 hw/xfree86/modes/xf86EdidModes.c | 15 hw/xquartz/mach-startup/bundle-main.c | 36 hw/xquartz/mach-startup/stub.c | 1 test/input.c | 54 21 files changed, 1133 insertions(+), 144 deletions(-)
New commits: commit df4e9195f8bf93eeb45c4085647e7e85634ed39e Author: Julien Cristau <[email protected]> Date: Sat Nov 28 16:48:46 2009 +0100 Prepare changelog for upload diff --git a/debian/changelog b/debian/changelog index 8cb6c4c..b6a1feb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xorg-server (2:1.7.2-1) UNRELEASED; urgency=low +xorg-server (2:1.7.2-1) experimental; urgency=low * New upstream release + Xorg sets umask to 022 (closes: #555308) @@ -18,7 +18,7 @@ xorg-server (2:1.7.2-1) UNRELEASED; urgency=low * Use libudev instead of libhal for input hotplug on linux. * Add udev rule to get keymap from /etc/default/keyboard. - -- Julien Cristau <[email protected]> Sat, 28 Nov 2009 16:17:58 +0100 + -- Julien Cristau <[email protected]> Sat, 28 Nov 2009 16:48:43 +0100 xorg-server (2:1.7.0-1) experimental; urgency=low commit cb7d5380f5e5fc8f26cdce4467fa46d3fb4b1a77 Author: Julien Cristau <[email protected]> Date: Sat Nov 28 16:48:21 2009 +0100 Fix mode of udev rule diff --git a/debian/rules b/debian/rules index cfa078f..ef76435 100755 --- a/debian/rules +++ b/debian/rules @@ -225,7 +225,7 @@ binary-arch: build install $(INSTALL) -m 755 debian/xserver-xorg-core.bug.script debian/xserver-xorg-core/usr/share/bug/xserver-xorg-core/script ifeq ($(DEB_HOST_ARCH_OS), linux) install -d debian/xserver-xorg-core/lib/udev/rules.d - install debian/local/64-xorg-xkb.rules debian/xserver-xorg-core/lib/udev/rules.d + install -m 644 debian/local/64-xorg-xkb.rules debian/xserver-xorg-core/lib/udev/rules.d endif dh_installdebconf -s dh_installman -s commit 33a67155da920d922c57426b1075d6da8ec11f74 Author: Julien Cristau <[email protected]> Date: Sat Nov 28 16:19:05 2009 +0100 Bump changelogs diff --git a/ChangeLog b/ChangeLog index 0864cdc..1792894 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,130 @@ +commit 1fff1b37a91c989c046d96d961862d592a307496 +Author: Peter Hutterer <[email protected]> +Date: Fri Nov 27 14:58:57 2009 +1000 + + xserver 1.7.2 + + Signed-off-by: Peter Hutterer <[email protected]> + +commit 196aff9b18381d700fb28027186cce6e68ad587c +Author: Aaron Plattner <[email protected]> +Date: Tue Nov 24 10:21:28 2009 -0800 + + Bug #25136: Revert "Fix clipping when windows are used as sources" + + That change causes lib(w)fb to make accelerated driver calls after the driver + has entered a software fallback. Most drivers don't expect this, which leads to + corruption or crashes. A change to make this code do the copy in software is + unacceptably slow. + + This reverts commit e9aa61e9f0d663d5b34a397b943b4d1df44e873d. + + Conflicts: + + configure.ac + fb/fbpict.c + + Signed-off-by: Aaron Plattner <[email protected]> + Signed-off-by: Peter Hutterer <[email protected]> + +commit 8eca8eaef56526b9649b48aa5f83c3d7914cfdc4 +Author: Peter Hutterer <[email protected]> +Date: Tue Nov 24 15:31:48 2009 +1000 + + Xi: when deleting all properties, reset property handler to NULL. + + Trying to unregister property handlers during the device closure process + leads to invalid memory accesses. + + Signed-off-by: Peter Hutterer <[email protected]> + Reviewed-by: Keith Packard <[email protected]> + (cherry picked from commit 1b127ab8429616adf9ec31ba4d8bdd9af6e104a9) + +commit 9998105a387e0294054502331a56e1e020cd93e4 +Author: Peter Hutterer <[email protected]> +Date: Tue Nov 17 09:25:47 2009 +1000 + + Move xdmxconfig modules into DMX conditionals (#25102) + + xdmxconfig requires additional modules not checked for if Xdmx build is set + to auto (the default). This may lead to build errors if the Xdmx modules are + installed, but not the extra ones required for xdmxconfig. + + X.Org Bug 25102 <http://bugs.freedesktop.org/show_bug.cgi?id=25102> + + Signed-off-by: Peter Hutterer <[email protected]> + Reviewed-by: Remi Cardona <[email protected]> + Acked-by: Julien Cristau <[email protected]> + (cherry picked from commit 8806375ed72a3cd465fe0a49ead079a334accd6b) + +commit 18dcc102ac12a4b18c60b5dbabbc4d5debfe5556 +Author: Rami Ylimaki <[email protected]> +Date: Tue Nov 17 17:13:43 2009 +0200 + + Xext: Fix a memory leak on GE client disconnect. + + Add a call to dixRequestPrivate to inform dixFreePrivates that memory + allocated in GEClientCallback should be released when client + disconnects. Otherwise there is a leak of sizeof(GEClientInfoRec) for + every client connect/disconnect. + + Also remove the explicit allocation and let GEGetClient / + dixLookupPrivate do it. This makes GEClientCallback similar to the + other extension callbacks. + + Signed-off-by: Rami Ylimaki <[email protected]> + Signed-off-by: Peter Hutterer <[email protected]> + (cherry picked from commit eb967ca36cfe0409972ac987a74d498cd6f6bafb) + +commit b8904935bbd26e9d34587f03810318d94cb771f6 +Author: Peter Hutterer <[email protected]> +Date: Mon Nov 23 13:07:56 2009 +1000 + + Xi: don't crash when deleting invalid device properties. + + Deleting a property that was not set on a device leads to a null-pointer + reference. The protocol allows deleting those properties - it has to be a + noop. + + Reproducible: + xinput --set-prop "My device" --type=int --format=8 "my property" 1 + xinput --delete-prop "My other device" "my property" + + Signed-off-by: Peter Hutterer <[email protected]> + Signed-off-by: Keith Packard <[email protected]> + (cherry picked from commit a30e739a144912a68adcaa9f426d600c6ecbd529) + +commit a5308ceb127bf390cbe6fef3ba1e33e78f222ba1 +Author: Zhao Yakui <[email protected]> +Date: Fri Nov 20 14:43:35 2009 +0800 + + xfree86: Edid quirk for Philips LCD LP154W01 + + v1->v2: Make one condition case for one quirk instead of merging them + together. This is based on the Keithp's suggestion. + + Move the EDID quirk for Philips LCD LP154W01 as the panel reports the vertical + size in cm. + + https://bugs.freedesktop.org/show_bug.cgi?id=24482 + + Signed-off-by: Zhao Yakui <[email protected]> + Signed-off-by: Keith Packard <[email protected]> + (cherry picked from commit 19f7c15e2008dab3c46ba3e14dfa353d01c74f72) + +commit b466329c111c4b6696508b3c2c8a60c9fbc90157 +Author: Jeremy Huddleston <[email protected]> +Date: Mon Nov 23 16:33:00 2009 -0800 + + XQuartz: Allow better compatability with older versions of xinit + + If we are id="org.x" and the launchd socket is ":0", we will claim + the socket to match the old behavior before we prefixed the + socket name with our id. + + Signed-off-by: Jeremy Huddleston <[email protected]> + (cherry picked from commit 4677b5a80025b50ba2a3e953fd487a549586ae9f) + commit 19b24f014f4dad1cc73e2454d15c64ae05ac8ef2 Author: Peter Hutterer <[email protected]> Date: Fri Nov 20 15:29:05 2009 +1000 diff --git a/debian/changelog b/debian/changelog index 5da0266..8cb6c4c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,7 @@ -xorg-server (2:1.7.1.902-1) UNRELEASED; urgency=low +xorg-server (2:1.7.2-1) UNRELEASED; urgency=low + * New upstream release + + Xorg sets umask to 022 (closes: #555308) * Delete 09_debian_xserver_rtff.diff. Was disabled since 1.3.99, and is not necessary since the fall back to builtin fonts was added. * Change the server's dependency on xserver-common to >= ${source:Version}, @@ -13,12 +15,10 @@ xorg-server (2:1.7.1.902-1) UNRELEASED; urgency=low * xvfb-run: retry a few times if Xvfb can't be started when using --auto-servernum, to make concurrent invocations work (closes: #521075). Thanks, Kees Cook! - * New upstream release - + Xorg sets umask to 022 (closes: #555308) * Use libudev instead of libhal for input hotplug on linux. * Add udev rule to get keymap from /etc/default/keyboard. - -- Julien Cristau <[email protected]> Thu, 26 Nov 2009 16:23:40 +0100 + -- Julien Cristau <[email protected]> Sat, 28 Nov 2009 16:17:58 +0100 xorg-server (2:1.7.0-1) experimental; urgency=low commit 1fff1b37a91c989c046d96d961862d592a307496 Author: Peter Hutterer <[email protected]> Date: Fri Nov 27 14:58:57 2009 +1000 xserver 1.7.2 Signed-off-by: Peter Hutterer <[email protected]> diff --git a/configure.ac b/configure.ac index 5579795..8500db4 100644 --- a/configure.ac +++ b/configure.ac @@ -26,8 +26,8 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([xorg-server], 1.7.1.902, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) -RELEASE_DATE="2009-11-20" +AC_INIT([xorg-server], 1.7.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) +RELEASE_DATE="2009-11-27" AC_CONFIG_SRCDIR([Makefile.am]) AM_INIT_AUTOMAKE([dist-bzip2 foreign]) AM_MAINTAINER_MODE commit dec68ef3470d39edabb5f6990d1f40c2c51f2601 Author: Julien Cristau <[email protected]> Date: Thu Nov 26 17:12:48 2009 +0100 Add udev rule to get keymap from /etc/default/keyboard. diff --git a/debian/changelog b/debian/changelog index 29893d7..5da0266 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,6 +16,7 @@ xorg-server (2:1.7.1.902-1) UNRELEASED; urgency=low * New upstream release + Xorg sets umask to 022 (closes: #555308) * Use libudev instead of libhal for input hotplug on linux. + * Add udev rule to get keymap from /etc/default/keyboard. -- Julien Cristau <[email protected]> Thu, 26 Nov 2009 16:23:40 +0100 diff --git a/debian/control b/debian/control index 81ce25b..e0eb5c5 100644 --- a/debian/control +++ b/debian/control @@ -85,6 +85,7 @@ Architecture: any Depends: xserver-common (>= ${source:Version}), xserver-xorg, + keyboard-configuration [linux-any kfreebsd-any], ${shlibs:Depends}, ${misc:Depends}, Recommends: libgl1-mesa-dri (>= 7.1~rc1) diff --git a/debian/local/64-xorg-xkb.rules b/debian/local/64-xorg-xkb.rules new file mode 100644 index 0000000..d5607c6 --- /dev/null +++ b/debian/local/64-xorg-xkb.rules @@ -0,0 +1,8 @@ +ACTION!="add", GOTO="xorg_xkb_end" +SUBSYSTEM!="input", GOTO="xorg_xkb_end" +KERNEL!="event*", GOTO="xorg_xkb_end" + +# import keyboard layout from /etc/default/keyboard +IMPORT{file}="/etc/default/keyboard" + +LABEL="xorg_xkb_end" diff --git a/debian/rules b/debian/rules index 37fe35a..cfa078f 100755 --- a/debian/rules +++ b/debian/rules @@ -191,7 +191,6 @@ install: build install -m 755 debian/local/xvfb-run debian/tmp/usr/bin install debian/local/xvfb-run.1 debian/tmp/usr/share/man/man1 - # stub to start building deb files, used by binary-indep and binary-arch binary-initial: dh_testdir @@ -224,6 +223,10 @@ binary-arch: build install $(CURDIR)/debian/xserver-xorg-dev/usr/share/xserver-xorg/serverminver $(INSTALL) -m 755 -d debian/xserver-xorg-core/usr/share/bug/xserver-xorg-core $(INSTALL) -m 755 debian/xserver-xorg-core.bug.script debian/xserver-xorg-core/usr/share/bug/xserver-xorg-core/script +ifeq ($(DEB_HOST_ARCH_OS), linux) + install -d debian/xserver-xorg-core/lib/udev/rules.d + install debian/local/64-xorg-xkb.rules debian/xserver-xorg-core/lib/udev/rules.d +endif dh_installdebconf -s dh_installman -s dh_link -s commit cc28c98c358b37bea1007f8e9dc8c4e0a8d2400c Author: Julien Cristau <[email protected]> Date: Thu Nov 26 16:55:42 2009 +0100 Use libudev instead of libhal for input hotplug on linux. diff --git a/debian/changelog b/debian/changelog index c344d7e..29893d7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,6 +15,7 @@ xorg-server (2:1.7.1.902-1) UNRELEASED; urgency=low Thanks, Kees Cook! * New upstream release + Xorg sets umask to 022 (closes: #555308) + * Use libudev instead of libhal for input hotplug on linux. -- Julien Cristau <[email protected]> Thu, 26 Nov 2009 16:23:40 +0100 diff --git a/debian/control b/debian/control index dcb7206..81ce25b 100644 --- a/debian/control +++ b/debian/control @@ -46,8 +46,9 @@ Build-Depends: libpixman-1-dev (>= 0.15.20), libpciaccess-dev (>= 0.10.7), libgcrypt-dev, - libdbus-1-dev [!hurd-i386], - libhal-dev [!hurd-i386], + libdbus-1-dev [kfreebsd-amd64 kfreebsd-i386], + libhal-dev [kfreebsd-amd64 kfreebsd-i386], + libudev-dev [alpha amd64 arm armeb armel avr32 hppa i386 ia64 lpia m32r m68k mips mipsel powerpc ppc64 s390 s390x sh3 sh3eb sh4 sh4eb sparc], libselinux1-dev (>= 2.0.80) [alpha amd64 arm armeb armel avr32 hppa i386 ia64 lpia m32r m68k mips mipsel powerpc ppc64 s390 s390x sh3 sh3eb sh4 sh4eb sparc], libaudit-dev [alpha amd64 arm armeb armel avr32 hppa i386 ia64 lpia m32r m68k mips mipsel powerpc ppc64 s390 s390x sh3 sh3eb sh4 sh4eb sparc], x11proto-xf86dri-dev (>= 2.1.0), diff --git a/debian/patches/11-Move-config_init-after-CreateWellKnownSockets-and-In.diff b/debian/patches/11-Move-config_init-after-CreateWellKnownSockets-and-In.diff new file mode 100644 index 0000000..3536198 --- /dev/null +++ b/debian/patches/11-Move-config_init-after-CreateWellKnownSockets-and-In.diff @@ -0,0 +1,37 @@ +From 4ae407a5a308febf63de27a62f8c301c73b37d3e Mon Sep 17 00:00:00 2001 +From: Julien Cristau <[email protected]> +Date: Tue, 6 Oct 2009 17:44:33 +0200 +Subject: [PATCH 1/5] Move config_init() after CreateWellKnownSockets() and InitCoreDevices() + +config_init() can now add devices directly instead of scheduling a +timer. + +Signed-off-by: Julien Cristau <[email protected]> +Tested-by: Peter Hutterer <[email protected]> +--- + dix/main.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/dix/main.c b/dix/main.c +index f96245a..2117a1e 100644 +--- a/dix/main.c ++++ b/dix/main.c +@@ -168,7 +168,6 @@ int main(int argc, char *argv[], char *envp[]) + InitBlockAndWakeupHandlers(); + /* Perform any operating system dependent initializations you'd like */ + OsInit(); +- config_init(); + if(serverGeneration == 1) + { + CreateWellKnownSockets(); +@@ -254,6 +253,7 @@ int main(int argc, char *argv[], char *envp[]) + InitRootWindow(WindowTable[i]); + + InitCoreDevices(); ++ config_init(); + InitInput(argc, argv); + InitAndStartDevices(); + +-- +1.6.5 + diff --git a/debian/patches/12-Add-libudev-input-hotplug-backend.diff b/debian/patches/12-Add-libudev-input-hotplug-backend.diff new file mode 100644 index 0000000..e764f6e --- /dev/null +++ b/debian/patches/12-Add-libudev-input-hotplug-backend.diff @@ -0,0 +1,714 @@ +From 7dc78123e56b2d4c6855aa7f8f554f012433eed3 Mon Sep 17 00:00:00 2001 +From: Julien Cristau <[email protected]> +Date: Sun, 27 Sep 2009 14:45:47 +0200 +Subject: [PATCH 2/5] Add libudev input-hotplug backend + +If libudev is found, we use that for hotplug and disable the hal and +dbus backends. +We look for event devices with an "x11_driver" property. XKB +configuration happens using xkb.{rules,model,layout,variant,options} +properties. Arbitrary driver options can be set with a "x11_options." +prefix. + +udev rules would look something like: +SUBSYSTEM=="input", KERNEL=="event*", ENV{x11_driver}="evdev" +SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_CLASS}=="kbd", ENV{xkb.layout}="fr", ENV{xkb.options}="terminate:ctrl_alt_bksp,compose:lwin" + +Signed-off-by: Julien Cristau <[email protected]> +Tested-by: Peter Hutterer <[email protected]> +--- + config/Makefile.am | 16 +++- + config/config-backends.h | 21 +++- + config/config.c | 77 ++++++++++++- + config/hal.c | 63 +---------- + config/udev.c | 247 +++++++++++++++++++++++++++++++++++++++ + configure.ac | 23 ++++- + hw/kdrive/src/kinput.c | 8 ++ + hw/xfree86/common/xf86Config.c | 15 ++- + hw/xfree86/common/xf86Globals.c | 2 +- + hw/xfree86/common/xf86Xinput.c | 4 +- + include/dix-config.h.in | 3 + + 11 files changed, 400 insertions(+), 79 deletions(-) + create mode 100644 config/udev.c + +diff --git a/config/Makefile.am b/config/Makefile.am +index 7fa2df8..8c57948 100644 +--- a/config/Makefile.am ++++ b/config/Makefile.am +@@ -3,10 +3,18 @@ AM_CFLAGS = @DIX_CFLAGS@ + noinst_LTLIBRARIES = libconfig.la + libconfig_la_SOURCES = config.c config-backends.h + ++if CONFIG_UDEV ++ ++AM_CFLAGS += @UDEV_CFLAGS@ ++libconfig_la_SOURCES += udev.c ++libconfig_la_LIBADD = @UDEV_LIBS@ ++ ++else ++ + if CONFIG_NEED_DBUS + AM_CFLAGS += @DBUS_CFLAGS@ + libconfig_la_SOURCES += dbus-core.c +-endif ++libconfig_la_LIBADD = @DBUS_LIBS@ + + if CONFIG_DBUS_API + dbusconfigdir = $(sysconfdir)/dbus-1/system.d +@@ -16,7 +24,13 @@ libconfig_la_SOURCES += dbus.c + endif + + if CONFIG_HAL ++AM_CFLAGS += @HAL_CFLAGS@ + libconfig_la_SOURCES += hal.c ++libconfig_la_LIBADD += @HAL_LIBS@ + endif + ++endif # CONFIG_NEED_DBUS ++ ++endif # !CONFIG_UDEV ++ + EXTRA_DIST = xorg-server.conf x11-input.fdi +diff --git a/config/config-backends.h b/config/config-backends.h +index 907e86b..0a2a22a 100644 +--- a/config/config-backends.h ++++ b/config/config-backends.h +@@ -26,8 +26,18 @@ + #ifdef HAVE_DIX_CONFIG_H + #include <dix-config.h> + #endif ++#include "input.h" + +-#ifdef CONFIG_NEED_DBUS ++void remove_devices(const char *backend, const char *config_info); ++BOOL device_is_duplicate(const char *config_info); ++void add_option(InputOption **options, const char *key, const char *value); ++ ++#ifdef CONFIG_UDEV ++int config_udev_init(void); ++void config_udev_fini(void); ++#else ++ ++# ifdef CONFIG_NEED_DBUS + #include <dbus/dbus.h> + + typedef void (*config_dbus_core_connect_hook)(DBusConnection *connection, +@@ -46,14 +56,15 @@ int config_dbus_core_init(void); + void config_dbus_core_fini(void); + int config_dbus_core_add_hook(struct config_dbus_core_hook *hook); + void config_dbus_core_remove_hook(struct config_dbus_core_hook *hook); +-#endif ++# endif + +-#ifdef CONFIG_DBUS_API ++# ifdef CONFIG_DBUS_API + int config_dbus_init(void); + void config_dbus_fini(void); +-#endif ++# endif + +-#ifdef CONFIG_HAL ++# ifdef CONFIG_HAL + int config_hal_init(void); + void config_hal_fini(void); ++# endif + #endif +diff --git a/config/config.c b/config/config.c +index b013293..7bf5e41 100644 +--- a/config/config.c ++++ b/config/config.c +@@ -28,13 +28,17 @@ + #endif + + #include "os.h" ++#include "inputstr.h" + #include "hotplug.h" + #include "config-backends.h" + + void + config_init(void) + { +-#if defined(CONFIG_DBUS_API) || defined(CONFIG_HAL) ++#ifdef CONFIG_UDEV ++ if (!config_udev_init()) ++ ErrorF("[config] failed to initialise udev\n"); ++#elif defined(CONFIG_NEED_DBUS) + if (config_dbus_core_init()) { + # ifdef CONFIG_DBUS_API + if (!config_dbus_init()) +@@ -54,7 +58,9 @@ config_init(void) + void + config_fini(void) + { +-#if defined(CONFIG_DBUS_API) || defined(CONFIG_HAL) ++#if defined(CONFIG_UDEV) ++ config_udev_fini(); ++#elif defined(CONFIG_NEED_DBUS) + # ifdef CONFIG_HAL + config_hal_fini(); + # endif +@@ -64,3 +70,70 @@ config_fini(void) + config_dbus_core_fini(); + #endif + } ++ ++static void ++remove_device(const char *backend, DeviceIntPtr dev) ++{ ++ /* this only gets called for devices that have already been added */ ++ LogMessage(X_INFO, "config/%s: removing device %s\n", backend, dev->name); ++ ++ /* Call PIE here so we don't try to dereference a device that's ++ * already been removed. */ ++ OsBlockSignals(); ++ ProcessInputEvents(); ++ DeleteInputDeviceRequest(dev); ++ OsReleaseSignals(); ++} ++ ++void ++remove_devices(const char *backend, const char *config_info) ++{ ++ DeviceIntPtr dev, next; ++ ++ for (dev = inputInfo.devices; dev; dev = next) { ++ next = dev->next; ++ if (dev->config_info && strcmp(dev->config_info, config_info) == 0) ++ remove_device(backend, dev); ++ } ++ for (dev = inputInfo.off_devices; dev; dev = next) { ++ next = dev->next; ++ if (dev->config_info && strcmp(dev->config_info, config_info) == 0) ++ remove_device(backend, dev); ++ } ++} ++ ++BOOL ++device_is_duplicate(const char *config_info) ++{ ++ DeviceIntPtr dev; ++ ++ for (dev = inputInfo.devices; dev; dev = dev->next) ++ { ++ if (dev->config_info && (strcmp(dev->config_info, config_info) == 0)) ++ return TRUE; ++ } ++ ++ for (dev = inputInfo.off_devices; dev; dev = dev->next) ++ { ++ if (dev->config_info && (strcmp(dev->config_info, config_info) == 0)) ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++void ++add_option(InputOption **options, const char *key, const char *value) ++{ ++ if (!value || *value == '\0') ++ return; ++ ++ for (; *options; options = &(*options)->next) ++ ; ++ *options = xcalloc(sizeof(**options), 1); ++ if (!*options) /* Yeesh. */ ++ return; ++ (*options)->key = xstrdup(key); ++ (*options)->value = xstrdup(value); ++ (*options)->next = NULL; ++} +diff --git a/config/hal.c b/config/hal.c +index 28f55a0..22af10f 100644 +--- a/config/hal.c ++++ b/config/hal.c +@@ -58,25 +58,9 @@ struct xkb_options { + char* options; + }; + +- +-static void +-remove_device(DeviceIntPtr dev) +-{ +- /* this only gets called for devices that have already been added */ +- LogMessage(X_INFO, "config/hal: removing device %s\n", dev->name); +- +- /* Call PIE here so we don't try to dereference a device that's +- * already been removed. */ +- OsBlockSignals(); +- ProcessInputEvents(); +- DeleteInputDeviceRequest(dev); +- OsReleaseSignals(); +-} +- + static void + device_removed(LibHalContext *ctx, const char *udi) + { +- DeviceIntPtr dev, next; + char *value; + + value = xalloc(strlen(udi) + 5); /* "hal:" + NULL */ +@@ -84,36 +68,11 @@ device_removed(LibHalContext *ctx, const char *udi) + return; + sprintf(value, "hal:%s", udi); + +- for (dev = inputInfo.devices; dev; dev = next) { +- next = dev->next; +- if (dev->config_info && strcmp(dev->config_info, value) == 0) +- remove_device(dev); +- } +- for (dev = inputInfo.off_devices; dev; dev = next) { +- next = dev->next; +- if (dev->config_info && strcmp(dev->config_info, value) == 0) +- remove_device(dev); +- } ++ remove_devices("hal", value); + + xfree(value); + } + +-static void +-add_option(InputOption **options, const char *key, const char *value) +-{ +- if (!value || *value == '\0') +- return; +- +- for (; *options; options = &(*options)->next) +- ; +- *options = xcalloc(sizeof(**options), 1); +- if (!*options) /* Yeesh. */ +- return; +- (*options)->key = xstrdup(key); +- (*options)->value = xstrdup(value); +- (*options)->next = NULL; +-} +- + static char * + get_prop_string(LibHalContext *hal_ctx, const char *udi, const char *name) + { +@@ -166,26 +125,6 @@ get_prop_string_array(LibHalContext *hal_ctx, const char *udi, const char *prop) + return ret; + } + +-static BOOL +-device_is_duplicate(char *config_info) +-{ +- DeviceIntPtr dev; +- +- for (dev = inputInfo.devices; dev; dev = dev->next) +- { +- if (dev->config_info && (strcmp(dev->config_info, config_info) == 0)) +- return TRUE; +- } +- +- for (dev = inputInfo.off_devices; dev; dev = dev->next) +- { +- if (dev->config_info && (strcmp(dev->config_info, config_info) == 0)) +- return TRUE; +- } +- +- return FALSE; +-} +- + static void + device_added(LibHalContext *hal_ctx, const char *udi) + { +diff --git a/config/udev.c b/config/udev.c +new file mode 100644 +index 0000000..62b9052 +--- /dev/null ++++ b/config/udev.c +@@ -0,0 +1,247 @@ ++/* ++ * Copyright © 2009 Julien Cristau ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Author: Julien Cristau <[email protected]> ++ */ ++ ++#ifdef HAVE_DIX_CONFIG_H ++#include <dix-config.h> ++#endif ++ ++#include <libudev.h> ++ ++#include "input.h" ++#include "inputstr.h" ++#include "hotplug.h" ++#include "config-backends.h" ++#include "os.h" ++ ++#define UDEV_XKB_PROP_KEY "xkb." ++#define UDEV_PROP_KEY "x11_options." ++ ++static struct udev_monitor *udev_monitor; ++ ++static void ++device_added(struct udev_device *udev_device) ++{ ++ const char *path = NULL, *driver = NULL, *name = NULL; ++ char *config_info = NULL; ++ const char *syspath; ++ const char *key, *value, *tmp; ++ InputOption *options = NULL, *tmpo; ++ DeviceIntPtr dev = NULL; ++ struct udev_list_entry *set, *entry; ++ struct udev_device *parent; ++ int rc; ++ ++ driver = udev_device_get_property_value(udev_device, "x11_driver"); ++ ++ path = udev_device_get_devnode(udev_device); ++ ++ syspath = udev_device_get_syspath(udev_device); ++ ++ parent = udev_device_get_parent(udev_device); ++ if (parent) ++ name = udev_device_get_property_value(parent, "NAME"); ++ else ++ name = "(unnamed)"; ++ ++ if (!driver || !path || !syspath) ++ return; ++ options = xcalloc(sizeof(*options), 1); ++ if (!options) ++ return; ++ ++ options->key = xstrdup("_source"); ++ options->value = xstrdup("server/udev"); ++ if (!options->key || !options->value) ++ goto unwind; ++ ++ add_option(&options, "path", path); ++ add_option(&options, "device", path); ++ add_option(&options, "driver", driver); ++ ++ config_info = Xprintf("udev:%s", syspath); ++ if (!config_info) ++ goto unwind; ++ ++ if (device_is_duplicate(config_info)) { ++ LogMessage(X_WARNING, "config/udev: device %s already added. " ++ "Ignoring.\n", name); ++ goto unwind; ++ } ++ ++ set = udev_device_get_properties_list_entry(udev_device); ++ udev_list_entry_foreach(entry, set) { ++ key = udev_list_entry_get_name(entry); ++ if (!key) ++ continue; ++ if (!strncasecmp(key, UDEV_PROP_KEY, sizeof(UDEV_PROP_KEY) - 1)) { ++ value = udev_list_entry_get_value(entry); ++ add_option(&options, key + sizeof(UDEV_PROP_KEY) - 1, value); ++ } else if (!strncasecmp(key, UDEV_XKB_PROP_KEY, ++ sizeof(UDEV_XKB_PROP_KEY) - 1)) { ++ tmp = key + sizeof(UDEV_XKB_PROP_KEY) - 1; ++ value = udev_list_entry_get_value(entry); ++ if (!strcasecmp(tmp, "rules")) ++ add_option(&options, "xkb_rules", value); ++ else if (!strcasecmp(tmp, "layout")) ++ add_option(&options, "xkb_layout", value); ++ else if (!strcasecmp(tmp, "variant")) ++ add_option(&options, "xkb_variant", value); ++ else if (!strcasecmp(tmp, "model")) ++ add_option(&options, "xkb_model", value); ++ else if (!strcasecmp(tmp, "options")) ++ add_option(&options, "xkb_options", value); ++ } ++ } ++ add_option(&options, "name", name); ++ LogMessage(X_INFO, "config/udev: Adding input device %s (%s)\n", ++ name, path); ++ rc = NewInputDeviceRequest(options, &dev); ++ if (rc != Success) ++ goto unwind; ++ ++ for (; dev; dev = dev->next) { ++ xfree(dev->config_info); ++ dev->config_info = xstrdup(config_info); ++ } ++ ++ unwind: ++ xfree(config_info); ++ while (!dev && (tmpo = options)) { ++ options = tmpo->next; ++ xfree(tmpo->key); ++ xfree(tmpo->value); ++ xfree(tmpo); ++ } ++ ++ return; ++} ++ ++static void ++device_removed(struct udev_device *device) ++{ ++ char *value; ++ const char *syspath = udev_device_get_syspath(device); ++ ++ value = Xprintf("udev:%s", syspath); ++ if (!value) ++ return; ++ ++ remove_devices("udev", value); ++ ++ xfree(value); ++} ++ ++static void ++wakeup_handler(pointer data, int err, pointer read_mask) ++{ ++ int udev_fd = udev_monitor_get_fd(udev_monitor); ++ struct udev_device *udev_device; ++ const char *action; ++ ++ if (err < 0) ++ return; ++ ++ if (FD_ISSET(udev_fd, (fd_set *)read_mask)) { ++ udev_device = udev_monitor_receive_device(udev_monitor); ++ if (!udev_device) ++ return; ++ action = udev_device_get_action(udev_device); ++ if (!action) ++ ; ++ else if (!strcmp(action, "add")) ++ device_added(udev_device); ++ else if (!strcmp(action, "remove")) ++ device_removed(udev_device); ++ else ++ DebugF("config/udev: unhandled action %s\n", action); ++ udev_device_unref(udev_device); ++ } ++} ++ ++static void ++block_handler(pointer data, struct timeval **tv, pointer read_mask) ++{ ++} ++ ++int ++config_udev_init(void) ++{ ++ struct udev *udev; ++ struct udev_enumerate *enumerate; ++ struct udev_list_entry *devices, *device; ++ int rc; ++ ++ udev = udev_new(); ++ if (!udev) ++ return 0; ++ udev_monitor = udev_monitor_new_from_netlink(udev, "udev"); ++ if (!udev_monitor) ++ return 0; ++ rc = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, ++ "input", NULL); ++ if (rc < 0) ++ return 0; ++ ++ if (udev_monitor_enable_receiving(udev_monitor)) { ++ ErrorF("config/udev: failed to bind the udev monitor\n"); ++ return 0; ++ } ++ ++ enumerate = udev_enumerate_new(udev); ++ if (!enumerate) ++ return 0; ++ udev_enumerate_add_match_subsystem(enumerate, "input"); ++ udev_enumerate_scan_devices(enumerate); ++ devices = udev_enumerate_get_list_entry(enumerate); ++ udev_list_entry_foreach(device, devices) { ++ const char *syspath = udev_list_entry_get_name(device); ++ struct udev_device *udev_device = udev_device_new_from_syspath(udev, syspath); ++ device_added(udev_device); ++ udev_device_unref(udev_device); ++ } ++ udev_enumerate_unref(enumerate); ++ ++ RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, NULL); ++ AddGeneralSocket(udev_monitor_get_fd(udev_monitor)); ++ ++ return 1; ++} ++ ++void ++config_udev_fini(void) ++{ ++ struct udev *udev; ++ ++ if (!udev_monitor) ++ return; ++ ++ udev = udev_monitor_get_udev(udev_monitor); ++ ++ RemoveGeneralSocket(udev_monitor_get_fd(udev_monitor)); ++ RemoveBlockAndWakeupHandlers(block_handler, wakeup_handler, udev_monitor); ++ udev_monitor_unref(udev_monitor); ++ udev_monitor = NULL; ++ udev_unref(udev); ++} +diff --git a/configure.ac b/configure.ac +index ed710f0..c7fb3d0 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -597,6 +597,7 @@ AC_ARG_ENABLE(multibuffer, AS_HELP_STRING([--enable-multibuffer], [Build Mult + AC_ARG_ENABLE(dbe, AS_HELP_STRING([--disable-dbe], [Build DBE extension (default: enabled)]), [DBE=$enableval], [DBE=yes]) + AC_ARG_ENABLE(xf86bigfont, AS_HELP_STRING([--disable-xf86bigfont], [Build XF86 Big Font extension (default: disabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=no]) + AC_ARG_ENABLE(dpms, AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes]) ++AC_ARG_ENABLE(config-udev, AS_HELP_STRING([--enable-config-udev], [Build udev support (default: auto)]), [CONFIG_UDEV=$enableval], [CONFIG_UDEV=auto]) + AC_ARG_ENABLE(config-dbus, AS_HELP_STRING([--enable-config-dbus], [Build D-BUS API support (default: no)]), [CONFIG_DBUS_API=$enableval], [CONFIG_DBUS_API=no]) + AC_ARG_ENABLE(config-hal, AS_HELP_STRING([--disable-config-hal], [Build HAL support (default: auto)]), [CONFIG_HAL=$enableval], [CONFIG_HAL=auto]) + AC_ARG_ENABLE(xfree86-utils, AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes]) +@@ -755,6 +756,26 @@ LIBXI="xi >= 1.2.99.1" + LIBXTST="xtst >= 1.0.99.2" + LIBPCIACCESS="pciaccess >= 0.8.0" + LIBGLIB="glib-2.0 >= 2.16" ++LIBUDEV="libudev >= 143" ++ -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

