/*
 * Main function.
 *
 * Copyright 1994 Alexandre Julliard
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <locale.h>
#ifdef MALLOC_DEBUGGING
#include <malloc.h>
#endif
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
#include <X11/cursorfont.h>
#include "message.h"
#include "module.h"
#include "msdos.h"
#include "windows.h"
#include "winsock.h"
#include "options.h"
#include "desktop.h"
#include "registers.h"
#include "shell.h"
#include "winbase.h"
#include "string32.h"
#define DEBUG_DEFINE_VARIABLES
#include "stddebug.h"
#include "debug.h"
#include "xmalloc.h"

const char people[] = "Wine is available thanks to the work of "
"Bob Amstadt, Dag Asheim, Martin Ayotte, Ross Biro, Uwe Bonnes, Erik Bos, "
"Fons Botman, John Brezak, Andrew Bulhak, John Burton, "
"Niels de Carpentier, Roman Dolejsi, Frans van Dorsselaer, Paul Falstad, "
"Olaf Flebbe, Peter Galbavy, Ramon Garcia, Hans de Graaff, "
"Charles M. Hannum, John Harvey, Cameron Heide, Jochen Hoenicke, "
"Onno Hovers, Jeffrey Hsu, Miguel de Icaza, Jukka Iivonen, "
"Alexandre Julliard, Jochen Karrer, Andreas Kirschbaum, Albrecht Kleine, "
"Jon Konrath, Alex Korobka, Greg Kreider, Anand Kumria, Scott A. Laird, "
"Martin von Loewis, Kenneth MacDonald, Peter MacDonald, William Magro, "
"Juergen Marquardt, Marcus Meissner, Graham Menhennitt, David Metcalfe, "
"Steffen Moeller, Philippe De Muyter, Itai Nahshon, Michael Patra, "
"Jim Peterson, Robert Pouliot, Keith Reynolds, John Richardson, "
"Johannes Ruscheinski, Thomas Sandford, Constantine Sapuntzakis, "
"Daniel Schepler, Ulrich Schmid, Bernd Schmidt, Yngvi Sigurjonsson, "
"Rick Sladkey, William Smith, Erik Svendsen, Tristan Tarrant, "
"Andrew Taylor, Duncan C Thomson, Goran Thyni, Jimmy Tirtawangsa, "
"Jon Tombs, Linus Torvalds, Gregory Trubetskoy, Michael Veksler, "
"Sven Verdoolaege, Eric Warnke, Manfred Weichel, Morten Welinder, "
"Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale, "
"and James Youngman. ";

const WINE_LANGUAGE_DEF Languages[] =
{
    {"En",0x0409},	/* LANG_En */
    {"Es",0x040A},	/* LANG_Es */
    {"De",0x0407},	/* LANG_De */
    {"No",0x0414},	/* LANG_No */
    {"Fr",0x0400},	/* LANG_Fr */
    {"Fi",0x040B},	/* LANG_Fi */
    {"Da",0x0406},	/* LANG_Da */
    {"Cz",0x0405},	/* LANG_Cz */
    {"Eo",     0},	/* LANG_Eo */ /* FIXME languageid */
    {"It",0x0410},	/* LANG_It */
    {"Ko",0x0412},	/* LANG_Ko */
    {NULL,0}
};

WORD WINE_LanguageId = 0;

#define WINE_CLASS    "Wine"    /* Class name for resources */

typedef struct tagENVENTRY {
  LPSTR	       	        Name;
  LPSTR	       	        Value;
  WORD	       	        wSize;
  struct tagENVENTRY    *Prev;
  struct tagENVENTRY    *Next;
} ENVENTRY, *LPENVENTRY;

LPENVENTRY	lpEnvList = NULL;

Display *display;
Screen *screen;
Window rootWindow;
int screenWidth = 0, screenHeight = 0;  /* Desktop window dimensions */
int screenDepth = 0;  /* Screen depth to use */
int desktopX = 0, desktopY = 0;  /* Desktop window position (if any) */
int getVersion16 = 0;
int getVersion32 = 0;
OSVERSIONINFO32A getVersionEx;

struct options Options =
{  /* default options */
    NULL,           /* desktopGeometry */
    NULL,           /* programName */
    FALSE,          /* usePrivateMap */
    FALSE,          /* useFixedMap */
    FALSE,          /* synchronous */
    FALSE,          /* backing store */
    SW_SHOWNORMAL,  /* cmdShow */
    FALSE,
    FALSE,          /* AllowReadOnly */
    MODE_ENHANCED,  /* Enhanced mode */
    FALSE,          /* IPC enabled */
#ifdef DEFAULT_LANG
    DEFAULT_LANG,   /* Default language */
#else
    LANG_En,
#endif
    FALSE,          /* Managed windows */
    FALSE           /* Perfect graphics */
};


