xserver: Branch 'xorg-server-1.6-apple' - 30 commits

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Wed Dec 10 15:08:48 PST 2008


 Xi/exevents.c                         |    2 
 Xi/xiproperty.c                       |    2 
 configure.ac                          |   34 ++++
 dix/getevents.c                       |    6 
 glx/Makefile.am                       |    4 
 hw/dmx/input/dmxinputinit.c           |    2 
 hw/xfree86/common/xf86Config.c        |    5 
 hw/xfree86/common/xf86InPriv.h        |    2 
 hw/xfree86/common/xf86Init.c          |    8 -
 hw/xfree86/common/xf86Xinput.c        |   29 +++-
 hw/xfree86/common/xf86Xinput.h        |    4 
 hw/xfree86/doc/man/xorg.conf.man.pre  |    2 
 hw/xfree86/modes/xf86Crtc.c           |   38 ++++-
 hw/xfree86/modes/xf86Crtc.h           |   36 +++++
 hw/xfree86/modes/xf86RandR12.c        |  233 ++++++++++++++++++++++++++++++++++
 hw/xfree86/modes/xf86Rotate.c         |    2 
 hw/xquartz/Makefile.am                |    3 
 hw/xquartz/X11Application.m           |    2 
 hw/xquartz/X11Controller.m            |  122 +++++++++--------
 hw/xquartz/bundle/Info.plist          |   39 -----
 hw/xquartz/bundle/Info.plist.cpp      |   39 +++++
 hw/xquartz/bundle/Makefile.am         |   16 ++
 hw/xquartz/bundle/X11.sh              |    3 
 hw/xquartz/bundle/cpprules.in         |   37 +++++
 hw/xquartz/bundle/mk_bundke.sh        |    3 
 hw/xquartz/mach-startup/bundle-main.c |  111 +++++++++++-----
 hw/xquartz/xpr/xprScreen.c            |    4 
 include/exevents.h                    |    2 
 randr/randrstr.h                      |   19 ++
 randr/rrcrtc.c                        |  158 ++++++++++++++++++++++-
 randr/rrdispatch.c                    |    2 
 randr/rrsdispatch.c                   |   68 ++++++++-
 xkb/ddxCtrls.c                        |   20 --
 33 files changed, 861 insertions(+), 196 deletions(-)

New commits:
commit 5926b213b39a90601c73f026dc0699723f5ed10d
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Dec 10 01:56:01 2008 -0800

    XQuartz: Fix path to executable
    (cherry picked from commit 7e9d3698e070a0c63dd2556651373c3aca58e2fe)

diff --git a/hw/xquartz/bundle/X11.sh b/hw/xquartz/bundle/X11.sh
index 5e00a82..2f953d1 100755
--- a/hw/xquartz/bundle/X11.sh
+++ b/hw/xquartz/bundle/X11.sh
@@ -1,3 +1,3 @@
 #!/bin/bash --login
 
-./X11 "${@}"
+"$(dirname $0)"/X11 "${@}"
commit 13eff12902be1b25d0ccc2089e08305f88949f32
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Dec 10 00:00:29 2008 -0800

    XQuartz: fixed make dist
    (cherry picked from commit 2d52367ab92429e58596d1a1ed3ef52a0a38a7aa)

diff --git a/hw/xquartz/bundle/Info.plist.cpp b/hw/xquartz/bundle/Info.plist.cpp
index 16434f2..9713289 100644
--- a/hw/xquartz/bundle/Info.plist.cpp
+++ b/hw/xquartz/bundle/Info.plist.cpp
@@ -5,7 +5,7 @@
 	<key>CFBundleDevelopmentRegion</key>
 		<string>English</string>
 	<key>CFBundleExecutable</key>
-		<string>X11</string>
+		<string>X11.sh</string>
 	<key>CFBundleGetInfoString</key>
 		<string>APPLE_APPLICATION_NAME</string>
 	<key>CFBundleIconFile</key>
diff --git a/hw/xquartz/bundle/Makefile.am b/hw/xquartz/bundle/Makefile.am
index e765d6e..03fa1dd 100644
--- a/hw/xquartz/bundle/Makefile.am
+++ b/hw/xquartz/bundle/Makefile.am
@@ -17,6 +17,7 @@ resource_DATA = Xquartz.plist
 
 EXTRA_DIST = \
 	mk_bundke.sh \
+	X11.sh \
 	Info.plist.cpp \
 	PkgInfo \
 	$(resource_DATA) \
commit 1962af7ee3bdf54cfa674187dea67b9ad36cd5a1
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Dec 9 23:48:18 2008 -0800

    XQuartz: Make debugging output for invalid depths a bit more detailed
    (cherry picked from commit 609fb166b7062c76f0561df12ffe893811f6ac8f)

diff --git a/hw/xquartz/xpr/xprScreen.c b/hw/xquartz/xpr/xprScreen.c
index 18406b8..b813727 100644
--- a/hw/xquartz/xpr/xprScreen.c
+++ b/hw/xquartz/xpr/xprScreen.c
@@ -279,7 +279,7 @@ xprAddScreen(int index, ScreenPtr pScreen)
     
     switch(depth) {
         case -8: // broken
-            FatalError("Unsupported color depth %d\n", darwinDesiredDepth);
+            FatalError("Unsupported color depth %d %d\n", darwinDesiredDepth, depth);
             dfb->visuals = (1 << StaticGray) | (1 << GrayScale);
             dfb->preferredCVC = GrayScale;
             dfb->depth = 8;
@@ -320,7 +320,7 @@ xprAddScreen(int index, ScreenPtr pScreen)
             dfb->blueMask  = 0x000000ff;
             break;
         default:
-            FatalError("Unsupported color depth %d\n", darwinDesiredDepth);
+            FatalError("Unsupported color depth %d %d\n", darwinDesiredDepth, depth);
     }
 
     if (noPseudoramiXExtension)
commit fdf64256127b2661bd6aa81ac694350028d36c43
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Dec 9 23:47:32 2008 -0800

    XQuartz: Avoid using login /bin/sh blech.  Just use a bash script to start the app, so it will inherit the right environment
    (cherry picked from commit f4b7ad9cc6b0c99fc7ee8516c4bf858ece938148)

diff --git a/hw/xquartz/X11Controller.m b/hw/xquartz/X11Controller.m
index 67a80d3..7222f46 100644
--- a/hw/xquartz/X11Controller.m
+++ b/hw/xquartz/X11Controller.m
@@ -314,65 +314,79 @@ BOOL xquartz_resetenv_display = NO;
 
 - (void) launch_client:(NSString *)filename
 {
-  const char *command = [filename UTF8String];
-  const char *argv[7];
-  int child1, child2 = 0;
-  int status;
-	
-  argv[0] = "/usr/bin/login";
-  argv[1] = "-fp";
-  argv[2] = getlogin();
-  argv[3] = [X11App prefs_get_string:@PREFS_LOGIN_SHELL default:"/bin/sh"];
-  argv[4] = "-c";
-  argv[5] = command;
-  argv[6] = NULL;
-
-  /* Do the fork-twice trick to avoid having to reap zombies */
+    const char *command = [filename UTF8String];
+    int child1, child2 = 0;
+    int status;
+    char newcommand[1024];
+    char *newargv[1024];
+    char buf[128];
+    size_t newargc;
+    char *s;
     
-  child1 = fork();
+    if(strlen(command) > 1023) {
+        fprintf(stderr, "Error: command is too long: %s\n", command);
+        return;
+    }
+    
+    strlcpy(newcommand, command, 1024);
     
-  switch (child1) {
-  case -1:                                /* error */
-    break;
+    for(newargc=0, s=newcommand; *s; newargc++) {
+        for(; *s && *s == ' '; s++);
+        if(!*s)
+            break;
+        
+        newargv[newargc] = s;
+        for(; *s && *s != ' '; s++);
+        
+        if(*s) {
+            *s='\0';
+            s++;
+        }
+    }
+    newargv[newargc] = NULL;
+    
+    s = getenv("DISPLAY");
+    if (xquartz_resetenv_display || s == NULL || s[0] == 0) {
+        snprintf(buf, sizeof(buf), ":%s", display);
+        setenv("DISPLAY", buf, TRUE);
+    }
+
+    /* Do the fork-twice trick to avoid having to reap zombies */
+    child1 = fork();
+    switch (child1) {
+        case -1:                                /* error */
+            break;
       
-  case 0:                                 /* child1 */
-    child2 = fork();
+        case 0:                                 /* child1 */
+            child2 = fork();
       
-    switch (child2) {
-      int max_files, i;
-      char buf[1024], *temp;
-	
-    case -1:                            /* error */
-      _exit(1);
-	
-    case 0:                             /* child2 */
-      /* close all open files except for standard streams */
-      max_files = sysconf(_SC_OPEN_MAX);
-      for (i = 3; i < max_files; i++)	close(i);
-	
-      /* ensure stdin is on /dev/null */
-      close(0);
-      open("/dev/null", O_RDONLY);
-	
-      /* Setup environment */
-      temp = getenv("DISPLAY");
-      if (xquartz_resetenv_display || temp == NULL || temp[0] == 0) {
-    snprintf(buf, sizeof(buf), ":%s", display);
-	setenv("DISPLAY", buf, TRUE);
-      }
-
-      execvp(argv[0], (char **const) argv);
-	
-      _exit(2);
-	
-    default:                            /* parent (child1) */
-      _exit(0);
-    }
-    break;
+            switch (child2) {
+                int max_files, i;
+	
+                case -1:                            /* error */
+                    _exit(1);
+	 
+                case 0:                             /* child2 */
+                /* close all open files except for standard streams */
+                max_files = sysconf(_SC_OPEN_MAX);
+                for(i = 3; i < max_files; i++)
+                    close(i);
+	
+                /* ensure stdin is on /dev/null */
+                close(0);
+                open("/dev/null", O_RDONLY);
+	
+                execvp(newargv[0], (char **const) newargv);
+                _exit(2);
+	
+                default:                            /* parent (child1) */
+                _exit(0);
+            }
+            break;
       
-  default:                                /* parent */
-    waitpid(child1, &status, 0);
-  }
+        default:                                /* parent */
+            waitpid(child1, &status, 0);
+    }
 }
 
 - (void) app_selected:sender
