=?n?q?=5BPATCH=20xrandr-utils=202/4=5D=20Refactor=20reflection=20support=20into=20library=2E?=

Bryce Harrington bryce at canonical.com
Wed Feb 15 16:10:41 PST 2012


This follows the same API style as rotation.

Signed-off-by: Bryce Harrington <bryce at canonical.com>
---
 examples/xrandr.c                    |   36 ++--------
 include/X11/extensions/XrandrUtils.h |    9 +++
 man/XrandrUtils.man                  |   18 +++++
 src/XrandrUtils.c                    |   56 +++++++++++++++
 test/.gitignore                      |    1 +
 test/Makefile.am                     |    3 +-
 test/reflections.c                   |  130 ++++++++++++++++++++++++++++++++++
 7 files changed, 221 insertions(+), 32 deletions(-)
 create mode 100644 test/reflections.c

diff --git a/examples/xrandr.c b/examples/xrandr.c
index c6ad767..e7c2295 100644
--- a/examples/xrandr.c
+++ b/examples/xrandr.c
@@ -51,13 +51,6 @@ static Bool	properties = False;
 static Bool	grab_server = True;
 static Bool	no_primary = False;
 
-static char *reflections[5] = {
-    "normal", 
-    "x", 
-    "y", 
-    "xy",
-    "\n"};
-
 /* subpixel order */
 static char *order[6] = {
     "unknown",
@@ -173,23 +166,6 @@ static inline double dmin (double x, double y)
     return x < y ? x : y;
 }
 
-static char *
-reflection_name (Rotation rotation)
-{
-    rotation &= (RR_Reflect_X|RR_Reflect_Y);
-    switch (rotation) {
-    case 0:
-	return "none";
-    case RR_Reflect_X:
-	return "X axis";
-    case RR_Reflect_Y:
-	return "Y axis";
-    case RR_Reflect_X|RR_Reflect_Y:
-	return "X and Y axis";
-    }
-    return "invalid reflection";
-}
-
 typedef enum _changes {
     changes_none = 0,
     changes_crtc = (1 << 0),
@@ -1113,7 +1089,7 @@ set_output_info (output_t *output, RROutput xid, XRROutputInfo *output_info)
 	fatal ("output %s cannot use rotation \"%s\" reflection \"%s\"\n",
 	       output->output.string,
 	       XRURotationName (output->rotation),
-	       reflection_name (output->rotation));
+	       XRUReflectionName (output->rotation));
 
     /* set gamma */
     if (!(output->changes & changes_gamma))
@@ -2301,10 +2277,8 @@ main (int argc, char **argv)
 	if (!strcmp ("--reflect", argv[i]) || !strcmp ("--reflection", argv[i])) {
 	    if (++i>=argc) usage ();
 	    if (!output) usage ();
-	    for (dirind = 0; dirind < 4; dirind++) {
-                if (strcmp (reflections[dirind], argv[i]) == 0) break;
-            }
-	    if (dirind == 4)
+	    dirind = XRUGetReflectionIndex(argv[i]);
+	    if ((dirind < 0) || (dirind > 3))
 		usage ();
 	    output->rotation &= ~(RR_Reflect_X|RR_Reflect_Y);
 	    output->rotation |= dirind * RR_Reflect_X;
@@ -2918,7 +2892,7 @@ main (int argc, char **argv)
 		    printf (" %s",
 			    XRURotationName (output->rotation));
 		    if (output->rotation & (RR_Reflect_X|RR_Reflect_Y))
-			printf (" %s", reflection_name (output->rotation));
+			printf (" %s", XRUReflectionName (output->rotation));
 		}
 	    }
 	    if (rotations != RR_Rotate_0 || verbose)
