[Xquartz-changes] xserver: Branch 'master' - 25 commits

Jeremy Huddleston jeremyhu at freedesktop.org
Fri Jun 6 01:04:37 PDT 2014


 Xi/exevents.c                           |    4 +
 config/10-quirks.conf                   |   16 ----
 configure.ac                            |    8 +-
 dix/devices.c                           |    7 -
 dix/events.c                            |    2 
 fb/fbscreen.c                           |    2 
 hw/xfree86/common/compiler.h            |    5 +
 hw/xfree86/common/xf86Config.c          |    2 
 hw/xfree86/loader/loadmod.c             |    6 +
 hw/xfree86/os-support/linux/lnx_video.c |    3 
 hw/xfree86/xorgconf.cpp                 |    2 
 hw/xwin/glx/indirect.c                  |   13 ---
 include/misc.h                          |   18 ++--
 include/servermd.h                      |   14 +++
 include/xwin-config.h.in                |    3 
 man/Xserver.man                         |    5 -
 mi/mieq.c                               |    4 +
 os/log.c                                |   65 ++++++++--------
 present/present.c                       |  126 ++++++++++++++++++++++----------
 present/present_priv.h                  |    1 
 test/input.c                            |   14 +++
 xfixes/cursor.c                         |    2 
 22 files changed, 199 insertions(+), 123 deletions(-)

New commits:
commit e27a839bf0488d5b1cc2e2a887f2ea0e3d790790
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Thu Jun 5 20:38:44 2014 -0700

    mi: Build fix: mieqProcessDeviceEvent returns void
    
    mieq.c:520:9: error: void function 'mieqProcessDeviceEvent' should not return a value [-Wreturn-type,Semantic Issue]
            return 0;
            ^      ~
    1 error generated.
    
    Regression-from: 9fb08310b51b46736f3ca8dbc04efdf502420403
    Found-by: Tinderbox
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mieq.c b/mi/mieq.c
index 0e27405..872ff93 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -517,7 +517,7 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, InternalEvent *event, ScreenPtr screen)
 
     /* refuse events from disabled devices */
     if (!dev->enabled)
-        return 0;
+        return;
 
     /* Custom event handler */
     handler = miEventQueue.handlers[event->any.type];
