Edit

kc3-lang/SDL/src/main/windows/SDL_windows_main.c

Branch :

  • Show log

    Commit

  • Author : Pierre-Loup A. Griffais
    Date : 2014-09-11 19:24:42
    Hash : 24c86b55
    Message : [X11] Reconcile logical keyboard state with physical state on FocusIn since the window system doesn't do it for us like other platforms. This prevents sticky keys and missed keys when going in and out of focus, for example Alt would appear to stick if switching away from an SDL app with Alt-Tab and had to be pressed again. CR: Sam

  • src/main/windows/SDL_windows_main.c
  • /*
        SDL_windows_main.c, placed in the public domain by Sam Lantinga  4/13/98
    
        The WinMain function -- calls your program's main() function
    */
    #include "SDL_config.h"
    
    #ifdef __WIN32__
    
    /* Include this so we define UNICODE properly */
    #include "../../core/windows/SDL_windows.h"
    
    /* Include the SDL main definition header */
    #include "SDL.h"
    #include "SDL_main.h"
    
    #ifdef main
    #  undef main
    #endif /* main */
    
    static void
    UnEscapeQuotes(char *arg)
    {
        char *last = NULL;
    
        while (*arg) {
            if (*arg == '"' && (last != NULL && *last == '\\')) {
                char *c_curr = arg;
                char *c_last = last;
    
                while (*c_curr) {
                    *c_last = *c_curr;
                    c_last = c_curr;
                    c_curr++;
                }
                *c_last = '\0';
            }
            last = arg;
            arg++;
        }
    }
    
    /* Parse a command line buffer into arguments */
    static int
    ParseCommandLine(char *cmdline, char **argv)
    {
        char *bufp;
        char *lastp = NULL;
        int argc, last_argc;
    
        argc = last_argc = 0;
        for (bufp = cmdline; *bufp;) {
            /* Skip leading whitespace */
            while (SDL_isspace(*bufp)) {
                ++bufp;
            }
            /* Skip over argument */
            if (*bufp == '"') {
                ++bufp;
                if (*bufp) {
                    if (argv) {
                        argv[argc] = bufp;
                    }
                    ++argc;
                }
                /* Skip over word */
                lastp = bufp;
                while (*bufp && (*bufp != '"' || *lastp == '\\')) {
                    lastp = bufp;
                    ++bufp;
                }
            } else {
                if (*bufp) {
                    if (argv) {
                        argv[argc] = bufp;
                    }
                    ++argc;
                }
                /* Skip over word */
                while (*bufp && !SDL_isspace(*bufp)) {
                    ++bufp;
                }
            }
            if (*bufp) {
                if (argv) {
                    *bufp = '\0';
                }
                ++bufp;
            }
    
            /* Strip out \ from \" sequences */
            if (argv && last_argc != argc) {
                UnEscapeQuotes(argv[last_argc]);
            }
            last_argc = argc;
        }
        if (argv) {
            argv[argc] = NULL;
        }
        return (argc);
    }
    
    /* Pop up an out of memory message, returns to Windows */
    static BOOL
    OutOfMemory(void)
    {
        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal Error", "Out of memory - aborting", NULL);
        return FALSE;
    }
    
    #if defined(_MSC_VER)
    /* The VC++ compiler needs main defined */
    #define console_main main
    #endif
    
    /* This is where execution begins [console apps] */
    int
    console_main(int argc, char *argv[])
    {
        SDL_SetMainReady();
    
        /* Run the application main() code */
        return SDL_main(argc, argv);
    }
    
    /* This is where execution begins [windowed apps] */
    int WINAPI
    WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
    {
        char **argv;
        int argc;
        char *cmdline;
    
        /* Grab the command line */
        TCHAR *text = GetCommandLine();
    #if UNICODE
        cmdline = SDL_iconv_string("UTF-8", "UCS-2-INTERNAL", (char *)(text), (SDL_wcslen(text)+1)*sizeof(WCHAR));
    #else
        cmdline = SDL_strdup(text);
    #endif
        if (cmdline == NULL) {
            return OutOfMemory();
        }
    
        /* Parse it into argv and argc */
        argc = ParseCommandLine(cmdline, NULL);
        argv = SDL_stack_alloc(char *, argc + 1);
        if (argv == NULL) {
            return OutOfMemory();
        }
        ParseCommandLine(cmdline, argv);
    
        /* Run the main program */
        console_main(argc, argv);
    
        SDL_stack_free(argv);
    
        SDL_free(cmdline);
    
        /* Hush little compiler, don't you cry... */
        return 0;
    }
    
    #endif /* __WIN32__ */
    
    /* vi: set ts=4 sw=4 expandtab: */