@@ -3292,7 +3266,7 @@ main (int argc, char **argv)
 	       XRURotationName (current_rotation));
 
 	printf("Current reflection - %s\n",
-	       reflection_name (current_rotation));
+	       XRUReflectionName (current_rotation));
 
 	printf ("Rotations possible - ");
 	for (i = 0; i < 4; i ++) {
diff --git a/include/X11/extensions/XrandrUtils.h b/include/X11/extensions/XrandrUtils.h
index c48de2e..7b33769 100644
--- a/include/X11/extensions/XrandrUtils.h
+++ b/include/X11/extensions/XrandrUtils.h
@@ -55,4 +55,13 @@ XRUGetRotationIndex(char * rotation_name);
 Rotation
 XRUGetRotation(int dirind);
 
+const char *
+XRUReflectionName(Rotation rotation);
+
+int
+XRUGetReflectionIndex(char * reflection_name);
+
+Rotation
+XRUGetReflection(int dirind);
+
 #endif /* _XRANDR_UTILS_H_ */
diff --git a/man/XrandrUtils.man b/man/XrandrUtils.man
index 0fd1a46..7acf0e9 100644
--- a/man/XrandrUtils.man
+++ b/man/XrandrUtils.man
@@ -52,6 +52,24 @@ int XRUGetRotationIndex(char * rotation_name);
  */
 Rotation XRUGetRotation(int dirind);
 
+/**
+ * Return string name for the given rotation,
+ * or "invalid reflection" on error.
+ */
+const char * XRUReflectionName(Rotation rotation);
+
+/**
+ * Look up reflection name and return an index number,
+ * or -1 if name could not be found.
+ */
+int XRUGetReflectionIndex(char * reflection_name);
+
+/**
+ * Return the reflection matching the given index as
+ * a Rotation, or 0 if not valid.
+ */
+Rotation XRUGetReflection(int dirind);
+
 .sp
 .fi
 
diff --git a/src/XrandrUtils.c b/src/XrandrUtils.c
index a00ad1c..0654977 100644
--- a/src/XrandrUtils.c
+++ b/src/XrandrUtils.c
@@ -40,6 +40,15 @@ static /* const */ char * ru_direction[5] = {
     "inverted",
     "right",
     "\n"};
+
+static /* const */ char * ru_reflection[5] = {
+    "normal",
+    "x",
+    "y",
+    "xy",
+    "\n"};
+
+/* Rotations */
 const char *
 XRURotationName(Rotation rotation)
 {
@@ -72,3 +81,50 @@ XRUGetRotation(int dirind)
 	return 0;
     return (1 << dirind);
 }
+
+
+/* Reflections */
+const char *
+XRUReflectionName(Rotation rotation)
+{
+    rotation &= (RR_Reflect_X|RR_Reflect_Y);
+    switch (rotation) {
+    case 0:
+        return "none";
+    case RR_Reflect_X:
+        return "X axis";
+    case RR_Reflect_Y:
+        return "Y axis";
+    case RR_Reflect_X|RR_Reflect_Y:
+        return "X and Y axis";
+    }
+    return "invalid reflection";
+}
+
+int
+XRUGetReflectionIndex(char * reflection_name)
+{
+    int dirind;
+    if (!reflection_name)
+	return -1;
+    for (dirind = 0; dirind < 4; dirind++)
+	if (strcmp (ru_reflection[dirind], reflection_name) == 0)
+	    return dirind;
+    return -1;
+}
+
+Rotation
+XRUGetReflection(int dirind)
+{
+    switch (dirind) {
+    case 0:
+	return 0;
+    case 1:
+	return RR_Reflect_X;
+    case 2:
+	return RR_Reflect_Y;
+    case 3:
+	return (RR_Reflect_X|RR_Reflect_Y);
+    }
+    return 0;
+}
diff --git a/test/.gitignore b/test/.gitignore
index 3819c8e..f3329d2 100644
--- a/test/.gitignore
+++ b/test/.gitignore
@@ -1,3 +1,4 @@
 geometry
 xrandr
 rotations
+reflections
diff --git a/test/Makefile.am b/test/Makefile.am
index 9c11fda..0b723c9 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,4 +1,4 @@
-check_PROGRAMS = geometry rotations
+check_PROGRAMS = geometry rotations reflections
 
 TESTS = $(check_PROGRAMS)
 
@@ -15,6 +15,7 @@ TEST_LDADD = @RANDR_UTILS_LIBS@
 
 geometry_LDADD = $(TEST_LDADD)
 rotations_LDADD = $(TEST_LDADD) $(RANDR_UTIL_LIB)
+reflections_LDADD = $(TEST_LDADD) $(RANDR_UTIL_LIB)
 
 $(RANDR_UTIL_LIB):
 	@cd $(top_builddir)/src/ && $(MAKE) libXrandrUtils.la
diff --git a/test/reflections.c b/test/reflections.c
new file mode 100644
index 0000000..9be4f7b
--- /dev/null
+++ b/test/reflections.c
@@ -0,0 +1,130 @@
+/**
+ * Copyright © 2012 Canonical, Ltd.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Test reflections and reflection name helper functions.
+ */
+
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+
+#include "XrandrUtils.h"
+
+/**
+ * Lookup reflection names
+ */
+static void reflection_names(void)
+{
+    Rotation normal = 0;
+    Rotation x      = RR_Reflect_X;
+    Rotation y      = RR_Reflect_Y;
+    Rotation xy     = RR_Reflect_X|RR_Reflect_Y;
+
+    assert(0 == strcmp("none",         XRUReflectionName( normal )));
+    assert(0 == strcmp("X axis",       XRUReflectionName( x )));
+    assert(0 == strcmp("Y axis",       XRUReflectionName( y )));
+    assert(0 == strcmp("X and Y axis", XRUReflectionName( xy )));
+}
+
+/**
+ * Verify that out of range name lookups produce an appropriate value or error
+ */
+static void reflection_names_invalid(void)
+{
+    assert(0 == strcmp("none", XRUReflectionName((Rotation) 0 )));
+    assert(0 == strcmp("none", XRUReflectionName((Rotation) 1 << 8 )));
+}
+
+/**
+ * Lookup reflection indexes by their string name
+ */
+static void reflection_indexes_by_name(void)
+{
+    assert(0 == XRUGetReflectionIndex("normal"));
+    assert(1 == XRUGetReflectionIndex("x"));
+    assert(2 == XRUGetReflectionIndex("y"));
+    assert(3 == XRUGetReflectionIndex("xy"));
+}
+
+/**
+ * Verify garbage name lookups produce an appropriate error
+ */
+static void reflection_indexes_by_invalid_name(void)
+{
+    assert(-1 == XRUGetReflectionIndex(NULL));
+    assert(-1 == XRUGetReflectionIndex(""));
+    assert(-1 == XRUGetReflectionIndex(" "));
+    assert(-1 == XRUGetReflectionIndex("z"));
+    assert(-1 == XRUGetReflectionIndex("invalid"));
+    assert(-1 == XRUGetReflectionIndex("NORMAL"));
+    assert(-1 == XRUGetReflectionIndex("uni©ode"));
+}
+
+/**
+ * Check unterminated string behavior
+ */
+static void reflection_indexes_by_unterminated_name(void)
+{
+    char x_unterminated[2] = "x";
+    x_unterminated[1] = ' ';
+
+    assert(-1 == XRUGetReflectionIndex(x_unterminated));
+}
+
+/**
+ * Lookup reflections by index
+ */
+static void reflection_by_index(void)
+{
+    assert(0                           == XRUGetReflection(0));
+    assert(RR_Reflect_X                == XRUGetReflection(1));
+    assert(RR_Reflect_Y                == XRUGetReflection(2));
+    assert((RR_Reflect_X|RR_Reflect_Y) == XRUGetReflection(3));
+}
+
+/**
+ * Verify out of range indexes produce appropriate errors
+ */
+static void reflection_by_invalid_index(void)
+{
+    assert(0 == XRUGetReflection(-1));
+    assert(0 == XRUGetReflection( 4));
+    assert(0 == XRUGetReflection(42));
+    assert(0 == XRUGetReflection(-100));
+}
+
+int main(int argc, char** argv)
+{
+    reflection_names();
+    reflection_names_invalid();
+
+    reflection_indexes_by_name();
+    reflection_indexes_by_invalid_name();
+    reflection_indexes_by_unterminated_name();
+
+    reflection_by_index();
+    reflection_by_invalid_index();
+
+    return 0;
+}
-- 
1.7.9



More information about the xorg-devel mailing list