MapToOutput helper functions now return 'true' when they sucessfully change the transformation matrix, and 'false' otherwise. Though this information is not used at the moment, it will be used with the KeepShape patch to ensure that the active area is only modified if the output mapping occured sucessfully.
Signed-off-by: Jason Gerecke <killert...@gmail.com> --- Changes from v3: * Broken out from patch v3 7/7 * Introduces only the change to return type tools/xsetwacom.c | 79 ++++++++++++++++++++++++++++++++++------------------- 1 files changed, 51 insertions(+), 28 deletions(-) diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c index 722e32c..a3998d2 100644 --- a/tools/xsetwacom.c +++ b/tools/xsetwacom.c @@ -2024,7 +2024,13 @@ Bool get_mapped_area(Display *dpy, XDevice *dev, int *width, int *height, int *x return matrix_is_valid; } -static void _set_matrix_prop(Display *dpy, XDevice *dev, const float fmatrix[9]) +/** + * Modifies the server's transformation matrix property for the given + * device. It takes as input a 9-element array of floats interpreted + * as the row-major 3x3 matrix to be set. If this function succeeds + * in modifying the transformation matrix, it returns 'true'. + */ +static Bool _set_matrix_prop(Display *dpy, XDevice *dev, const float fmatrix[9]) { Atom matrix_prop = XInternAtom(dpy, "Coordinate Transformation Matrix", True); Atom type; @@ -2037,7 +2043,7 @@ static void _set_matrix_prop(Display *dpy, XDevice *dev, const float fmatrix[9]) if (!matrix_prop) { fprintf(stderr, "Server does not support transformation\n"); - return; + return False; } /* XI1 expects 32 bit properties (including float) as long, @@ -2053,21 +2059,24 @@ static void _set_matrix_prop(Display *dpy, XDevice *dev, const float fmatrix[9]) { fprintf(stderr, "Property for '%s' has unexpected type - this is a bug.\n", "Coordinate Transformation Matrix"); - return; + return False; } XChangeDeviceProperty(dpy, dev, matrix_prop, type, format, PropModeReplace, (unsigned char*)matrix, 9); XFree(data); XFlush(dpy); + + return True; } /** * Adjust the transformation matrix based on a user-defined area. * This function will attempt to map the given pointer to an arbitrary - * rectangular portion of the desktop. + * rectangular portion of the desktop. If this function succeeds in + * modifying the transformation matrix, it returns 'true'. */ -static void set_output_area(Display *dpy, XDevice *dev, +static Bool set_output_area(Display *dpy, XDevice *dev, int offset_x, int offset_y, int output_width, int output_height) { @@ -2098,15 +2107,17 @@ static void set_output_area(Display *dpy, XDevice *dev, TRACE(" [ %f %f %f ]\n", matrix[3], matrix[4], matrix[5]); TRACE(" [ %f %f %f ]\n", matrix[6], matrix[7], matrix[8]); - _set_matrix_prop(dpy, dev, matrix); + return _set_matrix_prop(dpy, dev, matrix); } + /** * Adjust the transformation matrix based on RandR settings. This function * will attempt to map the given device to the output with the given RandR - * output name. + * output name. If this function succeeds in modifying the transformation + * matrix, it returns 'true'. */ -static void set_output_xrandr(Display *dpy, XDevice *dev, char *output_name) +static Bool set_output_xrandr(Display *dpy, XDevice *dev, char *output_name) { int i, found = 0; int x, y, width, height; @@ -2146,33 +2157,38 @@ static void set_output_xrandr(Display *dpy, XDevice *dev, char *output_name) if (found) { TRACE("Setting CRTC %s\n", output_name); - set_output_area(dpy, dev, x, y, width, height); + return set_output_area(dpy, dev, x, y, width, height); } else + { printf("Unable to find output '%s'. " "Output may not be connected.\n", output_name); + return False; + } } /** * Adjust the transformation matrix based on the Xinerama settings. This * function will attempt to map the given device to the specified Xinerama - * head number. + * head number. If this function succeeds in modifying the transformation + * matrix, it returns 'true'. * * For TwinView This would better be done with libXNVCtrl but until they * learn to package it properly, we need to rely on Xinerama. Besides, * libXNVCtrl isn't available on RHEL, so we'd have to do it through * Xinerama there anyway. */ -static void set_output_xinerama(Display *dpy, XDevice *dev, int head) +static Bool set_output_xinerama(Display *dpy, XDevice *dev, int head) { int event, error; XineramaScreenInfo *screens; int nscreens; + Bool success = False; if (!XineramaQueryExtension(dpy, &event, &error)) { fprintf(stderr, "Unable to set screen mapping. Xinerama extension not found\n"); - return; + return success; } screens = XineramaQueryScreens(dpy, &nscreens); @@ -2190,12 +2206,13 @@ static void set_output_xinerama(Display *dpy, XDevice *dev, int head) TRACE("Setting xinerama head %d\n", head); - set_output_area(dpy, dev, + success = set_output_area(dpy, dev, screens[head].x_org, screens[head].y_org, screens[head].width, screens[head].height); out: XFree(screens); + return success; } /** @@ -2203,12 +2220,12 @@ out: * This function will attempt to map the given device to the entire * desktop. */ -static void set_output_desktop(Display *dpy, XDevice *dev) +static Bool set_output_desktop(Display *dpy, XDevice *dev) { int display_width = DisplayWidth(dpy, DefaultScreen(dpy)); int display_height = DisplayHeight(dpy, DefaultScreen(dpy)); - set_output_area(dpy, dev, 0, 0, display_width, display_height); + return set_output_area(dpy, dev, 0, 0, display_width, display_height); } /** @@ -2218,7 +2235,7 @@ static void set_output_desktop(Display *dpy, XDevice *dev) * head, it maps to the first head. If mapped to the last Xinerama * head, it maps to the entire desktop. */ -static void set_output_next(Display *dpy, XDevice *dev) +static Bool set_output_next(Display *dpy, XDevice *dev) { XineramaScreenInfo *screens; int event, error, nscreens, head; @@ -2226,12 +2243,12 @@ static void set_output_next(Display *dpy, XDevice *dev) Bool success = False; if (!get_mapped_area(dpy, dev, &width, &height, &x_org, &y_org)) - return; + return success; if (!XineramaQueryExtension(dpy, &event, &error)) { fprintf(stderr, "Unable to get screen mapping. Xinerama extension not found\n"); - return; + return success; } screens = XineramaQueryScreens(dpy, &nscreens); @@ -2248,20 +2265,22 @@ static void set_output_next(Display *dpy, XDevice *dev) if (screens[head].width == width && screens[head].height == height && screens[head].x_org == x_org && screens[head].y_org == y_org) { - success = True; - if (head + 1 < nscreens) - set_output_xinerama(dpy, dev, head+1); + success = set_output_xinerama(dpy, dev, head+1); else - set_output_desktop(dpy, dev); + success = set_output_desktop(dpy, dev); + + if (!success) + goto out; } } if (!success) - set_output_xinerama(dpy, dev, 0); + success = set_output_xinerama(dpy, dev, 0); out: XFree(screens); + return success; } static void set_output(Display *dpy, XDevice *dev, param_t *param, int argc, char **argv) @@ -2270,6 +2289,7 @@ static void set_output(Display *dpy, XDevice *dev, param_t *param, int argc, cha int x, y; unsigned int width, height; int flags = XParseGeometry(argv[0], &x, &y, &width, &height); + Bool success = False; if (argc != param->arg_count) { @@ -2279,17 +2299,20 @@ static void set_output(Display *dpy, XDevice *dev, param_t *param, int argc, cha } if (MaskIsSet(flags, XValue|YValue|WidthValue|HeightValue)) - set_output_area(dpy, dev, x, y, width, height); + success = set_output_area(dpy, dev, x, y, width, height); else if (strcasecmp(argv[0], "next") == 0) - set_output_next(dpy, dev); + success = set_output_next(dpy, dev); else if (strcasecmp(argv[0], "desktop") == 0) - set_output_desktop(dpy, dev); + success = set_output_desktop(dpy, dev); else if (!need_xinerama(dpy)) - set_output_xrandr(dpy, dev, argv[0]); + success = set_output_xrandr(dpy, dev, argv[0]); else if (convert_value_from_user(param, argv[0], &head_no)) - set_output_xinerama(dpy, dev, head_no); + success = set_output_xinerama(dpy, dev, head_no); else fprintf(stderr, "Unable to find an output '%s'.\n", argv[0]); + + if (!success) + return; } -- 1.7.6 ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense. http://p.sf.net/sfu/splunk-d2dcopy1 _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel