[PATCH xf86-video-nested v2 3/5] Add preliminary support for screen options "Fullscreen" and "Output" in xorg.conf

Laércio de Sousa laerciosousa at sme-mogidascruzes.sp.gov.br
Thu Nov 6 09:18:12 PST 2014


This patch introduces support for new screen options in xorg.conf, namely:
"Fullscreen" and "Output". They are expected to work exactly as command-line
options -fullscreen and -output for Xephyr, allowing to open nested Xorg
window in fullscreen mode (restricted to given host X server output
if option "Output" is set).

In order to achieve this, NestedClientCheckDisplay() needs to be extended
to allow collecting fullscreen geometry from host X server while
checking if it's ready for connections, which has to be implemented
on each backend client.

NestedClientCreateScreen() also was extended to include a boolean
argument that tells backend client if it needs to set appropriate fullscreen
hint for nested Xorg window.

Signed-off-by: Laércio de Sousa <laerciosousa at sme-mogidascruzes.sp.gov.br>
---
 src/client.h     | 12 +++++--
 src/driver.c     | 96 ++++++++++++++++++++++++++++++++++++++------------------
 src/xlibclient.c |  8 ++++-
 3 files changed, 82 insertions(+), 34 deletions(-)

diff --git a/src/client.h b/src/client.h
index ea2c8de..28462a6 100644
--- a/src/client.h
+++ b/src/client.h
@@ -39,15 +39,21 @@
 struct NestedClientPrivate;
 typedef struct NestedClientPrivate *NestedClientPrivatePtr;
 
