diff --git a/src/Makefile b/src/Makefile index b9a3c97f..de54b1f4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -388,9 +388,13 @@ endif CC = $(CROSS_CC) CROSS_STRIP ?= $(shell which i686-w64-mingw32-strip || which mingw32-strip) STRIP = $(CROSS_STRIP) - BIN = ../bin/grafx2.exe - COPT = -W -Wall -Wdeclaration-after-statement -O$(OPTIM) -g -ggdb -Dmain=SDL_main $(shell $(CROSS_SDLCONFIG) --cflags) $(TTFCOPT) - LOPT = -mwindows -lmingw32 -lSDLmain -lSDL -lshlwapi $(shell $(CROSS_SDLCONFIG) --libs) -lSDL_image $(TTFLOPT) + BIN = ../bin/grafx2-$(API).exe + COPT = -W -Wall -Wdeclaration-after-statement -O$(OPTIM) -g -ggdb $(TTFCOPT) + LOPT = -mwindows -lmingw32 -lshlwapi $(TTFLOPT) + ifeq ($(API),sdl) + COPT += -Dmain=SDL_main $(shell $(CROSS_SDLCONFIG) --cflags) + LOPT += -lSDLmain -lSDL $(shell $(CROSS_SDLCONFIG) --libs) -lSDL_image + endif ifeq (,$(CROSS_PKGCONFIG)) COPT += -D__no_pnglib__ else @@ -404,7 +408,10 @@ endif WINDRES ?= $(shell which i686-w64-mingw32-windres || which mingw32-windres) PLATFORM = win32 PLATFORMOBJ = winres.o - PLATFORMFILES = bin/SDL.dll bin/SDL_image.dll $(wildcard ../bin/libpng*.dll) $(wildcard ../bin/libjpeg*.dll) bin/zlib1.dll $(TTFLIBS) + PLATFORMFILES = $(wildcard ../bin/libpng*.dll) $(wildcard ../bin/libjpeg*.dll) bin/zlib1.dll $(TTFLIBS) + ifeq ($(API),sdl) + PLATFORMFILES += bin/SDL.dll bin/SDL_image.dll + endif else ifdef GP2XCROSS #cross compile an exec for the gp2x @@ -571,6 +578,9 @@ ifeq ($(API),sdl2) APIOBJ = sdlscreen.o COPT += -DUSE_SDL2 endif +ifeq ($(API),win32) + APIOBJ = win32screen.o +endif #To enable Joystick emulation of cursor, make USE_JOYSTICK=1 (for input.o) #This can be necessary to test cursor code on a PC, but by default for all diff --git a/src/Makefile.dep b/src/Makefile.dep index c5448d8d..987bb9bd 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -56,7 +56,7 @@ $(OBJDIR)/loadsave.o: loadsave.c buttons.h struct.h const.h loadsave.h \ $(OBJDIR)/main.o: main.c const.h struct.h global.h graph.h misc.h init.h buttons.h \ loadsave.h gfx2surface.h engine.h pages.h screen.h errors.h readini.h \ saveini.h io.h text.h setup.h windows.h brush.h palette.h realpath.h \ - input.h keycodes.h help.h filesel.h + input.h keycodes.h help.h filesel.h win32screen.h $(OBJDIR)/misc.o: misc.c struct.h const.h global.h errors.h buttons.h loadsave.h \ gfx2surface.h engine.h misc.h keyboard.h screen.h windows.h palette.h \ input.h keycodes.h graph.h pages.h @@ -119,7 +119,8 @@ $(OBJDIR)/transform.o: transform.c global.h struct.h const.h transform.h engine. loadsave.h gfx2surface.h pages.h tiles.h $(OBJDIR)/unicode.o: unicode.c unicode.h struct.h const.h $(OBJDIR)/version.o: version.c -$(OBJDIR)/win32screen.o: win32screen.c screen.h struct.h const.h global.h +$(OBJDIR)/win32screen.o: win32screen.c screen.h struct.h const.h global.h errors.h \ + windows.h input.h keycodes.h keyboard.h $(OBJDIR)/windows.o: windows.c windows.h struct.h const.h engine.h errors.h \ global.h graph.h input.h keycodes.h misc.h op_c.h colorred.h readline.h \ screen.h palette.h unicode.h keyboard.h diff --git a/src/main.c b/src/main.c index e1a645d1..1252c48d 100644 --- a/src/main.c +++ b/src/main.c @@ -72,8 +72,11 @@ #include "input.h" #include "help.h" #include "filesel.h" +#if defined(WIN32) && !(defined(USE_SDL) || defined(USE_SDL2)) +#include "win32screen.h" +#endif -#if defined(__WIN32__) +#if defined(WIN32) #include #include #elif defined (__MINT__) @@ -86,7 +89,7 @@ #endif -#if defined (__WIN32__) +#if defined (WIN32) && (defined(USE_SDL) || defined(USE_SDL2)) // On Windows, SDL_putenv is not present in any compilable header. // It can be linked anyway, this declaration only avoids // a compilation warning. @@ -830,17 +833,19 @@ int Init_program(int argc,char * argv[]) Pixel_ratio); // Windows only: move back the window to its original position. - #if defined(__WIN32__) + #if defined(WIN32) if (!Video_mode[starting_videomode].Fullscreen) { if (Config.Window_pos_x != 9999 && Config.Window_pos_y != 9999) { //RECT r; + #if defined(USE_SDL) || defined(USE_SDL2) static SDL_SysWMinfo pInfo; SDL_VERSION(&pInfo.version); SDL_GetWMInfo(&pInfo); //GetWindowRect(pInfo.window, &r); SetWindowPos(pInfo.window, 0, Config.Window_pos_x, Config.Window_pos_y, 0, 0, SWP_NOSIZE); + #endif } } @@ -1043,7 +1048,7 @@ void Program_shutdown(void) int return_code; // Windows only: Recover the window position. - #if defined(__WIN32__) + #if defined(WIN32) && (defined(USE_SDL) || defined(USE_SDL2)) { RECT r; static SDL_SysWMinfo pInfo; @@ -1171,7 +1176,7 @@ int main(int argc,char * argv[]) GetModuleFileName(NULL, ModuleFileName, MAX_PATH); GetShortPathName(ModuleFileName, ModuleShortFileName, MAX_PATH); argv[argc++] = arg_buffer; - for (i = 0; i < sizeof(arg_buffer); i++) { + for (i = 0; i < (int)sizeof(arg_buffer); i++) { arg_buffer[i] = (char)ModuleShortFileName[i]; if (arg_buffer[i] == 0) break; } @@ -1188,3 +1193,30 @@ int main(int argc,char * argv[]) Program_shutdown(); return 0; } + +#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2) && !defined(_MSC_VER) +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR _lpCmdLine, int nCmdShow) +{ + WCHAR *lpCmdLine = GetCommandLineW(); + if (__argc == 1) + { // avoids GetCommandLineW bug that does not always quote the program name if no arguments + do { ++lpCmdLine; } while (*lpCmdLine); + } + else + { + BOOL quoted = lpCmdLine[0] == L'"'; + ++lpCmdLine; // skips the " or the first letter (all paths are at least 1 letter) + while (*lpCmdLine) + { + if (quoted && lpCmdLine[0] == L'"') quoted = FALSE; // found end quote + else if (!quoted && lpCmdLine[0] == L' ') + { // found an unquoted space, now skip all spaces + do { ++lpCmdLine; } while (lpCmdLine[0] == L' '); + break; + } + ++lpCmdLine; + } + } + return wWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); +} +#endif diff --git a/src/screen.h b/src/screen.h index 1242e445..cfee6ca6 100644 --- a/src/screen.h +++ b/src/screen.h @@ -32,10 +32,6 @@ #include "struct.h" #include "global.h" -#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2) -int Init_Win32(HINSTANCE hInstance, HINSTANCE hPrevInstance); -#endif - void GFX2_Set_mode(int *width, int *height, int fullscreen); byte Get_Screen_pixel(int x, int y); diff --git a/src/win32screen.c b/src/win32screen.c index 06dcdaef..e153d9d2 100644 --- a/src/win32screen.c +++ b/src/win32screen.c @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with Grafx2; if not, see */ -#include +#include #include #include #if defined(_MSC_VER) && _MSC_VER < 1900 @@ -30,6 +30,7 @@ #include "errors.h" #include "windows.h" #include "input.h" +#include "keyboard.h" extern int user_feedback_required; extern word Input_new_mouse_X; @@ -301,4 +302,4 @@ volatile int Allow_colorcycling = 0; /// Activates or desactivates file drag-dropping in program window. void Allow_drag_and_drop(int flag) { -} \ No newline at end of file +} diff --git a/src/win32screen.h b/src/win32screen.h new file mode 100644 index 00000000..d8db9745 --- /dev/null +++ b/src/win32screen.h @@ -0,0 +1,34 @@ +/* vim:expandtab:ts=2 sw=2: +*/ +/* Grafx2 - The Ultimate 256-color bitmap paint program + + Copyright 2018 Thomas Bernard + Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) + + Grafx2 is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 + of the License. + + Grafx2 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grafx2; if not, see +*/ + +////////////////////////////////////////////////////////////////////////////// +///@file win32screen.h +////////////////////////////////////////////////////////////////////////////// +#ifndef WIN32SCREEN_H_INCLUDED +#define WIN32SCREEN_H_INCLUDED + +#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2) +#include + +int Init_Win32(HINSTANCE hInstance, HINSTANCE hPrevInstance); +#endif + +#endif