diff --git a/hw/xquartz/bundle/X11.sh b/hw/xquartz/bundle/X11.sh
new file mode 100755
index 0000000..5e00a82
--- /dev/null
+++ b/hw/xquartz/bundle/X11.sh
@@ -0,0 +1,3 @@
+#!/bin/bash --login
+
+./X11 "${@}"
diff --git a/hw/xquartz/bundle/mk_bundke.sh b/hw/xquartz/bundle/mk_bundke.sh
index 0b2a144..5c5733a 100755
--- a/hw/xquartz/bundle/mk_bundke.sh
+++ b/hw/xquartz/bundle/mk_bundke.sh
@@ -20,6 +20,9 @@ install -m 644 Resources/X11.icns ${BUNDLE_ROOT}/Contents/Resources
 install -m 644 Info.plist ${BUNDLE_ROOT}/Contents
 install -m 644 PkgInfo ${BUNDLE_ROOT}/Contents
 
+mkdir -p ${BUNDLE_ROOT}/Contents/MacOS
+install -m 755 X11.sh ${BUNDLE_ROOT}/Contents/MacOS
+
 if [[ $(id -u) == 0 ]] ; then
 	chown -R root:admin ${BUNDLE_ROOT}
 fi
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 6b48c13..7677a9a 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -529,22 +529,39 @@ int main(int argc, char **argv, char **envp) {
     
     return EXIT_SUCCESS;
 }
-    
-static int execute(const char *command) {
-    const char *newargv[7];
-    const char **s;
 
-    newargv[0] = "/usr/bin/login";
-    newargv[1] = "-fp";
-    newargv[2] = getlogin();
-    newargv[3] = command_from_prefs("login_shell", DEFAULT_SHELL);
-    newargv[4] = "-c";
-    newargv[5] = command;
-    newargv[6] = NULL;
+static int execute(const char *command) {
+    char newcommand[1024];
+    char *newargv[1024];
+    size_t newargc;
+    char *s;
+    char **p;
+    
+    if(strlen(command) > 1023) {
+        fprintf(stderr, "Error: command is too long: %s\n", command);
+        return 1;
+    }
+    
+    strlcpy(newcommand, command, 1024);
+    
+    for(newargc=0, s=newcommand; *s; newargc++) {
+        for(; *s && *s == ' '; s++);
+        if(!*s)
+            break;
+        
+        newargv[newargc] = s;
+        for(; *s && *s != ' '; s++);
+        
+        if(*s) {
+            *s='\0';
+            s++;
+        }
+    }
+    newargv[newargc] = NULL;
     
     fprintf(stderr, "X11.app: Launching %s:\n", command);
-    for(s=newargv; *s; s++) {
-        fprintf(stderr, "\targv[%ld] = %s\n", (long int)(s - newargv), *s);
+    for(p=newargv; *p; p++) {
+        fprintf(stderr, "\targv[%ld] = %s\n", (long int)(p - newargv), *p);
     }
 
     execvp (newargv[0], (char * const *) newargv);
commit 9cbed0a325175e7ddb751db54fe6c0f5a5cedd16
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Mon Dec 8 21:59:49 2008 -0800

    XQuartz: unset DISPLAY if we didn't get a launchd socket handoff
    (cherry picked from commit b959727f38733009c6381cc8ca06b5984257bdac)

diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 8b6d458..6b48c13 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -278,8 +278,12 @@ static int create_socket(char *filename_out) {
     return 0;
 }
 
+static int launchd_socket_handed_off = 0;
+
 kern_return_t do_request_fd_handoff_socket(mach_port_t port, string_t filename) {
     socket_handoff_t *handoff_data;
+    
+    launchd_socket_handed_off = 1;
 
     handoff_data = (socket_handoff_t *)calloc(1,sizeof(socket_handoff_t));
     if(!handoff_data) {
@@ -318,6 +322,12 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
     char **_envp = alloca((envpCnt + 1) * sizeof(char *));
     size_t i;
     
+    /* If we didn't get handed a launchd DISPLAY socket, we shoul
+     * unset DISPLAY or we can run into problems with pbproxy
+     */
+    if(!launchd_socket_handed_off)
+        unsetenv("DISPLAY");
+    
     if(!_argv || !_envp) {
         return KERN_FAILURE;
     }
commit 99b2cbf061a9d074e66e6220dc08f8b4624ea6bb
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Mon Dec 8 21:00:11 2008 -0800

    XQuartz: unsetenv(DISPLAY) if we're not org.x.X11
    Also some prefix related fixes.
    (cherry picked from commit fd459e96581a883e30323c840b71004aa0747169)

diff --git a/configure.ac b/configure.ac
index 486dad8..efe347f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -63,6 +63,7 @@ AC_PROG_LEX
 AC_PROG_YACC
 AC_SYS_LARGEFILE
 XORG_PROG_RAWCPP
+AC_PATH_PROG(SED,sed)
 
 dnl Check for dtrace program (needed to build Xserver dtrace probes)
 dnl Also checks for <sys/sdt.h>, since some Linux distros have an 
@@ -485,6 +486,14 @@ AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir
 				[ APPLE_APPLICATIONS_DIR="${withval}" ],
 				[ APPLE_APPLICATIONS_DIR="/Applications/Utilities" ])
 AC_SUBST([APPLE_APPLICATIONS_DIR])
+AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name=NAME], [Name for the .app (default: X11)]),
+				[ APPLE_APPLICATION_NAME="${withval}" ],
+				[ APPLE_APPLICATION_NAME="X11" ])
+AC_SUBST([APPLE_APPLICATION_NAME])
+AC_ARG_WITH(apple-application-id,AS_HELP_STRING([--with-apple-application-id=VALUE], [CFBundleIdentification for the .app (default: org.x.X11)]),
+				[ APPLE_APPLICATION_ID="${withval}" ],
+				[ APPLE_APPLICATION_ID="org.x.X11" ])
+AC_SUBST([APPLE_APPLICATION_ID])
 AC_ARG_ENABLE(builddocs,      AS_HELP_STRING([--enable-builddocs], [Build docs (default: disabled)]),
                                 [BUILDDOCS=$enableval],
                                 [BUILDDOCS=no])
diff --git a/hw/xquartz/Makefile.am b/hw/xquartz/Makefile.am
index d1eb283..e5e2e9e 100644
--- a/hw/xquartz/Makefile.am
+++ b/hw/xquartz/Makefile.am
@@ -7,7 +7,8 @@ AM_CPPFLAGS = \
 	-DINXQUARTZ \
 	-DUSE_NEW_CLUT \
 	-DXFree86Server \
-	-I$(top_srcdir)/miext/rootless
+	-I$(top_srcdir)/miext/rootless \
+	-DX11LIBDIR=\"$(libdir)\"
 
 if GLX
 GL_DIR = GL
diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 21013d9..371b6d6 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -54,7 +54,7 @@
 // pbproxy/pbproxy.h
 extern BOOL xpbproxy_init (void);
 
-#define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist"
+#define DEFAULTS_FILE X11LIBDIR"/X11/xserver/Xquartz.plist"
 
 #ifndef XSERVER_VERSION
 #define XSERVER_VERSION "?"
diff --git a/hw/xquartz/bundle/Info.plist b/hw/xquartz/bundle/Info.plist
deleted file mode 100644
index f4a9287..0000000
--- a/hw/xquartz/bundle/Info.plist
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-		<string>English</string>
-	<key>CFBundleExecutable</key>
-		<string>X11</string>
-	<key>CFBundleGetInfoString</key>
-		<string>X11</string>
-	<key>CFBundleIconFile</key>
-		<string>X11.icns</string>
-	<key>CFBundleIdentifier</key>
-		<string>org.x.X11</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-		<string>6.0</string>
-	<key>CFBundleName</key>
-		<string>X11</string>
-	<key>CFBundlePackageType</key>
-		<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-		<string>2.3.2</string>
-	<key>CFBundleVersion</key>
-		<string>2.3.2</string>
-	<key>CFBundleSignature</key>
-		<string>x11a</string>
-	<key>CSResourcesFileMapped</key>
-		<true/>
-	<key>NSHumanReadableCopyright</key>
-		<string>Copyright © 2003-2008, Apple Inc.
-Copyright © 2003, XFree86 Project, Inc.
-Copyright © 2003-2008, X.org Foundation, Inc.
-</string>
-	<key>NSMainNibFile</key>
-		<string>main</string>
-	<key>NSPrincipalClass</key>
-		<string>X11Application</string>
-</dict>
-</plist>
diff --git a/hw/xquartz/bundle/Info.plist.cpp b/hw/xquartz/bundle/Info.plist.cpp
new file mode 100644
index 0000000..16434f2
--- /dev/null
+++ b/hw/xquartz/bundle/Info.plist.cpp
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+		<string>English</string>
+	<key>CFBundleExecutable</key>
+		<string>X11</string>
+	<key>CFBundleGetInfoString</key>
+		<string>APPLE_APPLICATION_NAME</string>
+	<key>CFBundleIconFile</key>
+		<string>X11.icns</string>
+	<key>CFBundleIdentifier</key>
+		<string>APPLE_APPLICATION_ID</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+		<string>6.0</string>
+	<key>CFBundleName</key>
+		<string>APPLE_APPLICATION_NAME</string>
+	<key>CFBundlePackageType</key>
+		<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+		<string>2.3.2</string>
+	<key>CFBundleVersion</key>
+		<string>2.3.2</string>
+	<key>CFBundleSignature</key>
+		<string>x11a</string>
+	<key>CSResourcesFileMapped</key>
+		<true/>
+	<key>NSHumanReadableCopyright</key>
+		<string>Copyright © 2003-2008, Apple Inc.
+Copyright © 2003, XFree86 Project, Inc.
+Copyright © 2003-2008, X.org Foundation, Inc.
+</string>
+	<key>NSMainNibFile</key>
+		<string>main</string>
+	<key>NSPrincipalClass</key>
+		<string>X11Application</string>
+</dict>
+</plist>
diff --git a/hw/xquartz/bundle/Makefile.am b/hw/xquartz/bundle/Makefile.am
index 7b76f84..e765d6e 100644
--- a/hw/xquartz/bundle/Makefile.am
+++ b/hw/xquartz/bundle/Makefile.am
@@ -1,12 +1,23 @@
+include cpprules.in
+
+CPP_FILES_FLAGS = \
+	-DAPPLE_APPLICATION_ID="$(APPLE_APPLICATION_ID)" \
+	-DAPPLE_APPLICATION_NAME="$(APPLE_APPLICATION_NAME)"
+
 install-data-hook:
-	./mk_bundke.sh $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/X11.app
+	./mk_bundke.sh $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app
+
+noinst_PRE = Info.plist.cpp
+noinst_DATA = $(noinst_PRE:plist.cpp=plist)
+
+CLEANFILES = $(noinst_DATA)
 
 resourcedir=$(libdir)/X11/xserver
 resource_DATA = Xquartz.plist
 
 EXTRA_DIST = \
 	mk_bundke.sh \
-	Info.plist \
+	Info.plist.cpp \
 	PkgInfo \
 	$(resource_DATA) \
 	Resources/da.lproj/InfoPlist.strings \
diff --git a/hw/xquartz/bundle/cpprules.in b/hw/xquartz/bundle/cpprules.in
new file mode 100644
index 0000000..f32eafc
--- /dev/null
+++ b/hw/xquartz/bundle/cpprules.in
@@ -0,0 +1,37 @@
+# Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
+# to cpp, because that trick does not work on all ANSI C preprocessors.
+# Delete line numbers from the cpp output (-P is not portable, I guess).
+# Allow XCOMM to be preceded by whitespace and provide a means of generating
+# output lines with trailing backslashes.
+# Allow XHASH to always be substituted, even in cases where XCOMM isn't.
+
+CPP_SED_MAGIC = $(SED) -e '/^\#  *[0-9][0-9]*  *.*$$/d' \
+                       -e '/^\#line  *[0-9][0-9]*  *.*$$/d' \
+                       -e '/^[ 	]*XCOMM$$/s/XCOMM/\#/' \
+                       -e '/^[ 	]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \
+                       -e '/^[ 	]*XHASH/s/XHASH/\#/' \
+                       -e '/XSLASHGLOB/s/XSLASHGLOB/\/\*/' \
+                       -e '/\@\@$$/s/\@\@$$/\\/'
+
+# Strings to replace in man pages
+XORGRELSTRING = @PACKAGE_STRING@
+  XORGMANNAME = X Version 11
+
+MANDEFS =  \
+	-D__xorgversion__="\"$(XORGRELSTRING)\" \"$(XORGMANNAME)\"" \
+	-D__appmansuffix__=$(APP_MAN_SUFFIX) \
+	-D__filemansuffix__=$(FILE_MAN_SUFFIX) \
+	-D__libmansuffix__=$(LIB_MAN_SUFFIX) \
+	-D__miscmansuffix__=$(MISC_MAN_SUFFIX) \
+	-D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \
+	-D__xinitdir__=$(XINITDIR) \
+	-D__bindir__=$(bindir) \
+	-DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS)
+
+SUFFIXES = .$(APP_MAN_SUFFIX) .man .cpp
+
+.cpp:
+	$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $< | $(CPP_SED_MAGIC) > $@
+
+.man.$(APP_MAN_SUFFIX):
+	$(RAWCPP) $(RAWCPPFLAGS) $(MANDEFS) $(EXTRAMANDEFS) < $< | $(CPP_SED_MAGIC) > $@
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 0e4ed34..8b6d458 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -59,8 +59,8 @@ extern int noPanoramiXExtension;
 
 extern int xquartz_resetenv_display;
 