static XrmOptionDescRec optionsTable[] =
{
    { "-backingstore",  ".backingstore",    XrmoptionNoArg,  (caddr_t)"on" },
    { "-desktop",       ".desktop",         XrmoptionSepArg, (caddr_t)NULL },
    { "-depth",         ".depth",           XrmoptionSepArg, (caddr_t)NULL },
    { "-display",       ".display",         XrmoptionSepArg, (caddr_t)NULL },
    { "-iconic",        ".iconic",          XrmoptionNoArg,  (caddr_t)"on" },
    { "-ipc",           ".ipc",             XrmoptionNoArg,  (caddr_t)"off"},
    { "-language",      ".language",        XrmoptionSepArg, (caddr_t)"En" },
    { "-name",          ".name",            XrmoptionSepArg, (caddr_t)NULL },
    { "-perfect",       ".perfect",         XrmoptionNoArg,  (caddr_t)"on" },
    { "-privatemap",    ".privatemap",      XrmoptionNoArg,  (caddr_t)"on" },
    { "-fixedmap",      ".fixedmap",        XrmoptionNoArg,  (caddr_t)"on" },
    { "-synchronous",   ".synchronous",     XrmoptionNoArg,  (caddr_t)"on" },
    { "-debug",         ".debug",           XrmoptionNoArg,  (caddr_t)"on" },
    { "-debugmsg",      ".debugmsg",        XrmoptionSepArg, (caddr_t)NULL },
    { "-dll",           ".dll",             XrmoptionSepArg, (caddr_t)NULL },
    { "-allowreadonly", ".allowreadonly",   XrmoptionNoArg,  (caddr_t)"on" },
    { "-mode",          ".mode",            XrmoptionSepArg, (caddr_t)NULL },
    { "-managed",       ".managed",         XrmoptionNoArg,  (caddr_t)"off"},
    { "-winver",        ".winver",          XrmoptionSepArg, (caddr_t)NULL }
};

#define NB_OPTIONS  (sizeof(optionsTable) / sizeof(optionsTable[0]))

#define USAGE \
  "Usage:  %s [options] program_name [arguments]\n" \
  "\n" \
  "Options:\n" \
  "    -allowreadonly  Read only files may be opened in write mode\n" \
  "    -backingstore   Turn on backing store\n" \
  "    -debug          Enter debugger before starting application\n" \
  "    -debugmsg name  Turn debugging-messages on or off\n" \
  "    -depth n        Change the depth to use for multiple-depth screens\n" \
  "    -desktop geom   Use a desktop window of the given geometry\n" \
  "    -display name   Use the specified display\n" \
  "    -dll name       Enable or disable built-in DLLs\n" \
  "    -fixedmap       Use a \"standard\" color map\n" \
  "    -iconic         Start as an icon\n" \
  "    -ipc            Enable IPC facilities\n" \
  "    -language xx    Set the language (one of En,Es,De,No,Fr,Fi,Da,Cz,Eo,It,Ko)\n" \
  "    -managed        Allow the window manager to manage created windows\n" \
  "    -mode mode      Start Wine in a particular mode (standard or enhanced)\n" \
  "    -name name      Set the application name\n" \
  "    -perfect        Favor correctness over speed for graphical operations\n" \
  "    -privatemap     Use a private color map\n" \
  "    -synchronous    Turn on synchronous display mode\n" \
  "    -winver         Version to imitate (one of win31,win95,nt351)\n"



/***********************************************************************
 *           MAIN_Usage
 */
#ifndef WINELIB32
static void MAIN_Usage( char *name )
{
    fprintf( stderr, USAGE, name );
    exit(1);
}
#endif


/***********************************************************************
 *           MAIN_GetProgramName
 *
 * Get the program name. The name is specified by (in order of precedence):
 * - the option '-name'.
 * - the environment variable 'WINE_NAME'.
 * - the last component of argv[0].
 */
static char *MAIN_GetProgramName( int argc, char *argv[] )
{
    int i;
    char *p;

    for (i = 1; i < argc-1; i++)
	if (!strcmp( argv[i], "-name" )) return argv[i+1];
    if ((p = getenv( "WINE_NAME" )) != NULL) return p;
    if ((p = strrchr( argv[0], '/' )) != NULL) return p+1;
    return argv[0];
}


/***********************************************************************
 *           MAIN_GetResource
 *
 * Fetch the value of resource 'name' using the correct instance name.
 * 'name' must begin with '.' or '*'
 */
static int MAIN_GetResource( XrmDatabase db, char *name, XrmValue *value )
{
    char *buff_instance, *buff_class;
    char *dummy;
    int retval;

    buff_instance = (char *)xmalloc(strlen(Options.programName)+strlen(name)+1);
    buff_class    = (char *)xmalloc( strlen(WINE_CLASS) + strlen(name) + 1 );

    strcpy( buff_instance, Options.programName );
    strcat( buff_instance, name );
    strcpy( buff_class, WINE_CLASS );
    strcat( buff_class, name );
    retval = XrmGetResource( db, buff_instance, buff_class, &dummy, value );
    free( buff_instance );
    free( buff_class );
    return retval;
}


/***********************************************************************
 *                    ParseDebugOptions
 *
 *  Turns specific debug messages on or off, according to "options".
 *  Returns TRUE if parsing was successful
 */
#ifdef DEBUG_RUNTIME

BOOL ParseDebugOptions(char *options)
{
  int l;
  if (strlen(options)<3)
    return FALSE;
  do
  {
    if ((*options!='+')&&(*options!='-'))
      return FALSE;
    if (strchr(options,','))
      l=strchr(options,',')-options;
    else
      l=strlen(options);
    if (!lstrncmpi32A(options+1,"all",l-1))
      {
	int i;
	for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
	  debug_msg_enabled[i]=(*options=='+');
      }
    else
      {
	int i;
	for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
	  if (debug_msg_name && (!lstrncmpi32A(options+1,debug_msg_name[i],l-1)))
	    {
	      debug_msg_enabled[i]=(*options=='+');
	      break;
	    }
	if (i==sizeof(debug_msg_enabled)/sizeof(short))
	  return FALSE;
      }
    options+=l;
  }
  while((*options==',')&&(*(++options)));
  if (*options)
    return FALSE;
  else
    return TRUE;
}

#endif


/***********************************************************************
 *           MAIN_ParseLanguageOption
 *
 * Parse -language option.
 */
static void MAIN_ParseLanguageOption( char *arg )
{
    const WINE_LANGUAGE_DEF *p = Languages;

    Options.language = LANG_En;  /* First language */
    for (;p->name;p++)
    {
        if (!lstrcmpi32A( p->name, arg ))
        {
	    WINE_LanguageId = p->langid;
	    return;
	}
        Options.language++;
    }
    fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
    for (p = Languages; p->name; p++) fprintf( stderr, "%s ", p->name );
    fprintf( stderr, "\n" );
    exit(1);
}


/***********************************************************************
 *           MAIN_ParseModeOption
 *
 * Parse -mode option.
 */
static void MAIN_ParseModeOption( char *arg )
{
    if (!lstrcmpi32A("enhanced", arg)) Options.mode = MODE_ENHANCED;
    else if (!lstrcmpi32A("standard", arg)) Options.mode = MODE_STANDARD;
    else
    {
        fprintf(stderr, "Invalid mode '%s' specified.\n", arg);
        fprintf(stderr, "Valid modes are: 'standard', 'enhanced' (default).\n");
	exit(1);
    }
}

/**********************************************************************
 *           MAIN_ParseVersion
 */
static void MAIN_ParseVersion( char *arg )
{
    /* If you add any other options, 
       verify the values you return on the real thing */
    if(strcmp(arg,"win31")==0) 
    {
        getVersion16 = 0x06160A03;
        /* FIXME: My Win32s installation failed to execute the
           MSVC 4 test program. So check these values */
        getVersion32 = 0x80000A03;
        getVersionEx.dwMajorVersion=3;
        getVersionEx.dwMinorVersion=10;
        getVersionEx.dwBuildNumber=0;
        getVersionEx.dwPlatformId=VER_PLATFORM_WIN32s;
        strcpy(getVersionEx.szCSDVersion,"Win32s 1.3");
    }
    else if(strcmp(arg, "win95")==0)
    {
        getVersion16 = 0x07005F03;
        getVersion32 = 0xC0000004;
        getVersionEx.dwMajorVersion=4;
        getVersionEx.dwMinorVersion=0;
        getVersionEx.dwBuildNumber=0x40003B6;
        getVersionEx.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS;
        strcpy(getVersionEx.szCSDVersion,"");
    }
    else if(strcmp(arg, "nt351")==0)
    {
        getVersion16 = 0x05000A03;
        getVersion32 = 0x04213303;
        getVersionEx.dwMajorVersion=3;
        getVersionEx.dwMinorVersion=51;
        getVersionEx.dwBuildNumber=0x421;
        getVersionEx.dwPlatformId=VER_PLATFORM_WIN32_NT;
        strcpy(getVersionEx.szCSDVersion,"Service Pack 2");
    }
    else fprintf(stderr, "Unknown winver system code - ignored\n");
}

/***********************************************************************
 *           MAIN_ParseOptions
 *
 * Parse command line options and open display.
 */
