ee34652
diff -up xf86-video-intel-2.12.0/src/i830_driver.c.uevent xf86-video-intel-2.12.0/src/i830_driver.c
ee34652
--- xf86-video-intel-2.12.0/src/i830_driver.c.uevent	2010-06-24 16:29:49.000000000 -0400
ee34652
+++ xf86-video-intel-2.12.0/src/i830_driver.c	2010-06-25 11:40:01.335975581 -0400
ee34652
@@ -81,6 +81,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
5d2542f
 #include "i915_drm.h"
5d2542f
 #include <xf86drmMode.h>
5d2542f
 
5d2542f
+#include "libudev.h"
5d2542f
+
5d2542f
 #define BIT(x) (1 << (x))
5d2542f
 #define MAX(a,b) ((a) > (b) ? (a) : (b))
5d2542f
 #define NB_OF(x) (sizeof (x) / sizeof (*x))
ee34652
@@ -996,6 +998,80 @@ int i830_crtc_to_pipe(xf86CrtcPtr crtc)
1afff88
 	return drmmode_get_pipe_from_crtc_id(intel->bufmgr, crtc);
5d2542f
 }
5d2542f
 
5d2542f
+static void
5d2542f
+I830HandleUEvents(int fd, void *closure)
5d2542f
+{
1afff88
+    ScrnInfoPtr scrn = closure;
1afff88
+	intel_screen_private *intel = intel_get_screen_private(scrn);
5d2542f
+    struct udev_device *dev;
5d2542f
+
1afff88
+    dev = udev_monitor_receive_device(intel->uevent_monitor);
5d2542f
+    if (!dev)
5d2542f
+	return;
5d2542f
+
5d2542f
+    /*
5d2542f
+     * technically we should inspect the event to see that it's a hotplug.
5d2542f
+     * but we know it's a hotplug, we don't get events for anything else.
5d2542f
+     * XXX but we should definitely trim by drm node
5d2542f
+     */
5d2542f
+
1afff88
+    RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE);
5d2542f
+
5d2542f
+    udev_device_unref(dev);
5d2542f
+}
5d2542f
+
5d2542f
+static void
1afff88
+I830UeventInit(ScrnInfoPtr scrn)
5d2542f
+{
1afff88
+	intel_screen_private *intel = intel_get_screen_private(scrn);
5d2542f
+    struct udev *u;
5d2542f
+    struct udev_monitor *mon;
5d2542f
+
5d2542f
+    u = udev_new();
5d2542f
+    if (!u)
5d2542f
+	return;
5d2542f
+
5d2542f
+    mon = udev_monitor_new_from_netlink(u, "udev");
5d2542f
+
5d2542f
+    if (!mon) {
5d2542f
+	udev_unref(u);
5d2542f
+	return;
5d2542f
+    }
5d2542f
+
5d2542f
+    if (udev_monitor_filter_add_match_subsystem_devtype(mon,
5d2542f
+							"drm",
5d2542f
+							"drm_minor") < 0 ||
5d2542f
+	udev_monitor_enable_receiving(mon) < 0)
5d2542f
+    {
5d2542f
+	udev_monitor_unref(mon);
5d2542f
+	udev_unref(u);
5d2542f
+	return;
5d2542f
+    }
5d2542f
+
1afff88
+    intel->uevent_handler =
5d2542f
+	xf86AddGeneralHandler(udev_monitor_get_fd(mon),
5d2542f
+			      I830HandleUEvents,
1afff88
+			      scrn);
5d2542f
+
1afff88
+    intel->uevent_monitor = mon;
5d2542f
+}
5d2542f
+
5d2542f
+static void
1afff88
+I830UeventFini(ScrnInfoPtr scrn)
5d2542f
+{
1afff88
+	intel_screen_private *intel = intel_get_screen_private(scrn);
5d2542f
+
1afff88
+    if (intel->uevent_handler)
5d2542f
+    {
1afff88
+	struct udev *u = udev_monitor_get_udev(intel->uevent_monitor);
5d2542f
+
1afff88
+	xf86RemoveGeneralHandler(intel->uevent_handler);
5d2542f
+
1afff88
+	udev_monitor_unref(intel->uevent_monitor);
5d2542f
+	udev_unref(u);
5d2542f
+    }
5d2542f
+}
5d2542f
+
5d2542f
 static Bool
1afff88
 I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
5d2542f
 {
ee34652
@@ -1233,6 +1309,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr 
5d2542f
 
1afff88
 	intel->suspended = FALSE;
1afff88
 
1afff88
+	I830UeventInit(scrn);
5d2542f
+
ee34652
 	return uxa_resources_init(screen);
5d2542f
 }
5d2542f
 
ee34652
@@ -1306,7 +1384,8 @@ static Bool I830CloseScreen(int scrnInde
1afff88
 {
1afff88
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
1afff88
 	intel_screen_private *intel = intel_get_screen_private(scrn);
1afff88
-
1afff88
+ 
1afff88
+	I830UeventFini(scrn);
1afff88
 	if (scrn->vtSema == TRUE) {
1afff88
 		I830LeaveVT(scrnIndex, 0);
1afff88
 	}
ee34652
diff -up xf86-video-intel-2.12.0/src/i830.h.uevent xf86-video-intel-2.12.0/src/i830.h
ee34652
--- xf86-video-intel-2.12.0/src/i830.h.uevent	2010-06-24 16:29:49.000000000 -0400
ee34652
+++ xf86-video-intel-2.12.0/src/i830.h	2010-06-25 11:39:15.665029821 -0400
5d2542f
@@ -47,6 +47,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
5d2542f
 #ifndef _I830_H_
5d2542f
 #define _I830_H_
5d2542f
 
5d2542f
+#include "libudev.h"
5d2542f
+
5d2542f
 #include "xf86_OSproc.h"
5d2542f
 #include "compiler.h"
5d2542f
 #include "xf86PciInfo.h"
ee34652
@@ -432,6 +434,9 @@ typedef struct intel_screen_private {
1afff88
 	 */
1afff88
 	Bool fallback_debug;
1afff88
 	unsigned debug_flush;
1afff88
+
1afff88
+	struct udev_monitor *uevent_monitor;
1afff88
+	InputHandlerProc uevent_handler;
1afff88
 } intel_screen_private;
5d2542f
 
1afff88
 enum {
ee34652
diff -up xf86-video-intel-2.12.0/src/Makefile.am.uevent xf86-video-intel-2.12.0/src/Makefile.am
ee34652
--- xf86-video-intel-2.12.0/src/Makefile.am.uevent	2010-06-24 16:29:37.000000000 -0400
ee34652
+++ xf86-video-intel-2.12.0/src/Makefile.am	2010-06-25 11:39:15.665029821 -0400
1afff88
@@ -32,7 +32,7 @@ AM_CFLAGS = @CWARNFLAGS@ @XORG_CFLAGS@ @
5d2542f
 intel_drv_la_LTLIBRARIES = intel_drv.la
5d2542f
 intel_drv_la_LDFLAGS = -module -avoid-version
5d2542f
 intel_drv_ladir = @moduledir@/drivers
5d2542f
-intel_drv_la_LIBADD = -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la
5d2542f
+intel_drv_la_LIBADD = -ludev -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la
5d2542f
 intel_drv_la_LIBADD += @PCIACCESS_LIBS@
5d2542f
 
5d2542f
 INTEL_DRI_SRCS = \