-#define DEFAULT_CLIENT "/usr/X11/bin/xterm"
-#define DEFAULT_STARTX "/usr/X11/bin/startx"
+#define DEFAULT_CLIENT X11BINDIR "/xterm"
+#define DEFAULT_STARTX X11BINDIR "/startx"
 #define DEFAULT_SHELL  "/bin/sh"
 
 #ifndef BUILD_DATE
@@ -420,19 +420,49 @@ int startup_trigger(int argc, char **argv, char **envp) {
 }
 
 /** Setup the environment we want our child processes to inherit */
-static void setup_env() {
+static void ensure_path(const char *dir) {
     char buf[1024], *temp;
-
+    
     /* Make sure /usr/X11/bin is in the $PATH */
     temp = getenv("PATH");
     if(temp == NULL || temp[0] == 0) {
-        snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", X11BINDIR);
+        snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", dir);
         setenv("PATH", buf, TRUE);
     } else if(strnstr(temp, X11BINDIR, sizeof(temp)) == NULL) {
-        snprintf(buf, sizeof(buf), "%s:%s", temp, X11BINDIR);
+        snprintf(buf, sizeof(buf), "%s:%s", temp, dir);
         setenv("PATH", buf, TRUE);
     }
+}
+
+static void setup_env() {
+    char *temp;
+    const char *pds = NULL;
+
+    /* Pass on our prefs domain to startx and its inheritors (mainly for
+     * quartz-wm and the Xquartz stub's MachIPC)
+     */
+    CFBundleRef bundle = CFBundleGetMainBundle();
+    if(bundle) {
+        CFStringRef pd = CFBundleGetIdentifier(bundle);
+        if(pd) {
+            pds = CFStringGetCStringPtr(pd, 0);
+            if(pds) {
+                server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1));
+                strcpy(server_bootstrap_name, pds);
+                setenv("X11_PREFS_DOMAIN", pds, 1);
+            }
+        }
+    }
 
+    /* If we're not org.x.X11, we want to unset DISPLAY, so we don't
+     * use the launchd DISPLAY socket.
+     */
+    if(pds == NULL || strcmp(pds, "org.x.X11") != 0)
+        unsetenv("DISPLAY");
+
+    /* Make sure PATH is right */
+    ensure_path(X11BINDIR);
+    
     /* cd $HOME */
     temp = getenv("HOME");
     if(temp != NULL && temp[0] != '\0')
@@ -455,22 +485,6 @@ int main(int argc, char **argv, char **envp) {
 
     /* Setup the initial crasherporter info */
     strlcpy(__crashreporter_info__, __crashreporter_info__base, __crashreporter_info__len);
-
-    /* Pass on our prefs domain to startx and its inheritors (mainly for
-     * quartz-wm and the Xquartz stub's MachIPC)
-     */
-    CFBundleRef bundle = CFBundleGetMainBundle();
-    if(bundle) {
-        CFStringRef pd = CFBundleGetIdentifier(bundle);
-        if(pd) {
-            const char *pds = CFStringGetCStringPtr(pd, 0);
-            if(pds) {
-                server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1));
-                strcpy(server_bootstrap_name, pds);
-                setenv("X11_PREFS_DOMAIN", pds, 1);
-            }
-        }
-    }
     
     fprintf(stderr, "X11.app: main(): argc=%d\n", argc);
     for(i=0; i < argc; i++) {
commit e45877e05eb650ba0d6920133d084edf936f6580
Merge: 8065953... 523aae1...
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Dec 10 15:04:59 2008 -0800

    Merge commit 'origin/server-1.6-branch' into xorg-server-1.6-apple

commit 523aae1fa6d8002e55e85aee49f113b7eb9a6df3
Author: Keith Packard <keithp at keithp.com>
Date:   Tue Dec 9 22:10:56 2008 -0800

    Bump version to 1.5.99.3 (1.6 beta3)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index 81024e9..2bfa296 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,7 +26,7 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
-AC_INIT([xorg-server], 1.5.99.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+AC_INIT([xorg-server], 1.5.99.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2 foreign])
 AM_MAINTAINER_MODE
commit 4810226dfc52ef798b507d284030b4b3aec020a6
Author: Matthias Hopf <mhopf at suse.de>
Date:   Fri Dec 5 15:37:15 2008 +0100

    randr: Update SProcRandrVector for panning
    (cherry picked from commit 44bef8b850c5a78a3d3eca5f0d92b71bdd0a87e2)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index d356ab0..3ff9f3f 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -399,6 +399,43 @@ SProcRRGetCrtcTransform (ClientPtr client)
     return (*ProcRandrVector[stuff->randrReqType]) (client);
 }
 
+static int
+SProcRRGetPanning (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRGetPanningReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetPanningReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->crtc, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetPanning (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRSetPanningReq);
+    
+    REQUEST_SIZE_MATCH(xRRSetPanningReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->crtc, n);
+    swapl(&stuff->timestamp, n);
+    swaps(&stuff->left, n);
+    swaps(&stuff->top, n);
+    swaps(&stuff->width, n);
+    swaps(&stuff->height, n);
+    swaps(&stuff->track_left, n);
+    swaps(&stuff->track_top, n);
+    swaps(&stuff->track_width, n);
+    swaps(&stuff->track_height, n);
+    swaps(&stuff->border_left, n);
+    swaps(&stuff->border_top, n);
+    swaps(&stuff->border_right, n);
+    swaps(&stuff->border_bottom, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
 int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRQueryVersion,	/* 0 */
 /* we skip 1 to make old clients fail pretty immediately */
@@ -433,5 +470,7 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRGetScreenResources,	/* 25 GetScreenResourcesCurrent */
     SProcRRSetCrtcTransform,	/* 26 */
     SProcRRGetCrtcTransform,	/* 27 */
+    SProcRRGetPanning,		/* 28 */
+    SProcRRSetPanning,		/* 29 */
 };
 
commit 798a4878a4ffb03024e77ea6ddbd9b170b9c3fe4
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Dec 4 18:13:40 2008 +0100

    randr: Allow panning to be disabled per axis
    (cherry picked from commit e5ab9e66628cde081757cf2a1013a78e927a622e)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 879f4a2..362229c 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -182,8 +182,8 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
 	return;
 
     if (! crtc->enabled						||
-	crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1	||
-	crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1)
+	(crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1	&&
+	 crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1))
 	return;
 
     newX   = crtc->x;
@@ -191,26 +191,36 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
     width  = crtc->mode.HDisplay;
     height = crtc->mode.VDisplay;
 