static void MAIN_ParseOptions( int *argc, char *argv[] )
{
    char *display_name;
    XrmValue value;
    XrmDatabase db = XrmGetFileDatabase("/usr/lib/X11/app-defaults/Wine");

      /* Parse command line */
    Options.programName = MAIN_GetProgramName( *argc, argv );
    XrmParseCommand( &db, optionsTable, NB_OPTIONS,
		     Options.programName, argc, argv );

#ifdef WINELIB
    /* Need to assemble command line and pass it to WinMain */
#else
    if (*argc < 2 || lstrcmpi32A(argv[1], "-h") == 0) 
    	MAIN_Usage( argv[0] );
#endif

      /* Open display */

    if (MAIN_GetResource( db, ".display", &value )) display_name = value.addr;
    else display_name = NULL;

    if (!(display = XOpenDisplay( display_name )))
    {
	fprintf( stderr, "%s: Can't open display: %s\n",
		 argv[0], display_name ? display_name : "(none specified)" );
	exit(1);
    }

      /* Get all options */
    if (MAIN_GetResource( db, ".iconic", &value ))
	Options.cmdShow = SW_SHOWMINIMIZED;
    if (MAIN_GetResource( db, ".privatemap", &value ))
	Options.usePrivateMap = TRUE;
    if (MAIN_GetResource( db, ".fixedmap", &value ))
	Options.useFixedMap = TRUE;
    if (MAIN_GetResource( db, ".synchronous", &value ))
	Options.synchronous = TRUE;
    if (MAIN_GetResource( db, ".backingstore", &value ))
	Options.backingstore = TRUE;	
    if (MAIN_GetResource( db, ".debug", &value ))
	Options.debug = TRUE;
    if (MAIN_GetResource( db, ".allowreadonly", &value ))
        Options.allowReadOnly = TRUE;
    if (MAIN_GetResource( db, ".ipc", &value ))
        Options.ipc = TRUE;
    if (MAIN_GetResource( db, ".perfect", &value ))
	Options.perfectGraphics = TRUE;
    if (MAIN_GetResource( db, ".depth", &value))
	screenDepth = atoi( value.addr );
    if (MAIN_GetResource( db, ".desktop", &value))
	Options.desktopGeometry = value.addr;
    if (MAIN_GetResource( db, ".language", &value))
        MAIN_ParseLanguageOption( (char *)value.addr );
    if (MAIN_GetResource( db, ".managed", &value))
        Options.managed = TRUE;
    if (MAIN_GetResource( db, ".mode", &value))
        MAIN_ParseModeOption( (char *)value.addr );

#ifdef DEBUG_RUNTIME
    if (MAIN_GetResource( db, ".debugoptions", &value))
	ParseDebugOptions((char*)value.addr);
#endif
    if (MAIN_GetResource( db, ".debugmsg", &value))
      {
#ifndef DEBUG_RUNTIME
	fprintf(stderr,"%s: Option \"-debugmsg\" not implemented.\n" \
          "    Recompile with DEBUG_RUNTIME in include/stddebug.h defined.\n",
	  argv[0]);
	exit(1);
#else
	if (ParseDebugOptions((char*)value.addr)==FALSE)
	  {
	    int i;
	    fprintf(stderr,"%s: Syntax: -debugmsg +xxx,...  or -debugmsg -xxx,...\n",argv[0]);
	    fprintf(stderr,"Example: -debugmsg +all,-heap    turn on all messages except heap messages\n");
	    fprintf(stderr,"Available message types:\n");
	    fprintf(stderr,"%-9s ","all");
	    for(i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
	      if(debug_msg_name[i])
		fprintf(stderr,"%-9s%c",debug_msg_name[i],
			(((i+2)%8==0)?'\n':' '));
	    fprintf(stderr,"\n\n");
	    exit(1);
	  }
#endif
      }

      if(MAIN_GetResource( db, ".dll", &value))
      {
#ifndef WINELIB
          if (!BUILTIN_ParseDLLOptions( (char*)value.addr ))
          {
              fprintf(stderr,"%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",argv[0]);
              fprintf(stderr,"Example: -dll -ole2    Do not use emulated OLE2.DLL\n");
              fprintf(stderr,"Available DLLs:\n");
              BUILTIN_PrintDLLs();
              exit(1);
          }
#else
          fprintf(stderr,"-dll not supported in libwine\n");
#endif
      }

      if(MAIN_GetResource( db, ".winver", &value))
          MAIN_ParseVersion( (char*)value.addr );
}


/***********************************************************************
 *           MAIN_CreateDesktop
 */
static void MAIN_CreateDesktop( int argc, char *argv[] )
{
    int flags;
    unsigned int width = 640, height = 480;  /* Default size = 640x480 */
    char *name = "Wine desktop";
    XSizeHints *size_hints;
    XWMHints   *wm_hints;
    XClassHint *class_hints;
    XSetWindowAttributes win_attr;
    XTextProperty window_name;
    Atom XA_WM_DELETE_WINDOW;

    flags = XParseGeometry( Options.desktopGeometry,
			    &desktopX, &desktopY, &width, &height );
    screenWidth  = width;
    screenHeight = height;

      /* Create window */

    win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
	                 PointerMotionMask | ButtonPressMask |
			 ButtonReleaseMask | EnterWindowMask | 
			 StructureNotifyMask;
    win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow );

    rootWindow = XCreateWindow( display, DefaultRootWindow(display),
			        desktopX, desktopY, width, height, 0,
			        CopyFromParent, InputOutput, CopyFromParent,
			        CWEventMask | CWCursor, &win_attr );

      /* Set window manager properties */

    size_hints  = XAllocSizeHints();
    wm_hints    = XAllocWMHints();
    class_hints = XAllocClassHint();
    if (!size_hints || !wm_hints || !class_hints)
    {
        fprintf( stderr, "Not enough memory for window manager hints.\n" );
        exit(1);
    }
    size_hints->min_width = size_hints->max_width = width;
    size_hints->min_height = size_hints->max_height = height;
    size_hints->flags = PMinSize | PMaxSize;
    if (flags & (XValue | YValue)) size_hints->flags |= USPosition;
    if (flags & (WidthValue | HeightValue)) size_hints->flags |= USSize;
    else size_hints->flags |= PSize;

    wm_hints->flags = InputHint | StateHint;
    wm_hints->input = True;
    wm_hints->initial_state = NormalState;
    class_hints->res_name = argv[0];
    class_hints->res_class = "Wine";

    XStringListToTextProperty( &name, 1, &window_name );
    XSetWMProperties( display, rootWindow, &window_name, &window_name,
                      argv, argc, size_hints, wm_hints, class_hints );
    XA_WM_DELETE_WINDOW = XInternAtom( display, "WM_DELETE_WINDOW", False );
    XSetWMProtocols( display, rootWindow, &XA_WM_DELETE_WINDOW, 1 );
    XFree( size_hints );
    XFree( wm_hints );
    XFree( class_hints );

      /* Map window */

    XMapWindow( display, rootWindow );
}


