[PATCH v4 1/3] kdrive: add support to +X+Y syntax in -screen option parsing

Laércio de Sousa laerciosousa at sme-mogidascruzes.sp.gov.br
Wed Aug 6 06:56:17 PDT 2014


From: Laércio de Sousa <lbsousajr at gmail.com>

This patch enhances current -screen option parsing for kdrive-based
applications. It can parse strings like
<WIDTH>x<HEIGHT>+<XOFFSET>+<YOFFSET>, 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.
---
 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 b5b91c0..5dbff3f 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/+ at 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 at XY", save, &delim);
+            arg = KdParseFindNext(arg, "x+ at 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, "+ at 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 08b1681..066a134 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;
-- 
1.8.4.5



More information about the xorg-devel mailing list