-    if (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2 &&
-    	y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2) {
-	if (x < crtc->x + crtc->panningBorder[0])
-	    newX = x - crtc->panningBorder[0];
-	if (x >= crtc->x + width - crtc->panningBorder[2])
-	    newX = x - width + crtc->panningBorder[2] + 1;
-	if (y < crtc->y + crtc->panningBorder[1])
-	    newY = y - crtc->panningBorder[1];
-	if (y >= crtc->y + height - crtc->panningBorder[3])
-	    newY = y - height + crtc->panningBorder[3] + 1;
+    if ((crtc->panningTrackingArea.x2 <= crtc->panningTrackingArea.x1 ||
+	 (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2)) &&
+	(crtc->panningTrackingArea.y2 <= crtc->panningTrackingArea.y1 ||
+	 (y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2))) {
+	if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
+	    if (x < crtc->x + crtc->panningBorder[0])
+		newX = x - crtc->panningBorder[0];
+	    if (x >= crtc->x + width - crtc->panningBorder[2])
+		newX = x - width + crtc->panningBorder[2] + 1;
+	}
+	if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+	    if (y < crtc->y + crtc->panningBorder[1])
+		newY = y - crtc->panningBorder[1];
+	    if (y >= crtc->y + height - crtc->panningBorder[3])
+		newY = y - height + crtc->panningBorder[3] + 1;
+	}
     }
     /* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
-    if (newX >= crtc->panningTotalArea.x2 - width)
-	newX =  crtc->panningTotalArea.x2 - width - 1;
-    if (newX <  crtc->panningTotalArea.x1)
-	newX =  crtc->panningTotalArea.x1;
-    if (newY >= crtc->panningTotalArea.y2 - height)
-	newY =  crtc->panningTotalArea.y2 - height - 1;
-    if (newY <  crtc->panningTotalArea.y1)
-	newY =  crtc->panningTotalArea.y1;
+    if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
+	if (newX >= crtc->panningTotalArea.x2 - width)
+	    newX =  crtc->panningTotalArea.x2 - width - 1;
+	if (newX <  crtc->panningTotalArea.x1)
+	    newX =  crtc->panningTotalArea.x1;
+    }
+    if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+	if (newY >= crtc->panningTotalArea.y2 - height)
+	    newY =  crtc->panningTotalArea.y2 - height - 1;
+	if (newY <  crtc->panningTotalArea.y1)
+	    newY =  crtc->panningTotalArea.y1;
+    }
     if (newX != crtc->x || newY != crtc->y)
 	xf86CrtcSetOrigin (crtc, newX, newY);
 }
@@ -485,12 +495,16 @@ xf86RandR12ScreenSetSize (ScreenPtr	pScreen,
     /* Update panning information */
     for (c = 0; c < config->num_crtc; c++) {
 	xf86CrtcPtr crtc = config->crtc[c];
-	if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 &&
+	if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
 	    crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
-	    crtc->panningTotalArea.x2 += width  - pScreen->width;
-	    crtc->panningTotalArea.y2 += height - pScreen->height;
-	    crtc->panningTrackingArea.x2 += width  - pScreen->width;
-	    crtc->panningTrackingArea.y2 += height - pScreen->height;
+	    if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
+		crtc->panningTotalArea.x2 += width  - pScreen->width;
+	    if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
+		crtc->panningTotalArea.y2 += height - pScreen->height;
+	    if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
+		crtc->panningTrackingArea.x2 += width  - pScreen->width;
+	    if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
+		crtc->panningTrackingArea.y2 += height - pScreen->height;
 	    xf86RandR13VerifyPanningArea (crtc, width, height);
 	    xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
 	}
commit 5fa2cce83cc2df560ce62ec4bbf88233ee70e64a
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Dec 4 16:55:14 2008 +0100

    randr: Rework panning area verification
    (cherry picked from commit bad118ace6c5bae5a5ed8a35129c90c38f1c1932)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 0b1dcb5..879f4a2 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -88,40 +88,88 @@ xf86RandR12ModeRefresh (DisplayModePtr mode)
 	return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
 }
 
+/* Adapt panning area; return TRUE if panning area was valid without adaption */
 static int
 xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight)
 {
+    int ret = TRUE;
+
     if (crtc->version < 2)
 	return FALSE;
 
-    if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1				||
-	crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
-	memset (&crtc->panningTotalArea, 0, sizeof(BoxRec));
-	memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec));
-	memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
-	return TRUE;
+    if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1) {
+	/* Panning in X is disabled */
+	if (crtc->panningTotalArea.x1 || crtc->panningTotalArea.x2)
+	    /* Illegal configuration -> fail/disable */
+	    ret = FALSE;
+	crtc->panningTotalArea.x1    = crtc->panningTotalArea.x2    = 0;
+	crtc->panningTrackingArea.x1 = crtc->panningTrackingArea.x2 = 0;
+	crtc->panningBorder[0]       = crtc->panningBorder[2]       = 0;
+    } else {
+	/* Panning in X is enabled */
+	if (crtc->panningTotalArea.x1 < 0) {
+	    /* Panning region outside screen -> move inside */
+	    crtc->panningTotalArea.x2 -= crtc->panningTotalArea.x1;
+	    crtc->panningTotalArea.x1 = 0;
+	    ret = FALSE;
+	}
+	if (crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay) {
+	    /* Panning region smaller than displayed area -> crop to displayed area */
+	    crtc->panningTotalArea.x2 = crtc->panningTotalArea.x1 + crtc->mode.HDisplay;
+	    ret = FALSE;
+	}
+	if (crtc->panningTotalArea.x2 > screenWidth) {
+	    /* Panning region larger than screen -> move inside, then crop to screen */
+	    crtc->panningTotalArea.x1 -= crtc->panningTotalArea.x2 - screenWidth;
+	    crtc->panningTotalArea.x2 = screenWidth;
+	    ret = FALSE;
+	    if (crtc->panningTotalArea.x1 < 0)
+		crtc->panningTotalArea.x1 = 0;
+	}
+	if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay) {
+	    /* Borders too large -> set to 0 */
+	    crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
+	    ret = FALSE;
+	}
     }
 
-    if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1				||
-	crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1				||
-	crtc->panningTotalArea.x1 < 0							||
-	crtc->panningTotalArea.y1 < 0							||
-	crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay	||
-	crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay	||
-	crtc->panningTotalArea.x2 > screenWidth				 		||
-	crtc->panningTotalArea.y2 > screenHeight)
-    {
-	memset (&crtc->panningTotalArea, 0, sizeof(BoxRec));
-	memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec));
-	memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
-	return FALSE;
-    }
-    if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay		||
-	crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
-	memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
-	return FALSE;
+    if (crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
+	/* Panning in Y is disabled */
+	if (crtc->panningTotalArea.y1 || crtc->panningTotalArea.y2)
+	    /* Illegal configuration -> fail/disable */
+	    ret = FALSE;
+	crtc->panningTotalArea.y1    = crtc->panningTotalArea.y2    = 0;
+	crtc->panningTrackingArea.y1 = crtc->panningTrackingArea.y2 = 0;
+	crtc->panningBorder[1]       = crtc->panningBorder[3]       = 0;
+    } else {
+	/* Panning in Y is enabled */
+	if (crtc->panningTotalArea.y1 < 0) {
+	    /* Panning region outside screen -> move inside */
+	    crtc->panningTotalArea.y2 -= crtc->panningTotalArea.y1;
+	    crtc->panningTotalArea.y1 = 0;
+	    ret = FALSE;
+	}
+	if (crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay) {
+	    /* Panning region smaller than displayed area -> crop to displayed area */
+	    crtc->panningTotalArea.y2 = crtc->panningTotalArea.y1 + crtc->mode.VDisplay;
+	    ret = FALSE;
+	}
+	if (crtc->panningTotalArea.y2 > screenHeight) {
+	    /* Panning region larger than screen -> move inside, then crop to screen */
+	    crtc->panningTotalArea.y1 -= crtc->panningTotalArea.y2 - screenHeight;
+	    crtc->panningTotalArea.y2 = screenHeight;
+	    ret = FALSE;
+	    if (crtc->panningTotalArea.y1 < 0)
+		crtc->panningTotalArea.y1 = 0;
+	}
+	if (crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
+	    /* Borders too large -> set to 0 */
+	    crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
+	    ret = FALSE;
+	}
     }
-    return TRUE;
+
+    return ret;
 }
 
 static void
commit 97e8a75ce3c70e7a83028b256b6884084f5e196b
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Dec 4 16:28:40 2008 +0100

    randr: Don't change panning parameters if verification fails.
    (cherry picked from commit 219c26ce0c65625d55cfd943ec66fe94a1a0ddfd)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 0e7a5ec..0b1dcb5 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1327,20 +1327,35 @@ xf86RandR13SetPanning (ScreenPtr           pScreen,
 {
     XF86RandRInfoPtr	randrp  = XF86RANDRINFO(pScreen);
     xf86CrtcPtr		crtc = randr_crtc->devPrivate;
-    int			ret;
+    BoxRec		oldTotalArea;
+    BoxRec		oldTrackingArea;
+    INT16		oldBorder[4];
+
 
     if (crtc->version < 2)
 	return FALSE;
+
+    memcpy (&oldTotalArea,    &crtc->panningTotalArea,    sizeof(BoxRec));
+    memcpy (&oldTrackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
+    memcpy (oldBorder,         crtc->panningBorder,       4*sizeof(INT16));
+
     if (totalArea)
 	memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec));
     if (trackingArea)
 	memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec));
     if (border)
 	memcpy (crtc->panningBorder, border, 4*sizeof(INT16));
-    ret = xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
-    xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
 
-    return ret;
+    if (xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height)) {
+	xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
+	return TRUE;
+    } else {
+	/* Restore old settings */
+	memcpy (&crtc->panningTotalArea,    &oldTotalArea,    sizeof(BoxRec));
+	memcpy (&crtc->panningTrackingArea, &oldTrackingArea, sizeof(BoxRec));
+	memcpy (crtc->panningBorder,         oldBorder,       4*sizeof(INT16));
+	return FALSE;
+    }
 }
 
 static Bool
commit 6189f0832ecd6930608f5b253e534bb104174694
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Dec 4 16:30:38 2008 +0100

    randr: Rename pan() to set_origin(), and xf86CrtcPan() to xf86CrtcSetOrigin()
    (cherry picked from commit 18a8bac1a1567b6215928f96870554ea63f39aab)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 051916d..9717620 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -324,10 +324,10 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 		    crtc->x, crtc->y);
     }
 
-    if (crtc->funcs->pan &&
+    if (crtc->funcs->set_origin &&
 	memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 &&
 	saved_rotation == rotation) {
-	crtc->funcs->pan (crtc, crtc->x, crtc->y);
+	crtc->funcs->set_origin (crtc, crtc->x, crtc->y);
 	ret = TRUE;
 	goto done;
     }
@@ -424,12 +424,12 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
  * Pans the screen, does not change the mode
  */
 _X_EXPORT void
-xf86CrtcPan (xf86CrtcPtr crtc, int x, int y)
+xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y)
 {
     crtc->x = x;
     crtc->y = y;
-    if (crtc->funcs->pan)
-	crtc->funcs->pan (crtc, x, y);
+    if (crtc->funcs->set_origin)
+	crtc->funcs->set_origin (crtc, x, y);
     else
 	xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y);
 }
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index f085bf7..5e47e6f 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -218,7 +218,7 @@ typedef struct _xf86CrtcFuncs {
      * Callback for panning. Doesn't change the mode.
      */
     void
-    (*pan)(xf86CrtcPtr crtc, int x, int y);
+    (*set_origin)(xf86CrtcPtr crtc, int x, int y);
 
 } xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
 
@@ -695,7 +695,7 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
 		 int x, int y);
 
 void
