Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Further progress on the new Windows video driver:
* SDL_SetModuleHandle() is obsolete, I hope.
* SDL 1.3 uses the UNICODE API
* I'm ignoring Windows CE for the moment, we'll reevaluate what needs to be different for Windows CE later.
* Pulled the stdio redirection from WinMain()
  • Loading branch information
slouken committed Jun 27, 2006
1 parent 75c3eb8 commit 2bc6d2f
Show file tree
Hide file tree
Showing 10 changed files with 158 additions and 269 deletions.
1 change: 1 addition & 0 deletions include/SDL_compat.h
Expand Up @@ -117,6 +117,7 @@ typedef enum

struct SDL_SysWMinfo;

#define SDL_SetModuleHandle(x)
#define SDL_AllocSurface SDL_CreateRGBSurface

extern DECLSPEC const SDL_version *SDLCALL SDL_Linked_Version(void);
Expand Down
6 changes: 2 additions & 4 deletions include/SDL_main.h
Expand Up @@ -63,13 +63,11 @@ extern "C" {
/* *INDENT-ON* */
#endif

/* This should be called from your WinMain() function, if any */
extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst);
/* This can also be called, but is no longer necessary */
/* This can be called to set the application class at startup */
extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style,
void *hInst);
/* This can also be called, but is no longer necessary (SDL_Quit calls it) */
extern DECLSPEC void SDLCALL SDL_UnregisterApp(void);

#ifdef __cplusplus
/* *INDENT-OFF* */
}
Expand Down
6 changes: 0 additions & 6 deletions src/SDL.c
Expand Up @@ -348,12 +348,6 @@ _DllMainCRTStartup(HANDLE hModule,
}
#endif /* building DLL with Watcom C */

void
SDL_SetModuleHandle(void *hInst)
{
/* FIXME: Do we still need this? */
}

#endif /* OS/2 elif __WIN32__ */

/* vi: set ts=4 sw=4 expandtab: */
197 changes: 2 additions & 195 deletions src/main/win32/SDL_win32_main.c
Expand Up @@ -10,20 +10,6 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#ifdef _WIN32_WCE
# define DIR_SEPERATOR TEXT("\\")
# undef _getcwd
# define _getcwd(str,len) wcscpy(str,TEXT(""))
# define setbuf(f,b)
# define setvbuf(w,x,y,z)
# define fopen _wfopen
# define freopen _wfreopen
# define remove(x) DeleteFile(x)
#else
# define DIR_SEPERATOR TEXT("/")
# include <direct.h>
#endif

/* Include the SDL main definition header */
#include "SDL.h"
#include "SDL_main.h"
Expand All @@ -34,20 +20,6 @@
# endif /* _WIN32_WCE_EMULATION */
#endif /* main */

/* The standard output files */
#define STDOUT_FILE TEXT("stdout.txt")
#define STDERR_FILE TEXT("stderr.txt")

#ifndef NO_STDIO_REDIRECT
# ifdef _WIN32_WCE
static wchar_t stdoutPath[MAX_PATH];
static wchar_t stderrPath[MAX_PATH];
# else
static char stdoutPath[MAX_PATH];
static char stderrPath[MAX_PATH];
# endif
#endif

#if defined(_WIN32_WCE) && _WIN32_WCE < 300
/* seems to be undefined in Win CE although in online help */
#define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
Expand Down Expand Up @@ -124,52 +96,6 @@ OutOfMemory(void)
return FALSE;
}

/* SDL_Quit() shouldn't be used with atexit() directly because
calling conventions may differ... */
static void
cleanup(void)
{
SDL_Quit();
}

/* Remove the output files if there was no output written */
static void
cleanup_output(void)
{
#ifndef NO_STDIO_REDIRECT
FILE *file;
int empty;
#endif

/* Flush the output in case anything is queued */
fclose(stdout);
fclose(stderr);

#ifndef NO_STDIO_REDIRECT
/* See if the files have any output in them */
if (stdoutPath[0]) {
file = fopen(stdoutPath, TEXT("rb"));
if (file) {
empty = (fgetc(file) == EOF) ? 1 : 0;
fclose(file);
if (empty) {
remove(stdoutPath);
}
}
}
if (stderrPath[0]) {
file = fopen(stderrPath, TEXT("rb"));
if (file) {
empty = (fgetc(file) == EOF) ? 1 : 0;
fclose(file);
if (empty) {
remove(stderrPath);
}
}
}
#endif
}

