summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/xwin/InitOutput.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/xwin/InitOutput.c')
-rw-r--r--xc/programs/Xserver/hw/xwin/InitOutput.c479
1 files changed, 321 insertions, 158 deletions
diff --git a/xc/programs/Xserver/hw/xwin/InitOutput.c b/xc/programs/Xserver/hw/xwin/InitOutput.c
index 31c3cdee3..68b4c3dc2 100644
--- a/xc/programs/Xserver/hw/xwin/InitOutput.c
+++ b/xc/programs/Xserver/hw/xwin/InitOutput.c
@@ -22,17 +22,21 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
-/* $XFree86: xc/programs/Xserver/hw/xwin/InitOutput.c,v 1.8 2001/05/08 08:14:09 alanh Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xwin/InitOutput.c,v 1.17 2001/08/06 11:02:30 alanh Exp $ */
#include "win.h"
-int g_nNumScreens;
-winScreenInfo g_winScreens[MAXSCREENS];
-int g_nLastScreen = -1;
-ColormapPtr g_cmInstalledMaps[MAXSCREENS];
+int g_iNumScreens = 0;
+winScreenInfo g_ScreenInfo[MAXSCREENS];
+int g_iLastScreen = -1;
int g_fdMessageQueue = WIN_FD_INVALID;
-int g_winScreenPrivateIndex = -1;
-unsigned long g_winGeneration = 0;
+int g_iScreenPrivateIndex = -1;
+int g_iCmapPrivateIndex = -1;
+int g_iGCPrivateIndex = -1;
+int g_iPixmapPrivateIndex = -1;
+unsigned long g_ulServerGeneration = 0;
+HBITMAP g_hbmpGarbage = NULL;
+static Bool g_fScreenInfoInitialized = FALSE;
static PixmapFormatRec g_PixmapFormats[] = {
{ 1, 1, BITMAP_SCANLINE_PAD },
@@ -43,27 +47,35 @@ static PixmapFormatRec g_PixmapFormats[] = {
{ 24, 24, BITMAP_SCANLINE_PAD },
{ 32, 32, BITMAP_SCANLINE_PAD }
};
+
const int NUMFORMATS = sizeof (g_PixmapFormats) / sizeof (g_PixmapFormats[0]);
void
winInitializeDefaultScreens (void)
{
int i;
+
+ /* Set a default DPI, if no parameter was passed */
+ if (monitorResolution == 0)
+ monitorResolution = WIN_DEFAULT_DPI;
- for (i = 0; i < MAXSCREENS; i++)
+ for (i = 0; i < MAXSCREENS; ++i)
{
- g_winScreens[i].dwScreen = i;
- g_winScreens[i].dwWidth = WIN_DEFAULT_WIDTH;
- g_winScreens[i].dwHeight = WIN_DEFAULT_HEIGHT;
- g_winScreens[i].dwDepth = WIN_DEFAULT_DEPTH;
- g_winScreens[i].pixelBlack = WIN_DEFAULT_BLACKPIXEL;
- g_winScreens[i].pixelWhite = WIN_DEFAULT_WHITEPIXEL;
- g_winScreens[i].dwLineBias = WIN_DEFAULT_LINEBIAS;
- g_winScreens[i].pfb = NULL;
- g_winScreens[i].fFullScreen = FALSE;
- g_winScreens[i].iE3BTimeout = WIN_E3B_OFF;
+ g_ScreenInfo[i].dwScreen = i;
+ g_ScreenInfo[i].dwWidth = WIN_DEFAULT_WIDTH;
+ g_ScreenInfo[i].dwHeight = WIN_DEFAULT_HEIGHT;
+ g_ScreenInfo[i].dwDepth = WIN_DEFAULT_DEPTH;
+ g_ScreenInfo[i].dwRefreshRate = WIN_DEFAULT_REFRESH;
+ g_ScreenInfo[i].pfb = NULL;
+ g_ScreenInfo[i].fFullScreen = FALSE;
+ g_ScreenInfo[i].iE3BTimeout = WIN_E3B_OFF;
+ g_ScreenInfo[i].dwWidth_mm = (WIN_DEFAULT_WIDTH / WIN_DEFAULT_DPI)
+ * 25.4;
+ g_ScreenInfo[i].dwHeight_mm = (WIN_DEFAULT_HEIGHT / WIN_DEFAULT_DPI)
+ * 25.4;
+ g_ScreenInfo[i].fUseWinKillKey = WIN_DEFAULT_WIN_KILL;
+ g_ScreenInfo[i].fUseUnixKillKey = WIN_DEFAULT_UNIX_KILL;
}
- g_nNumScreens = 1;
}
DWORD
@@ -113,93 +125,166 @@ OsVendorInit (void)
#if CYGDEBUG
ErrorF ("OsVendorInit ()\n");
#endif
+
+ /* Add a default screen if no screens were specified */
+ if (g_iNumScreens == 0)
+ {
+ if (!g_fScreenInfoInitialized)
+ winInitializeDefaultScreens ();
+
+ g_iNumScreens = 1;
+ g_iLastScreen = 0;
+
+ g_ScreenInfo[0].dwWidth = GetSystemMetrics (SM_CXSCREEN);
+ g_ScreenInfo[0].dwHeight = GetSystemMetrics (SM_CYSCREEN);
+ }
}
/* See Porting Layer Definition - p. 57 */
void
ddxUseMsg (void)
{
- ErrorF ("-screen n WxHxD\n"\
- "\tSet screen n's width, height, and bit depth\n");
- ErrorF ("-linebias n\n"\
- "\tAdjust thin line pixelization\n");
- ErrorF ("-blackpixel n\n"\
- "\tPixel value for black\n");
- ErrorF ("-whitepixel n\n"\
- "\tPixel value for white\n");
- ErrorF ("-engine n\n"\
- "\tOverride the server's detected engine type:\n"\
- "\t\tGDI blitter\t\t1\n"\
- "\t\tDirectDraw blitter\t2\n"\
- "\t\tDirectDraw4 blitter\t4\n");
+ ErrorF ("-screen scr_num width height\n"
+ "\tSet screen scr_num's width and height\n");
+ ErrorF ("-engine engine_type_id\n"
+ "\tOverride the server's automatically selected engine type:\n"
+ "\t\t1 - GDI blitter\t\t1\n"
+ "\t\t2 - DirectDraw blitter\t2\n"
+ "\t\t4 - DirectDraw4 blitter\t4\n");
ErrorF ("-fullscreen\n"
- "\tRun the specified server engine in fullscreen mode\n");
- ErrorF ("-emulate3buttons [n]\n"
- "\tEmulate 3 button mouse with timeout of n milliseconds\n");
+ "\tRun the server in fullscreen mode\n");
+ ErrorF ("-depth bits_per_pixel\n"
+ "\tSpecify an optional bitdepth to use in fullscreen mode\n"
+ "\twith a DirectDraw engine.\n");
+ ErrorF ("-refresh rate_in_Hz\n"
+ "\tSpecify an optional refresh rate to use in fullscreen mode\n"
+ "\twith a DirectDraw engine.\n");
+ ErrorF ("-emulate3buttons [timeout]\n"
+ "\tEmulate 3 button mouse with an optional timeout in "
+ "milliseconds\n");
+ ErrorF ("-[no]winkill\n"
+ "\tAlt+F4 exits the XServer\n");
+ ErrorF ("-[no]unixkill\n"
+ "\tCtrl+Alt+Backspace exits the XServer\n");
}
/* See Porting Layer Definition - p. 57 */
+/*
+ * INPUT
+ * argv: pointer to an array of null-terminated strings, one for
+ * each token in the X Server command line; the first token
+ * is 'XWin.exe', or similar.
+ * argc: a count of the number of tokens stored in argv.
+ * i: a zero-based index into argv indicating the current token being
+ * processed.
+ *
+ * OUTPUT
+ * return: return the number of tokens processed correctly.
+ *
+ * NOTE
+ * When looking for n tokens, check that i + n is less than argc. Or,
+ * you may check if i is greater than or equal to argc, in which case
+ * you should display the UseMsg () and return 0.
+ */
int
ddxProcessArgument (int argc, char *argv[], int i)
{
- static Bool fFirstTime = TRUE;
+ ErrorF ("ddxProcessArgument ()\n");
/* Run some initialization procedures the first time through */
- if (fFirstTime)
+ if (!g_fScreenInfoInitialized)
{
winInitializeDefaultScreens ();
- fFirstTime = FALSE;
+ g_fScreenInfoInitialized = TRUE;
}
+ /* Set a default DPI */
+ if (monitorResolution == 0)
+ monitorResolution = WIN_DEFAULT_DPI;
+
/*
- * Look for the '-screen n WxHxD' arugment
+ * Look for the '-screen scr_num width height' argument
*/
if (strcmp (argv[i], "-screen") == 0)
{
+ int iArgsProcessed = 1;
int nScreenNum;
+ ErrorF ("ddxProcessArgument () - screen - argc: %d i: %d\n",
+ argc, i);
+
/* Display the usage message if the argument is malformed */
if (i + 2 >= argc)
{
- UseMsg ();
return 0;
}
-
- nScreenNum = atoi (argv[i+1]);
+
+ /* Grab screen number */
+ nScreenNum = atoi (argv[i + 1]);
/* Validate the specified screen number */
if (nScreenNum < 0 || nScreenNum >= MAXSCREENS)
{
- ErrorF ("Invalid screen number %d\n", nScreenNum);
+ ErrorF ("ddxProcessArgument () - Invalid screen number %d\n",
+ nScreenNum);
UseMsg ();
return 0;
}
-
- /* Grab the height, width, and depth parameters */
- if (3 != sscanf (argv[i+2], "%dx%dx%d",
- (int*)&g_winScreens[nScreenNum].dwWidth,
- (int*)&g_winScreens[nScreenNum].dwHeight,
- (int*)&g_winScreens[nScreenNum].dwDepth))
- {
- /* I see no height, width, and depth here */
- ErrorF ("Invalid screen configuration %s\n", argv[i+2]);
- UseMsg ();
+
+ /* Look for 'WxD' or 'W D' */
+ if (2 == sscanf (argv[i + 2], "%dx%d",
+ (int *) &g_ScreenInfo[nScreenNum].dwWidth,
+ (int *) &g_ScreenInfo[nScreenNum].dwHeight))
+ {
+ iArgsProcessed = 3;
+ }
+ else if (i + 3 < argc
+ && 1 == sscanf (argv[i + 2], "%d",
+ (int *) &g_ScreenInfo[nScreenNum].dwWidth)
+ && 1 == sscanf (argv[i + 3], "%d",
+ (int *) &g_ScreenInfo[nScreenNum].dwHeight))
+ {
+ iArgsProcessed = 4;
+ }
+ else
+ {
+ /* I see no height and width here */
+ ErrorF ("ddxProcessArgument () - Invalid screen width and "
+ "height: %s\n",
+ argv[i + 2]);
return 0;
- }
+ }
+
+
+ /* Calculate the screen width and height in millimeters */
+ g_ScreenInfo[nScreenNum].dwWidth_mm
+ = (g_ScreenInfo[nScreenNum].dwWidth
+ / monitorResolution) * 25.4;
+ g_ScreenInfo[nScreenNum].dwHeight_mm
+ = (g_ScreenInfo[nScreenNum].dwHeight
+ / monitorResolution) * 25.4;
+
+ /*
+ * Keep track of the last screen number seen, as parameters seen
+ * before a screen number apply to all screens, whereas parameters
+ * seen after a screen number apply to that screen number only.
+ */
+ g_iLastScreen = nScreenNum;
- if (nScreenNum >= g_nNumScreens)
- g_nNumScreens = nScreenNum + 1;
- g_nLastScreen = nScreenNum;
- return 3;
+ /* Keep a count of the number of screens */
+ ++g_iNumScreens;
+
+ return iArgsProcessed;
}
/*
- * Look for the '-blackpixel n' argument
+ * Look for the '-engine n' argument
*/
- if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */
+ if (strcmp (argv[i], "-engine") == 0)
{
- Pixel pix;
-
+ DWORD dwEngine = 0;
+ CARD8 c8OnBits = 0;
+
/* Display the usage message if the argument is malformed */
if (++i >= argc)
{
@@ -207,69 +292,121 @@ ddxProcessArgument (int argc, char *argv[], int i)
return 0;
}
- pix = atoi (argv[i]);
+ /* Grab the argument */
+ dwEngine = atoi (argv[i]);
+
+ /* Count the one bits in the engine argument */
+ c8OnBits = winCountBits (dwEngine);
+
+ /* Argument should only have a single bit on */
+ if (c8OnBits != 1)
+ {
+ UseMsg ();
+ return 0;
+ }
/* Is this parameter attached to a screen or global? */
- if (-1 == g_nLastScreen)
- {
- int j;
+ if (-1 == g_iLastScreen)
+ {
+ int j;
/* Parameter is for all screens */
- for (j = 0; j < MAXSCREENS; j++)
- {
- g_winScreens[j].pixelBlack = pix;
- }
- }
+ for (j = 0; j < MAXSCREENS; j++)
+ {
+ g_ScreenInfo[j].dwEnginePreferred = dwEngine;
+ }
+ }
else
- {
+ {
/* Parameter is for a single screen */
- g_winScreens[g_nLastScreen].pixelBlack = pix;
- }
+ g_ScreenInfo[g_iLastScreen].dwEnginePreferred = dwEngine;
+ }
+
+ /* Indicate that we have processed the argument */
return 2;
}
/*
- * Look for the '-whitepixel n' argument
+ * Look for the '-fullscreen' argument
*/
- if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */
+ if (strcmp(argv[i], "-fullscreen") == 0)
{
- Pixel pix;
+ /* Is this parameter attached to a screen or is it global? */
+ if (-1 == g_iLastScreen)
+ {
+ int j;
- /* Display the usage message if the argument is malformed */
- if (++i >= argc)
+ /* Parameter is for all screens */
+ for (j = 0; j < MAXSCREENS; j++)
+ {
+ g_ScreenInfo[j].fFullScreen = TRUE;
+ }
+ }
+ else
{
- UseMsg ();
- return 0;
+ /* Parameter is for a single screen */
+ g_ScreenInfo[g_iLastScreen].fFullScreen = TRUE;
}
- pix = atoi (argv[i]);
+ /* Indicate that we have processed this argument */
+ return 1;
+ }
- /* Is this parameter attached to a screen or global? */
- if (-1 == g_nLastScreen)
+ /*
+ * Look for the '-emulate3buttons' argument
+ */
+ if (strcmp(argv[i], "-emulate3buttons") == 0)
+ {
+ int iArgsProcessed = 1;
+ int iE3BTimeout = WIN_DEFAULT_E3B_TIME;
+
+ /* Grab the optional timeout value */
+ if (i + 1 < argc
+ && 1 == sscanf (argv[i + 1], "%d",
+ &iE3BTimeout))
{
- int j;
+ /* Indicate that we have processed the next argument */
+ iArgsProcessed++;
+ }
+ else
+ {
+ /*
+ * sscanf () won't modify iE3BTimeout if it doesn't find
+ * the specified format; however, I want to be explicit
+ * about setting the default timeout in such cases to
+ * prevent some programs (me) from getting confused.
+ */
+ iE3BTimeout = WIN_DEFAULT_E3B_TIME;
+ }
+
+ /* Is this parameter attached to a screen or is it global? */
+ if (-1 == g_iLastScreen)
+ {
+ int j;
/* Parameter is for all screens */
- for (j = 0; j < MAXSCREENS; j++)
- {
- g_winScreens[j].pixelWhite = pix;
- }
- }
+ for (j = 0; j < MAXSCREENS; j++)
+ {
+ g_ScreenInfo[j].iE3BTimeout = iE3BTimeout;
+ }
+ }
else
- {
+ {
/* Parameter is for a single screen */
- g_winScreens[g_nLastScreen].pixelWhite = pix;
- }
- return 2;
+ g_ScreenInfo[g_iLastScreen].iE3BTimeout = TRUE;
+ }
+
+ /* Indicate that we have processed this argument */
+ return iArgsProcessed;
}
/*
- * Look for the '-linebias n' argument
+ * Look for the '-depth n' argument
*/
- if (strcmp (argv[i], "-linebias") == 0)
+ if (strcmp (argv[i], "-depth") == 0)
{
- unsigned int uiLinebias;
-
+ DWORD dwDepth = 0;
+
/* Display the usage message if the argument is malformed */
if (++i >= argc)
{
@@ -277,34 +414,36 @@ ddxProcessArgument (int argc, char *argv[], int i)
return 0;
}
- uiLinebias = atoi (argv[i]);
+ /* Grab the argument */
+ dwDepth = atoi (argv[i]);
/* Is this parameter attached to a screen or global? */
- if (-1 == g_nLastScreen)
- {
- int j;
+ if (-1 == g_iLastScreen)
+ {
+ int j;
/* Parameter is for all screens */
- for (j = 0; j < MAXSCREENS; j++)
- {
- g_winScreens[j].dwLineBias = uiLinebias;
- }
- }
+ for (j = 0; j < MAXSCREENS; j++)
+ {
+ g_ScreenInfo[j].dwDepth = dwDepth;
+ }
+ }
else
- {
+ {
/* Parameter is for a single screen */
- g_winScreens[g_nLastScreen].dwLineBias = uiLinebias;
- }
+ g_ScreenInfo[g_iLastScreen].dwDepth = dwDepth;
+ }
+
+ /* Indicate that we have processed the argument */
return 2;
}
/*
- * Look for the '-engine n' argument
+ * Look for the '-refresh n' argument
*/
- if (strcmp (argv[i], "-engine") == 0)
+ if (strcmp (argv[i], "-refresh") == 0)
{
- DWORD dwEngine = 0;
- CARD8 c8OnBits = 0;
+ DWORD dwRefreshRate = 0;
/* Display the usage message if the argument is malformed */
if (++i >= argc)
@@ -314,33 +453,23 @@ ddxProcessArgument (int argc, char *argv[], int i)
}
/* Grab the argument */
- dwEngine = atoi (argv[i]);
-
- /* Count the one bits in the engine argument */
- c8OnBits = winCountBits (dwEngine);
-
- /* Argument should only have a single bit on */
- if (c8OnBits != 1)
- {
- UseMsg ();
- return 0;
- }
+ dwRefreshRate = atoi (argv[i]);
/* Is this parameter attached to a screen or global? */
- if (-1 == g_nLastScreen)
+ if (-1 == g_iLastScreen)
{
int j;
/* Parameter is for all screens */
for (j = 0; j < MAXSCREENS; j++)
{
- g_winScreens[j].dwEnginePreferred = dwEngine;
+ g_ScreenInfo[j].dwRefreshRate = dwRefreshRate;
}
}
else
{
/* Parameter is for a single screen */
- g_winScreens[g_nLastScreen].dwEnginePreferred = dwEngine;
+ g_ScreenInfo[g_iLastScreen].dwRefreshRate = dwRefreshRate;
}
/* Indicate that we have processed the argument */
@@ -348,25 +477,25 @@ ddxProcessArgument (int argc, char *argv[], int i)
}
/*
- * Look for the '-fullscreen' argument
+ * Look for the '-nowinkill' argument
*/
- if (strcmp(argv[i], "-fullscreen") == 0)
+ if (strcmp(argv[i], "-nowinkill") == 0)
{
/* Is this parameter attached to a screen or is it global? */
- if (-1 == g_nLastScreen)
+ if (-1 == g_iLastScreen)
{
int j;
/* Parameter is for all screens */
for (j = 0; j < MAXSCREENS; j++)
{
- g_winScreens[j].fFullScreen = TRUE;
+ g_ScreenInfo[j].fUseWinKillKey = FALSE;
}
}
else
{
/* Parameter is for a single screen */
- g_winScreens[g_nLastScreen].fFullScreen = TRUE;
+ g_ScreenInfo[g_iLastScreen].fUseWinKillKey = FALSE;
}
/* Indicate that we have processed this argument */
@@ -374,51 +503,81 @@ ddxProcessArgument (int argc, char *argv[], int i)
}
/*
- * Look for the '-emulate3buttons' argument
+ * Look for the '-winkill' argument
*/
- if (strcmp(argv[i], "-emulate3buttons") == 0)
+ if (strcmp(argv[i], "-winkill") == 0)
{
- int iArgsProcessed = 1;
- int iE3BTimeout = WIN_DEFAULT_E3B_TIME;
+ /* Is this parameter attached to a screen or is it global? */
+ if (-1 == g_iLastScreen)
+ {
+ int j;
- /* Grab the optional timeout value */
- if (i + 1 < argc
- && 1 == sscanf (argv[i + 1], "%d",
- &iE3BTimeout))
- {
- /* Indicate that we have processed the next argument */
- iArgsProcessed++;
- }
+ /* Parameter is for all screens */
+ for (j = 0; j < MAXSCREENS; j++)
+ {
+ g_ScreenInfo[j].fUseWinKillKey = TRUE;
+ }
+ }
else
{
- /*
- * sscanf () won't modify iE3BTimeout if it doesn't find
- * the specified format; however, I want to be explicit
- * about setting the default timeout in such cases to
- * prevent some programs (me) from getting confused.
- */
- iE3BTimeout = WIN_DEFAULT_E3B_TIME;
+ /* Parameter is for a single screen */
+ g_ScreenInfo[g_iLastScreen].fUseWinKillKey = TRUE;
}
+ /* Indicate that we have processed this argument */
+ return 1;
+ }
+
+ /*
+ * Look for the '-nounixkill' argument
+ */
+ if (strcmp(argv[i], "-nounixkill") == 0)
+ {
/* Is this parameter attached to a screen or is it global? */
- if (-1 == g_nLastScreen)
+ if (-1 == g_iLastScreen)
{
int j;
/* Parameter is for all screens */
for (j = 0; j < MAXSCREENS; j++)
{
- g_winScreens[j].iE3BTimeout = iE3BTimeout;
+ g_ScreenInfo[j].fUseUnixKillKey = FALSE;
}
}
else
{
/* Parameter is for a single screen */
- g_winScreens[g_nLastScreen].iE3BTimeout = TRUE;
+ g_ScreenInfo[g_iLastScreen].fUseUnixKillKey = FALSE;
}
/* Indicate that we have processed this argument */
- return iArgsProcessed;
+ return 1;
+ }
+
+ /*
+ * Look for the '-unixkill' argument
+ */
+ if (strcmp(argv[i], "-unixkill") == 0)
+ {
+ /* Is this parameter attached to a screen or is it global? */
+ if (-1 == g_iLastScreen)
+ {
+ int j;
+
+ /* Parameter is for all screens */
+ for (j = 0; j < MAXSCREENS; j++)
+ {
+ g_ScreenInfo[j].fUseUnixKillKey = TRUE;
+ }
+ }
+ else
+ {
+ /* Parameter is for a single screen */
+ g_ScreenInfo[g_iLastScreen].fUseUnixKillKey = TRUE;
+ }
+
+ /* Indicate that we have processed this argument */
+ return 1;
}
return 0;
@@ -439,13 +598,17 @@ InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
{
int i;
+#if CYGDEBUG
+ ErrorF ("InitOutput ()\n");
+#endif
+
/* Setup global screen info parameters */
screenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
screenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
screenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
screenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
screenInfo->numPixmapFormats = NUMFORMATS;
-
+
/* Describe how we want common pixmap formats padded */
for (i = 0; i < NUMFORMATS; i++)
{
@@ -453,7 +616,7 @@ InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
}
/* Initialize each screen */
- for (i = 0; i < g_nNumScreens; i++)
+ for (i = 0; i < g_iNumScreens; i++)
{
if (-1 == AddScreen (winScreenInit, argc, argv))
{