8ef3e7052e
Use find | xargs combination instead of simple shell globbing to prevent commandline argument overflow
794 lines
20 KiB
C
794 lines
20 KiB
C
/* $TOG: InitOutput.c /main/20 1998/02/10 13:23:56 kaleb $ */
|
|
/*
|
|
|
|
Copyright 1993, 1998 The Open Group
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software and its
|
|
documentation for any purpose is hereby granted without fee, provided that
|
|
the above copyright notice appear in all copies and that both that
|
|
copyright notice and this permission notice appear in supporting
|
|
documentation.
|
|
|
|
The above copyright notice and this permission notice shall be included
|
|
in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of The Open Group shall
|
|
not be used in advertising or otherwise to promote the sale, use or
|
|
other dealings in this Software without prior written authorization
|
|
from The Open Group.
|
|
|
|
*/
|
|
/* $XFree86: xc/programs/Xserver/hw/xwin/InitOutput.c,v 1.34 2003/10/02 13:30:09 eich Exp $ */
|
|
|
|
#include "win.h"
|
|
#include "winmsg.h"
|
|
#ifdef XWIN_XF86CONFIG
|
|
#include "winconfig.h"
|
|
#endif
|
|
#include "winprefs.h"
|
|
#include "X11/Xlocale.h"
|
|
#include <mntent.h>
|
|
|
|
|
|
/*
|
|
* References to external symbols
|
|
*/
|
|
|
|
extern int g_iNumScreens;
|
|
extern winScreenInfo g_ScreenInfo[];
|
|
extern int g_iLastScreen;
|
|
extern char * g_pszCommandLine;
|
|
extern Bool g_fSilentFatalError;
|
|
|
|
extern char * g_pszLogFile;
|
|
extern int g_iLogVerbose;
|
|
Bool g_fLogInited;
|
|
|
|
extern Bool g_fXdmcpEnabled;
|
|
extern int g_fdMessageQueue;
|
|
extern const char * g_pszQueryHost;
|
|
extern HINSTANCE g_hInstance;
|
|
|
|
#ifdef XWIN_CLIPBOARD
|
|
extern Bool g_fUnicodeClipboard;
|
|
extern Bool g_fClipboardLaunched;
|
|
extern Bool g_fClipboardStarted;
|
|
extern pthread_t g_ptClipboardProc;
|
|
extern HWND g_hwndClipboard;
|
|
extern Bool g_fClipboard;
|
|
#endif
|
|
|
|
extern HMODULE g_hmodDirectDraw;
|
|
extern FARPROC g_fpDirectDrawCreate;
|
|
extern FARPROC g_fpDirectDrawCreateClipper;
|
|
|
|
extern HMODULE g_hmodCommonControls;
|
|
extern FARPROC g_fpTrackMouseEvent;
|
|
extern Bool g_fNoHelpMessageBox;
|
|
extern Bool g_fSilentDupError;
|
|
|
|
|
|
/*
|
|
* Function prototypes
|
|
*/
|
|
|
|
#ifdef XWIN_CLIPBOARD
|
|
static void
|
|
winClipboardShutdown (void);
|
|
#endif
|
|
|
|
#if defined(DDXOSVERRORF)
|
|
void
|
|
OsVendorVErrorF (const char *pszFormat, va_list va_args);
|
|
#endif
|
|
|
|
void
|
|
winInitializeDefaultScreens (void);
|
|
|
|
static Bool
|
|
winCheckDisplayNumber (void);
|
|
|
|
void
|
|
winLogCommandLine (int argc, char *argv[]);
|
|
|
|
void
|
|
winLogVersionInfo (void);
|
|
|
|
Bool
|
|
winValidateArgs (void);
|
|
|
|
|
|
/*
|
|
* For the depth 24 pixmap we default to 32 bits per pixel, but
|
|
* we change this pixmap format later if we detect that the display
|
|
* is going to be running at 24 bits per pixel.
|
|
*
|
|
* FIXME: On second thought, don't DIBs only support 32 bits per pixel?
|
|
* DIBs are the underlying bitmap used for DirectDraw surfaces, so it
|
|
* seems that all pixmap formats with depth 24 would be 32 bits per pixel.
|
|
* Confirm whether depth 24 DIBs can have 24 bits per pixel, then remove/keep
|
|
* the bits per pixel adjustment and update this comment to reflect the
|
|
* situation. Harold Hunt - 2002/07/02
|
|
*/
|
|
|
|
static PixmapFormatRec g_PixmapFormats[] = {
|
|
{ 1, 1, BITMAP_SCANLINE_PAD },
|
|
{ 4, 8, BITMAP_SCANLINE_PAD },
|
|
{ 8, 8, BITMAP_SCANLINE_PAD },
|
|
{ 15, 16, BITMAP_SCANLINE_PAD },
|
|
{ 16, 16, BITMAP_SCANLINE_PAD },
|
|
{ 24, 32, BITMAP_SCANLINE_PAD },
|
|
#ifdef RENDER
|
|
{ 32, 32, BITMAP_SCANLINE_PAD }
|
|
#endif
|
|
};
|
|
|
|
const int NUMFORMATS = sizeof (g_PixmapFormats) / sizeof (g_PixmapFormats[0]);
|
|
|
|
#ifdef XWIN_CLIPBOARD
|
|
static void
|
|
winClipboardShutdown (void)
|
|
{
|
|
/* Close down clipboard resources */
|
|
if (g_fClipboard && g_fClipboardLaunched && g_fClipboardStarted)
|
|
{
|
|
/* Synchronously destroy the clipboard window */
|
|
if (g_hwndClipboard != NULL)
|
|
{
|
|
SendMessage (g_hwndClipboard, WM_DESTROY, 0, 0);
|
|
/* NOTE: g_hwndClipboard is set to NULL in winclipboardthread.c */
|
|
}
|
|
else
|
|
return;
|
|
|
|
/* Wait for the clipboard thread to exit */
|
|
if (g_ptClipboardProc)
|
|
{
|
|
pthread_join (g_ptClipboardProc, NULL);
|
|
g_ptClipboardProc = 0;
|
|
}
|
|
else
|
|
return;
|
|
|
|
g_fClipboardLaunched = FALSE;
|
|
g_fClipboardStarted = FALSE;
|
|
|
|
winDebug ("winClipboardShutdown - Clipboard thread has exited.\n");
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#if defined(DDXBEFORERESET)
|
|
/*
|
|
* Called right before KillAllClients when the server is going to reset,
|
|
* allows us to shutdown our seperate threads cleanly.
|
|
*/
|
|
|
|
void
|
|
ddxBeforeReset (void)
|
|
{
|
|
winDebug ("ddxBeforeReset - Hello\n");
|
|
|
|
#ifdef XWIN_CLIPBOARD
|
|
winClipboardShutdown ();
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
|
|
/* See Porting Layer Definition - p. 57 */
|
|
void
|
|
ddxGiveUp (void)
|
|
{
|
|
int i;
|
|
|
|
#if CYGDEBUG
|
|
winDebug ("ddxGiveUp\n");
|
|
#endif
|
|
|
|
/* Perform per-screen deinitialization */
|
|
for (i = 0; i < g_iNumScreens; ++i)
|
|
{
|
|
/* Delete the tray icon */
|
|
if (!g_ScreenInfo[i].fNoTrayIcon && g_ScreenInfo[i].pScreen)
|
|
winDeleteNotifyIcon (winGetScreenPriv (g_ScreenInfo[i].pScreen));
|
|
}
|
|
|
|
#ifdef XWIN_MULTIWINDOW
|
|
/* Notify the worker threads we're exiting */
|
|
winDeinitMultiWindowWM ();
|
|
#endif
|
|
|
|
/* Close our handle to our message queue */
|
|
if (g_fdMessageQueue != WIN_FD_INVALID)
|
|
{
|
|
/* Close /dev/windows */
|
|
close (g_fdMessageQueue);
|
|
|
|
/* Set the file handle to invalid */
|
|
g_fdMessageQueue = WIN_FD_INVALID;
|
|
}
|
|
|
|
if (!g_fLogInited) {
|
|
LogInit (g_pszLogFile, NULL);
|
|
g_fLogInited = TRUE;
|
|
}
|
|
LogClose ();
|
|
|
|
/*
|
|
* At this point we aren't creating any new screens, so
|
|
* we are guaranteed to not need the DirectDraw functions.
|
|
*/
|
|
if (g_hmodDirectDraw != NULL)
|
|
{
|
|
FreeLibrary (g_hmodDirectDraw);
|
|
g_hmodDirectDraw = NULL;
|
|
g_fpDirectDrawCreate = NULL;
|
|
g_fpDirectDrawCreateClipper = NULL;
|
|
}
|
|
|
|
/* Unload our TrackMouseEvent funtion pointer */
|
|
if (g_hmodCommonControls != NULL)
|
|
{
|
|
FreeLibrary (g_hmodCommonControls);
|
|
g_hmodCommonControls = NULL;
|
|
g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
|
|
}
|
|
|
|
/* Free concatenated command line */
|
|
if (g_pszCommandLine)
|
|
{
|
|
free (g_pszCommandLine);
|
|
g_pszCommandLine = NULL;
|
|
}
|
|
|
|
/* Remove our keyboard hook if it is installed */
|
|
winRemoveKeyboardHookLL ();
|
|
|
|
/* Tell Windows that we want to end the app */
|
|
PostQuitMessage (0);
|
|
}
|
|
|
|
|
|
/* See Porting Layer Definition - p. 57 */
|
|
void
|
|
AbortDDX (void)
|
|
{
|
|
#if CYGDEBUG
|
|
winDebug ("AbortDDX\n");
|
|
#endif
|
|
ddxGiveUp ();
|
|
}
|
|
|
|
/* hasmntopt is currently not implemented for cygwin */
|
|
const char *winCheckMntOpt(const struct mntent *mnt, const char *opt)
|
|
{
|
|
const char *s;
|
|
size_t len;
|
|
if (mnt == NULL)
|
|
return NULL;
|
|
if (opt == NULL)
|
|
return NULL;
|
|
if (mnt->mnt_opts == NULL)
|
|
return NULL;
|
|
|
|
len = strlen(opt);
|
|
s = strstr(mnt->mnt_opts, opt);
|
|
if (s == NULL)
|
|
return NULL;
|
|
if ((s == mnt->mnt_opts || *(s-1) == ',') && (s[len] == 0 || s[len] == ','))
|
|
return (char *)opt;
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
winCheckMount(void)
|
|
{
|
|
FILE *mnt;
|
|
struct mntent *ent;
|
|
|
|
enum { none = 0, sys_root, user_root, sys_tmp, user_tmp }
|
|
level = none, curlevel;
|
|
BOOL binary = TRUE;
|
|
|
|
mnt = setmntent("/etc/mtab", "r");
|
|
if (mnt == NULL)
|
|
{
|
|
ErrorF("setmntent failed");
|
|
return;
|
|
}
|
|
|
|
while ((ent = getmntent(mnt)) != NULL)
|
|
{
|
|
BOOL system = (strcmp(ent->mnt_type, "system") == 0);
|
|
BOOL root = (strcmp(ent->mnt_dir, "/") == 0);
|
|
BOOL tmp = (strcmp(ent->mnt_dir, "/tmp") == 0);
|
|
|
|
if (system)
|
|
{
|
|
if (root)
|
|
curlevel = sys_root;
|
|
else if (tmp)
|
|
curlevel = sys_tmp;
|
|
else
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if (root)
|
|
curlevel = user_root;
|
|
else if (tmp)
|
|
curlevel = user_tmp;
|
|
else
|
|
continue;
|
|
}
|
|
|
|
if (curlevel <= level)
|
|
continue;
|
|
level = curlevel;
|
|
|
|
if (winCheckMntOpt(ent, "binmode") == NULL)
|
|
binary = 0;
|
|
else
|
|
binary = 1;
|
|
}
|
|
|
|
if (endmntent(mnt) != 1)
|
|
{
|
|
ErrorF("endmntent failed");
|
|
return;
|
|
}
|
|
|
|
if (!binary)
|
|
winMsg(X_WARNING, "/tmp mounted int textmode\n");
|
|
}
|
|
|
|
|
|
void
|
|
OsVendorInit (void)
|
|
{
|
|
/* Re-initialize global variables on server reset */
|
|
winInitializeGlobals ();
|
|
|
|
#ifdef DDXOSVERRORF
|
|
if (!OsVendorVErrorFProc)
|
|
OsVendorVErrorFProc = OsVendorVErrorF;
|
|
#endif
|
|
|
|
if (!g_fLogInited) {
|
|
/* keep this order. If LogInit fails it calls Abort which then calls
|
|
* ddxGiveUp where LogInit is called again and creates an infinite
|
|
* recursion. If we set g_fLogInited to TRUE before the init we
|
|
* avoid the second call
|
|
*/
|
|
g_fLogInited = TRUE;
|
|
LogInit (g_pszLogFile, NULL);
|
|
}
|
|
LogSetParameter (XLOG_FLUSH, 1);
|
|
LogSetParameter (XLOG_VERBOSITY, g_iLogVerbose);
|
|
LogSetParameter (XLOG_FILE_VERBOSITY, 1);
|
|
|
|
/* Log the version information */
|
|
if (serverGeneration == 1)
|
|
winLogVersionInfo ();
|
|
|
|
winCheckMount();
|
|
|
|
/* Add a default screen if no screens were specified */
|
|
if (g_iNumScreens == 0)
|
|
{
|
|
winDebug ("OsVendorInit - Creating bogus screen 0\n");
|
|
|
|
/*
|
|
* We need to initialize default screens if no arguments
|
|
* were processed. Otherwise, the default screens would
|
|
* already have been initialized by ddxProcessArgument ().
|
|
*/
|
|
winInitializeDefaultScreens ();
|
|
|
|
/*
|
|
* Add a screen 0 using the defaults set by
|
|
* winInitializeDefaultScreens () and any additional parameters
|
|
* processed by ddxProcessArgument ().
|
|
*/
|
|
g_iNumScreens = 1;
|
|
g_iLastScreen = 0;
|
|
|
|
/* We have to flag this as an explicit screen, even though it isn't */
|
|
g_ScreenInfo[0].fExplicitScreen = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
winUseMsg (void)
|
|
{
|
|
ErrorF ("-depth bits_per_pixel\n"
|
|
"\tSpecify an optional bitdepth to use in fullscreen mode\n"
|
|
"\twith a DirectDraw engine.\n");
|
|
|
|
ErrorF ("-emulate3buttons [timeout]\n"
|
|
"\tEmulate 3 button mouse with an optional timeout in\n"
|
|
"\tmilliseconds.\n");
|
|
|
|
ErrorF ("-engine engine_type_id\n"
|
|
"\tOverride the server's automatically selected engine type:\n"
|
|
"\t\t1 - Shadow GDI\n"
|
|
"\t\t2 - Shadow DirectDraw\n"
|
|
"\t\t4 - Shadow DirectDraw4 Non-Locking\n"
|
|
#ifdef XWIN_NATIVEGDI
|
|
"\t\t16 - Native GDI - experimental\n"
|
|
#endif
|
|
);
|
|
|
|
ErrorF ("-fullscreen\n"
|
|
"\tRun the server in fullscreen mode.\n");
|
|
|
|
ErrorF ("-refresh rate_in_Hz\n"
|
|
"\tSpecify an optional refresh rate to use in fullscreen mode\n"
|
|
"\twith a DirectDraw engine.\n");
|
|
|
|
ErrorF ("-screen scr_num [width height]\n"
|
|
"\tEnable screen scr_num and optionally specify a width and\n"
|
|
"\theight for that screen.\n");
|
|
|
|
ErrorF ("-lesspointer\n"
|
|
"\tHide the windows mouse pointer when it is over an inactive\n"
|
|
"\tCygwin/X window. This prevents ghost cursors appearing where\n"
|
|
"\tthe Windows cursor is drawn overtop of the X cursor\n");
|
|
|
|
ErrorF ("-nodecoration\n"
|
|
"\tDo not draw a window border, title bar, etc. Windowed\n"
|
|
"\tmode only.\n");
|
|
|
|
#ifdef XWIN_MULTIWINDOWEXTWM
|
|
ErrorF ("-mwextwm\n"
|
|
"\tRun the server in multi-window external window manager mode.\n");
|
|
#endif
|
|
|
|
ErrorF ("-rootless\n"
|
|
"\tRun the server in rootless mode.\n");
|
|
|
|
#ifdef XWIN_MULTIWINDOW
|
|
ErrorF ("-multiwindow\n"
|
|
"\tRun the server in multi-window mode.\n");
|
|
#endif
|
|
|
|
ErrorF ("-multiplemonitors\n"
|
|
"\tEXPERIMENTAL: Use the entire virtual screen if multiple\n"
|
|
"\tmonitors are present.\n");
|
|
|
|
#ifdef XWIN_CLIPBOARD
|
|
ErrorF ("-clipboard\n"
|
|
"\tRun the clipboard integration module.\n"
|
|
"\tDo not use at the same time as 'xwinclip'.\n");
|
|
|
|
ErrorF ("-nounicodeclipboard\n"
|
|
"\tDo not use Unicode clipboard even if NT-based platform.\n");
|
|
#endif
|
|
|
|
ErrorF ("-scrollbars\n"
|
|
"\tIn windowed mode, allow screens bigger than the Windows desktop.\n"
|
|
"\tMoreover, if the window has decorations, one can now resize\n"
|
|
"\tit.\n");
|
|
|
|
ErrorF ("-[no]trayicon\n"
|
|
"\tDo not create a tray icon. Default is to create one\n"
|
|
"\ticon per screen. You can globally disable tray icons with\n"
|
|
"\t-notrayicon, then enable it for specific screens with\n"
|
|
"\t-trayicon for those screens.\n");
|
|
|
|
ErrorF ("-clipupdates num_boxes\n"
|
|
"\tUse a clipping region to constrain shadow update blits to\n"
|
|
"\tthe updated region when num_boxes, or more, are in the\n"
|
|
"\tupdated region. Currently supported only by `-engine 1'.\n");
|
|
|
|
#ifdef XWIN_EMULATEPSEUDO
|
|
ErrorF ("-emulatepseudo\n"
|
|
"\tCreate a depth 8 PseudoColor visual when running in\n"
|
|
"\tdepths 15, 16, 24, or 32, collectively known as TrueColor\n"
|
|
"\tdepths. The PseudoColor visual does not have correct colors,\n"
|
|
"\tand it may crash, but it at least allows you to run your\n"
|
|
"\tapplication in TrueColor modes.\n");
|
|
#endif
|
|
|
|
ErrorF ("-[no]unixkill\n"
|
|
"\tCtrl+Alt+Backspace exits the X Server.\n");
|
|
|
|
ErrorF ("-[no]winkill\n"
|
|
"\tAlt+F4 exits the X Server.\n");
|
|
|
|
#ifdef XWIN_XF86CONFIG
|
|
ErrorF ("-config\n"
|
|
"\tSpecify a configuration file.\n");
|
|
|
|
ErrorF ("-keyboard\n"
|
|
"\tSpecify a keyboard device from the configuration file.\n");
|
|
#endif
|
|
|
|
#ifdef XKB
|
|
ErrorF ("-xkbrules XKBRules\n"
|
|
"\tEquivalent to XKBRules in XF86Config files.\n");
|
|
|
|
ErrorF ("-xkbmodel XKBModel\n"
|
|
"\tEquivalent to XKBModel in XF86Config files.\n");
|
|
|
|
ErrorF ("-xkblayout XKBLayout\n"
|
|
"\tEquivalent to XKBLayout in XF86Config files.\n"
|
|
"\tFor example: -xkblayout de\n");
|
|
|
|
ErrorF ("-xkbvariant XKBVariant\n"
|
|
"\tEquivalent to XKBVariant in XF86Config files.\n"
|
|
"\tFor example: -xkbvariant nodeadkeys\n");
|
|
|
|
ErrorF ("-xkboptions XKBOptions\n"
|
|
"\tEquivalent to XKBOptions in XF86Config files.\n");
|
|
#endif
|
|
|
|
ErrorF ("-logfile filename\n"
|
|
"\tWrite logmessages to <filename> instead of /tmp/Xwin.log.\n");
|
|
|
|
ErrorF ("-logverbose verbosity\n"
|
|
"\tSet the verbosity of logmessages. [NOTE: Only a few messages\n"
|
|
"\trespect the settings yet]\n"
|
|
"\t\t0 - only print fatal error.\n"
|
|
"\t\t1 - print additional configuration information.\n"
|
|
"\t\t2 - print additional runtime information [default].\n"
|
|
"\t\t3 - print debugging and tracing information.\n");
|
|
|
|
ErrorF ("-[no]keyhook\n"
|
|
"\tGrab special windows key combinations like Alt-Tab or the Menu "
|
|
"key.\n These keys are discarded by default.\n");
|
|
|
|
ErrorF ("-swcursor\n"
|
|
"\tDisable the usage of the windows cursor and use the X11 software "
|
|
"cursor instead\n");
|
|
}
|
|
|
|
/* See Porting Layer Definition - p. 57 */
|
|
void
|
|
ddxUseMsg(void)
|
|
{
|
|
/* Set a flag so that FatalError won't give duplicate warning message */
|
|
g_fSilentFatalError = TRUE;
|
|
|
|
winUseMsg();
|
|
|
|
/* Log file will not be opened for UseMsg unless we open it now */
|
|
if (!g_fLogInited) {
|
|
LogInit (g_pszLogFile, NULL);
|
|
g_fLogInited = TRUE;
|
|
}
|
|
LogClose ();
|
|
|
|
/* Notify user where UseMsg text can be found.*/
|
|
if (!g_fNoHelpMessageBox)
|
|
winMessageBoxF ("The Cygwin/X help text has been printed to "
|
|
"/tmp/XWin.log.\n"
|
|
"Please open /tmp/XWin.log to read the help text.\n",
|
|
MB_ICONINFORMATION);
|
|
}
|
|
|
|
/* ddxInitGlobals - called by |InitGlobals| from os/util.c */
|
|
void ddxInitGlobals(void)
|
|
{
|
|
}
|
|
|
|
#ifdef DDXTIME /* from ServerOSDefines */
|
|
CARD32
|
|
GetTimeInMillis (void)
|
|
{
|
|
return GetTickCount ();
|
|
}
|
|
#endif /* DDXTIME */
|
|
|
|
|
|
/* See Porting Layer Definition - p. 20 */
|
|
/*
|
|
* Do any global initialization, then initialize each screen.
|
|
*
|
|
* NOTE: We use ddxProcessArgument, so we don't need to touch argc and argv
|
|
*/
|
|
|
|
void
|
|
InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
|
|
{
|
|
int i;
|
|
|
|
/* Log the command line */
|
|
winLogCommandLine (argc, argv);
|
|
|
|
#if CYGDEBUG
|
|
winDebug ("InitOutput\n");
|
|
#endif
|
|
|
|
/* Validate command-line arguments */
|
|
if (serverGeneration == 1 && !winValidateArgs ())
|
|
{
|
|
FatalError ("InitOutput - Invalid command-line arguments found. "
|
|
"Exiting.\n");
|
|
}
|
|
|
|
/* Check for duplicate invocation on same display number.*/
|
|
if (serverGeneration == 1 && !winCheckDisplayNumber ())
|
|
{
|
|
if (g_fSilentDupError)
|
|
g_fSilentFatalError = TRUE;
|
|
FatalError ("InitOutput - Duplicate invocation on display "
|
|
"number: %s. Exiting.\n", display);
|
|
}
|
|
|
|
#ifdef XWIN_XF86CONFIG
|
|
/* Try to read the xorg.conf-style configuration file */
|
|
if (!winReadConfigfile ())
|
|
winErrorFVerb (1, "InitOutput - Error reading config file\n");
|
|
#else
|
|
winMsg(X_INFO, "XF86Config is not supported\n");
|
|
winMsg(X_INFO, "See http://x.cygwin.com/docs/faq/cygwin-x-faq.html "
|
|
"for more information\n");
|
|
#endif
|
|
|
|
/* Load preferences from XWinrc file */
|
|
LoadPreferences();
|
|
|
|
/* 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++)
|
|
{
|
|
screenInfo->formats[i] = g_PixmapFormats[i];
|
|
}
|
|
|
|
/* Load pointers to DirectDraw functions */
|
|
winGetDDProcAddresses ();
|
|
|
|
/* Detect supported engines */
|
|
winDetectSupportedEngines ();
|
|
|
|
/* Load common controls library */
|
|
g_hmodCommonControls = LoadLibraryEx ("comctl32.dll", NULL, 0);
|
|
|
|
/* Load TrackMouseEvent function pointer */
|
|
g_fpTrackMouseEvent = GetProcAddress (g_hmodCommonControls,
|
|
"_TrackMouseEvent");
|
|
if (g_fpTrackMouseEvent == NULL)
|
|
{
|
|
winErrorFVerb (1, "InitOutput - Could not get pointer to function\n"
|
|
"\t_TrackMouseEvent in comctl32.dll. Try installing\n"
|
|
"\tInternet Explorer 3.0 or greater if you have not\n"
|
|
"\talready.\n");
|
|
|
|
/* Free the library since we won't need it */
|
|
FreeLibrary (g_hmodCommonControls);
|
|
g_hmodCommonControls = NULL;
|
|
|
|
/* Set function pointer to point to no operation function */
|
|
g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
|
|
}
|
|
|
|
/* Store the instance handle */
|
|
g_hInstance = GetModuleHandle (NULL);
|
|
|
|
/* Initialize each screen */
|
|
for (i = 0; i < g_iNumScreens; ++i)
|
|
{
|
|
/* Initialize the screen */
|
|
if (-1 == AddScreen (winScreenInit, argc, argv))
|
|
{
|
|
FatalError ("InitOutput - Couldn't add screen %d", i);
|
|
}
|
|
}
|
|
|
|
#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
|
|
|
|
#if defined(XCSECURITY)
|
|
/* Generate a cookie used by internal clients for authorization */
|
|
if (g_fXdmcpEnabled)
|
|
winGenerateAuthorization ();
|
|
#endif
|
|
|
|
/* Perform some one time initialization */
|
|
if (1 == serverGeneration)
|
|
{
|
|
/*
|
|
* setlocale applies to all threads in the current process.
|
|
* Apply locale specified in LANG environment variable.
|
|
*/
|
|
setlocale (LC_ALL, "");
|
|
}
|
|
#endif
|
|
|
|
#if CYGDEBUG || YES
|
|
winDebug ("InitOutput - Returning.\n");
|
|
#endif
|
|
}
|
|
|
|
|
|
/*
|
|
* winCheckDisplayNumber - Check if another instance of Cygwin/X is
|
|
* already running on the same display number. If no one exists,
|
|
* make a mutex to prevent new instances from running on the same display.
|
|
*
|
|
* return FALSE if the display number is already used.
|
|
*/
|
|
|
|
static Bool
|
|
winCheckDisplayNumber ()
|
|
{
|
|
int nDisp;
|
|
HANDLE mutex;
|
|
char name[MAX_PATH];
|
|
char * pszPrefix = '\0';
|
|
OSVERSIONINFO osvi = {0};
|
|
|
|
/* Check display range */
|
|
nDisp = atoi (display);
|
|
if (nDisp < 0 || nDisp > 65535)
|
|
{
|
|
ErrorF ("winCheckDisplayNumber - Bad display number: %d\n", nDisp);
|
|
return FALSE;
|
|
}
|
|
|
|
/* Set first character of mutex name to null */
|
|
name[0] = '\0';
|
|
|
|
/* Get operating system version information */
|
|
osvi.dwOSVersionInfoSize = sizeof (osvi);
|
|
GetVersionEx (&osvi);
|
|
|
|
/* Want a mutex shared among all terminals on NT > 4.0 */
|
|
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT
|
|
&& osvi.dwMajorVersion >= 5)
|
|
{
|
|
pszPrefix = "Global\\";
|
|
}
|
|
|
|
/* Setup Cygwin/X specific part of name */
|
|
sprintf (name, "%sCYGWINX_DISPLAY:%d", pszPrefix, nDisp);
|
|
|
|
/* Windows automatically releases the mutex when this process exits */
|
|
mutex = CreateMutex (NULL, FALSE, name);
|
|
if (!mutex)
|
|
{
|
|
LPVOID lpMsgBuf;
|
|
|
|
/* Display a fancy error message */
|
|
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
NULL,
|
|
GetLastError (),
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
(LPTSTR) &lpMsgBuf,
|
|
0, NULL);
|
|
ErrorF ("winCheckDisplayNumber - CreateMutex failed: %s\n",
|
|
(LPSTR)lpMsgBuf);
|
|
LocalFree (lpMsgBuf);
|
|
|
|
return FALSE;
|
|
}
|
|
if (GetLastError () == ERROR_ALREADY_EXISTS)
|
|
{
|
|
ErrorF ("winCheckDisplayNumber - "
|
|
"Cygwin/X is already running on display %d\n",
|
|
nDisp);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|