xserver: Branch 'master' - 4 commits

Keith Packard keithp at kemper.freedesktop.org
Mon Jul 14 02:54:40 PDT 2014


 dix/getevents.c                |   80 ++++++++++-------------------------------
 hw/xfree86/common/xf86Config.c |    2 -
 hw/xfree86/common/xf86DPMS.c   |    2 -
 os/log.c                       |    2 -
 4 files changed, 23 insertions(+), 63 deletions(-)

New commits:
commit 9a19bf06b5b409fa0d5b5932e29cd4c5545052c5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 14 15:05:58 2014 +1000

    Revert "dix: fix up coordinate scaling when external monitors are present"
    
    This reverts commit d90b5f83010248be65b2039b0b2d0b9e6a4e93cf.
    
    Reverting for two reasons:
    * the scaling does not work on devices that don't advertise resolution, and
      the default resolution used (100 units/mm) is higher than most devices,
      resulting in a significant slowdown of the touchpads.
    * the scaling is still affected by resolution changing. The patch worked
      before acceleration but since it maps into resolution-dependent dx/dy
      coordinates the acceleration may distort the movement after the fact. So the
      same input data generates different movements depending on the resolution.
      This can't easily be fixed for all affected devices as synaptics has its own
      velocity calculation method whereas wacom doesn't. So anything in the server
      won't work for both at the same time.
    
    Revert this for now, until a more integrated solution can be implemented.

diff --git a/dix/getevents.c b/dix/getevents.c
index d68fa96..ffa89fa 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -770,65 +770,27 @@ add_to_scroll_valuator(DeviceIntPtr dev, ValuatorMask *mask, int valuator, doubl
 }
 
 
