Mercurial > dwindows
view winmain.c @ 1955:91541efcea10
Mac: Complete refactoring of the Mac code using a handful of macros.
This allows using the old mutex system for thread safety pre-mojave.
On Mojave and later instead we create two functions, an entrypoint
and an actual code function which will get called on the main thread.
This avoids Apples new artifical checks that the code is running
on the main thread, since it actually is running on the main thread
even though the actual caller might not be.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Wed, 24 Jul 2019 17:22:19 +0000 |
parents | aedf5903db0a |
children | 05dd5189099f |
line wrap: on
line source
/* Dynamic Windows stub file to allow Win32 applications * to use the main() entry point instead of WinMain(). * * (C) 2000-2012 Brian Smith <brian@dbsoft.org> */ #include <windows.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <process.h> #ifndef NODW void Win32_Set_Instance(HINSTANCE hInstance); #endif char **_convertargs(int *count, char *start, HINSTANCE DWInstance) { char *tmp, *argstart, **argv; int loc = 0, inquotes = 0; (*count) = 1; tmp = start; /* Count the number of entries */ if(*start) { (*count)++; while(*tmp) { if(*tmp == '"' && inquotes) inquotes = 0; else if(*tmp == '"' && !inquotes) inquotes = 1; else if(*tmp == ' ' && !inquotes) { /* Push past any white space */ while(*(tmp+1) == ' ') tmp++; /* If we aren't at the end of the command * line increment the count. */ if(*(tmp+1)) (*count)++; } tmp++; } } argv = (char **)malloc(sizeof(char *) * ((*count)+1)); argv[0] = malloc(260); GetModuleFileNameA(DWInstance, argv[0], 260); argstart = tmp = start; if(*start) { loc = 1; while(*tmp) { if(*tmp == '"' && inquotes) { *tmp = 0; inquotes = 0; } else if(*tmp == '"' && !inquotes) { argstart = tmp+1; inquotes = 1; } else if(*tmp == ' ' && !inquotes) { *tmp = 0; argv[loc] = strdup(argstart); /* Push past any white space */ while(*(tmp+1) == ' ') tmp++; /* Move the start pointer */ argstart = tmp+1; /* If we aren't at the end of the command * line increment the count. */ if(*(tmp+1)) loc++; } tmp++; } if(*argstart) argv[loc] = strdup(argstart); } argv[loc+1] = NULL; return argv; } /* Ok this is a really big hack but what the hell ;) */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char **argv; int argc; #ifndef NODW Win32_Set_Instance(hInstance); #endif argv = _convertargs(&argc, lpCmdLine, hInstance); return main(argc, argv); }