commit 08820f03768e904f1746ef93ca01660330dc5406
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Jun 4 22:28:57 2014 -0700

    Update to version 1.15.99.903
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index e3d991d..0a6e772 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,9 +26,9 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.60)
-AC_INIT([xorg-server], 1.15.99.902, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
-RELEASE_DATE="2014-04-08"
-RELEASE_NAME="Glacier Blue"
+AC_INIT([xorg-server], 1.15.99.903, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+RELEASE_DATE="2014-06-04"
+RELEASE_NAME="Strawberry Shortcake"
 AC_CONFIG_SRCDIR([Makefile.am])
 AC_CONFIG_MACRO_DIR([m4])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
commit 9fb08310b51b46736f3ca8dbc04efdf502420403
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 21 10:07:31 2014 +1000

    mi: don't process events from disabled devices (#77884)
    
    Once a device is disabled, it doesn't have a sprite pointer anymore. If an
    event is still in the queue and processed after DisableDevice finished, a
    dereference causes a crash. Example backtrace (crash forced by injecting an
    event at the right time):
    
    (EE) 0: /opt/xorg/bin/Xorg (OsSigHandler+0x3c) [0x48d334]
    (EE) 1: /lib64/libpthread.so.0 (__restore_rt+0x0) [0x37fcc0f74f]
    (EE) 2: /opt/xorg/bin/Xorg (mieqMoveToNewScreen+0x38) [0x609240]
    (EE) 3: /opt/xorg/bin/Xorg (mieqProcessDeviceEvent+0xd4) [0x609389]
    (EE) 4: /opt/xorg/bin/Xorg (mieqProcessInputEvents+0x206) [0x609720]
    (EE) 5: /opt/xorg/bin/Xorg (ProcessInputEvents+0xd) [0x4aeb58]
    (EE) 6: /opt/xorg/bin/Xorg (xf86VTSwitch+0x1a6) [0x4af457]
    (EE) 7: /opt/xorg/bin/Xorg (xf86Wakeup+0x2bf) [0x4af0a7]
    (EE) 8: /opt/xorg/bin/Xorg (WakeupHandler+0x83) [0x4445cb]
    (EE) 9: /opt/xorg/bin/Xorg (WaitForSomething+0x3fe) [0x491bf6]
    (EE) 10: /opt/xorg/bin/Xorg (Dispatch+0x97) [0x435748]
    (EE) 11: /opt/xorg/bin/Xorg (dix_main+0x61d) [0x4438a9]
    (EE) 12: /opt/xorg/bin/Xorg (main+0x28) [0x49ba28]
    (EE) 13: /lib64/libc.so.6 (__libc_start_main+0xf5) [0x37fc821d65]
    (EE) 14: /opt/xorg/bin/Xorg (_start+0x29) [0x425e69]
    (EE) 15: ? (?+0x29) [0x29]
    
    xf86VTSwitch() calls ProcessInputEvents() before disabling a device, and
    DisableDevice() calls mieqProcessInputEvents() again when flushing touches and
    button events. Between that and disabling the device (which causes new events
    to be refused) there is a window where events may be triggered and enqueued.
    On the next call to PIE that event is processed on a now defunct device,
    causing the crash.
    
    The simplest fix to this is to discard events from disabled devices. We flush
    the queue often enough before disabling that when we get here, we really don't
    care about the events from this device.
    
    X.Org Bug 77884 <http://bugs.freedesktop.org/show_bug.cgi?id=77884>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reported-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
    Tested-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/mi/mieq.c b/mi/mieq.c
index 36aa213..0e27405 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -515,6 +515,10 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, InternalEvent *event, ScreenPtr screen)
 
     verify_internal_event(event);
 
+    /* refuse events from disabled devices */
+    if (!dev->enabled)
+        return 0;
+
     /* Custom event handler */
     handler = miEventQueue.handlers[event->any.type];
 
diff --git a/test/input.c b/test/input.c
index 9b5db89..a4615c9 100644
--- a/test/input.c
+++ b/test/input.c
@@ -1712,6 +1712,18 @@ mieq_test_event_handler(int screenNum, InternalEvent *ie, DeviceIntPtr dev)
 static void
 _mieq_test_generate_events(uint32_t start, uint32_t count)
 {
+    static DeviceIntRec dev;
+    static SpriteInfoRec spriteInfo;
+    static SpriteRec sprite;
+
+    memset(&dev, 0, sizeof(dev));
+    memset(&spriteInfo, 0, sizeof(spriteInfo));
+    memset(&sprite, 0, sizeof(sprite));
+    dev.spriteInfo = &spriteInfo;
+    spriteInfo.sprite = &sprite;
+
+    dev.enabled = 1;
+
     count += start;
     while (start < count) {
         RawDeviceEvent e = { 0 };
@@ -1721,7 +1733,7 @@ _mieq_test_generate_events(uint32_t start, uint32_t count)
         e.time = GetTimeInMillis();
         e.flags = start;
 
-        mieqEnqueue(NULL, (InternalEvent *) &e);
+        mieqEnqueue(&dev, (InternalEvent *) &e);
 
         start++;
     }
commit e6f5d9d7b7efdacea0f22f1808efca849bcede4c
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jan 27 11:23:58 2014 -0800

    present: Queue flips for later execution
    
    When a flip (or unflip) is pending and a flip request comes in, leave
    it queued until the pending flip completes and then execute it.
    
    This fixes a bug where an application submitting back-to-back
    present_pixmap requests for sequential frames would alternate between
    flipping and copying as the pending flip would cause the new
    present_pixmap request to not use a flip.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Tested-by: Frank Binns <frank.binns at imgtec.com>

diff --git a/present/present.c b/present/present.c
index 73d5f69..1bf3a58 100644
--- a/present/present.c
+++ b/present/present.c
@@ -42,6 +42,9 @@ static struct xorg_list present_flip_queue;
 #define DebugPresent(x)
 #endif
 
+static void
+present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
+
 /*
  * Copies the update region from a pixmap to the target drawable
  */
@@ -78,6 +81,20 @@ present_copy_region(DrawablePtr drawable,
     FreeScratchGC(gc);
 }
 
+static inline PixmapPtr
+present_flip_pending_pixmap(ScreenPtr screen)
+{
+    present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
+
+    if (!screen_priv)
+        return NULL;
+
+    if (!screen_priv->flip_pending)
+        return NULL;
+        
+    return screen_priv->flip_pending->pixmap;
+}
+
 static Bool
 present_check_flip(RRCrtcPtr    crtc,
                    WindowPtr    window,
@@ -88,6 +105,7 @@ present_check_flip(RRCrtcPtr    crtc,
                    int16_t      y_off)
 {
     ScreenPtr                   screen = window->drawable.pScreen;
+    PixmapPtr                   window_pixmap;
     WindowPtr                   root = screen->root;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
 
@@ -104,19 +122,11 @@ present_check_flip(RRCrtcPtr    crtc,
     if (!screen_priv->info->flip)
         return FALSE;
 
-    /* Can't pend a flip while unflipping */
-    if (screen_priv->unflip_event_id) {
-        return FALSE;
-    }
-
-    /* Can't have two pending flips at the same time */
-    if (screen_priv->flip_pending) {
-        return FALSE;
-    }
-
     /* Make sure the window hasn't been redirected with Composite */
-    if (screen->GetWindowPixmap(window) != screen->GetScreenPixmap(screen) &&
-        screen->GetWindowPixmap(window) != screen_priv->flip_pixmap)
+    window_pixmap = screen->GetWindowPixmap(window);
+    if (window_pixmap != screen->GetScreenPixmap(screen) &&
+        window_pixmap != screen_priv->flip_pixmap &&
+        window_pixmap != present_flip_pending_pixmap(screen))
         return FALSE;
 
     /* Check for full-screen window */
@@ -147,6 +157,7 @@ present_check_flip(RRCrtcPtr    crtc,
     /* Ask the driver for permission */
     if (screen_priv->info->check_flip) {
         if (!(*screen_priv->info->check_flip) (crtc, window, pixmap, sync_flip)) {
+            DebugPresent(("\td %08lx -> %08lx\n", window->drawable.id, pixmap ? pixmap->drawable.id : 0));
             return FALSE;
         }
     }
@@ -188,8 +199,10 @@ present_pixmap_idle(PixmapPtr pixmap, WindowPtr window, CARD32 serial, struct pr
 {
     if (present_fence)
         present_fence_set_triggered(present_fence);
-    if (window)
+    if (window) {
+        DebugPresent(("\ti %08lx\n", pixmap ? pixmap->drawable.id : 0));
         present_send_idle_notify(window, serial, pixmap, present_fence);
+    }
 }
 
 RRCrtcPtr
@@ -227,9 +240,8 @@ present_query_capabilities(RRCrtcPtr crtc)
 }
 
 static int
-present_get_ust_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t *ust, uint64_t *msc)
+present_get_ust_msc(ScreenPtr screen, RRCrtcPtr crtc, uint64_t *ust, uint64_t *msc)
 {
-    ScreenPtr                   screen = window->drawable.pScreen;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
 
     if (crtc == NULL)
@@ -283,7 +295,7 @@ present_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t window_msc
          * we'll just use whatever previous MSC we'd seen from this CRTC
          */
 
-        if (present_get_ust_msc(window, window_priv->crtc, &old_ust, &old_msc) != Success)
+        if (present_get_ust_msc(window->drawable.pScreen, window_priv->crtc, &old_ust, &old_msc) != Success)
             old_msc = window_priv->msc;
 
         window_priv->msc_offset += new_msc - old_msc;
@@ -293,6 +305,34 @@ present_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t window_msc
     return window_msc + window_priv->msc_offset;
 }
 
+/*
+ * When the wait fence or previous flip is completed, it's time
+ * to re-try the request
+ */
+static void
+present_re_execute(present_vblank_ptr vblank)
+{
+    uint64_t            ust = 0, crtc_msc = 0;
+
+    if (vblank->crtc)
+        (void) present_get_ust_msc(vblank->screen, vblank->crtc, &ust, &crtc_msc);
+
+    present_execute(vblank, ust, crtc_msc);
+}
+
+static void
+present_flip_try_ready(ScreenPtr screen)
+{
+    present_vblank_ptr  vblank, tmp;
+
+    xorg_list_for_each_entry_safe(vblank, tmp, &present_exec_queue, event_queue) {
+        if (vblank->flip_ready) {
+            present_re_execute(vblank);
+            return;
+        }
+    }
+}
+
 static void
 present_flip_idle(ScreenPtr screen)
 {
@@ -369,16 +409,14 @@ present_unflip(ScreenPtr screen)
 }
 
 static void
-present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
-
-static void
 present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
 {
     ScreenPtr                   screen = vblank->screen;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
 
-    DebugPresent(("\tn %p %8lld: %08lx -> %08lx\n", vblank, vblank->target_msc,
-           vblank->pixmap ? vblank->pixmap->drawable.id : 0,
+    DebugPresent(("\tn %lld %p %8lld: %08lx -> %08lx\n",
+                  vblank->event_id, vblank, vblank->target_msc,
+                  vblank->pixmap ? vblank->pixmap->drawable.id : 0,
                   vblank->window->drawable.id));
 
     assert (vblank == screen_priv->flip_pending);
@@ -404,6 +442,8 @@ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
 
     present_vblank_notify(vblank, PresentCompleteKindPixmap, PresentCompleteModeFlip, ust, crtc_msc);
     present_vblank_destroy(vblank);
+
+    present_flip_try_ready(screen);
 }
 
 void
@@ -436,6 +476,7 @@ present_event_notify(uint64_t event_id, uint64_t ust, uint64_t msc)
             DebugPresent(("\tun %lld\n", event_id));
             screen_priv->unflip_event_id = 0;
             present_flip_idle(screen);
+            present_flip_try_ready(screen);
             return;
         }
     }
@@ -498,15 +539,7 @@ static void
 present_wait_fence_triggered(void *param)
 {
     present_vblank_ptr  vblank = param;
-    WindowPtr           window = vblank->window;
-    uint64_t            ust = 0, crtc_msc = 0;
-
-    if (window) {
-        present_window_priv_ptr     window_priv = present_get_window_priv(window, TRUE);
-        if (window_priv)
-            (void) present_get_ust_msc(window, window_priv->crtc, &ust, &crtc_msc);
-    }
-    present_execute(vblank, ust, crtc_msc);
+    present_re_execute(vblank);
 }
 
 /*
@@ -534,14 +567,27 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
         }
     }
 
+    if (vblank->flip && vblank->pixmap && vblank->window) {
+        if (screen_priv->flip_pending || screen_priv->unflip_event_id) {
+            DebugPresent(("\tr %lld %p (pending %p unflip %lld)\n",
+                          vblank->event_id, vblank,
+                          screen_priv->flip_pending, screen_priv->unflip_event_id));
+            vblank->flip_ready = TRUE;
+            return;
+        }
+    }
+
     xorg_list_del(&vblank->event_queue);
     vblank->queued = FALSE;
 
     if (vblank->pixmap && vblank->window) {
 
-        if (vblank->flip && screen_priv->flip_pending == NULL && !screen_priv->unflip_event_id) {
+        if (vblank->flip) {
+
+            DebugPresent(("\tf %lld %p %8lld: %08lx -> %08lx\n",
+                          vblank->event_id, vblank, crtc_msc,
+                          vblank->pixmap->drawable.id, vblank->window->drawable.id));
 
-            DebugPresent(("\tf %p %8lld: %08lx -> %08lx\n", vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id));
             /* Prepare to flip by placing it in the flip queue and
              * and sticking it into the flip_pending field
              */
@@ -644,7 +690,7 @@ present_pixmap(WindowPtr window,
     uint64_t                    target_msc;
     uint64_t                    crtc_msc;
     int                         ret;
-    present_vblank_ptr          vblank;
+    present_vblank_ptr          vblank, tmp;
     ScreenPtr                   screen = window->drawable.pScreen;
     present_window_priv_ptr     window_priv = present_get_window_priv(window, TRUE);
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
@@ -664,7 +710,7 @@ present_pixmap(WindowPtr window,
             target_crtc = present_get_crtc(window);
     }
 
-    present_get_ust_msc(window, target_crtc, &ust, &crtc_msc);
+    present_get_ust_msc(screen, target_crtc, &ust, &crtc_msc);
 
     target_msc = present_window_to_crtc_msc(window, target_crtc, window_msc, crtc_msc);
 
@@ -698,7 +744,7 @@ present_pixmap(WindowPtr window,
      */
 
     if (!update) {
-        xorg_list_for_each_entry(vblank, &window_priv->vblank, window_list) {
+        xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->vblank, window_list) {
 
             if (!vblank->pixmap)
                 continue;
@@ -706,11 +752,11 @@ present_pixmap(WindowPtr window,
             if (!vblank->queued)
                 continue;
 
-            if (vblank->crtc != target_crtc || vblank->target_msc != target_msc)
+            if (vblank->crtc != target_crtc || vblank->target_msc > target_msc)
                 continue;
 
             DebugPresent(("\tx %lld %p %8lld: %08lx -> %08lx (crtc %p)\n",
-                          vblank->event_id, vblank, target_msc,
+                          vblank->event_id, vblank, vblank->target_msc,
                           vblank->pixmap->drawable.id, vblank->window->drawable.id,
                           vblank->crtc));
 
@@ -720,6 +766,9 @@ present_pixmap(WindowPtr window,
 
             vblank->pixmap = NULL;
             vblank->idle_fence = NULL;
+            vblank->flip = FALSE;
+            if (vblank->flip_ready)
+                present_re_execute(vblank);
         }
     }
 
@@ -875,7 +924,8 @@ present_vblank_destroy(present_vblank_ptr vblank)
     /* Remove vblank from window and screen lists */
     xorg_list_del(&vblank->window_list);
 
-    DebugPresent(("\td %p %8lld: %08lx -> %08lx\n", vblank, vblank->target_msc,
+    DebugPresent(("\td %lld %p %8lld: %08lx -> %08lx\n",
+                  vblank->event_id, vblank, vblank->target_msc,
                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
                   vblank->window->drawable.id));
 
diff --git a/present/present_priv.h b/present/present_priv.h
index 8d3e007..d8569a2 100644
--- a/present/present_priv.h
+++ b/present/present_priv.h
@@ -71,6 +71,7 @@ struct present_vblank {
     int                 num_notifies;
     Bool                queued;         /* on present_exec_queue */
     Bool                flip;           /* planning on using flip */
+    Bool                flip_ready;     /* wants to flip, but waiting for previous flip or unflip */
     Bool                sync_flip;      /* do flip synchronous to vblank */
     Bool                abort_flip;     /* aborting this flip */
 };
commit 2f5cf9ff9a0f713b7e038636484c77f113a5f10a
Author: Frank Binns <frank.binns at imgtec.com>
Date:   Thu Apr 24 11:37:48 2014 +0100

    xfixes: disable cursor on X server reset
    
    The initial state of the cursor is set to disabled but this was
    never be re-disabled during X server reset. This meant any
    application run after an X server reset would have the cursor
    displayed even if it hadn't requested this to be the case.
    
    Signed-off-by: Frank Binns <frank.binns at imgtec.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 2c4b57c..31a408f 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -1056,6 +1056,8 @@ XFixesCursorInit(void)
 
     if (party_like_its_1989)
         CursorVisible = EnableCursor;
+    else
+        CursorVisible = FALSE;
 
     if (!dixRegisterPrivateKey(&CursorScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
         return FALSE;
commit b92d86a982504af2605042c19ef796d135074ee1
Author: Brendan King <brendan.king at imgtec.com>
Date:   Thu Apr 24 11:37:47 2014 +0100

    dix: fix pixmap leak on server reset
    
    The server is leaking a pixmap (created by CreateDefaultStipple()) on
    reset. The leak is caused by some X Server graphics contexts not being
    freed on reset by the machine independent cursor code in the server,
    which in turn is caused by the cursor cleanup code
    (miSpriteDeviceCursorCleanup()) not being called.
    
    Ensures the DeviceCursorCleanup() function is called when the associated
    input device is closed on server reset.
    
    Signed-off-by: Frank Binns <frank.binns at imgtec.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/dix/devices.c b/dix/devices.c
index 73f60f4..7f079ff 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -946,8 +946,9 @@ CloseDevice(DeviceIntPtr dev)
     if (dev->inited)
         (void) (*dev->deviceProc) (dev, DEVICE_CLOSE);
 
-    /* free sprite memory */
-    if (IsMaster(dev) && dev->spriteInfo->sprite)
+    FreeSprite(dev);
+
+    if (IsMaster(dev))
         screen->DeviceCursorCleanup(dev, screen);
 
     /* free acceleration info */
@@ -968,8 +969,6 @@ CloseDevice(DeviceIntPtr dev)
         free(classes);
     }
 
-    FreeSprite(dev);
-
     /* a client may have the device set as client pointer */
     for (j = 0; j < currentMaxClients; j++) {
         if (clients[j] && clients[j]->clientPtr == dev) {
commit a99c061aafd4aaa5728c776dca7d0a1789ac739a
Author: Brendan King <brendan.king at imgtec.com>
Date:   Thu Apr 24 11:37:46 2014 +0100

    dix: reference the cursor just once in InitializeSprite()
    
    The new current cursor was being referenced twice, resulting in a
    memory leak when the current server generation ended.
    
    Signed-off-by: Frank Binns <frank.binns at imgtec.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/dix/events.c b/dix/events.c
index 7e7a1c9..b8c67fd 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3237,7 +3237,7 @@ InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
     pCursor = RefCursor(pCursor);
     if (pSprite->current)
         FreeCursor(pSprite->current, None);
-    pSprite->current = RefCursor(pCursor);
+    pSprite->current = pCursor;
 
     if (pScreen) {
         (*pScreen->RealizeCursor) (pDev, pScreen, pSprite->current);
commit 444a1f7a8802999e27ecf5f6eb598df2206f7277
Author: Brendan King <brendan.king at imgtec.com>
Date:   Thu Apr 24 11:37:45 2014 +0100

    fb: fix screen pixmap leak on server reset
    
    Call FreePixmap() instead of free() to destroy the screen pixmap in
    fbCloseScreen().
    
    Signed-off-by: Frank Binns <frank.binns at imgtec.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/fb/fbscreen.c b/fb/fbscreen.c
index b2b9739..1f91089 100644
--- a/fb/fbscreen.c
+++ b/fb/fbscreen.c
@@ -37,7 +37,7 @@ fbCloseScreen(ScreenPtr pScreen)
         free(depths[d].vids);
     free(depths);
     free(pScreen->visuals);
-    free(pScreen->devPrivate);
+    FreePixmap((PixmapPtr)pScreen->devPrivate);
     return TRUE;
 }
 
commit 7ca458493aa2f0aa091c989ea0768611e0730bf5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 28 08:14:00 2014 +0100

    xfree86: Report Present as a built-in module
    
    This is so that drivers can do a runtime check that Present is available,
    similar to existing runtime checks performed by the drivers for DRI.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
index f92ad8d..e1f649a 100644
--- a/hw/xfree86/loader/loadmod.c
+++ b/hw/xfree86/loader/loadmod.c
@@ -841,6 +841,9 @@ static const char *compiled_in_modules[] = {
 #if DRI3
     "dri3",
 #endif
+#if PRESENT
+    "present",
+#endif
     NULL
 };
 
commit 746be5a03ebbda4ab411ca3efb2ed95f99e9ea46
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 28 08:13:59 2014 +0100

    xfree86: Report DRI3 as a built-in module
    
    This is so that drivers can do a runtime check that DRI3 is available,
    similar to existing runtime checks performed by the drivers for DRI and
    DRI2.
    
    v2: Only add DRI3 to the list if the module was actually built into the
    server (Mark Kettenis).
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Mark Kettenis <mark.kettenis at xs4all.nl>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
index 092bf57..f92ad8d 100644
--- a/hw/xfree86/loader/loadmod.c
+++ b/hw/xfree86/loader/loadmod.c
@@ -838,6 +838,9 @@ static const char *compiled_in_modules[] = {
     "extmod",
     "dri",
     "dri2",
+#if DRI3
+    "dri3",
+#endif
     NULL
 };
 
commit b5526141f78df15bc5df2497bc4b4a17f1a6368d
Merge: dc8d068 a205ec3
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jun 2 13:08:23 2014 -0700

    Merge remote-tracking branch 'jturney/master'

commit dc8d0688471695ec5a8db5fef93fbcfc064891d5
Author: Max Filippov <jcmvbkbc at gmail.com>
Date:   Mon Jun 2 01:17:31 2014 +0400

    xtensa: add support for xtensa architecture
    
    Signed-off-by: Max Filippov <jcmvbkbc at gmail.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/compiler.h b/hw/xfree86/common/compiler.h
index 0319de0..1bd8def 100644
--- a/hw/xfree86/common/compiler.h
+++ b/hw/xfree86/common/compiler.h
@@ -1352,7 +1352,10 @@ stl_u(unsigned long val, unsigned int *p)
 #else                           /* ix86 */
 
 #if !defined(__SUNPRO_C)
-#if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__m32r__) && !defined(__aarch64__) && !defined(__arc__)
+#if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && \
+    !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && \
+    !defined(__m32r__) && !defined(__aarch64__) && !defined(__arc__) && \
+    !defined(__xtensa__)
 #ifdef GCCUSESGAS
 
 /*
diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
index 40765fc..652f963 100644
--- a/hw/xfree86/os-support/linux/lnx_video.c
+++ b/hw/xfree86/os-support/linux/lnx_video.c
@@ -60,7 +60,8 @@ static Bool ExtendedEnabled = FALSE;
       !defined(__nds32__) && \
       !defined(__arm__) && \
       !defined(__aarch64__) && \
-      !defined(__arc__)
+      !defined(__arc__) && \
+      !defined(__xtensa__)
 
 /*
  * Due to conflicts with "compiler.h", don't rely on <sys/io.h> to declare
diff --git a/include/servermd.h b/include/servermd.h
index 2d1ccb1..081123b 100644
--- a/include/servermd.h
+++ b/include/servermd.h
@@ -313,6 +313,20 @@ SOFTWARE.
 
 #endif                          /* ARC */
 
+#ifdef __xtensa__
+
+#ifdef __XTENSA_EL__
+#define IMAGE_BYTE_ORDER        LSBFirst
+#define BITMAP_BIT_ORDER        LSBFirst
+#endif
+#ifdef __XTENSA_EB__
+#define IMAGE_BYTE_ORDER        MSBFirst
+#define BITMAP_BIT_ORDER        MSBFirst
+#endif
+#define GLYPHPADBYTES           4
+
+#endif                          /* __xtensa__ */
+
 /* size of buffer to use with GetImage, measured in bytes. There's obviously
  * a trade-off between the amount of heap used and the number of times the
  * ddx routine has to be called.
commit a6ffdc69c4ac45bc39924159c7fab5f02f720f1f
Merge: 63c48de 1c10b37
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jun 2 11:30:24 2014 -0700

    Merge remote-tracking branch 'jeremyhu/master'

commit 63c48de63becdee680e90cb2363984c2f8f77fd1
Author: Søren Sandmann <soren.sandmann at gmail.com>
Date:   Fri May 30 16:50:35 2014 -0400

    xfree86: Add "modesetting" to list of fallback drivers
    
    To make X -configure work properly, the output of fixup_video_driver_list()
    should be in order of preference. Otherwise, the config file may use
    the incorrect driver for some devices.
    
    In particular, the drivers that work for all (or many) devices need to be
    last in the list. Since the modesetting driver works for many devices,
    it needs to be considered a fallback driver.
    
    Signed-off-by: Søren Sandmann <ssp at redhat.com>
    Acked-by: Daniel Stone <daniels at collabora.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 2adef44..481674d 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -519,7 +519,7 @@ xf86InputDriverlistFromConfig(void)
 static void
 fixup_video_driver_list(const char **drivers)
 {
-    static const char *fallback[4] = { "fbdev", "vesa", "wsfb", NULL };
+    static const char *fallback[5] = { "modesetting", "fbdev", "vesa", "wsfb", NULL };
     const char **end, **drv;
     const char *x;
     int i;
commit ab47ec9636b21a7f542d2e8612834915e7c8cc64
Merge: 0df871c cfaf2ab
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jun 2 11:22:48 2014 -0700

    Merge remote-tracking branch 'whot/for-keith'

commit 0df871cf34ee5f1a85586206027de9b02fb364ec
Author: Robert Ancell <robert.ancell at canonical.com>
Date:   Thu May 22 10:43:52 2014 +1200

    Fix overflow checking extension versions
    
    The easiest way to check for the version of an extension is to send the maximum
    possible version numbers in the QueryVersion request. The X server overflows on
    these as it assumes you will send a reasonable version number.
    
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/include/misc.h b/include/misc.h
index 17de710..9c2f573 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -259,15 +259,19 @@ extern void FormatDouble(double dbl, char *string);
  * or a value greater than 0
  */
 static inline int
-version_compare(uint16_t a_major, uint16_t a_minor,
-                uint16_t b_major, uint16_t b_minor)
+version_compare(uint32_t a_major, uint32_t a_minor,
+                uint32_t b_major, uint32_t b_minor)
 {
-    int a, b;
+    if (a_major > b_major)
+        return 1;
+    if (a_major < b_major)
+        return -1;
+    if (a_minor > b_minor)
+        return 1;
+    if (a_minor < b_minor)
+        return -1;
 
-    a = a_major << 16 | a_minor;
-    b = b_major << 16 | b_minor;
-
-    return (a - b);
+    return 0;
 }
 
 /* some macros to help swap requests, replies, and events */
commit 4cbd3fabaa41e89579530bceb01b9239fa2afdb7
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed May 21 09:22:49 2014 -0400

    configure: Require sufficiently new wayland-client for xwayland ddx
    
    The explicit release requests were added in 1.3.0, don't try to build
    against older.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Jasper St. Pierre <jstpierre at mecheye.net>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index e5387bf..e3d991d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2442,7 +2442,7 @@ AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
 
 dnl Xwayland DDX
 
-PKG_CHECK_MODULES(XWAYLANDMODULES, [wayland-client libdrm epoxy], [have_xwayland=yes], [have_xwayland=no])
+PKG_CHECK_MODULES(XWAYLANDMODULES, [wayland-client >= 1.3.0 libdrm epoxy], [have_xwayland=yes], [have_xwayland=no])
 AC_MSG_CHECKING([whether to build Xwayland DDX])
 if test "x$XWAYLAND" = xauto; then
    XWAYLAND="$have_xwayland"
commit a205ec3ab77c6765d44f77c526a832345fef77b0
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Sat Apr 5 15:15:46 2014 +0100

    configure: Restore DEFAULT_LOGDIR to xwin-config.h, it is used
    
    Commit f37a46913489397d8628ffe578c8d4ed50b6ca72 removed this from
    xwin-config.h.in for some reason, but it is used.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/include/xwin-config.h.in b/include/xwin-config.h.in
index a5e6b17..176c019 100644
--- a/include/xwin-config.h.in
+++ b/include/xwin-config.h.in
@@ -26,5 +26,8 @@
 /* Vendor web address for support */
 #undef __VENDORDWEBSUPPORT__
 
+/* Default log location */
+#undef DEFAULT_LOGDIR
+
 /* Whether we should re-locate the root to where the executable lives */
 #undef RELOCATE_PROJECTROOT
commit aaaa41345674a1c76a70836394cb5e57f82e9a26
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Sun Apr 27 20:55:51 2014 +0100

    hw/xwin: Update for __glXLastContext -> lastGLContext
    
    Update for __glXLastContext -> lastGLContext.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 6906114..9bfaac0 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -929,17 +929,6 @@ glxWinDrawableDestroy(__GLXdrawable * base)
 {
     __GLXWinDrawable *glxPriv = (__GLXWinDrawable *) base;
 
-    if (glxPriv->drawContext &&
-        (__glXLastContext == &((glxPriv->drawContext)->base))) {
-        // if this context is current and has unflushed commands, say we have flushed them
-        // (don't actually flush them, the window is going away anyhow, and an implict flush occurs
-        // on the next context change)
-        // (GLX core considers it an error when we try to select a new current context if the old one
-        // has unflushed commands, but the window has disappeared..)
-        __glXLastContext->hasUnflushedCommands = FALSE;
-        __glXLastContext = NULL;
-    }
-
     if (glxPriv->hPbuffer)
         if (!wglDestroyPbufferARBWrapper(glxPriv->hPbuffer)) {
             ErrorF("wglDestroyPbufferARB failed: %s\n", glxWinErrorMessage());
@@ -1542,7 +1531,7 @@ glxWinContextLoseCurrent(__GLXcontext * base)
        An error seems to be reported if we try to make no context current
        if there is already no current context, so avoid doing that...
      */
-    if (__glXLastContext != NULL) {
+    if (wglGetCurrentContext() != NULL) {
         ret = wglMakeCurrent(NULL, NULL);       /* We don't need a DC when setting no current context */
         if (!ret)
             ErrorF("glxWinContextLoseCurrent error: %s\n",
commit cfaf2abbac3f01e57d00845d8908bf01559263f9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat May 24 20:05:53 2014 +1000

    man: drop specific mention of DontZap in -retro (#71113)
    
    DontZap off is the default anyway, don't mention it specifically to avoid
    confusion
    
    X.Org Bug 71113 <http://bugs.freedesktop.org/show_bug.cgi?id=71113>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/man/Xserver.man b/man/Xserver.man
index b103551..7a74e85 100644
--- a/man/Xserver.man
+++ b/man/Xserver.man
@@ -223,9 +223,8 @@ turns on auto-repeat.
 .B -retro
 starts the stipple with the classic stipple and cursor visible.  The default
 is to start with a black root window, and to suppress display of the cursor
-until the first time an application calls XDefineCursor().  For the Xorg
-server, this also sets the default for the DontZap option to FALSE.  For
-kdrive servers, this implies -zap.
+until the first time an application calls XDefineCursor(). For kdrive
+servers, this implies -zap.
 .TP 8
 .B \-s \fIminutes\fP
 sets screen-saver timeout time in minutes.
commit e48a132b6d187f355abd7021be47edde972e7091
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat May 24 20:02:56 2014 +1000

    xfree86: fix wrong DontZap documentation (#71113)
    
    X.Org Bug 71113 <http://bugs.freedesktop.org/show_bug.cgi?id=71113>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/xorgconf.cpp b/hw/xfree86/xorgconf.cpp
index cd6d4a9..a903438 100644
--- a/hw/xfree86/xorgconf.cpp
+++ b/hw/xfree86/xorgconf.cpp
@@ -97,7 +97,7 @@ Section "ServerFlags"
 # Uncomment this to disable the <Ctrl><Alt><BS> server abort sequence
 # This allows clients to receive this key event.
 
-#    Option	"DontZap"	"false"
+#    Option	"DontZap"	"true"
 
 # Uncomment this to disable the <Ctrl><Alt><KP_+>/<KP_-> mode switching
 # sequences.  This allows clients to receive these key events.
commit 548fc937b22d4dfe7f96e0bd77522261603a2c2f
Author: Robert Ancell <robert.ancell at canonical.com>
Date:   Thu May 22 10:43:52 2014 +1200

    Fix overflow checking extension versions
    
    The easiest way to check for the version of an extension is to send the maximum
    possible version numbers in the QueryVersion request. The X server overflows on
    these as it assumes you will send a reasonable version number.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/include/misc.h b/include/misc.h
index 17de710..9c2f573 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -259,15 +259,19 @@ extern void FormatDouble(double dbl, char *string);
  * or a value greater than 0
  */
 static inline int
-version_compare(uint16_t a_major, uint16_t a_minor,
-                uint16_t b_major, uint16_t b_minor)
+version_compare(uint32_t a_major, uint32_t a_minor,
+                uint32_t b_major, uint32_t b_minor)
 {
-    int a, b;
+    if (a_major > b_major)
+        return 1;
+    if (a_major < b_major)
+        return -1;
+    if (a_minor > b_minor)
+        return 1;
+    if (a_minor < b_minor)
+        return -1;
 
-    a = a_major << 16 | a_minor;
-    b = b_major << 16 | b_minor;
-
-    return (a - b);
+    return 0;
 }
 
 /* some macros to help swap requests, replies, and events */
commit d7a2df0a7499864cb005b098b79c1bdf884f6600
Author: Steven McDonald <steven at steven-mcdonald.id.au>
Date:   Sun May 18 13:42:08 2014 +0200

    Xi: block SIGIOs while copying device classes around
    
    I've been seeing sporadic (anywhere from once every few days to 3-4
    times a day) crashes and freezes in X. The problematic behaviour isn't
    always the same, but I chose a particular incident to debug, and found
    that X was segfaulting in updateMotionHistory, on line 575 of
    dix/getevents.c.
    
    After some further investigation, I found that the bug was being
    triggered when a SIGIO was received in DeepCopyPointerClasses, between
    the AllocValuatorClass call (line 540) and updating the to->valuator
    pointer (line 545). AllocValuatorClass calls realloc() on to->valuator,
    so between these lines, it's not guaranteed to point to allocated
    memory.
    
    It seems the SIGIO handler is calling updateMotionHistory, which is
    reading the memory pointed to by to->valuator and getting a wrong value
    for last_motion, which updates buff to point to wildly the wrong place
    and thus generates a segfault when a memcpy() is done into buff.
    
    I am attaching a patch which I've been running on that machine for the
    past three days, and haven't yet observed any more crashing or freezing
    behaviour. The patch simply calls OsBlockSIGIO while
    DeepCopyDeviceClasses is in progress, as the state of the X server's
    device data structures is not guaranteed to be in a consistent state
    during that time.
    
    Debian bug#744303 <https://bugs.debian.org/744303>
    
    Signed-off-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/Xi/exevents.c b/Xi/exevents.c
index 02530bd..b0bc47e 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -661,6 +661,8 @@ void
 DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to,
                       DeviceChangedEvent *dce)
 {
+    OsBlockSIGIO();
+
     /* generic feedback classes, not tied to pointer and/or keyboard */
     DeepCopyFeedbackClasses(from, to);
 
@@ -668,6 +670,8 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to,
         DeepCopyKeyboardClasses(from, to);
     if ((dce->flags & DEVCHANGE_POINTER_EVENT))
         DeepCopyPointerClasses(from, to);
+
+    OsReleaseSIGIO();
 }
 
 /**
commit d3a3ee7a0e5cbd3fcaba77d2d5664e1524eda11c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 8 09:39:36 2014 +1000

    os: automatically switch to sigsafe logging when needed
    
    If we're smart enough to warn, we should be smart enough to just pass it
    through to the right function. Worst case we lose some formatting specifiers
    which pnprintf will complain about anyway. And in most cases it won't matter.
    
    This requires renaming pnprintf to vpnprintf and changing the size_t to int to
    be compatible with Xvscnprintf. pnprintf is internal only, the others are
    exported API so we can't change them as easily.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/os/log.c b/os/log.c
index a0f2a81..a368569 100644
--- a/os/log.c
+++ b/os/log.c
@@ -342,7 +342,7 @@ out:
  * which directives you use.
  */
 static int
-pnprintf(char *string, size_t size, const char *f, va_list args)
+vpnprintf(char *string, int size_in, const char *f, va_list args)
 {
     int f_idx = 0;
     int s_idx = 0;
@@ -353,6 +353,7 @@ pnprintf(char *string, size_t size, const char *f, va_list args)
     int i;
     uint64_t ui;
     int64_t si;
+    size_t size = size_in;
 
     for (; f_idx < f_len && s_idx < size - 1; f_idx++) {
         int length_modifier = 0;
@@ -484,6 +485,19 @@ pnprintf(char *string, size_t size, const char *f, va_list args)
     return s_idx;
 }
 
+static int
+pnprintf(char *string, int size, const char *f, ...)
+{
+    int rc;
+    va_list args;
+
+    va_start(args, f);
+    rc = vpnprintf(string, size, f, args);
+    va_end(args);
+
+    return rc;
+}
+
 /* This function does the actual log message writes. It must be signal safe.
  * When attempting to call non-signal-safe functions, guard them with a check
  * of the inSignalContext global variable. */
@@ -597,7 +611,6 @@ LogMessageTypeVerbString(MessageType type, int verb)
 void
 LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
 {
-    static unsigned int warned;
     const char *type_str;
     char buf[1024];
     const size_t size = sizeof(buf);
@@ -605,17 +618,8 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
     size_t len = 0;
 
     if (inSignalContext) {
-        if (warned < 3) {
-            BUG_WARN_MSG(inSignalContext,
-                         "Warning: attempting to log data in a signal unsafe "
-                         "manner while in signal context.\nPlease update to check "
-                         "inSignalContext and/or use LogMessageVerbSigSafe() or "
-                         "ErrorFSigSafe().\nThe offending log format message is:\n"
-                         "%s\n", format);
-            warned++;
-            if (warned == 3)
-                LogMessageVerbSigSafe(X_WARNING, -1, "Warned %u times about sigsafe logging. Will be quiet now.\n", warned);
-        }
+        LogVMessageVerbSigSafe(type, verb, format, args);
+        return;
     }
 
     type_str = LogMessageTypeVerbString(type, verb);
@@ -687,7 +691,7 @@ LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list a
         LogSWrite(verb, " ", 1, FALSE);
     }
 
-    len = pnprintf(buf, sizeof(buf), format, args);
+    len = vpnprintf(buf, sizeof(buf), format, args);
 
     /* Force '\n' at end of truncated line */
     if (sizeof(buf) - len == 1)
@@ -701,40 +705,37 @@ void
 LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
                    va_list msg_args, const char *hdr_format, va_list hdr_args)
 {
-    static unsigned int warned;
     const char *type_str;
     char buf[1024];
     const size_t size = sizeof(buf);
     Bool newline;
     size_t len = 0;
-
-    if (inSignalContext) {
-        if (warned < 3) {
-            BUG_WARN_MSG(inSignalContext,
-                         "Warning: attempting to log data in a signal unsafe "
-                         "manner while in signal context.\nPlease update to check "
-                         "inSignalContext and/or use LogMessageVerbSigSafe().\nThe "
-                         "offending header and log message formats are:\n%s %s\n",
-                         hdr_format, msg_format);
-            warned++;
-            if (warned == 3)
-                LogMessageVerbSigSafe(X_WARNING, -1, "Warned %u times about sigsafe logging. Will be quiet now.\n", warned);
-        }
-    }
+    int (*vprintf_func)(char *, int, const char* _X_RESTRICT_KYWD f, va_list args)
+            _X_ATTRIBUTE_PRINTF(3, 0);
+    int (*printf_func)(char *, int, const char* _X_RESTRICT_KYWD f, ...)
+            _X_ATTRIBUTE_PRINTF(3, 4);
 
     type_str = LogMessageTypeVerbString(type, verb);
     if (!type_str)
         return;
 
+    if (inSignalContext) {
+        vprintf_func = vpnprintf;
+        printf_func = pnprintf;
+    } else {
+        vprintf_func = Xvscnprintf;
+        printf_func = Xscnprintf;
+    }
+
     /* if type_str is not "", prepend it and ' ', to message */
     if (type_str[0] != '\0')
-        len += Xscnprintf(&buf[len], size - len, "%s ", type_str);
+        len += printf_func(&buf[len], size - len, "%s ", type_str);
 
     if (hdr_format && size - len > 1)
-        len += Xvscnprintf(&buf[len], size - len, hdr_format, hdr_args);
+        len += vprintf_func(&buf[len], size - len, hdr_format, hdr_args);
 
     if (msg_format && size - len > 1)
-        len += Xvscnprintf(&buf[len], size - len, msg_format, msg_args);
+        len += vprintf_func(&buf[len], size - len, msg_format, msg_args);
 
     /* Force '\n' at end of truncated line */
     if (size - len == 1)
commit d5587cf3acb7ad6f81e1c095f1b88f8fb25ee953
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 14 10:32:30 2014 +1000

    config: revert quirk for the Evoluent Vertical Mouse
    
    This quick makes the mouse behaviour more obvious (LMR buttons generate LMR
    events) but goes against the manufacturer's intended defaults:
    
        Top button - left click.
        Wheel button - .middle click (e.g., for pan and rotate in CAD programs).
        Middle button - right click.
        Bottom button - back.
        Thumb button - forward.
    
    from http://www.evoluent.com/vm3.html
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/config/10-quirks.conf b/config/10-quirks.conf
index c9b823c..47907d8 100644
--- a/config/10-quirks.conf
+++ b/config/10-quirks.conf
@@ -19,22 +19,6 @@ Section "InputClass"
         Option "IgnoreRelativeAxes" "off"
 EndSection
 
-# https://bugzilla.redhat.com/show_bug.cgi?id=612140
-# please make Evoluent VerticalMouse 3 work out of the box
-# Button mapping on this mouse is quirky
-Section "InputClass"
-	Identifier "Evoluent VerticalMouse 3"
-        MatchProduct "Evoluent VerticalMouse 3"
-        # Sets following configuration:
-        # top button:    left
-        # middle button: middle
-        # bottom button: right
-        # wheel click:   middle
-        # thumb button:  8 (back)
-	Option "ButtonMapping" "1 2 2 4 5 6 7 3 8"
-EndSection
-
-
 # https://bugs.freedesktop.org/show_bug.cgi?id=55867
 # Bug 55867 - Doesn't know how to tag XI_TRACKBALL
 Section "InputClass"


More information about the Xquartz-changes mailing list