XKeyboardState keyboard_state;

/***********************************************************************
 *           MAIN_SaveSetup
 */
static void MAIN_SaveSetup(void)
{
    XGetKeyboardControl(display, &keyboard_state);
}

/***********************************************************************
 *           MAIN_RestoreSetup
 */
static void MAIN_RestoreSetup(void)
{
    XKeyboardControl keyboard_value;

    keyboard_value.key_click_percent	= keyboard_state.key_click_percent;
    keyboard_value.bell_percent 	= keyboard_state.bell_percent;
    keyboard_value.bell_pitch		= keyboard_state.bell_pitch;
    keyboard_value.bell_duration	= keyboard_state.bell_duration;
    keyboard_value.auto_repeat_mode	= keyboard_state.global_auto_repeat;

    XChangeKeyboardControl(display, KBKeyClickPercent | KBBellPercent | 
    	KBBellPitch | KBBellDuration | KBAutoRepeatMode, &keyboard_value);
}


static void called_at_exit(void)
{
    MAIN_RestoreSetup();
    WSACleanup();
}

/***********************************************************************
 *           main
 */
#if defined(WINELIB) && defined(WINELIBDLL)
int _wine_main (int argc, char *argv[])
#else
int main( int argc, char *argv[] )
#endif
{    
    int ret_val;
    int depth_count, i;
    int *depth_list;
    struct timeval tv;

    extern int _WinMain(int argc, char **argv);

#ifdef MALLOC_DEBUGGING
    char *trace;

    mcheck(NULL);
    if (!(trace = getenv("MALLOC_TRACE")))
    {       
        fprintf( stderr, "MALLOC_TRACE not set. No trace generated\n" );
    }
    else
    {
        fprintf( stderr, "malloc trace goes to %s\n", trace );
        mtrace();
    }
#endif

    setbuf(stdout,NULL);
    setbuf(stderr,NULL);

    setlocale(LC_CTYPE,"");
    gettimeofday( &tv, NULL);
    MSG_WineStartTicks = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);

    XrmInitialize();
    
    MAIN_ParseOptions( &argc, argv );

    if (Options.desktopGeometry && Options.managed)
    {
        fprintf( stderr, "%s: -managed and -desktop options cannot be used together\n",
                 Options.programName );
        exit(1);
    }

    screen       = DefaultScreenOfDisplay( display );
    screenWidth  = WidthOfScreen( screen );
    screenHeight = HeightOfScreen( screen );
    if (screenDepth)  /* -depth option specified */
    {
	depth_list = XListDepths(display,DefaultScreen(display),&depth_count);
	for (i = 0; i < depth_count; i++)
	    if (depth_list[i] == screenDepth) break;
	XFree( depth_list );
	if (i >= depth_count)
	{
	    fprintf( stderr, "%s: Depth %d not supported on this screen.\n",
		              Options.programName, screenDepth );
	    exit(1);
	}
    }
    else screenDepth  = DefaultDepthOfScreen( screen );
    if (Options.synchronous) XSynchronize( display, True );
    if (Options.desktopGeometry) MAIN_CreateDesktop( argc, argv );
    else rootWindow = DefaultRootWindow( display );

    MAIN_SaveSetup();
    atexit(called_at_exit);

    ret_val = _WinMain( argc, argv );

    return ret_val;
}


/***********************************************************************
 *           MessageBeep    (USER.104)
 */
void MessageBeep(WORD i)
{
	XBell(display, 100);
}


/***********************************************************************
 *           Beep   (KERNEL32.11)
 */
BOOL32 Beep( DWORD dwFreq, DWORD dwDur )
{
    /* dwFreq and dwDur are ignored by Win95 */
    XBell(display, 100);
    return TRUE;
}


/***********************************************************************
 *      GetVersion16   (KERNEL.3)
 */
LONG GetVersion16(void)
{
    if (getVersion16) return getVersion16;
    return MAKELONG( WINVERSION, WINDOSVER );
}


/***********************************************************************
 *      GetVersion32
 */
LONG GetVersion32(void)
{
    if (getVersion32) return getVersion32;
    return MAKELONG( 4, DOSVERSION);
}


/***********************************************************************
 *      GetVersionExA
 */
BOOL32 GetVersionEx32A(OSVERSIONINFO32A *v)
{
    if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32A))
    {
        fprintf(stddeb,"wrong OSVERSIONINFO size from app");
        return FALSE;
    }
    if(!getVersion32)
    {
        /* Return something like NT 3.5 */
        v->dwMajorVersion = 3;
        v->dwMinorVersion = 5;
        v->dwBuildNumber = 42;
        v->dwPlatformId = VER_PLATFORM_WIN32_NT;
        strcpy(v->szCSDVersion, "Wine is not an emulator");
        return TRUE;
    }
    v->dwMajorVersion = getVersionEx.dwMajorVersion;
    v->dwMinorVersion = getVersionEx.dwMinorVersion;
    v->dwBuildNumber = getVersionEx.dwBuildNumber;
    v->dwPlatformId = getVersionEx.dwPlatformId;
    strcpy(v->szCSDVersion, getVersionEx.szCSDVersion);
    return TRUE;
}


/***********************************************************************
 *     GetVersionExW
 */