#if defined(_MSC_VER) && !defined(_WIN32_WCE)
/* The VC++ compiler needs main defined */
#define console_main main
Expand All @@ -179,45 +105,8 @@ cleanup_output(void)
int
console_main(int argc, char *argv[])
{
size_t n;
char *bufp, *appname;
int status;

/* Get the class name from argv[0] */
appname = argv[0];
if ((bufp = SDL_strrchr(argv[0], '\\')) != NULL) {
appname = bufp + 1;
} else if ((bufp = SDL_strrchr(argv[0], '/')) != NULL) {
appname = bufp + 1;
}

if ((bufp = SDL_strrchr(appname, '.')) == NULL)
n = SDL_strlen(appname);
else
n = (bufp - appname);

bufp = SDL_stack_alloc(char, n + 1);
if (bufp == NULL) {
return OutOfMemory();
}
SDL_strlcpy(bufp, appname, n + 1);
appname = bufp;

/* Load SDL dynamic link library */
if (SDL_Init(SDL_INIT_NOPARACHUTE) < 0) {
ShowError("WinMain() error", SDL_GetError());
return (FALSE);
}
atexit(cleanup_output);
atexit(cleanup);

/* Sam:
We still need to pass in the application handle so that
DirectInput will initialize properly when SDL_RegisterApp()
is called later in the video initialization.
*/
SDL_SetModuleHandle(GetModuleHandle(NULL));

/* Run the application main() code */
status = SDL_main(argc, argv);

Expand All @@ -229,101 +118,19 @@ console_main(int argc, char *argv[])
}

/* This is where execution begins [windowed apps] */
#ifdef _WIN32_WCE
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw)
#else
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
#endif
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int sw)
{
HINSTANCE handle;
char **argv;
int argc;
char *cmdline;
DWORD pathlen;
#ifdef _WIN32_WCE
wchar_t path[MAX_PATH];
#else
char path[MAX_PATH];
#endif
#ifdef _WIN32_WCE
wchar_t *bufp;
int nLen;
#else
char *bufp;
size_t nLen;
#endif
#ifndef NO_STDIO_REDIRECT
FILE *newfp;
#endif

/* Start up DDHELP.EXE before opening any files, so DDHELP doesn't
keep them open. This is a hack.. hopefully it will be fixed
someday. DDHELP.EXE starts up the first time DDRAW.DLL is loaded.
*/
handle = LoadLibrary(TEXT("DDRAW.DLL"));
if (handle != NULL) {
FreeLibrary(handle);
}
#ifndef NO_STDIO_REDIRECT
pathlen = GetModuleFileName(NULL, path, SDL_arraysize(path));
while (pathlen > 0 && path[pathlen] != '\\') {
--pathlen;
}
path[pathlen] = '\0';

#ifdef _WIN32_WCE
wcsncpy(stdoutPath, path, SDL_arraysize(stdoutPath));
wcsncat(stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath));
#else
SDL_strlcpy(stdoutPath, path, SDL_arraysize(stdoutPath));
SDL_strlcat(stdoutPath, DIR_SEPERATOR STDOUT_FILE,
SDL_arraysize(stdoutPath));
#endif

/* Redirect standard input and standard output */
newfp = freopen(stdoutPath, TEXT("w"), stdout);

#ifndef _WIN32_WCE
if (newfp == NULL) { /* This happens on NT */
#if !defined(stdout)
stdout = fopen(stdoutPath, TEXT("w"));
#else
newfp = fopen(stdoutPath, TEXT("w"));
if (newfp) {
*stdout = *newfp;
}
#endif
}
#endif /* _WIN32_WCE */