-/* FIXME: relative events from devices with absolute axis ranges is
-   fundamentally broken. We map the device coordinate range into the screen
-   range, but don't really account for device resolution in that.
-
-   what we do here is a hack to make touchpads usable. for a given relative
-   motion vector in device coordinates:
-   1. calculate physical movement on the device in metres
-   2. calculate pixel vector that is the same physical movement on the
-      screen (times some magic number to provide sensible base speed)
-   3. calculate what percentage this vector is of the current screen
-      width/height
-   4. calculate equivalent vector in % on the device's min/max axis range
-   5. Use that device vector as the actual motion vector
-
-   e.g. 10/50mm on the device, 10/50mm on the screen are 30/100 pixels,
-   30/100 pixels are 1/3% of the width, 1/3% of the device is a vector of
-   20/80 -> use 20/80 as dx/dy.
-
-   dx/dy is then applied to the current position in device coordinates,
-   mapped to screen coordinates and thus the movement on the screen reflects
-   the motion direction on the device.
- */
 static void
 scale_for_device_resolution(DeviceIntPtr dev, ValuatorMask *mask)
 {
-    double x, y;
+    double y;
     ValuatorClassPtr v = dev->valuator;
     int xrange = v->axes[0].max_value - v->axes[0].min_value + 1;
     int yrange = v->axes[1].max_value - v->axes[1].min_value + 1;
 
-    /* Assume 100 units/m for devices without resolution */
-    int xres = 100000, yres = 100000;
-
-    /* If we have multiple screens with different dpi, it gets complicated:
-       we have to map which screen we're on and then take the dpi of that
-       screen to be somewhat accurate.  */
-    const ScreenPtr s = screenInfo.screens[0];
-    const double screen_res = 1000.0 * s->width/s->mmWidth; /* units/m */
+    double screen_ratio = 1.0 * screenInfo.width/screenInfo.height;
+    double device_ratio = 1.0 * xrange/yrange;
+    double resolution_ratio = 1.0;
+    double ratio;
 
-    /* some magic multiplier, so unaccelerated movement of x mm on the
-       device reflects x * magic mm on the screen */
-    const double magic = 4;
+    if (!valuator_mask_fetch_double(mask, 1, &y))
+        return;
 
-    if (v->axes[0].resolution != 0 && v->axes[1].resolution != 0) {
-        xres = v->axes[0].resolution;
-        yres = v->axes[1].resolution;
-    }
+    if (v->axes[0].resolution != 0 && v->axes[1].resolution != 0)
+        resolution_ratio = 1.0 * v->axes[0].resolution/v->axes[1].resolution;
 
-    if (valuator_mask_isset(mask, 0)) {
-        x = valuator_mask_get_double(mask, 0);
-        x = magic * x/xres * screen_res/screenInfo.width * xrange;
-        valuator_mask_set_double(mask, 0, x);
-    }
-
-    if (valuator_mask_isset(mask, 1)) {
-        y = valuator_mask_get_double(mask, 1);
-        y = magic * y/yres * screen_res/screenInfo.height * yrange;
-        valuator_mask_set_double(mask, 1, y);
-    }
+    ratio = device_ratio/resolution_ratio/screen_ratio;
+    valuator_mask_set_double(mask, 1, y / ratio);
 }
 
 /**
@@ -842,6 +804,15 @@ moveRelative(DeviceIntPtr dev, int flags, ValuatorMask *mask)
 {
     int i;
     Bool clip_xy = IsMaster(dev) || !IsFloating(dev);
+    ValuatorClassPtr v = dev->valuator;
+
+    /* for abs devices in relative mode, we've just scaled wrong, since we
+       mapped the device's shape into the screen shape. Undo this. */
+    if ((flags & POINTER_ABSOLUTE) == 0 && v && v->numAxes > 1 &&
+        v->axes[0].min_value < v->axes[0].max_value &&
+        v->axes[1].min_value < v->axes[1].max_value) {
+        scale_for_device_resolution(dev, mask);
+    }
 
     /* calc other axes, clip, drop back into valuators */
     for (i = 0; i < valuator_mask_size(mask); i++) {
@@ -1470,21 +1441,10 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
             set_raw_valuators(raw, &mask, raw->valuators.data);
     }
     else {
-        ValuatorClassPtr v = pDev->valuator;
-
         transformRelative(pDev, &mask);
 
-        /* for abs devices in relative mode, we've just scaled wrong, since we
-           mapped the device's shape into the screen shape. Undo this. */
-        if (v && v->numAxes > 1 &&
-            v->axes[0].min_value < v->axes[0].max_value &&
-            v->axes[1].min_value < v->axes[1].max_value) {
-            scale_for_device_resolution(pDev, &mask);
-        }
-
         if (flags & POINTER_ACCELERATE)
             accelPointer(pDev, &mask, ms);
-
         if ((flags & POINTER_NORAW) == 0 && raw)
             set_raw_valuators(raw, &mask, raw->valuators.data);
 
commit acc0b5edd1dc560b5c39dc44872b46581ec23903
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Fri Jul 11 15:56:35 2014 -0700

    xfree86: Only support one sysconfigdir
    
    When the X server is compiled with --prefix set to something other than /usr,
    then it ends up with a nonstandard sysconfigdir in its .pc file.  This causes
    various other components to install their xorg.conf.d snippets there.
    
    However, the X server first looks for /usr/share/X11/xorg.conf.d before looking
    in sysconfigdir.  That means that if the system administrator installed anything
    that created that path, the user's custom sysconfigdir is not searched.
    
    Rather than doing that, just look in the configured sysconfdir and nowhere else.
    
    Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 481674d..779ba6f 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -103,7 +103,7 @@
 					"/etc/X11/%X," "%C/X11/%X"
 #endif
 #ifndef SYS_CONFIGDIRPATH
-#define SYS_CONFIGDIRPATH	"/usr/share/X11/%X," "%D/X11/%X"
+#define SYS_CONFIGDIRPATH	"%D/X11/%X"
 #endif
 #ifndef PROJECTROOT
 #define PROJECTROOT	"/usr/X11R6"
commit 578b9283bcc129d0a35fabe2637c7622085ef1e8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jul 10 10:39:50 2014 +1000

    xfree86: don't force the screensaver off on DPMS unblank, merely suggest it
    
    Commit 41d4beb2616ceb3f1a1b8694733e85bae70de59a added symmetry to the
    screensaver/DPMS invocations so that one (en|dis)ables the other. Having
    dependencies between DPMS and the screensaver is subject to further arguments,
    but in this particular case using SCREENSAVER_FORCER is detrimental.
    SCREENSAVER_FORCER(ScreenSaverReset) resets the idle time for all
    devices on DPMS unblank.
    
    It prevents at least one use-case that GNOME tries to implement:
    GNOME displays a notification before suspending. If the display is
    currently blanked, GNOME lights it up to display the message. With the
    original patch in place DPMS unblank also resets the device idle times, thus
    restarting the timeout ad infinitum.
    
    Switch this to a more suggestive SCREENSAVER_OFF(ScreenSaverReset). This keeps
    the symmetry in blanking mode (DPMS and screensaver turn each other on/off as
    expected) but does not reset the idle time on the devices.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=731241
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Hans de Goede <hdegoede at redhat.com>
    Reviewed-By: Egbert Eich <eich at freedesktop.org>

diff --git a/hw/xfree86/common/xf86DPMS.c b/hw/xfree86/common/xf86DPMS.c
index 14d1f45..2b5a3ed 100644
--- a/hw/xfree86/common/xf86DPMS.c
+++ b/hw/xfree86/common/xf86DPMS.c
@@ -166,7 +166,7 @@ DPMSSet(ClientPtr client, int level)
                 return rc;
         }
     } else if (!xf86IsUnblank(screenIsSaved)) {
-        rc = dixSaveScreens(client, SCREEN_SAVER_FORCER, ScreenSaverReset);
+        rc = dixSaveScreens(client, SCREEN_SAVER_OFF, ScreenSaverReset);
         if (rc != Success)
             return rc;
     }
commit daa1a9d22db8e83d1933d8403acf72626199ee2a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 7 08:27:44 2014 +1000

    os: prevent negative array index access (#80890)
    
    If an empty string is provided to LogMessageVerbSigSafe, the length of the
    printed string is 0.
    
    Read-only access only and the only effect it had was adding a linebreak or not.
    
    X.Org Bug 80890 <http://bugs.freedesktop.org/show_bug.cgi?id=80890>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/os/log.c b/os/log.c
index a368569..2a721b9 100644
--- a/os/log.c
+++ b/os/log.c
@@ -697,7 +697,7 @@ LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list a
     if (sizeof(buf) - len == 1)
         buf[len - 1] = '\n';
 
-    newline = (buf[len - 1] == '\n');
+    newline = (len > 0 && buf[len - 1] == '\n');
     LogSWrite(verb, buf, len, newline);
 }
 


More information about the xorg-commit mailing list