BOOL32 GetVersionEx32W(OSVERSIONINFO32W *v)
{
	OSVERSIONINFO32A v1;
	if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32W))
	{
		fprintf(stddeb,"wrong OSVERSIONINFO size from app");
		return FALSE;
	}
	v1.dwOSVersionInfoSize=sizeof(v1);
	GetVersionEx32A(&v1);
	v->dwMajorVersion = v1.dwMajorVersion;
	v->dwMinorVersion = v1.dwMinorVersion;
	v->dwBuildNumber = v1.dwBuildNumber;
	v->dwPlatformId = v1.dwPlatformId;
	STRING32_AnsiToUni(v->szCSDVersion, v1.szCSDVersion);
	return TRUE;
}

/***********************************************************************
 *	GetWinFlags (KERNEL.132)
 */
LONG GetWinFlags(void)
{
  static const long cpuflags[5] =
    { WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };

  long result = 0;

  /* There doesn't seem to be any Pentium flag.  */
#ifndef WINELIB
  long cpuflag = cpuflags[MIN (runtime_cpu (), 4)];
#else
  long cpuflag = cpuflags[4];
#endif

  switch(Options.mode) {
  case MODE_STANDARD:
    result = (WF_STANDARD | cpuflag | WF_PMODE | WF_80x87);
    break;

  case MODE_ENHANCED:
    result = (WF_ENHANCED | cpuflag | WF_PMODE | WF_80x87 | WF_PAGING);
    break;

  default:
    fprintf(stderr, "Unknown mode set? This shouldn't happen. Check GetWinFlags()!\n");
    break;
  }

  return result;
}

/***********************************************************************
 *	SetEnvironment (GDI.132)
 */
int SetEnvironment(LPCSTR lpPortName, LPCSTR lpEnviron, WORD nCount)
{
    LPENVENTRY	lpNewEnv;
    LPENVENTRY	lpEnv = lpEnvList;
    dprintf_env(stddeb, "SetEnvironment('%s', '%s', %d) !\n", 
		lpPortName, lpEnviron, nCount);
    if (lpPortName == NULL) return -1;
    while (lpEnv != NULL) {
	if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
	    if (nCount == 0 || lpEnviron == NULL) {
		if (lpEnv->Prev != NULL) lpEnv->Prev->Next = lpEnv->Next;
		if (lpEnv->Next != NULL) lpEnv->Next->Prev = lpEnv->Prev;
		free(lpEnv->Value);
		free(lpEnv->Name);
		free(lpEnv);
		dprintf_env(stddeb, "SetEnvironment() // entry deleted !\n");
		return -1;
	    }
	    free(lpEnv->Value);
	    lpEnv->Value = malloc(nCount);
	    if (lpEnv->Value == NULL) {
		dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
		return 0;
	    }
	    memcpy(lpEnv->Value, lpEnviron, nCount);
	    lpEnv->wSize = nCount;
	    dprintf_env(stddeb, "SetEnvironment() // entry modified !\n");
	    return nCount;
	}
	if (lpEnv->Next == NULL) break;
	lpEnv = lpEnv->Next;
    }
    if (nCount == 0 || lpEnviron == NULL) return -1;
    dprintf_env(stddeb, "SetEnvironment() // new entry !\n");
    lpNewEnv = malloc(sizeof(ENVENTRY));
    if (lpNewEnv == NULL) {
	dprintf_env(stddeb, "SetEnvironment() // Error allocating new entry !\n");
	return 0;
    }
    if (lpEnvList == NULL) {
	lpEnvList = lpNewEnv;
	lpNewEnv->Prev = NULL;
    }
    else 
    {
	lpEnv->Next = lpNewEnv;
	lpNewEnv->Prev = lpEnv;
    }
    lpNewEnv->Next = NULL;
    lpNewEnv->Name = malloc(strlen(lpPortName) + 1);
    if (lpNewEnv->Name == NULL) {
	dprintf_env(stddeb, "SetEnvironment() // Error allocating entry name !\n");
	return 0;
    }
    strcpy(lpNewEnv->Name, lpPortName);
    lpNewEnv->Value = malloc(nCount);
    if (lpNewEnv->Value == NULL) {
	dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
	return 0;
    }
    memcpy(lpNewEnv->Value, lpEnviron, nCount);
    lpNewEnv->wSize = nCount;
    return nCount;
}


/***********************************************************************
 *      SetEnvironmentVariable32A   (KERNEL32.484)
 */
BOOL32 SetEnvironmentVariable32A( LPCSTR lpName, LPCSTR lpValue )
{
    int rc;

    rc = SetEnvironment(lpName, lpValue, strlen(lpValue) + 1);
    return (rc > 0) ? 1 : 0;
}


/***********************************************************************
 *      SetEnvironmentVariable32W   (KERNEL32.485)
 */
BOOL32 SetEnvironmentVariable32W( LPCWSTR lpName, LPCWSTR lpValue )
{
    LPSTR lpAName, lpAValue;
    BOOL ret;

    lpAName = STRING32_DupUniToAnsi( lpName );
    lpAValue = STRING32_DupUniToAnsi ( lpValue );
    ret = SetEnvironment(lpAName, lpAValue, strlen(lpAValue) + 1);
    free (lpAName);
    free (lpAValue);
    return (ret > 0) ? 1 : 0;    
}


/***********************************************************************
 *	GetEnvironment (GDI.134)
 */