-Bool NestedClientCheckDisplay(int         scrnIndex,
-                              const char *displayName,
-                              const char *xauthFile);
+Bool NestedClientCheckDisplay(int           scrnIndex,
+                              const char   *displayName,
+                              const char   *xauthFile,
+                              const char   *output,
+                              unsigned int *width,
+                              unsigned int *height,
+                              int          *x,
+                              int          *y);
 
 Bool NestedClientValidDepth(int depth);
 
 NestedClientPrivatePtr NestedClientCreateScreen(int          scrnIndex,
                                                 const char  *displayName,
                                                 const char  *xauthFile,
+                                                Bool         wantFullscreenHint,
                                                 unsigned int width,
                                                 unsigned int height,
                                                 int          originX,
diff --git a/src/driver.c b/src/driver.c
index d6208cc..695b580 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -101,7 +101,9 @@ void NestedPrintMode(ScrnInfoPtr p, DisplayModePtr m);
 typedef enum {
     OPTION_DISPLAY,
     OPTION_XAUTHORITY,
-    OPTION_ORIGIN
+    OPTION_ORIGIN,
+    OPTION_FULLSCREEN,
+    OPTION_OUTPUT
 } NestedOpts;
 
 typedef enum {
@@ -117,10 +119,12 @@ static SymTabRec NestedChipsets[] = {
  * port NestedClient to something that's not Xlib/Xcb we might need to add some
  * custom options */
 static OptionInfoRec NestedOptions[] = {
-    { OPTION_DISPLAY,    "Display",    OPTV_STRING, {0}, FALSE },
-    { OPTION_XAUTHORITY, "Xauthority", OPTV_STRING, {0}, FALSE },
-    { OPTION_ORIGIN,     "Origin",     OPTV_STRING, {0}, FALSE },
-    { -1,                NULL,         OPTV_NONE,   {0}, FALSE }
+    { OPTION_DISPLAY,    "Display",    OPTV_STRING,  {0}, FALSE },
+    { OPTION_XAUTHORITY, "Xauthority", OPTV_STRING,  {0}, FALSE },
+    { OPTION_ORIGIN,     "Origin",     OPTV_STRING,  {0}, FALSE },
+    { OPTION_FULLSCREEN, "Fullscreen", OPTV_BOOLEAN, {0}, FALSE },
+    { OPTION_OUTPUT,     "Output",     OPTV_STRING,  {0}, FALSE },
+    { -1,                NULL,         OPTV_NONE,    {0}, FALSE }
 };
 
 _X_EXPORT DriverRec NESTED = {
@@ -175,6 +179,10 @@ typedef struct NestedPrivate {
     const char                  *xauthFile;
     int                          originX;
     int                          originY;
+    unsigned int                 fullWidth;
+    unsigned int                 fullHeight;
+    Bool                         fullscreen;
+    const char                  *output;
     NestedClientPrivatePtr       clientData;
     CreateScreenResourcesProcPtr CreateScreenResources;
     CloseScreenProcPtr           CloseScreen;
@@ -333,6 +341,10 @@ static Bool NestedPreInit(ScrnInfoPtr pScrn, int flags) {
     pNested->xauthFile = NULL;
     pNested->originX = 0;
     pNested->originY = 0;
+    pNested->fullWidth = 0;
+    pNested->fullHeight = 0;
+    pNested->fullscreen = FALSE;
+    pNested->output = NULL;
 
     if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
         return FALSE;
@@ -380,11 +392,27 @@ static Bool NestedPreInit(ScrnInfoPtr pScrn, int flags) {
                    pNested->originX, pNested->originY);
     }
 
+    if (xf86GetOptValBool(NestedOptions, OPTION_FULLSCREEN, &pNested->fullscreen))
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Fullscreen mode %s\n",
+                   pNested->fullscreen ? "enabled" : "disabled");
+
+    if (xf86IsOptionSet(NestedOptions, OPTION_OUTPUT)) {
+        pNested->output = xf86GetOptValString(NestedOptions,
+                                              OPTION_OUTPUT);
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Targeting host X server output \"%s\"\n",
+                   pNested->output);
+    }
+
     xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
 
     if (!NestedClientCheckDisplay(pScrn->scrnIndex,
                                   pNested->displayName,
-                                  pNested->xauthFile)) {
+                                  pNested->xauthFile,
+                                  pNested->output,
+                                  &pNested->fullWidth,
+                                  &pNested->fullHeight,
+                                  &pNested->originX,
+                                  &pNested->originY)) {
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Can't open display: %s\n",
                    pNested->displayName ? pNested->displayName : getenv("DISPLAY"));
         return FALSE;
@@ -434,35 +462,42 @@ NestedValidateModes(ScrnInfoPtr pScrn) {
     DisplayModePtr mode;
     int i, width, height, ret = 0;
     int maxX = 0, maxY = 0;
+    NestedPrivatePtr pNested = PNESTED(pScrn);
 
-    /* Print useless stuff */
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Monitor wants these modes:\n");
-    for(mode = pScrn->monitor->Modes; mode != NULL; mode = mode->next) {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "  %s (%dx%d)\n", mode->name,
-                   mode->HDisplay, mode->VDisplay);
-    }
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Too bad for it...\n");
-
-    /* If user requested modes, add them. If not, use 640x480 */
-    if (pScrn->display->modes != NULL) {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "User wants these modes:\n");
-        for(i = 0; pScrn->display->modes[i] != NULL; i++) {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "  %s\n",
-                       pScrn->display->modes[i]);
-            if (sscanf(pScrn->display->modes[i], "%dx%d", &width,
-                       &height) != 2) {
-                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                           "This is not the mode name I was expecting...\n");
-                return 0;
+    if (pNested->output != NULL || pNested->fullscreen) {
+        if (!NestedAddMode(pScrn, pNested->fullWidth, pNested->fullHeight)) {
+            return 0;
+        }
+    } else {
+        /* Print useless stuff */
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Monitor wants these modes:\n");
+        for(mode = pScrn->monitor->Modes; mode != NULL; mode = mode->next) {
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "  %s (%dx%d)\n", mode->name,
+                       mode->HDisplay, mode->VDisplay);
+        }
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Too bad for it...\n");
+
+        /* If user requested modes, add them. If not, use 640x480 */
+        if (pScrn->display->modes != NULL) {
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "User wants these modes:\n");
+            for(i = 0; pScrn->display->modes[i] != NULL; i++) {
+                xf86DrvMsg(pScrn->scrnIndex, X_INFO, "  %s\n",
+                           pScrn->display->modes[i]);
+                if (sscanf(pScrn->display->modes[i], "%dx%d", &width,
+                           &height) != 2) {
+                    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                               "This is not the mode name I was expecting...\n");
+                    return 0;
+                }
+                if (!NestedAddMode(pScrn, width, height)) {
+                    return 0;
+                }
             }
-            if (!NestedAddMode(pScrn, width, height)) {
+        } else {
+            if (!NestedAddMode(pScrn, 640, 480)) {
                 return 0;
             }
         }
-    } else {
-        if (!NestedAddMode(pScrn, 640, 480)) {
-            return 0;
-        }
     }
 
     pScrn->modePool = NULL;
@@ -586,6 +621,7 @@ static Bool NestedScreenInit(SCREEN_INIT_ARGS_DECL)
     pNested->clientData = NestedClientCreateScreen(pScrn->scrnIndex,
                                                    pNested->displayName,
                                                    pNested->xauthFile,
+                                                   pNested->output != NULL || pNested->fullscreen,
                                                    pScrn->virtualX,
                                                    pScrn->virtualY,
                                                    pNested->originX,
diff --git a/src/xlibclient.c b/src/xlibclient.c
index e8f3281..671e63f 100644
--- a/src/xlibclient.c
+++ b/src/xlibclient.c
@@ -87,7 +87,12 @@ struct NestedClientPrivate {
 Bool
 NestedClientCheckDisplay(int scrnIndex,
                          const char *displayName,
-                         const char *xauthFile) {
+                         const char *xauthFile,
+                         const char *output,
+                         unsigned int *width,
+                         unsigned int *height,
+                         int *x,
+                         int *y) {
     Display *d;
 
     /* Needed until we can pass authorization file
@@ -175,6 +180,7 @@ NestedClientPrivatePtr
 NestedClientCreateScreen(int scrnIndex,
                          const char *displayName,
                          const char *xauthFile,
+                         Bool wantFullscreenHint,
                          unsigned int width,
                          unsigned int height,
                          int originX,
-- 
2.1.2



More information about the xorg-devel mailing list