From 376f4de8ae927748417046390c24afbda24b0583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= Date: Mon, 18 Aug 2014 08:45:41 -0300 Subject: [PATCH] kdrive: add support to +X+Y syntax in -screen option parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch enhances current -screen option parsing for kdrive-based applications. It can parse strings like x++, storing X and Y offsets in KdScreenInfo instances. For negative values, this patch supports +-X+-Y (not -X-Y) syntax. It will allow e.g. proper Xephyr window placement for multiseat purposes. Signed-off-by: LaƩrcio de Sousa Reviewed-by: Keith Packard Signed-off-by: Keith Packard --- hw/kdrive/src/kdrive.c | 23 +++++++++++++++++++---- hw/kdrive/src/kdrive.h | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c index b5b91c0dd..5dbff3fce 100644 --- a/hw/kdrive/src/kdrive.c +++ b/hw/kdrive/src/kdrive.c @@ -300,6 +300,8 @@ KdParseScreen(KdScreenInfo * screen, const char *arg) screen->softCursor = kdSoftCursor; screen->origin = kdOrigin; screen->randr = RR_Rotate_0; + screen->x = 0; + screen->y = 0; screen->width = 0; screen->height = 0; screen->width_mm = 0; @@ -313,7 +315,7 @@ KdParseScreen(KdScreenInfo * screen, const char *arg) return; for (i = 0; i < 2; i++) { - arg = KdParseFindNext(arg, "x/@XY", save, &delim); + arg = KdParseFindNext(arg, "x/+@XY", save, &delim); if (!save[0]) return; @@ -321,7 +323,7 @@ KdParseScreen(KdScreenInfo * screen, const char *arg) mm = 0; if (delim == '/') { - arg = KdParseFindNext(arg, "x@XY", save, &delim); + arg = KdParseFindNext(arg, "x+@XY", save, &delim); if (!save[0]) return; mm = atoi(save); @@ -335,7 +337,8 @@ KdParseScreen(KdScreenInfo * screen, const char *arg) screen->height = pixels; screen->height_mm = mm; } - if (delim != 'x' && delim != '@' && delim != 'X' && delim != 'Y' && + if (delim != 'x' && delim != '+' && delim != '@' && + delim != 'X' && delim != 'Y' && (delim != '\0' || i == 0)) return; } @@ -346,6 +349,18 @@ KdParseScreen(KdScreenInfo * screen, const char *arg) kdSoftCursor = FALSE; kdSubpixelOrder = SubPixelUnknown; + if (delim == '+') { + arg = KdParseFindNext(arg, "+@xXY", save, &delim); + if (save[0]) + screen->x = atoi(save); + } + + if (delim == '+') { + arg = KdParseFindNext(arg, "@xXY", save, &delim); + if (save[0]) + screen->y = atoi(save); + } + if (delim == '@') { arg = KdParseFindNext(arg, "xXY", save, &delim); if (save[0]) { @@ -425,7 +440,7 @@ KdUseMsg(void) { ErrorF("\nTinyX Device Dependent Usage:\n"); ErrorF - ("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]] Specify screen characteristics\n"); + ("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][+[-]XOFFSET][+[-]YOFFSET][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]] Specify screen characteristics\n"); ErrorF ("-rgba rgb/bgr/vrgb/vbgr/none Specify subpixel ordering for LCD panels\n"); ErrorF diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h index 08b1681ce..066a13419 100644 --- a/hw/kdrive/src/kdrive.h +++ b/hw/kdrive/src/kdrive.h @@ -89,6 +89,8 @@ typedef struct _KdScreenInfo { ScreenPtr pScreen; void *driver; Rotation randr; /* rotation and reflection */ + int x; + int y; int width; int height; int rate;