-xf86CrtcPan (xf86CrtcPtr crtc, int x, int y);
+xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y);
 
 /*
  * Assign crtc rotation during mode set
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index caf6429..0e7a5ec 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -164,7 +164,7 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
     if (newY <  crtc->panningTotalArea.y1)
 	newY =  crtc->panningTotalArea.y1;
     if (newX != crtc->x || newY != crtc->y)
-	xf86CrtcPan (crtc, newX, newY);
+	xf86CrtcSetOrigin (crtc, newX, newY);
 }
 
 static Bool
commit 68858b202a0c32e8cc3fb22ca4714c1baa05b44c
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Dec 4 16:11:21 2008 +0100

    randr: Nuke config-timestamp for panning
    (cherry picked from commit 825b2c2f4a59ac4852f90bbbddf18ab832297fdd)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index b8e4d11..99f7d1e 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -1056,7 +1056,6 @@ ProcRRSetPanning (ClientPtr client)
     RRCrtcPtr		crtc;
     ScreenPtr		pScreen;
     rrScrPrivPtr	pScrPriv;
-    TimeStamp		configTime;
     TimeStamp		time;
     BoxRec		total;
     BoxRec		tracking;
@@ -1083,21 +1082,7 @@ ProcRRSetPanning (ClientPtr client)
     }
     
     time = ClientTimeToServerTime(stuff->timestamp);
-    configTime = ClientTimeToServerTime(stuff->configTimestamp);
     
-#if 0
-    /*
-     * if the client's config timestamp is not the same as the last config
-     * timestamp, then the config information isn't up-to-date and
-     * can't even be validated
-     */
-    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
-    {
-	rep.status = RRSetConfigInvalidConfigTime;
-	goto sendReply;
-    }
-#endif
-
     /*
      * Make sure the requested set-time is not older than
      * the last set-time
commit 7cbded550d3bebc35e2322a89d0afbb57b37b3da
Author: Matthias Hopf <mhopf at suse.de>
Date:   Fri Nov 28 17:51:20 2008 +0100

    randr: Protocol bits for panning support
    (cherry picked from commit eeeb98d1df59baaaec954b6318d788a37e388d11)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/randrstr.h b/randr/randrstr.h
index 64206e8..f6aa5c7 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -190,6 +190,17 @@ typedef void (*RRModeDestroyProcPtr) (ScreenPtr	    pScreen,
 typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr		pScreen,
 					    RROutputPtr		output,
 					    Atom		property);
+typedef Bool (*RRGetPanningProcPtr)    (ScreenPtr		pScrn,
+					RRCrtcPtr		crtc,
+					BoxPtr		totalArea,
+					BoxPtr		trackingArea,
+					INT16		*border);
+typedef Bool (*RRSetPanningProcPtr)    (ScreenPtr		pScrn,
+					RRCrtcPtr		crtc,
+					BoxPtr		totalArea,
+					BoxPtr		trackingArea,
+					INT16		*border);
+
 #endif /* RANDR_13_INTERFACE */
 
 typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
@@ -239,6 +250,8 @@ typedef struct _rrScrPriv {
 #endif
 #if RANDR_13_INTERFACE
     RROutputGetPropertyProcPtr	rrOutputGetProperty;
+    RRGetPanningProcPtr	rrGetPanning;
+    RRSetPanningProcPtr	rrSetPanning;
 #endif
     
     /*
@@ -686,6 +699,12 @@ ProcRRSetCrtcTransform (ClientPtr client);
 int
 ProcRRGetCrtcTransform (ClientPtr client);
 
+int
+ProcRRGetPanning (ClientPtr client);
+
+int
+ProcRRSetPanning (ClientPtr client);
+
 /* rrdispatch.c */
 Bool
 RRClientKnowsRates (ClientPtr	pClient);
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 90d93b5..b8e4d11 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -978,6 +978,173 @@ sendReply:
 }
 
 int
+ProcRRGetPanning (ClientPtr client)
+{
+    REQUEST(xRRGetPanningReq);
+    xRRGetPanningReply	rep;
+    RRCrtcPtr		crtc;
+    ScreenPtr		pScreen;
+    rrScrPrivPtr	pScrPriv;
+    BoxRec		total;
+    BoxRec		tracking;
+    INT16		border[4];
+    int			n;
+    
+    REQUEST_SIZE_MATCH(xRRGetPanningReq);
+    crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
+
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+
+    /* All crtcs must be associated with screens before client
+     * requests are processed
+     */
+    pScreen = crtc->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+
+    if (!pScrPriv || !pScrPriv->rrGetPanning)
+	return RRErrorBase + BadRRCrtc;
+
+    rep.type = X_Reply;
+    rep.status = RRSetConfigSuccess;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 1;
+    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+
+    if (! pScrPriv->rrGetPanning (pScreen, crtc, &total, &tracking, border))
+	return RRErrorBase + BadRRCrtc;
+
+    rep.left          = total.x1;
+    rep.top           = total.y1;
+    rep.width         = total.x2 - total.x1;
+    rep.height        = total.y2 - total.y1;
+    rep.track_left    = tracking.x1;
+    rep.track_top     = tracking.y1;
+    rep.track_width   = tracking.x2 - tracking.x1;
+    rep.track_height  = tracking.y2 - tracking.y1;
+    rep.border_left   = border[0];
+    rep.border_top    = border[1];
+    rep.border_right  = border[2];
+    rep.border_bottom = border[3];
+
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swaps(&rep.timestamp, n);
+	swaps(&rep.left, n);
+	swaps(&rep.top, n);
+	swaps(&rep.width, n);
+	swaps(&rep.height, n);
+	swaps(&rep.track_left, n);
+	swaps(&rep.track_top, n);
+	swaps(&rep.track_width, n);
+	swaps(&rep.track_height, n);
+	swaps(&rep.border_left, n);
+	swaps(&rep.border_top, n);
+	swaps(&rep.border_right, n);
+	swaps(&rep.border_bottom, n);
+    }
+    WriteToClient(client, sizeof(xRRGetPanningReply), (char *)&rep);
+    return client->noClientException;
+}
+
+int
+ProcRRSetPanning (ClientPtr client)
+{
+    REQUEST(xRRSetPanningReq);
+    xRRSetPanningReply	rep;
+    RRCrtcPtr		crtc;
+    ScreenPtr		pScreen;
+    rrScrPrivPtr	pScrPriv;
+    TimeStamp		configTime;
+    TimeStamp		time;
+    BoxRec		total;
+    BoxRec		tracking;
+    INT16		border[4];
+    int			n;
+    
+    REQUEST_SIZE_MATCH(xRRSetPanningReq);
+    crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
+
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+
+
+    /* All crtcs must be associated with screens before client
+     * requests are processed
+     */
+    pScreen = crtc->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+
+    if (!pScrPriv) {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    
+    time = ClientTimeToServerTime(stuff->timestamp);
+    configTime = ClientTimeToServerTime(stuff->configTimestamp);
+    
+#if 0
+    /*
+     * if the client's config timestamp is not the same as the last config
+     * timestamp, then the config information isn't up-to-date and
+     * can't even be validated
+     */
+    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
+    {
+	rep.status = RRSetConfigInvalidConfigTime;
+	goto sendReply;
+    }
+#endif
+
+    /*
+     * Make sure the requested set-time is not older than
+     * the last set-time
+     */
+    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+    {
+	rep.status = RRSetConfigInvalidTime;
+	goto sendReply;
+    }
+
+    if (!pScrPriv->rrGetPanning)
+	return RRErrorBase + BadRRCrtc;
+
+    total.x1    = stuff->left;
+    total.y1    = stuff->top;
+    total.x2    = stuff->width - total.x1;
+    total.y2    = stuff->height - total.y1;
+    tracking.x1 = stuff->track_left;
+    tracking.y1 = stuff->track_top;
+    tracking.x2 = stuff->track_width - tracking.x1;
+    tracking.y2 = stuff->track_height - tracking.y1;
+    border[0]   = stuff->border_left;
+    border[1]   = stuff->border_top;
+    border[2]   = stuff->border_right;
+    border[3]   = stuff->border_bottom;
+
+    if (! pScrPriv->rrSetPanning (pScreen, crtc, &total, &tracking, border))
+	return BadMatch;
+
+    rep.status = RRSetConfigSuccess;
+
+sendReply:
+    rep.type = X_Reply;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
+
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swaps(&rep.newTimestamp, n);
+    }
+    WriteToClient(client, sizeof(xRRSetPanningReply), (char *)&rep);
+    return client->noClientException;
+}
+
+int
 ProcRRGetCrtcGammaSize (ClientPtr client)
 {
     REQUEST(xRRGetCrtcGammaSizeReq);
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index 64af6ce..0cc0bca 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -215,5 +215,7 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
     ProcRRGetScreenResourcesCurrent, /* 25 */
     ProcRRSetCrtcTransform,	/* 26 */
     ProcRRGetCrtcTransform,	/* 27 */
+    ProcRRGetPanning,		/* 28 */
+    ProcRRSetPanning,		/* 29 */
 };
 
commit bc05471d1184ebf72b793b1dceff9856eba616d2
Author: Matthias Hopf <mhopf at suse.de>
Date:   Fri Nov 28 17:49:31 2008 +0100

    randr: Panning support
    (cherry picked from commit b929d721efdb17bcc94b9984c4f34d0df3d267d5)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index a2583b8..051916d 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -324,8 +324,14 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 		    crtc->x, crtc->y);
     }
 
-    /* XXX short-circuit changes to base location only */
-    
+    if (crtc->funcs->pan &&
+	memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 &&
+	saved_rotation == rotation) {
+	crtc->funcs->pan (crtc, crtc->x, crtc->y);
+	ret = TRUE;
+	goto done;
+    }
+
     /* Pass our mode to the outputs and the CRTC to give them a chance to
      * adjust it according to limitations or output properties, and also
      * a chance to reject the mode entirely.
@@ -414,6 +420,20 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
     return xf86CrtcSetModeTransform (crtc, mode, rotation, NULL, x, y);
 }
 
+/**
+ * Pans the screen, does not change the mode
+ */
+_X_EXPORT void
+xf86CrtcPan (xf86CrtcPtr crtc, int x, int y)
+{
+    crtc->x = x;
+    crtc->y = y;
+    if (crtc->funcs->pan)
+	crtc->funcs->pan (crtc, x, y);
+    else
+	xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y);
+}
+
 /*
  * Output functions
  */
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 9d7750f..caf6429 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -51,6 +51,8 @@ typedef struct _xf86RandR12Info {
     int				    mmHeight;
     int				    maxX;
     int				    maxY;
+    int				    pointerX;
+    int				    pointerY;
     Rotation			    rotation; /* current mode */
     Rotation                        supported_rotations; /* driver supported */
 } XF86RandRInfoRec, *XF86RandRInfoPtr;
@@ -86,6 +88,85 @@ xf86RandR12ModeRefresh (DisplayModePtr mode)
 	return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
 }
 