int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz)
{
    WORD       nCount;
    LPENVENTRY lpEnv = lpEnvList;
    dprintf_env(stddeb, "GetEnvironment('%s', '%s', %d) !\n",
		lpPortName, lpEnviron, nMaxSiz);
    while (lpEnv != NULL) {
	if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
	    nCount = MIN(nMaxSiz, lpEnv->wSize);
	    memcpy(lpEnviron, lpEnv->Value, nCount);
	    dprintf_env(stddeb, "GetEnvironment() // found '%s' !\n", lpEnviron);
	    return nCount;
	}
	lpEnv = lpEnv->Next;
    }
    dprintf_env(stddeb, "GetEnvironment() // not found !\n");
    return 0;
}

/***********************************************************************
 *      GetEnvironmentVariableA (KERNEL32.213)
 */
DWORD GetEnvironmentVariableA(LPSTR lpName, LPSTR lpValue, DWORD size)
{
    return GetEnvironment(lpName, lpValue, size);
}

/***********************************************************************
 *      GetEnvironmentStrings (KERNEL32.210)
 */
LPVOID GetEnvironmentStrings(void)
{
    int count;
    LPENVENTRY lpEnv;
    char *envtable, *envptr;

    /* Count the total number of bytes we'll need for the string
     * table.  Include the trailing nuls and the final double nul.
     */
    count = 1;
    lpEnv = lpEnvList;
    while(lpEnv != NULL)
    {
        if(lpEnv->Name != NULL)
        {
            count += strlen(lpEnv->Name) + 1;
            count += strlen(lpEnv->Value) + 1;
        }
        lpEnv = lpEnv->Next;
    }

    envtable = malloc(count);
    if(envtable)
    {
        lpEnv = lpEnvList;
        envptr = envtable;

        while(lpEnv != NULL)
        {
            if(lpEnv->Name != NULL)
            {
                count = sprintf(envptr, "%s=%s", lpEnv->Name, lpEnv->Value);
                envptr += count + 1;
            }
            lpEnv = lpEnv->Next;
        }
        *envptr = '\0';
    }

    return envtable;
}


LPVOID GetEnvironmentStringsW(void)
{
    int count,len;
    LPENVENTRY lpEnv;
    char *envtable, *envptr;
	WCHAR *wenvtable;

    /* Count the total number of bytes we'll need for the string
     * table.  Include the trailing nuls and the final double nul.
     */
    count = 1;
    lpEnv = lpEnvList;
    while(lpEnv != NULL)
    {
        if(lpEnv->Name != NULL)
        {
            count += strlen(lpEnv->Name) + 1;
            count += strlen(lpEnv->Value) + 1;
        }
        lpEnv = lpEnv->Next;
    }

	len=count;
    envtable = malloc(count);
    if(envtable)
    {
        lpEnv = lpEnvList;
        envptr = envtable;

        while(lpEnv != NULL)
        {
            if(lpEnv->Name != NULL)
            {
                count = sprintf(envptr, "%s=%s", lpEnv->Name, lpEnv->Value);
                envptr += count + 1;
            }
            lpEnv = lpEnv->Next;
        }
        *envptr = '\0';
    }

	wenvtable = malloc(2*len);
	for(count=0;count<len;count++)
		wenvtable[count]=(WCHAR)envtable[count];
	free(envtable);

    return envtable;
}

void FreeEnvironmentStringsA(void *e)
{
	free(e);
}

void FreeEnvironmentStringsW(void* e)
{
	free(e);
}

/***********************************************************************
 *	GetTimerResolution (USER.14)
 */
LONG GetTimerResolution(void)
{
	return (1000);
}

/***********************************************************************
 *	SystemParametersInfo (USER.483)
 */