#ifdef _WIN32_WCE
wcsncpy(stderrPath, path, SDL_arraysize(stdoutPath));
wcsncat(stderrPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath));
#else
SDL_strlcpy(stderrPath, path, SDL_arraysize(stderrPath));
SDL_strlcat(stderrPath, DIR_SEPERATOR STDERR_FILE,
SDL_arraysize(stderrPath));
#endif

newfp = freopen(stderrPath, TEXT("w"), stderr);
#ifndef _WIN32_WCE
if (newfp == NULL) { /* This happens on NT */
#if !defined(stderr)
stderr = fopen(stderrPath, TEXT("w"));
#else
newfp = fopen(stderrPath, TEXT("w"));
if (newfp) {
*stderr = *newfp;
}
#endif
}
#endif /* _WIN32_WCE */

setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Line buffered */
setbuf(stderr, NULL); /* No buffering */
#endif /* !NO_STDIO_REDIRECT */

#ifdef _WIN32_WCE
nLen = wcslen(szCmdLine) + 128 + 1;
Expand Down Expand Up @@ -357,7 +164,7 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
}
ParseCommandLine(cmdline, argv);

/* Run the main program (after a little SDL initialization) */
/* Run the main program */
console_main(argc, argv);

/* Hush little compiler, don't you cry... */
Expand Down
84 changes: 83 additions & 1 deletion src/video/win32/SDL_win32events.c
Expand Up @@ -23,9 +23,91 @@

#include "SDL_win32video.h"


static LRESULT CALLBACK
WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam);
}

void
WIN32_PumpEvents(_THIS)
WIN_PumpEvents(_THIS)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

static int app_registered = 0;
LPTSTR SDL_Appname = NULL;
Uint32 SDL_Appstyle = 0;
HINSTANCE SDL_Instance = NULL;

/* Register the class for this application */
int
SDL_RegisterApp(char *name, Uint32 style, void *hInst)
{
WNDCLASS class;

/* Only do this once... */
if (app_registered) {
++app_registered;
return (0);
}
if (!name && !SDL_Appname) {
name = "SDL_app";
SDL_Appstyle = (CS_BYTEALIGNCLIENT | CS_OWNDC);
SDL_Instance = hInst ? hInst : GetModuleHandle(NULL);
}

if (name) {
SDL_Appname = SDL_iconv_utf8_ucs2(name);
SDL_Appstyle = style;
SDL_Instance = hInst ? hInst : GetModuleHandle(NULL);
}

/* Register the application class */
class.hCursor = NULL;
class.hIcon = LoadImage(SDL_Instance, SDL_Appname,
IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);
class.lpszMenuName = NULL;
class.lpszClassName = SDL_Appname;
class.hbrBackground = NULL;
class.hInstance = SDL_Instance;
class.style = SDL_Appstyle;
class.lpfnWndProc = WinMessage;
class.cbWndExtra = 0;
class.cbClsExtra = 0;
if (!RegisterClass(&class)) {
SDL_SetError("Couldn't register application class");
return (-1);
}

app_registered = 1;
return (0);
}

/* Unregisters the windowclass registered in SDL_RegisterApp above. */
void
SDL_UnregisterApp()
{
WNDCLASS class;

/* SDL_RegisterApp might not have been called before */
if (!app_registered) {
return;
}
--app_registered;
if (app_registered == 0) {
/* Check for any registered window classes. */
if (GetClassInfo(SDL_Instance, SDL_Appname, &class)) {
UnregisterClass(SDL_Appname, SDL_Instance);
}
SDL_free(SDL_Appname);
SDL_Appname = NULL;
}
}

/* vi: set ts=4 sw=4 expandtab: */
6 changes: 5 additions & 1 deletion src/video/win32/SDL_win32events.h
Expand Up @@ -26,7 +26,11 @@

#include "../SDL_sysvideo.h"

extern void WIN32_PumpEvents(_THIS);
extern LPTSTR SDL_Appname;
extern Uint32 SDL_Appstyle;
extern HINSTANCE SDL_Instance;

extern void WIN_PumpEvents(_THIS);

#endif /* _SDL_win32events_h */

Expand Down

0 comments on commit 2bc6d2f

Please sign in to comment.