From 02a882784fdfd68cfb7548333503f153200076f9 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 15 Jan 2015 05:17:22 +0100 Subject: [PATCH] (Win32) Initial menubar - will become optional --- gfx/drivers_context/wgl_ctx.c | 127 ++++++++++++++++++++++++++++- gfx/drivers_context/win32_common.h | 1 + media/rarch.rc | 46 +++++++++++ win32/resource.h | 25 ++++++ 4 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 win32/resource.h diff --git a/gfx/drivers_context/wgl_ctx.c b/gfx/drivers_context/wgl_ctx.c index 567bd7f95b..132184062c 100644 --- a/gfx/drivers_context/wgl_ctx.c +++ b/gfx/drivers_context/wgl_ctx.c @@ -223,13 +223,122 @@ bool dinput_handle_message(void *dinput, UINT message, WPARAM wParam, LPARAM lPa static void *dinput_wgl; +#if !defined(_XBOX) && defined(_WIN32) +#include "../../retroarch.h" + +static bool win32_browser(char *filename, const char *extensions) +{ + OPENFILENAME ofn; + + memset((void*)&ofn, 0, sizeof(OPENFILENAME)); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = g_hwnd; + ofn.lpstrFilter = extensions; + ofn.lpstrFile = filename; + ofn.lpstrTitle = "Load Content"; + ofn.lpstrDefExt = ""; + ofn.nMaxFile = PATH_MAX; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + + if (GetOpenFileName(&ofn)) + return true; + + return false; +} + +static LRESULT win32_menu_loop(WPARAM wparam) +{ + WPARAM mode = wparam & 0xffff; + unsigned cmd = RARCH_CMD_NONE; + bool do_wm_close = false; + + switch (mode) + { + case ID_M_LOAD_CORE: + case ID_M_LOAD_CONTENT: + { + char win32_file[PATH_MAX_LENGTH] = {0}; + const char *extensions = NULL; + + if (mode == ID_M_LOAD_CORE) + extensions = "All Files\0*.*\0 Libretro core(.dll)\0*.dll\0"; + else if (mode == ID_M_LOAD_CONTENT) + extensions = "All Files\0*.*\0\0"; + + if (win32_browser(win32_file, extensions)) + { + switch (mode) + { + case ID_M_LOAD_CORE: + strlcpy(g_settings.libretro, win32_file, sizeof(g_settings.libretro)); + cmd = RARCH_CMD_LOAD_CORE; + break; + case ID_M_LOAD_CONTENT: + strlcpy(g_extern.fullpath, win32_file, sizeof(g_extern.fullpath)); + cmd = RARCH_CMD_LOAD_CONTENT; + do_wm_close = true; + break; + } + } + } + break; + case ID_M_RESET: + cmd = RARCH_CMD_RESET; + break; + case ID_M_MENU_TOGGLE: + cmd = RARCH_CMD_MENU_TOGGLE; + break; + case ID_M_PAUSE_TOGGLE: + cmd = RARCH_CMD_PAUSE_TOGGLE; + break; + case ID_M_LOAD_STATE: + cmd = RARCH_CMD_LOAD_STATE; + break; + case ID_M_SAVE_STATE: + cmd = RARCH_CMD_SAVE_STATE; + break; + case ID_M_DISK_CYCLE: + cmd = RARCH_CMD_DISK_EJECT_TOGGLE; + break; + case ID_M_DISK_NEXT: + cmd = RARCH_CMD_DISK_NEXT; + break; + case ID_M_DISK_PREV: + cmd = RARCH_CMD_DISK_PREV; + break; + case ID_M_FULL_SCREEN: + cmd = RARCH_CMD_FULLSCREEN_TOGGLE; + break; + case ID_M_QUIT: + do_wm_close = true; + break; + } + + if (mode >= ID_M_WINDOW_SCALE_1X && mode <= ID_M_WINDOW_SCALE_10X) + { + unsigned idx = (mode - (ID_M_WINDOW_SCALE_1X-1)); + g_extern.pending.windowed_scale = idx; + cmd = RARCH_CMD_RESIZE_WINDOWED_SCALE; + } + + if (cmd != RARCH_CMD_NONE) + rarch_main_command(cmd); + + if (do_wm_close) + PostMessage(g_hwnd, WM_CLOSE, 0, 0); + + return 0L; +} +#endif + static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch (message) { case WM_SYSCOMMAND: - // Prevent screensavers, etc, while running. + /* Prevent screensavers, etc, while running. */ switch (wparam) { case SC_SCREENSAVE: @@ -262,7 +371,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, } case WM_SIZE: - // Do not send resize message if we minimize. + /* Do not send resize message if we minimize. */ if (wparam != SIZE_MAXHIDE && wparam != SIZE_MINIMIZED) { g_resize_width = LOWORD(lparam); @@ -270,6 +379,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, g_resized = true; } return 0; + case WM_COMMAND: + { + LRESULT ret = win32_menu_loop(wparam); + } + } if (dinput_handle_message(dinput_wgl, message, wparam, lparam)) return 0; @@ -503,6 +617,15 @@ static bool gfx_ctx_wgl_set_video_mode(void *data, if (!fullscreen || windowed_full) { + if (!fullscreen) + { + RECT rc_temp = {0, 0, g_resize_height, 0x7FFF}; + SetMenu(g_hwnd, LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU))); + SendMessage(g_hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rc_temp); + g_resize_height += rc_temp.top + rect.top; + SetWindowPos(g_hwnd, NULL, 0, 0, g_resize_width, g_resize_height, SWP_NOMOVE); + } + ShowWindow(g_hwnd, SW_RESTORE); UpdateWindow(g_hwnd); SetForegroundWindow(g_hwnd); diff --git a/gfx/drivers_context/win32_common.h b/gfx/drivers_context/win32_common.h index 62fe20d654..c0f0cf6372 100644 --- a/gfx/drivers_context/win32_common.h +++ b/gfx/drivers_context/win32_common.h @@ -24,6 +24,7 @@ extern "C" { #ifndef _XBOX #define WIN32_LEAN_AND_MEAN #include +#include "../../win32/resource.h" LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); #endif diff --git a/media/rarch.rc b/media/rarch.rc index 8e387a106d..1ae4d7a4d1 100644 --- a/media/rarch.rc +++ b/media/rarch.rc @@ -1,2 +1,48 @@ +#include "../win32/resource.h" 1 ICON "retroarch-icon.ico" 2 24 "rarch.manifest" + +IDR_MENU MENU +BEGIN + POPUP "File" + BEGIN + MENUITEM "Load Core", ID_M_LOAD_CORE + MENUITEM "Load Content", ID_M_LOAD_CONTENT + MENUITEM SEPARATOR + MENUITEM "Close", ID_M_QUIT + END + POPUP "Command" + BEGIN + POPUP "Save State Options" + BEGIN + MENUITEM "Load State" ID_M_LOAD_STATE + MENUITEM "Save State" ID_M_SAVE_STATE + END + POPUP "Disk Options" + BEGIN + MENUITEM "Disk Eject Toggle" ID_M_DISK_CYCLE + MENUITEM "Disk Previous" ID_M_DISK_PREV + MENUITEM "Disk Next" ID_M_DISK_NEXT + END + MENUITEM "Reset", ID_M_RESET + MENUITEM "Menu Toggle", ID_M_MENU_TOGGLE, + MENUITEM "Pause Toggle", ID_M_PAUSE_TOGGLE, + END + POPUP "Window" + BEGIN + POPUP "Windowed Scale" + BEGIN + MENUITEM "1x" ID_M_WINDOW_SCALE_1X + MENUITEM "2x" ID_M_WINDOW_SCALE_2X + MENUITEM "3x" ID_M_WINDOW_SCALE_3X + MENUITEM "4x" ID_M_WINDOW_SCALE_4X + MENUITEM "5x" ID_M_WINDOW_SCALE_5X + MENUITEM "6x" ID_M_WINDOW_SCALE_6X + MENUITEM "7x" ID_M_WINDOW_SCALE_7X + MENUITEM "8x" ID_M_WINDOW_SCALE_8X + MENUITEM "9x" ID_M_WINDOW_SCALE_9X + MENUITEM "10x" ID_M_WINDOW_SCALE_10X + END + MENUITEM "Toggle Exclusive Full Screen" ID_M_FULL_SCREEN + END +END diff --git a/win32/resource.h b/win32/resource.h new file mode 100644 index 0000000000..802a2ffd3f --- /dev/null +++ b/win32/resource.h @@ -0,0 +1,25 @@ +/* Used by rarch.rc */ + +#define IDR_MENU 101 +#define ID_M_LOAD_CONTENT 40001 +#define ID_M_RESET 40002 +#define ID_M_QUIT 40003 +#define ID_M_MENU_TOGGLE 40004 +#define ID_M_PAUSE_TOGGLE 40005 +#define ID_M_LOAD_CORE 40006 +#define ID_M_LOAD_STATE 40007 +#define ID_M_SAVE_STATE 40008 +#define ID_M_DISK_CYCLE 40009 +#define ID_M_DISK_NEXT 40010 +#define ID_M_DISK_PREV 40011 +#define ID_M_WINDOW_SCALE_1X 40012 +#define ID_M_WINDOW_SCALE_2X 40013 +#define ID_M_WINDOW_SCALE_3X 40014 +#define ID_M_WINDOW_SCALE_4X 40015 +#define ID_M_WINDOW_SCALE_5X 40016 +#define ID_M_WINDOW_SCALE_6X 40017 +#define ID_M_WINDOW_SCALE_7X 40018 +#define ID_M_WINDOW_SCALE_8X 40019 +#define ID_M_WINDOW_SCALE_9X 40020 +#define ID_M_WINDOW_SCALE_10X 40021 +#define ID_M_FULL_SCREEN 40022