We now call XRRFreeScreenResources as soon as practical to allow the
now-following logic to return at its leisure. Additionally, we also
copy the data from 'crtc_info' locally and free it ASAP.

Signed-off-by: Jason Gerecke <[email protected]>
---
 Changes from v2:
  * Don't use crtc_info after free

 tools/xsetwacom.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
index 9d47ea6..7bc5b54 100644
--- a/tools/xsetwacom.c
+++ b/tools/xsetwacom.c
@@ -2006,6 +2006,7 @@ static void _set_matrix(Display *dpy, XDevice *dev,
 static void set_output_xrandr(Display *dpy, XDevice *dev, param_t *param, int 
argc, char **argv)
 {
        int i, found = 0;
+       int x, y, width, height;
        char *output_name;
        XRRScreenResources *res;
        XRROutputInfo *output_info;
@@ -2014,7 +2015,6 @@ static void set_output_xrandr(Display *dpy, XDevice *dev, 
param_t *param, int ar
        output_name = argv[0];
 
        res = XRRGetScreenResources(dpy, DefaultRootWindow(dpy));
-
        for (i = 0; i < res->noutput && !found; i++)
        {
                output_info = XRRGetOutputInfo(dpy, res, res->outputs[i]);
@@ -2026,8 +2026,13 @@ static void set_output_xrandr(Display *dpy, XDevice 
*dev, param_t *param, int ar
                        continue;
 
                crtc_info = XRRGetCrtcInfo (dpy, res, output_info->crtc);
-               TRACE("CRTC (%dx%d) %dx%d\n", crtc_info->x, crtc_info->y,
-                       crtc_info->width, crtc_info->height);
+               x = crtc_info->x;
+               y = crtc_info->y;
+               width = crtc_info->width;
+               height = crtc_info->height;
+               XRRFreeCrtcInfo(crtc_info);
+
+               TRACE("CRTC (%dx%d) %dx%d\n", x, y, width, height);
 
                if (strcmp(output_info->name, output_name) == 0)
                {
@@ -2035,18 +2040,17 @@ static void set_output_xrandr(Display *dpy, XDevice 
*dev, param_t *param, int ar
                        break;
                }
        }
+       XRRFreeScreenResources(res);
 
        /* crtc holds our screen info, need to compare to actual screen size */
        if (found)
        {
                TRACE("Setting CRTC %s\n", output_name);
-               _set_matrix(dpy, dev, crtc_info->x, crtc_info->y,
-                           crtc_info->width, crtc_info->height);
+               _set_matrix(dpy, dev, x, y, width, height);
        } else
                printf("Unable to find output '%s'. "
                        "Output may not be connected.\n", output_name);
 
-       XRRFreeScreenResources(res);
 }
 
 /**
-- 
1.7.6


------------------------------------------------------------------------------
Using storage to extend the benefits of virtualization and iSCSI
Virtualization increases hardware utilization and delivers a new level of
agility. Learn what those decisions are and how to modernize your storage 
and backup environments for virtualization.
http://www.accelacomm.com/jaw/sfnl/114/51434361/
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to