int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ int c; int oldf = 0; char *p; for (c = 0; c < 128; c++) keylookup[c] = c; processcommandline(); hinstance = hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(hThisInstance, "allegro_icon"); wincl.hIconSm = LoadIcon(hThisInstance, "allegro_icon"); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ VERSION_STR, /* Title Text */ WS_OVERLAPPEDWINDOW/*&~WS_SIZEBOX&~WS_THICKFRAME&~WS_MAXIMIZEBOX*/, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 640 + (GetSystemMetrics(SM_CXFIXEDFRAME) * 2), /* The programs width */ 480 + (GetSystemMetrics(SM_CYFIXEDFRAME) * 2) + GetSystemMetrics(SM_CYMENUSIZE) + GetSystemMetrics(SM_CYCAPTION) + 1, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ LoadMenu(hThisInstance, TEXT("MainMenu")), /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); ghwnd = hwnd; win_set_window(hwnd); allegro_init(); get_executable_name(exedir, 511); p = get_filename(exedir); p[0] = 0; config_load(); InitializeCriticalSection(&cs); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); initmenu(); mainthread = (HANDLE)_beginthread(_mainthread, 0, NULL); updatewindowtitle(); /* Run the message loop. It will run until GetMessage() returns 0 */ while (!quited) { // runbbc(); if (PeekMessage(&messages, NULL, 0, 0, PM_REMOVE)) { if (messages.message == WM_QUIT) { quited=1; } TranslateMessage(&messages); DispatchMessage(&messages); } else Sleep(10); if ((key[KEY_LCONTROL] || key[KEY_RCONTROL]) && key[KEY_END] && mousecapture) { ClipCursor(&oldclip); mousecapture = 0; updatewindowtitle(); } if (key[KEY_ALT] && key[KEY_ENTER] && fullscreen && !oldf) { EnterCriticalSection(&cs); fullscreen = 0; video_leavefullscreen(); LeaveCriticalSection(&cs); } else if (key[KEY_ALT] && key[KEY_ENTER] && !fullscreen && !oldf) { EnterCriticalSection(&cs); fullscreen = 1; video_enterfullscreen(); LeaveCriticalSection(&cs); } oldf = key[KEY_ALT] && key[KEY_ENTER]; } EnterCriticalSection(&cs); TerminateThread(mainthread, 0); main_close(); DeleteCriticalSection(&cs); return messages.wParam; }
/** * Program start point, build the windows GUI, initialise the emulator. * Enter the program main loop, and tidy up when finished. */ int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { static const char szClassName[] = "WindowsApp"; MSG messages = {0}; /**< Here messages to the application are saved */ WNDCLASSEX wincl; /**< Data structure for the windowclass */ hinstance=hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use custom icon and default mouse-pointer */ wincl.hIcon = LoadIcon(hThisInstance, "allegro_icon"); wincl.hIconSm = LoadIcon(hThisInstance, "allegro_icon"); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* Load Menu from resources file */ menu=LoadMenu(hThisInstance,TEXT("MainMenu")); /* Add in CDROM links to the settings menu dynamically */ initmenu(); /* The class is registered, let's create the program*/ ghwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "RPCEmu v" VERSION, /* Title Text */ WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, /* overlapped window with no sizing frame */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 640 + (GetSystemMetrics(SM_CXFIXEDFRAME) * 2), /* The window width */ 480 + (GetSystemMetrics(SM_CYFIXEDFRAME) * 2) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION), /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ menu, /* Menu handle */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (ghwnd, nFunsterStil); win_set_window(ghwnd); allegro_init(); /* allegro */ /* Allegro does not appear to read the window position until it receives a window move message. This results in the mousehack pointer being offset incorrectly until the window is moved. To workaround this issue, we generate a window move message to the window's current position. */ { WINDOWINFO wi; GetWindowInfo(ghwnd, &wi); PostMessage(ghwnd, WM_MOVE, 0, MAKELPARAM(wi.rcClient.left, wi.rcClient.top)); } /* Initialise the emulation and read the config file */ if (startrpcemu()) return -1; /* Initialise the podules */ opendlls(); /* Based on the contents of config file, dynamically update the Windows GUI items */ if (config.cdromtype > 2) { WindowProcedure(ghwnd, WM_COMMAND, IDM_CDROM_DISABLED + config.cdromtype, 0); } CheckMenuItem(menu, IDM_CDROM_DISABLED + config.cdromtype, MF_CHECKED); CheckMenuItem(menu, IDM_MOUSE_TWOBUTTON, config.mousetwobutton ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(menu, IDM_CPUIDLE, config.cpu_idle ? MF_CHECKED : MF_UNCHECKED); if (config.mousehackon) { CheckMenuItem(menu, IDM_MOUSE_FOL, MF_CHECKED); } else { CheckMenuItem(menu, IDM_MOUSE_CAP, MF_CHECKED); } /* Return the mouse clipping to normal on program exit */ atexit(releasemousecapture); // SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); install_int_ex(vblupdate, BPS_TO_TIMER(config.refresh)); drawscre=0; /* Program main loop */ while (!quited) { /* Execute the emulation */ execrpcemu(); /* Update title with mips speed */ if (updatemips) { char title[128]; if (mousehack) { sprintf(title, "RPCEmu v" VERSION " - MIPS: %.1f, AVG: %.1f", perf.mips, perf.mips_total / perf.mips_count); } else { sprintf(title, "RPCEmu v" VERSION " - MIPS: %.1f, AVG: %.1f - %s", perf.mips, perf.mips_total / perf.mips_count, (mousecapture) ? "Press CTRL-END to release mouse" : "Click to capture mouse"); } SetWindowText(ghwnd, title); updatemips=0; } if (handle_sigio) { handle_sigio = 0; sig_io(1); } /* Exit full screen? */ if ((key[KEY_LCONTROL] || key[KEY_RCONTROL]) && key[KEY_END] && fullscreen) { togglefullscreen(0); mousecapture=0; } /* Release mouse from mouse capture mode? */ if ((key[KEY_LCONTROL] || key[KEY_RCONTROL]) && key[KEY_END] && mousecapture && !config.mousehackon) { ClipCursor(&oldclip); mousecapture=0; updatemips=1; } /* Handle Windows events */ if (PeekMessage(&messages,NULL,0,0,PM_REMOVE)) { if (messages.message==WM_QUIT) { quited=1; } /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } } /* Program has exited. Tidy up */ endrpcemu(); /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }