diff options
Diffstat (limited to 'xc/programs/Xserver/hw/xwin/InitOutput.c')
-rw-r--r-- | xc/programs/Xserver/hw/xwin/InitOutput.c | 479 |
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)) { |