+static int
+xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight)
+{
+    if (crtc->version < 2)
+	return FALSE;
+
+    if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1				||
+	crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
+	memset (&crtc->panningTotalArea, 0, sizeof(BoxRec));
+	memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec));
+	memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
+	return TRUE;
+    }
+
+    if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1				||
+	crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1				||
+	crtc->panningTotalArea.x1 < 0							||
+	crtc->panningTotalArea.y1 < 0							||
+	crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay	||
+	crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay	||
+	crtc->panningTotalArea.x2 > screenWidth				 		||
+	crtc->panningTotalArea.y2 > screenHeight)
+    {
+	memset (&crtc->panningTotalArea, 0, sizeof(BoxRec));
+	memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec));
+	memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
+	return FALSE;
+    }
+    if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay		||
+	crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
+	memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
+	return FALSE;
+    }
+    return TRUE;
+}
+
+static void
+xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
+{
+    int newX, newY;
+    int width, height;
+
+    if (crtc->version < 2)
+	return;
+
+    if (! crtc->enabled						||
+	crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1	||
+	crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1)
+	return;
+
+    newX   = crtc->x;
+    newY   = crtc->y;
+    width  = crtc->mode.HDisplay;
+    height = crtc->mode.VDisplay;
+
+    if (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2 &&
+    	y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2) {
+	if (x < crtc->x + crtc->panningBorder[0])
+	    newX = x - crtc->panningBorder[0];
+	if (x >= crtc->x + width - crtc->panningBorder[2])
+	    newX = x - width + crtc->panningBorder[2] + 1;
+	if (y < crtc->y + crtc->panningBorder[1])
+	    newY = y - crtc->panningBorder[1];
+	if (y >= crtc->y + height - crtc->panningBorder[3])
+	    newY = y - height + crtc->panningBorder[3] + 1;
+    }
+    /* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
+    if (newX >= crtc->panningTotalArea.x2 - width)
+	newX =  crtc->panningTotalArea.x2 - width - 1;
+    if (newX <  crtc->panningTotalArea.x1)
+	newX =  crtc->panningTotalArea.x1;
+    if (newY >= crtc->panningTotalArea.y2 - height)
+	newY =  crtc->panningTotalArea.y2 - height - 1;
+    if (newY <  crtc->panningTotalArea.y1)
+	newY =  crtc->panningTotalArea.y1;
+    if (newX != crtc->x || newY != crtc->y)
+	xf86CrtcPan (crtc, newX, newY);
+}
+
 static Bool
 xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
 {
@@ -332,6 +413,7 @@ xf86RandR12ScreenSetSize (ScreenPtr	pScreen,
     WindowPtr		pRoot = WindowTable[pScreen->myNum];
     PixmapPtr		pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
     Bool		ret = FALSE;
+    int                 c;
 
 #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
     if (xf86RandR12Key) {
@@ -352,6 +434,19 @@ xf86RandR12ScreenSetSize (ScreenPtr	pScreen,
 	goto finish;
 
     ret = TRUE;
+    /* Update panning information */
+    for (c = 0; c < config->num_crtc; c++) {
+	xf86CrtcPtr crtc = config->crtc[c];
+	if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 &&
+	    crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+	    crtc->panningTotalArea.x2 += width  - pScreen->width;
+	    crtc->panningTotalArea.y2 += height - pScreen->height;
+	    crtc->panningTrackingArea.x2 += width  - pScreen->width;
+	    crtc->panningTrackingArea.y2 += height - pScreen->height;
+	    xf86RandR13VerifyPanningArea (crtc, width, height);
+	    xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
+	}
+    }
 
     pScreen->width = pScrnPix->drawable.width = width;
     pScreen->height = pScrnPix->drawable.height = height;
@@ -762,6 +857,7 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 		    int		    num_randr_outputs,
 		    RROutputPtr	    *randr_outputs)
 {
+    XF86RandRInfoPtr	randrp = XF86RANDRINFO(pScreen);
     ScrnInfoPtr		pScrn = xf86Screens[pScreen->myNum];
     xf86CrtcConfigPtr   config = XF86_CRTC_CONFIG_PTR(pScrn);
     xf86CrtcPtr		crtc = randr_crtc->devPrivate;
@@ -841,6 +937,8 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 		xfree(save_crtcs);
 		return FALSE;
 	    }
+	    xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
+	    xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
 	    /*
 	     * Save the last successful setting for EnterVT
 	     */
@@ -1187,6 +1285,62 @@ xf86RandR12TellChanged (ScreenPtr pScreen)
 static void
 xf86RandR12PointerMoved (int scrnIndex, int x, int y)
 {
+    ScreenPtr		pScreen = screenInfo.screens[scrnIndex];
+    ScrnInfoPtr		pScrn   = XF86SCRNINFO(pScreen);
+    xf86CrtcConfigPtr	config  = XF86_CRTC_CONFIG_PTR(pScrn);
+    XF86RandRInfoPtr	randrp  = XF86RANDRINFO(pScreen);
+    int c;
+
+    randrp->pointerX = x;
+    randrp->pointerY = y;
+    for (c = 0; c < config->num_crtc; c++)
+	xf86RandR13Pan (config->crtc[c], x, y);
+}
+
+static Bool
+xf86RandR13GetPanning (ScreenPtr           pScreen,
+		       RRCrtcPtr           randr_crtc,
+		       BoxPtr              totalArea,
+		       BoxPtr              trackingArea,
+		       INT16               *border)
+{
+    xf86CrtcPtr		crtc = randr_crtc->devPrivate;
+
+    if (crtc->version < 2)
+	return FALSE;
+    if (totalArea)
+	memcpy (totalArea,    &crtc->panningTotalArea,    sizeof(BoxRec));
+    if (trackingArea)
+	memcpy (trackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
+    if (border)
+	memcpy (border,        crtc->panningBorder,       4*sizeof(INT16));
+
+    return TRUE;
+}
+
+static Bool
+xf86RandR13SetPanning (ScreenPtr           pScreen,
+		       RRCrtcPtr           randr_crtc,
+		       BoxPtr              totalArea,
+		       BoxPtr              trackingArea,
+		       INT16               *border)
+{
+    XF86RandRInfoPtr	randrp  = XF86RANDRINFO(pScreen);
+    xf86CrtcPtr		crtc = randr_crtc->devPrivate;
+    int			ret;
+
+    if (crtc->version < 2)
+	return FALSE;
+    if (totalArea)
+	memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec));
+    if (trackingArea)
+	memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec));
+    if (border)
+	memcpy (crtc->panningBorder, border, 4*sizeof(INT16));
+    ret = xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
+    xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
+
+    return ret;
 }
 
 static Bool
@@ -1203,6 +1357,8 @@ xf86RandR12Init12 (ScreenPtr pScreen)
     rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
 #if RANDR_13_INTERFACE
     rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
+    rp->rrGetPanning = xf86RandR13GetPanning;
+    rp->rrSetPanning = xf86RandR13SetPanning;
 #endif
     rp->rrModeDestroy = xf86RandR12ModeDestroy;
     rp->rrSetConfig = NULL;
commit f7e2fee8fe9b47f1e898feb8419aacd9a32c1f01
Author: Matthias Hopf <mhopf at suse.de>
Date:   Fri Nov 28 17:39:23 2008 +0100

    randr: Crtc interface update for panning support.
    (cherry picked from commit 834cbc16f3eb539704faade7bff347b161ce69d9)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index 4b6f7d2..f085bf7 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -213,9 +213,16 @@ typedef struct _xf86CrtcFuncs {
     Bool
     (*set_mode_major)(xf86CrtcPtr crtc, DisplayModePtr mode,
 		      Rotation rotation, int x, int y);
+
+    /**
+     * Callback for panning. Doesn't change the mode.
+     */
+    void
+    (*pan)(xf86CrtcPtr crtc, int x, int y);
+
 } xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
 
-#define XF86_CRTC_VERSION 1
+#define XF86_CRTC_VERSION 2
 
 struct _xf86Crtc {
     /**
@@ -321,6 +328,15 @@ struct _xf86Crtc {
      * Bounding box in screen space
      */
     BoxRec	    bounds;
+    /**
+     * Panning:
+     * TotalArea: total panning area, larger than CRTC's size
+     * TrackingArea: Area of the pointer for which the CRTC is panned
+     * border: Borders of the displayed CRTC area which induces panning if the pointer reaches them
+     */
+    BoxRec          panningTotalArea;
+    BoxRec          panningTrackingArea;
+    INT16           panningBorder[4];
 };
 
 typedef struct _xf86OutputFuncs {
@@ -678,6 +694,9 @@ Bool
 xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
 		 int x, int y);
 
+void
+xf86CrtcPan (xf86CrtcPtr crtc, int x, int y);
+
 /*
  * Assign crtc rotation during mode set
  */
@@ -867,4 +886,19 @@ xf86_unwrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr old);
 void
 xf86_crtc_notify(ScreenPtr pScreen);
 
+/**
+ * Panning
+ */
+Bool
+xf86_crtc_get_panning(ScrnInfoPtr pScrn,
+		      BoxPtr      totalArea,
+		      BoxPtr      TrackingArea,
+		      INT16      *border);
+
+Bool
+xf86_crtc_set_panning(ScrnInfoPtr pScrn,
+		      BoxPtr      totalArea,
+		      BoxPtr      TrackingArea,
+		      INT16      *border);
+
 #endif /* _XF86CRTC_H_ */
commit 27ca32eb05101e0e5624422dd25e1aa95b129d77
Author: Matthias Hopf <mhopf at suse.de>
Date:   Fri Nov 28 17:38:52 2008 +0100

    randr: Weird enough, crtc->version was never set upon creation. Fix that.
    (cherry picked from commit a475eb9feec75e9ce1e316da0f1679acd7dd3aa8)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 9ae173c..a2583b8 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -96,6 +96,7 @@ xf86CrtcCreate (ScrnInfoPtr		scrn,
     crtc = xcalloc (sizeof (xf86CrtcRec), 1);
     if (!crtc)
 	return NULL;
+    crtc->version = XF86_CRTC_VERSION;
     crtc->scrn = scrn;
     crtc->funcs = funcs;
 #ifdef RANDR_12_INTERFACE
commit 0d27dd23cf08a2dc3581f9db81371c2cdb798db0
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Dec 8 16:28:00 2008 -0500

    Default to x86emu even on i386 linux
    
    vm86 mode is a bad idea anyway, and using the emulator everywhere
    means we get a consistent set of bugs.
    (cherry picked from commit 58a27d2932164e43c0db42b1286ec2f95250b420)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index f62f35f..81024e9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -312,7 +312,6 @@ case $host_cpu in
   i*86)
 	I386_VIDEO=yes
 	case $host_os in
