Rotating the device simply sets the Coordinate Transformation Matrix to the rotation matrix, it does not handle screen mapping or offsets.
Signed-off-by: Peter Hutterer <[email protected]> --- configure.ac | 3 +++ man/xinput.man | 6 ++++++ src/Makefile.am | 4 ++-- src/property.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/xinput.c | 5 +++++ src/xinput.h | 2 ++ 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index f53a81f..745d46b 100644 --- a/configure.ac +++ b/configure.ac @@ -37,6 +37,9 @@ m4_ifndef([XORG_MACROS_VERSION], XORG_MACROS_VERSION(1.8) XORG_DEFAULT_OPTIONS +AC_CHECK_LIB([m], [cos]) +AC_CHECK_LIB([m], [sin]) + # Obtain compiler/linker options for dependencies PKG_CHECK_MODULES(XINPUT, x11 xext [xi >= 1.2] [inputproto >= 1.5] xrandr xinerama) diff --git a/man/xinput.man b/man/xinput.man index 540308b..8a1b23c 100644 --- a/man/xinput.man +++ b/man/xinput.man @@ -158,6 +158,12 @@ Enable the \fIdevice\fP. This call is equivalent to Disable the \fIdevice\fP. This call is equivalent to .B xinput --set-prop device \fI"Device Enabled"\fP 0 .PP +.TP 8 +.B --rotate \fIdevice\fP \fIangle\fP +Rotate the \fIdevice\fP by \fIangle\fP counterclockwise. This call is equivalent to +.B xinput --set-prop device \fI"Coordinate Transformation Matrix"\fP <rotation matrix>. +An angle of 90 degrees is equivalent to RandR's "left" orientation. +.PP \fIdevice\fP can be the device name as a string or the XID of the device. .PP diff --git a/src/Makefile.am b/src/Makefile.am index 985207b..ee69b0f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,8 +22,8 @@ bin_PROGRAMS = xinput -AM_CFLAGS = $(XINPUT_CFLAGS) -xinput_LDADD = $(XINPUT_LIBS) +AM_CFLAGS = $(XINPUT_CFLAGS) $(M_CFLAGS) +xinput_LDADD = $(XINPUT_LIBS) $(M_LIBS) if HAVE_XI2 diff --git a/src/property.c b/src/property.c index 66a3842..4a93459 100644 --- a/src/property.c +++ b/src/property.c @@ -23,6 +23,7 @@ */ #include <ctype.h> +#include <math.h> #include <string.h> #include <stdlib.h> #include <stdint.h> @@ -841,3 +842,46 @@ int enable(Display *display, int argc, char *argv[], char *name, char *desc) char *new_argv[3] = { argv[0], "Device Enabled", "1" }; return set_prop(display, 3, new_argv, name, desc); } + +int rotate(Display *display, int argc, char *argv[], char *name, char *desc) +{ + char *endptr; + char *new_argv[11] = { argv[0], "Coordinate Transformation Matrix" }; + long int angle; + double matrix[9]; + double rad; + char matrix_str[9][6]; + int i; + + if (argc < 2) { + fprintf(stderr, "Usage: xinput %s %s\n", name, desc); + return EXIT_FAILURE; + } + + angle = strtol(argv[1], &endptr, 10); + if (argv[1] == '\0' || *endptr != '\0') { + fprintf(stderr, "Invalid angle. Angle must be in degrees counterclockwise.\n"); + return EXIT_FAILURE; + } + + rad = angle * M_PI/180.0; + + memset(matrix, 0, sizeof(matrix)); + matrix[0] = cos(rad); + matrix[1] = -sin(rad); + matrix[3] = sin(rad); + matrix[4] = cos(rad); + + /* offset */ + matrix[2] = -0.5 * cos(rad) + 0.5 * sin(rad) + 0.5; + matrix[5] = -0.5 * sin(rad) - 0.5 * cos(rad) + 0.5; + + matrix[8] = 1; + + for (i = 0; i < 9; i++) { + sprintf(matrix_str[i], "%.2f", matrix[i]); + new_argv[i + 2] = matrix_str[i]; + } + + return set_prop(display, 11, new_argv, name, desc); +} diff --git a/src/xinput.c b/src/xinput.c index 0f86720..d6480f5 100644 --- a/src/xinput.c +++ b/src/xinput.c @@ -147,6 +147,11 @@ static entry drivers[] = "<device>", enable, }, + { + "rotate", + "<device> <angle>", + rotate, + }, {NULL, NULL, NULL } }; diff --git a/src/xinput.h b/src/xinput.h index c37e6e6..493c049 100644 --- a/src/xinput.h +++ b/src/xinput.h @@ -81,4 +81,6 @@ int set_clientpointer( Display* display, int argc, char *argv[], char *prog_name int test_xi2( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); int map_to_output( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); +int rotate( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc); + /* end of xinput.h */ -- 1.7.10.4 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
