summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon TURNEY <jon.turney@dronecode.org.uk>2010-04-16 18:13:50 +0100
committerTiago Vignatti <tiago.vignatti@nokia.com>2010-04-23 15:59:49 +0300
commita7d398e545a4be5491248d5ccb303aa03ee1594f (patch)
treeaffd1e09c3e22c57195e1e1923a546113a2a83f2
parentd8454ae488cfc073cd6010c9a08d53855a0c2612 (diff)
Xwin: make screens structures run-time adjustable
Change g_ScreenInfo, an array of winScreenInfo elements, from a static array of MAXSCREENS elements, to a dynamically allocated one Fix up the validation that -screen option screen numbers are contiguous from zero (which possibly didn't work correctly before anyhow) Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> Reviewed-by: Jamey Sharp<jamey@minilop.net> Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com>
-rw-r--r--hw/xwin/InitOutput.c2
-rw-r--r--hw/xwin/win.h2
-rw-r--r--hw/xwin/winglobals.c2
-rwxr-xr-xhw/xwin/winprocarg.c7
-rwxr-xr-xhw/xwin/winvalargs.c31
5 files changed, 23 insertions, 21 deletions
diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 8c7ebf0ea..0ab692987 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -64,7 +64,7 @@ typedef HRESULT (*SHGETFOLDERPATHPROC)(
*/
extern int g_iNumScreens;
-extern winScreenInfo g_ScreenInfo[];
+extern winScreenInfo * g_ScreenInfo;
extern char * g_pszCommandLine;
extern Bool g_fSilentFatalError;
diff --git a/hw/xwin/win.h b/hw/xwin/win.h
index 072c69121..5abaa031c 100644
--- a/hw/xwin/win.h
+++ b/hw/xwin/win.h
@@ -622,7 +622,7 @@ typedef struct {
* Extern declares for general global variables
*/
-extern winScreenInfo g_ScreenInfo[];
+extern winScreenInfo * g_ScreenInfo;
extern miPointerScreenFuncRec g_winPointerCursorFuncs;
extern DWORD g_dwEvents;
#ifdef HAS_DEVWINDOWS
diff --git a/hw/xwin/winglobals.c b/hw/xwin/winglobals.c
index da7815560..d74011cc7 100644
--- a/hw/xwin/winglobals.c
+++ b/hw/xwin/winglobals.c
@@ -41,7 +41,7 @@
*/
int g_iNumScreens = 0;
-winScreenInfo g_ScreenInfo[MAXSCREENS];
+winScreenInfo * g_ScreenInfo = 0;
#ifdef HAS_DEVWINDOWS
int g_fdMessageQueue = WIN_FD_INVALID;
#endif
diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c
index 540adf706..ad4b7e913 100755
--- a/hw/xwin/winprocarg.c
+++ b/hw/xwin/winprocarg.c
@@ -45,7 +45,7 @@ from The Open Group.
*/
extern int g_iNumScreens;
-extern winScreenInfo g_ScreenInfo[];
+extern winScreenInfo * g_ScreenInfo;
#ifdef XWIN_CLIPBOARD
extern Bool g_fUnicodeClipboard;
extern Bool g_fClipboard;
@@ -227,6 +227,9 @@ winInitializeScreens(int maxscreens)
if (maxscreens > g_iNumScreens)
{
+ /* Reallocate the memory for DDX-specific screen info */
+ g_ScreenInfo = realloc(g_ScreenInfo, maxscreens * sizeof (winScreenInfo));
+
/* Set default values for any new screens */
for (i = g_iNumScreens; i < maxscreens ; i++)
winInitializeScreen(i);
@@ -353,7 +356,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
nScreenNum = atoi (argv[i + 1]);
/* Validate the specified screen number */
- if (nScreenNum < 0 || nScreenNum >= MAXSCREENS)
+ if (nScreenNum < 0)
{
ErrorF ("ddxProcessArgument - screen - Invalid screen number %d\n",
nScreenNum);
diff --git a/hw/xwin/winvalargs.c b/hw/xwin/winvalargs.c
index 038e097a5..6f8d1c994 100755
--- a/hw/xwin/winvalargs.c
+++ b/hw/xwin/winvalargs.c
@@ -40,17 +40,24 @@
*/
extern int g_iNumScreens;
-extern winScreenInfo g_ScreenInfo[];
+extern winScreenInfo * g_ScreenInfo;
extern Bool g_fXdmcpEnabled;
/*
- * Prototypes
+ * Verify all screens have been explicitly specified
*/
+static BOOL
+isEveryScreenExplicit(void)
+{
+ int i;
-Bool
-winValidateArgs (void);
+ for (i = 0; i < g_iNumScreens; i++)
+ if (!g_ScreenInfo[i].fExplicitScreen)
+ return FALSE;
+ return TRUE;
+}
/*
* winValidateArgs - Look for invalid argument combinations
@@ -62,6 +69,7 @@ winValidateArgs (void)
int i;
int iMaxConsecutiveScreen = 0;
BOOL fHasNormalScreen0 = FALSE;
+ BOOL fImplicitScreenFound = FALSE;
/*
* Check for a malformed set of -screen parameters.
@@ -70,23 +78,14 @@ winValidateArgs (void)
* XWin -screen 0 -screen 2
* XWin -screen 1 -screen 2
*/
- for (i = 0; i < MAXSCREENS; i++)
- {
- if (g_ScreenInfo[i].fExplicitScreen)
- iMaxConsecutiveScreen = i + 1;
- }
- winErrorFVerb (2, "winValidateArgs - g_iNumScreens: %d "
- "iMaxConsecutiveScreen: %d\n",
- g_iNumScreens, iMaxConsecutiveScreen);
- if (g_iNumScreens < iMaxConsecutiveScreen)
+ if (!isEveryScreenExplicit())
{
ErrorF ("winValidateArgs - Malformed set of screen parameter(s). "
"Screens must be specified consecutively starting with "
"screen 0. That is, you cannot have only a screen 1, nor "
"could you have screen 0 and screen 2. You instead must "
- "have screen 0, or screen 0 and screen 1, respectively. Of "
- "you can specify as many screens as you want from 0 up to "
- "%d.\n", MAXSCREENS - 1);
+ "have screen 0, or screen 0 and screen 1, respectively. "
+ "You can specify as many screens as you want.\n");
return FALSE;
}