-		*linux*)	DEFAULT_INT10=vm86 ;;
 		*freebsd*)	AC_DEFINE(USE_DEV_IO) ;;
 		*dragonfly*)	AC_DEFINE(USE_DEV_IO) ;;
 		*netbsd*)	AC_DEFINE(USE_I386_IOPL)
commit ff9b55d8cbc19e0e31a91034e332058acd967cd1
Author: Sascha Hlusiak <saschahlusiak at arcor.de>
Date:   Mon Dec 8 12:24:39 2008 +0100

    ddxCtrls.c: XkbDDXUsesSoftRepeat always returns 1 now
    
    We'd like to do soft repeat in the server for all keys. Remove obscure check, that'd
    prevent the server from autorepeating when delay is set to exactly 660ms and rate is
    set to exactly 25 (interval=40).
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    (cherry picked from commit bbf811514d3cdf84790bad5b852942a4e636902b)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/xkb/ddxCtrls.c b/xkb/ddxCtrls.c
index 34ea0bd..be269c2 100644
--- a/xkb/ddxCtrls.c
+++ b/xkb/ddxCtrls.c
@@ -57,27 +57,7 @@ int realRepeat;
 int
 XkbDDXUsesSoftRepeat(DeviceIntPtr pXDev)
 {
-#ifndef XKB_ALWAYS_USES_SOFT_REPEAT
-    if (pXDev && pXDev->kbdfeed ) {
-	if (pXDev->kbdfeed->ctrl.autoRepeat) {
-	    if (pXDev->key && pXDev->key->xkbInfo) {
-		XkbDescPtr	xkb;
-		xkb= pXDev->key->xkbInfo->desc;
-		if ((xkb->ctrls->repeat_delay == 660) &&
-		    (xkb->ctrls->repeat_interval == 40) &&
-		    ((xkb->ctrls->enabled_ctrls&(XkbSlowKeysMask|
-						 XkbBounceKeysMask|
-						 XkbMouseKeysMask))==0)) {
-			return 0;
-		}
-		return ((xkb->ctrls->enabled_ctrls&XkbRepeatKeysMask)!=0);
-	    }
-	}
-    }
-    return 0;
-#else
     return 1;
-#endif
 }
 
 void
commit b0c64725526338cbc02708415e1aa9497cdc3a38
Author: Peter Hutterer <peter.hutterer at redhat.com>
Date:   Wed Nov 26 14:15:04 2008 +1000

    xfree86: don't FatalError on "too many input devices".
    
    Just ignore devices after MAXDEVICES has been reached, but warn the user that
    the devices are ignored.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at redhat.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/xf86InPriv.h b/hw/xfree86/common/xf86InPriv.h
index 62e4820..3838d69 100644
--- a/hw/xfree86/common/xf86InPriv.h
+++ b/hw/xfree86/common/xf86InPriv.h
@@ -38,7 +38,7 @@ extern InputDriverPtr *xf86InputDriverList;
 extern int xf86NumInputDrivers;
 
 /* xf86Xinput.c */
-void xf86ActivateDevice(InputInfoPtr pInfo);
+int xf86ActivateDevice(InputInfoPtr pInfo);
 
 /* xf86Helper.c */
 InputDriverPtr xf86LookupInputDriver(const char *name);
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 44e0392..236c00b 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1324,7 +1324,9 @@ InitInput(argc, argv)
             strcpy((*pDev)->driver, "kbd");
         }
 
-        xf86NewInputDevice(*pDev, &dev, TRUE);
+        /* If one fails, the others will too */
+        if (xf86NewInputDevice(*pDev, &dev, TRUE) == BadAlloc)
+            break;
     }
 }
 
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 2cb41e5..9558b77 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -287,12 +287,13 @@ xf86ProcessCommonOptions(LocalDevicePtr local,
 /***********************************************************************
  *
  * xf86ActivateDevice --
- * 
+ *
  *	Initialize an input device.
  *
+ * Returns TRUE on success, or FALSE otherwise.
  ***********************************************************************
  */
-_X_EXPORT void
+_X_EXPORT int
 xf86ActivateDevice(LocalDevicePtr local)
 {
     DeviceIntPtr	dev;
@@ -301,8 +302,13 @@ xf86ActivateDevice(LocalDevicePtr local)
         dev = AddInputDevice(serverClient, local->device_control, TRUE);
 
         if (dev == NULL)
-            FatalError("Too many input devices");
-        
+        {
+            xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n",
+                    local->name);
+            local->dev = NULL;
+            return FALSE;
+        }
+
         local->atom = MakeAtom(local->type_name,
                                strlen(local->type_name),
                                TRUE);
@@ -334,6 +340,8 @@ xf86ActivateDevice(LocalDevicePtr local)
             xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n",
                     local->name, local->type_name);
     }
+
+    return TRUE;
 }
 
 
@@ -470,6 +478,13 @@ AddOtherInputDevices()
 /**
  * Create a new input device, activate and enable it.
  *
+ * Possible return codes:
+ *    BadName .. a bad driver name was supplied.
+ *    BadImplementation ... The driver does not have a PreInit function. This
+ *                          is a driver bug.
+ *    BadMatch .. device initialization failed.
+ *    BadAlloc .. too many input devices
+ *
  * @param idev The device, already set up with identifier, driver, and the
  * options.
  * @param pdev Pointer to the new device, if Success was reported.
@@ -519,7 +534,11 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable)
         goto unwind;
     }
 
-    xf86ActivateDevice(pInfo);
+    if (!xf86ActivateDevice(pInfo))
+    {
+        rval = BadAlloc;
+        goto unwind;
+    }
 
     dev = pInfo->dev;
     ActivateDevice(dev);
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 28a3315..2ca2073 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -170,9 +170,7 @@ void xf86PostKeyEvent(DeviceIntPtr device, unsigned int key_code, int is_down,
 		      ...);
 void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code,
                            int is_down);
-void xf86ActivateDevice(LocalDevicePtr local);
-Bool xf86CheckButton(int button, int down);
-void xf86SwitchCoreDevice(LocalDevicePtr device, DeviceIntPtr core);
+int xf86ActivateDevice(LocalDevicePtr local);
 LocalDevicePtr xf86FirstLocalDevice(void);
 int xf86ScaleAxis(int Cx, int Sxhigh, int Sxlow, int Rxhigh, int Rxlow);
 void xf86XInputSetScreen(LocalDevicePtr local, int screen_number, int x, int y);
commit db5abde7ea0e482041d16d7d5f3715cd4f6222d3
Author: Peter Hutterer <peter.hutterer at redhat.com>
Date:   Fri Dec 5 10:12:57 2008 +1000

    dix: fix calculation of valuator events.
    
    Follow-up to 4971315296cb. countValuatorEvents was copied from GKVE where it
    was obviously broken but nobody noticed. GPE had the correct version, but that
    one got lost during de-duplication. Restoring the correct calculation - if we
    have 6 valuators, we want 1 valuator event, not 2.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at redhat.com>
    (cherry picked from commit ee1a6c28418a6dad6c89f79a994f27bfbaa77368)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/dix/getevents.c b/dix/getevents.c
index 82be5e9..9592d4c 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -728,9 +728,9 @@ static int
 countValuatorEvents(int num_valuators)
 {
     if (num_valuators) {
-        if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
-            num_valuators = MAX_VALUATOR_EVENTS;
-        return (num_valuators / 6) + 1;
+        if (((num_valuators - 1) / 6) + 1 > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS * 6;
+        return ((num_valuators - 1)/ 6) + 1;
     } else
         return 0;
 }
commit d679cf70a79aa53e823f4fa51a7ab19837f26525
Author: Tom Jaeger <ThJaeger at gmail.com>
Date:   Mon Dec 8 11:38:12 2008 +1000

    Xi: XIGetDevice needs to ignore the MORE_EVENTS flag.
    
    Reported in X.Org Bug 18882, Comment 5.
    <http://bugs.freedesktop.org/show_bug.cgi?id=18882>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit 78a62d7713c708d067d8824ec41b0a0225c1997f)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 00a6b21..a976802 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -150,7 +150,7 @@ XIGetDevice(xEvent* xE)
         int rc;
         int id;
 
-        id = ((deviceKeyButtonPointer*)xE)->deviceid;
+        id = ((deviceKeyButtonPointer*)xE)->deviceid & ~MORE_EVENTS;
 
         rc = dixLookupDevice(&pDev, id, serverClient, DixUnknownAccess);
         if (rc != Success)
commit 480caacbdd20d47770cc9a698be9f7c98e87783d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Dec 8 12:12:39 2008 +1000

    xfree86: init EQ before trying to initialise the devices (#18890)
    
    The kbd driver may send events during device initialisation, and these events
    need the EQ set up already.
    
    X.Org Bug 18890 <http://bugs.freedesktop.org/show_bug.cgi?id=18890>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit 39db182b637041255ed6dac739ff77c8e4e07c30)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 922e7b3..44e0392 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1315,6 +1315,8 @@ InitInput(argc, argv)
 
     xf86Info.vtRequestsPending = FALSE;
 
+    mieqInit();
+
     /* Call the PreInit function for each input device instance. */
     for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
         /* Replace obsolete keyboard driver with kbd */
@@ -1324,8 +1326,6 @@ InitInput(argc, argv)
 
         xf86NewInputDevice(*pDev, &dev, TRUE);
     }
-
-    mieqInit();
 }
 
 /*
commit 991f0be6e2bfe3cc3df55b2fc75fe3900d5e0b94
Author: Maarten Maathuis <madman2003 at gmail.com>
Date:   Sat Nov 29 14:30:55 2008 +0100

    randr: Avoid needlessly creating a shadow framebuffer.
    
    - pScreen->width and height were zero, so it didn't "fit" the screen.
    (cherry picked from commit ffb484f7ef84099019b196ef97bfb2355eb6d52a)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index fe9d7b0..9ae173c 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -112,6 +112,8 @@ xf86CrtcCreate (ScrnInfoPtr		scrn,
     crtc->filter_width = 0;
     crtc->filter_height = 0;
     crtc->transform_in_use = FALSE;
+    crtc->transformPresent = FALSE;
+    crtc->desiredTransformPresent = FALSE;
     memset (&crtc->bounds, '\0', sizeof (crtc->bounds));
 
     if (xf86_config->crtc)
@@ -241,6 +243,8 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 			  RRTransformPtr transform, int x, int y)
 {
     ScrnInfoPtr		scrn = crtc->scrn;
+    /* During ScreenInit() scrn->pScreen is still NULL */
+    ScreenPtr		pScreen = screenInfo.screens[scrn->scrnIndex];
     xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
     int			i;
     Bool		ret = FALSE;