BOOL SystemParametersInfo (UINT uAction, UINT uParam, LPVOID lpvParam, UINT fuWinIni)
{
	int timeout, temp;
	char buffer[256];
	XKeyboardState		keyboard_state;
	XKeyboardControl	keyboard_value;


	switch (uAction) {
		case SPI_GETBEEP:
			XGetKeyboardControl(display, &keyboard_state);
			if (keyboard_state.bell_percent == 0)
				*(BOOL *) lpvParam = FALSE;
			else
				*(BOOL *) lpvParam = TRUE;
			break;
		
		case SPI_GETBORDER:
			*(INT *)lpvParam = GetSystemMetrics( SM_CXFRAME );
			break;

		case SPI_GETFASTTASKSWITCH:
			*(BOOL *) lpvParam = FALSE;
			/* FIXME GetProfileInt( "windows", "CoolSwitch", 1 ) */
			break;

		case SPI_GETGRIDGRANULARITY:
			*(INT *) lpvParam = 1;
		/* FIXME GetProfileInt( "desktop", "GridGranularity", 1 ) */
			break;

		case SPI_GETICONTITLEWRAP:
			*(BOOL *) lpvParam = FALSE;
			/* FIXME GetProfileInt( "desktop", "?", True ) */
			break;

		case SPI_GETKEYBOARDDELAY:
			*(INT *) lpvParam = 1;
			/* FIXME */
			break;

		case SPI_GETKEYBOARDSPEED:
			*(WORD *) lpvParam = 30;
			/* FIXME */
			break;

		case SPI_GETMENUDROPALIGNMENT:
			*(BOOL *) lpvParam = GetSystemMetrics( SM_MENUDROPALIGNMENT ); /* XXX check this */
			break;

		case SPI_GETSCREENSAVEACTIVE:
			/* FIXME GetProfileInt( "windows", "ScreenSaveActive", 1 ); */
			*(BOOL *) lpvParam = FALSE;
			break;

		case SPI_GETSCREENSAVETIMEOUT:
			/* FIXME GetProfileInt( "windows", "ScreenSaveTimeout", 300 ); */
			XGetScreenSaver(display, &timeout, &temp,&temp,&temp);
			*(INT *) lpvParam = timeout * 1000;
			break;

		case SPI_ICONHORIZONTALSPACING:
			if (lpvParam == NULL)
				fprintf(stderr, "SystemParametersInfo: Horizontal icon spacing set to %d\n.", uParam);
			else
				*(INT *) lpvParam = GetSystemMetrics( SM_CXICONSPACING );
			break;

		case SPI_ICONVERTICALSPACING:
			if (lpvParam == NULL)
				fprintf(stderr, "SystemParametersInfo: Vertical icon spacing set to %d\n.", uParam);
			else
				*(INT *) lpvParam = GetSystemMetrics( SM_CYICONSPACING );
			break;

		case SPI_SETBEEP:
			if (uParam == TRUE)
				keyboard_value.bell_percent = -1;
			else
				keyboard_value.bell_percent = 0;			
   			XChangeKeyboardControl(display, KBBellPercent, 
   							&keyboard_value);
			break;

		case SPI_SETSCREENSAVEACTIVE:
			if (uParam == TRUE)
				XActivateScreenSaver(display);
			else
				XResetScreenSaver(display);
			break;

		case SPI_SETSCREENSAVETIMEOUT:
			XSetScreenSaver(display, uParam, 60, DefaultBlanking, 
						DefaultExposures);
			break;

		case SPI_SETDESKWALLPAPER:
			return (SetDeskWallPaper((LPSTR) lpvParam));
			break;

		case SPI_SETDESKPATTERN:
			if ((INT) uParam == -1) {
				GetProfileString("Desktop", "Pattern", 
						"170 85 170 85 170 85 170 85", 
						buffer, sizeof(buffer) );
				return (DESKTOP_SetPattern((LPSTR) buffer));
			} else
				return (DESKTOP_SetPattern((LPSTR) lpvParam));
			break;

	        case SPI_GETICONTITLELOGFONT: 
	        {
		    /* FIXME GetProfileString( "?", "?", "?" ) */
		  LPLOGFONT16 lpLogFont = (LPLOGFONT16)lpvParam;
		  lpLogFont->lfHeight = 10;
		  lpLogFont->lfWidth = 0;
		  lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0;
		  lpLogFont->lfWeight = FW_NORMAL;
		  lpLogFont->lfItalic = lpLogFont->lfStrikeOut = lpLogFont->lfUnderline = FALSE;
		  lpLogFont->lfCharSet = ANSI_CHARSET;
		  lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
		  lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
		  lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
		  break;
		}
		case SPI_LANGDRIVER:
		case SPI_SETBORDER:
		case SPI_SETDOUBLECLKHEIGHT:
		case SPI_SETDOUBLECLICKTIME:
		case SPI_SETDOUBLECLKWIDTH:
		case SPI_SETFASTTASKSWITCH:
		case SPI_SETKEYBOARDDELAY:
		case SPI_SETKEYBOARDSPEED:
			fprintf(stderr, "SystemParametersInfo: option %d ignored.\n", uParam);
			break;

		default:
			fprintf(stderr, "SystemParametersInfo: unknown option %d.\n", uParam);
			break;
	}
	return 1;
}

/***********************************************************************
*	COPY (GDI.250)
*/
void Copy(LPVOID lpSource, LPVOID lpDest, WORD nBytes)
{
	memcpy(lpDest, lpSource, nBytes);
}

/***********************************************************************
*	SWAPMOUSEBUTTON (USER.186)
*/
BOOL SwapMouseButton(BOOL fSwap)
{
	return 0;	/* don't swap */
}

/***********************************************************************
*	FileCDR (KERNEL.130)
*/
void FileCDR(FARPROC16 x)
{
	printf("FileCDR(%8x)\n", (int) x);
}

/***********************************************************************
*	GetWinDebugInfo (KERNEL.355)
*/
BOOL GetWinDebugInfo(WINDEBUGINFO *lpwdi, UINT flags)
{
	printf("GetWinDebugInfo(%8lx,%d) stub returning 0\n", (unsigned long)lpwdi, flags);
	/* 0 means not in debugging mode/version */
	/* Can this type of debugging be used in wine ? */
	/* Constants: WDI_OPTIONS WDI_FILTER WDI_ALLOCBREAK */
	return 0;
}

/***********************************************************************
*	GetWinDebugInfo (KERNEL.355)
*/
BOOL SetWinDebugInfo(WINDEBUGINFO *lpwdi)
{
	printf("SetWinDebugInfo(%8lx) stub returning 0\n", (unsigned long)lpwdi);
	/* 0 means not in debugging mode/version */
	/* Can this type of debugging be used in wine ? */
	/* Constants: WDI_OPTIONS WDI_FILTER WDI_ALLOCBREAK */
	return 0;
}