@@ -254,9 +258,9 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 
     if (crtc->funcs->set_mode_major)
 	return crtc->funcs->set_mode_major(crtc, mode, rotation, x, y);
-	
+
     crtc->enabled = xf86CrtcInUse (crtc);
-    
+
     if (!crtc->enabled)
     {
 	/* XXX disable crtc? */
@@ -290,6 +294,11 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
     } else
 	crtc->transformPresent = FALSE;
 
+    /* xf86CrtcFitsScreen() relies on these values being correct. */
+    /* This should ensure the values are always set at modeset time. */
+    pScreen->width = scrn->virtualX;
+    pScreen->height = scrn->virtualY;
+
     /* Shift offsets that move us out of virtual size */
     if (x + mode->HDisplay > xf86_config->maxWidth ||
 	y + mode->VDisplay > xf86_config->maxHeight)
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
index 07189a5..d7f7b3b 100644
--- a/hw/xfree86/modes/xf86Rotate.c
+++ b/hw/xfree86/modes/xf86Rotate.c
@@ -464,7 +464,7 @@ xf86CrtcRotate (xf86CrtcPtr crtc)
 	    /* mark shadowed area as damaged so it will be repainted */
 	    xf86CrtcDamageShadow (crtc);
 	}
-	
+
 	if (!xf86_config->rotation_damage)
 	{
 	    /* Create damage structure */
commit d6129ebf8dad9cfbc13dc8db7c780b023bf9a60b
Author: Timo Aaltonen <tjaalton at cc.hut.fi>
Date:   Wed Dec 3 18:40:29 2008 +0200

    If AEI is on, disable 'vmmouse' in addition to 'kbd' and 'mouse'.
    
    Signed-off-by: Timo Aaltonen <tjaalton at cc.hut.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at redhat.com>
    (cherry picked from commit dd128ddcdcbe254a9cdd973590f6a979a7f0427e)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 9771008..f530ec4 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -2460,13 +2460,14 @@ checkInput(serverLayoutPtr layout, Bool implicit_layout) {
         while(*dev)
         {
             if (strcmp((*dev)->driver, "kbd") == 0 ||
-                strcmp((*dev)->driver, "mouse") == 0)
+                strcmp((*dev)->driver, "mouse") == 0 ||
+                strcmp((*dev)->driver, "vmmouse") == 0)
             {
                 IDevPtr *current;
                 if (!warned)
                 {
                     xf86Msg(X_WARNING, "AllowEmptyInput is on, devices using "
-                            "drivers 'kbd' or 'mouse' will be disabled.\n");
+                            "drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.\n");
                     warned = TRUE;
                 }
 
diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre
index 4f1ba00..d9a4b35 100644
--- a/hw/xfree86/doc/man/xorg.conf.man.pre
+++ b/hw/xfree86/doc/man/xorg.conf.man.pre
@@ -662,7 +662,7 @@ the X server to load. Disabled by default.
 If enabled, don't add the standard keyboard and mouse drivers, if there are no
 input devices in the config file.  Enabled by default if AutoAddDevices and
 AutoEnableDevices is enabled, otherwise disabled.
-If AllowEmptyInput is on, devices using the kbd or mouse driver are ignored.
+If AllowEmptyInput is on, devices using the kbd, mouse or vmmouse driver are ignored.
 .TP 7
 .BI "Option \*qAutoAddDevices\*q \*q" boolean \*q
 If this option is disabled, then no devices will be added from HAL events.
commit 90900976ceee294fef4ae39e10869057c50f2021
Author: Julien Cristau <jcristau at debian.org>
Date:   Wed Nov 26 21:19:55 2008 +0100

    randr: add swapped dispatch for RR[GS]etCrtcTransform
    
    Fix a memory leak in ProcRRGetCrtcTransform() while I'm at it.
    
    Signed-off-by: Julien Cristau <jcristau at debian.org>
    Cc: Keith Packard <keithp at keithp.com>
    (cherry picked from commit 0b5ecabfb803cd820338fb0364521fe39b05578b)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 5d270ce..90d93b5 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -1150,8 +1150,7 @@ transform_filter_encode (ClientPtr client, char *output,
     if (client->swapped) {
 	swaps (nbytesFilter, n);
 	swaps (nparamsFilter, n);
-	SwapLongs ((CARD32 *) (output + nbytes),
-		   nparams * sizeof (xFixed));
+	SwapLongs ((CARD32 *) (output + nbytes), nparams);
     }
     nbytes += nparams * sizeof (xFixed);
     return nbytes;
@@ -1162,7 +1161,7 @@ transform_encode (ClientPtr client, xRenderTransform *wire, PictTransform *pict)
 {
     xRenderTransform_from_PictTransform (wire, pict);
     if (client->swapped)
-	SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform));
+	SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform) >> 2);
 }
 
 int
@@ -1214,5 +1213,6 @@ ProcRRGetCrtcTransform (ClientPtr client)
 	swapl (&reply->length, n);
     }
     WriteToClient (client, sizeof (xRRGetCrtcTransformReply) + nextra, (char *) reply);
+    xfree(reply);
     return client->noClientException;
 }
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index 5a6dab5..d356ab0 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -367,21 +367,36 @@ SProcRRSetCrtcGamma (ClientPtr client)
 static int
 SProcRRSetCrtcTransform (ClientPtr client)
 {
+    int n, nparams;
+    char *filter;
+    CARD32 *params;
     REQUEST(xRRSetCrtcTransformReq);
-    
-    REQUEST_SIZE_MATCH(xRRSetCrtcTransformReq);
-    (void) stuff;
-    return BadImplementation; 
+
+    REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->crtc, n);
+    SwapLongs((CARD32 *)&stuff->transform, (sizeof(xRenderTransform)) >> 2);
+    swaps(&stuff->nbytesFilter, n);
+    filter = (char *)(stuff + 1);
+    params = (CARD32 *) (filter + ((stuff->nbytesFilter + 3) & ~3));
+    nparams = ((CARD32 *) stuff + client->req_len) - params;
+    if (nparams < 0)
+	return BadLength;
+
+    SwapLongs(params, nparams);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
 }
 
 static int
 SProcRRGetCrtcTransform (ClientPtr client)
 {
+    int n;
     REQUEST(xRRGetCrtcTransformReq);
-    
+
     REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
-    (void) stuff;
-    return BadImplementation; 
+    swaps(&stuff->length, n);
+    swapl(&stuff->crtc, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
 }
 
 int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
commit de83a342f483fbf3cc841929876002a3c47e3496
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Wed Dec 3 11:22:38 2008 -0500

    Test for DRI2 extension in dri_internal.h and only enable AIGLX DRI2 if found.
    (cherry picked from commit 110a71d11ab7a1a55a6a24d792457fdef0b0746d)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index 947a167..f62f35f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -874,6 +874,28 @@ if test "x$DRI" = xyes || test "x$DRI2" = xyes; then
 	AC_SUBST(LIBDRM_LIBS)
 fi
 
+if test "x$DRI2" = xyes; then
+	save_CFLAGS=$CFLAGS
+	CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS -Wall"
+	AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#ifndef __DRI_DRI2
+#error DRI2 extension not available.
+#endif]])],
+			  [HAVE_DRI2EXTENSION=yes],
+			  [HAVE_DRI2EXTENSION=no])
+	CFLAGS=$save_CFLAGS
+	if test "x$HAVE_DRI2EXTENSION" = xyes; then
+		AC_DEFINE(DRI2_AIGLX, 1, [Build DRI2 AIGLX loader])
+		DRI2_AIGLX=yes
+	else
+		AC_MSG_NOTICE([DRI2 AIGLX disabled, __DRI_DRI2 not defined in dri_interface.h.])
+		DRI2_AIGLX=no
+	fi
+fi
+AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" == xyes)
+
+
 AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes])
 if test "x$XINERAMA" = xyes; then
 	AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
diff --git a/glx/Makefile.am b/glx/Makefile.am
index 8c705a7..bec35bf 100644
--- a/glx/Makefile.am
+++ b/glx/Makefile.am
@@ -24,7 +24,7 @@ INCLUDES = \
 	-I$(top_srcdir)/hw/xfree86/dri \
 	-I$(top_srcdir)/mi
 
-if DRI2
+if DRI2_AIGLX
 INCLUDES += -I$(top_srcdir)/hw/xfree86/dri2
 endif
 
@@ -53,7 +53,7 @@ libglxdri_la_SOURCES = \
         extension_string.c \
         extension_string.h
 
-if DRI2
+if DRI2_AIGLX
 libglxdri_la_SOURCES += glxdri2.c
 endif
 
commit 3df1db67e37094ef263134a86ee82a36fc52f990
Author: Peter Hutterer <peter.hutterer at redhat.com>
Date:   Wed Dec 3 11:31:48 2008 +1000

    Xi: change XIUnRegisterPropertyHandler to XIUnregisterPropertyHandler
    
    CamelCase can be taken too far, and AFAICT there's no consumers of that
    function yet anyway.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at redhat.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 2ff5cae..01db856 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -121,7 +121,7 @@ XIRegisterPropertyHandler(DeviceIntPtr         dev,
 }
 
 void
-XIUnRegisterPropertyHandler(DeviceIntPtr dev, long id)
+XIUnregisterPropertyHandler(DeviceIntPtr dev, long id)
 {
     XIPropertyHandlerPtr curr, prev = NULL;
 
diff --git a/include/exevents.h b/include/exevents.h
index 8788295..7459b5c 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -240,7 +240,7 @@ extern long XIRegisterPropertyHandler(
                                Atom property)
 );
 
-extern void XIUnRegisterPropertyHandler(
+extern _X_EXPORT void XIUnregisterPropertyHandler(
         DeviceIntPtr          dev,
         long                  id
 );
commit ba666a969e938daa2176c12c4959393789b0a98d
Author: Keith Packard <keithp at keithp.com>
Date:   Tue Dec 9 20:36:41 2008 -0800

    Revert "dmx: claim we support XI 2."
    
    This reverts commit 8da8a0fec4b1b9d9208635dedb2f449dc99e0004.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index a0eb80f..77f8ed5 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -865,7 +865,7 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
     
     /* Print out information about the XInput Extension. */
     handler = XSetExtensionErrorHandler(dmxInputExtensionErrorHandler);
-    ext     = XQueryInputVersion(display, XI_2_Major, XI_2_Minor);
+    ext     = XGetExtensionVersion(display, INAME);
     XSetExtensionErrorHandler(handler);
     
     if (!ext || ext == (XExtensionVersion *)NoSuchExtension) {


More information about the xorg-commit mailing list