mirror of
https://github.com/libretro/RetroArch.git
synced 2026-11-07 08:36:02 -10:00
(Win32)
gfx/common/win32_resources.c — programmatic creation of all resources (menu bar, accelerator table, Pick Core dialog, icon loading, DPI awareness) gfx/common/win32_resources.h — public API header gfx/common/win32_common.c — replaces LoadMenuA(MAKEINTRESOURCE(IDR_MENU)), LoadAcceleratorsA(MAKEINTRESOURCE(IDR_ACCELERATOR1)), DialogBoxParam(MAKEINTRESOURCE(IDD_PICKCORE)), and LoadIcon(MAKEINTRESOURCE(IDI_ICON)) with the new programmatic equivalents frontend/drivers/platform_win32.c — replaces the hand-rolled DPI awareness code in frontend_win32_init() with a single win32_resources_init() call that also sets up the accelerator table griffin/griffin.c — adds #include "../gfx/common/win32_resources.c" for MSVC unity builds Makefile.common — swaps media/rarch.o for gfx/common/win32_resources.o for MinGW/GCC builds rarch.rc is only kept around now for the icon about to be embedded into the binary file
This commit is contained in:
1 parent
95b6bb2ea2
commit
cd0568e829
9 files changed
+417
-234
No files matched your search
@@ -2526,6 +2526,7 @@ endif
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
OBJ += media/rarch.o \
|
||||
gfx/common/win32_resources.o \
|
||||
gfx/common/win32_common.o \
|
||||
frontend/drivers/platform_win32.o \
|
||||
gfx/display_servers/dispserv_win32.o
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
#include "../../verbosity.h"
|
||||
#include "../../msg_hash_lbl_str.h"
|
||||
#include "../../ui/drivers/ui_win32.h"
|
||||
#include "../../gfx/common/win32_resources.h"
|
||||
|
||||
#include "platform_win32.h"
|
||||
|
||||
@@ -647,24 +648,9 @@ static size_t frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
|
||||
|
||||
static void frontend_win32_init(void *data)
|
||||
{
|
||||
typedef BOOL (WINAPI *isProcessDPIAwareProc)();
|
||||
typedef BOOL (WINAPI *setProcessDPIAwareProc)();
|
||||
#ifdef HAVE_DYLIB
|
||||
HMODULE handle =
|
||||
GetModuleHandle("User32.dll");
|
||||
isProcessDPIAwareProc isDPIAwareProc =
|
||||
(isProcessDPIAwareProc)dylib_proc(handle, "IsProcessDPIAware");
|
||||
setProcessDPIAwareProc setDPIAwareProc =
|
||||
(setProcessDPIAwareProc)dylib_proc(handle, "SetProcessDPIAware");
|
||||
#else
|
||||
isProcessDPIAwareProc isDPIAwareProc = IsProcessDPIAware;
|
||||
setProcessDPIAwareProc setDPIAwareProc = SetProcessDPIAware;
|
||||
#endif
|
||||
|
||||
if (isDPIAwareProc)
|
||||
if (!isDPIAwareProc())
|
||||
if (setDPIAwareProc)
|
||||
setDPIAwareProc();
|
||||
/* Initializes DPI awareness, accelerator table, and
|
||||
* prepares programmatic resources (replaces .rc file). */
|
||||
win32_resources_init();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#endif
|
||||
|
||||
#include "win32_common.h"
|
||||
#include "win32_resources.h"
|
||||
|
||||
#ifdef HAVE_GDI
|
||||
#include "gdi_defines.h"
|
||||
@@ -577,8 +578,8 @@ static bool win32_load_content_from_gui(const char *szFilename)
|
||||
video_st->poke->show_mouse(video_st->data, true);
|
||||
|
||||
/* Pick one core that could be compatible. */
|
||||
if (DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_PICKCORE),
|
||||
main_window.hwnd, pick_core_proc, (LPARAM)NULL) == IDOK)
|
||||
if (win32_resources_pick_core_dialog(
|
||||
main_window.hwnd, pick_core_proc) == IDOK)
|
||||
{
|
||||
task_push_load_content_with_current_core_from_companion_ui(
|
||||
NULL, &content_info, CORE_TYPE_PLAIN, NULL, NULL);
|
||||
@@ -2060,7 +2061,7 @@ bool win32_window_create(void *data, unsigned style,
|
||||
if (!main_window.hwnd)
|
||||
return false;
|
||||
|
||||
window_accelerators = LoadAcceleratorsA(GetModuleHandleA(NULL), MAKEINTRESOURCE(IDR_ACCELERATOR1));
|
||||
window_accelerators = win32_resources_get_accelerator();
|
||||
|
||||
#ifdef HAVE_TASKBAR
|
||||
g_win32->taskbar_message =
|
||||
@@ -2734,7 +2735,7 @@ void win32_set_window(unsigned *width, unsigned *height,
|
||||
rc_temp.right = (LONG)*height;
|
||||
rc_temp.bottom = 0x7FFF;
|
||||
|
||||
menuItem = LoadMenuA(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU));
|
||||
menuItem = win32_resources_create_menu();
|
||||
win32_localize_menu(menuItem);
|
||||
SetMenu(main_window.hwnd, menuItem);
|
||||
|
||||
|
||||
@@ -0,0 +1,334 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2024 - RetroArch contributors
|
||||
*
|
||||
* RetroArch 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 Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch 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 RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Programmatic replacement for the menu, dialog, accelerator,
|
||||
* and manifest resources formerly in media/rarch.rc and
|
||||
* media/rarch_ja.rc.
|
||||
*
|
||||
* The icon resource remains in rarch.rc so the executable has
|
||||
* an embedded icon visible in Explorer / taskbar / Alt+Tab.
|
||||
*
|
||||
* This file creates:
|
||||
* IDR_MENU → win32_resources_create_menu()
|
||||
* IDR_ACCELERATOR1 → win32_resources_get_accelerator()
|
||||
* IDD_PICKCORE → win32_resources_pick_core_dialog()
|
||||
* rarch.manifest → apply_dpi_awareness() (called from _init)
|
||||
*/
|
||||
|
||||
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||
|
||||
#ifndef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0601
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#include "win32_resources.h"
|
||||
#include "../../ui/drivers/ui_win32_resource.h"
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Internal state
|
||||
* ---------------------------------------------------------------- */
|
||||
static HACCEL s_accel_table = NULL;
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* DPI AWARENESS (replaces media/rarch.manifest)
|
||||
*
|
||||
* The manifest contained:
|
||||
* <dpiAware xmlns="...">true</dpiAware>
|
||||
*
|
||||
* We call the equivalent API at runtime.
|
||||
* ---------------------------------------------------------------- */
|
||||
typedef HRESULT (WINAPI *pfn_SetProcessDpiAwareness)(int);
|
||||
|
||||
static void apply_dpi_awareness(void)
|
||||
{
|
||||
HMODULE shcore = LoadLibraryW(L"shcore.dll");
|
||||
if (shcore)
|
||||
{
|
||||
pfn_SetProcessDpiAwareness fn =
|
||||
(pfn_SetProcessDpiAwareness)(void*)GetProcAddress(
|
||||
shcore, "SetProcessDpiAwareness");
|
||||
if (fn)
|
||||
{
|
||||
/* PROCESS_SYSTEM_DPI_AWARE = 1 */
|
||||
fn(1);
|
||||
FreeLibrary(shcore);
|
||||
return;
|
||||
}
|
||||
FreeLibrary(shcore);
|
||||
}
|
||||
|
||||
/* Fallback for Vista / Win7 without shcore */
|
||||
SetProcessDPIAware();
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ACCELERATOR TABLE (replaces IDR_ACCELERATOR1)
|
||||
*
|
||||
* Ctrl+O → ID_M_LOAD_CONTENT
|
||||
* Alt+Enter → ID_M_FULL_SCREEN
|
||||
* ---------------------------------------------------------------- */
|
||||
static HACCEL create_accelerator_table(void)
|
||||
{
|
||||
ACCEL accel[2];
|
||||
|
||||
accel[0].fVirt = FCONTROL | FVIRTKEY | FNOINVERT;
|
||||
accel[0].key = 'O';
|
||||
accel[0].cmd = ID_M_LOAD_CONTENT;
|
||||
|
||||
accel[1].fVirt = FALT | FVIRTKEY | FNOINVERT;
|
||||
accel[1].key = VK_RETURN;
|
||||
accel[1].cmd = ID_M_FULL_SCREEN;
|
||||
|
||||
return CreateAcceleratorTableW(accel, 2);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* MENU BAR (replaces IDR_MENU from rarch.rc)
|
||||
*
|
||||
* The menu is always created with English labels; RetroArch's
|
||||
* existing win32_localize_menu() in win32_common.c re-labels
|
||||
* every item with the localized string for the active language,
|
||||
* so there is no need for a separate Japanese menu.
|
||||
* ---------------------------------------------------------------- */
|
||||
HMENU win32_resources_create_menu(void)
|
||||
{
|
||||
HMENU menu_bar, file_menu, command_menu, window_menu;
|
||||
HMENU audio_menu, disk_menu, savestate_menu, stateindex_menu;
|
||||
HMENU scale_menu;
|
||||
|
||||
menu_bar = CreateMenu();
|
||||
if (!menu_bar)
|
||||
return NULL;
|
||||
|
||||
/* ---- File ---- */
|
||||
file_menu = CreatePopupMenu();
|
||||
AppendMenuA(file_menu, MF_STRING, ID_M_LOAD_CORE, "Load Core...");
|
||||
AppendMenuA(file_menu, MF_STRING, ID_M_LOAD_CONTENT, "Load Content...");
|
||||
AppendMenuA(file_menu, MF_SEPARATOR, 0, NULL);
|
||||
AppendMenuA(file_menu, MF_STRING, ID_M_QUIT, "Close");
|
||||
AppendMenuA(menu_bar, MF_POPUP, (UINT_PTR)file_menu, "File");
|
||||
|
||||
/* ---- Command ---- */
|
||||
command_menu = CreatePopupMenu();
|
||||
|
||||
/* Audio Options */
|
||||
audio_menu = CreatePopupMenu();
|
||||
AppendMenuA(audio_menu, MF_STRING, ID_M_MUTE_TOGGLE, "Audio Mute Toggle");
|
||||
AppendMenuA(command_menu, MF_POPUP, (UINT_PTR)audio_menu, "Audio Options");
|
||||
|
||||
/* Disk Options */
|
||||
disk_menu = CreatePopupMenu();
|
||||
AppendMenuA(disk_menu, MF_STRING, ID_M_DISK_CYCLE, "Disk Eject Toggle");
|
||||
AppendMenuA(disk_menu, MF_STRING, ID_M_DISK_PREV, "Disk Previous");
|
||||
AppendMenuA(disk_menu, MF_STRING, ID_M_DISK_NEXT, "Disk Next");
|
||||
AppendMenuA(command_menu, MF_POPUP, (UINT_PTR)disk_menu, "Disk Options");
|
||||
|
||||
/* Save State Options */
|
||||
savestate_menu = CreatePopupMenu();
|
||||
|
||||
/* State Index sub-menu */
|
||||
stateindex_menu = CreatePopupMenu();
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_AUTO, "Auto");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_0, "0");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_1, "1");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_2, "2");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_3, "3");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_4, "4");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_5, "5");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_6, "6");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_7, "7");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_8, "8");
|
||||
AppendMenuA(stateindex_menu, MF_STRING, ID_M_STATE_INDEX_9, "9");
|
||||
AppendMenuA(savestate_menu, MF_POPUP,
|
||||
(UINT_PTR)stateindex_menu, "State Index");
|
||||
|
||||
AppendMenuA(savestate_menu, MF_STRING, ID_M_LOAD_STATE, "Load State");
|
||||
AppendMenuA(savestate_menu, MF_STRING, ID_M_SAVE_STATE, "Save State");
|
||||
AppendMenuA(command_menu, MF_POPUP,
|
||||
(UINT_PTR)savestate_menu, "Save State Options");
|
||||
|
||||
AppendMenuA(command_menu, MF_STRING, ID_M_RESET, "Reset");
|
||||
AppendMenuA(command_menu, MF_STRING, ID_M_PAUSE_TOGGLE, "Pause Toggle");
|
||||
AppendMenuA(command_menu, MF_STRING, ID_M_MENU_TOGGLE, "Menu Toggle");
|
||||
AppendMenuA(command_menu, MF_STRING, ID_M_TAKE_SCREENSHOT, "Take Screenshot");
|
||||
AppendMenuA(command_menu, MF_STRING, ID_M_MOUSE_GRAB, "Mouse Grab Toggle");
|
||||
AppendMenuA(menu_bar, MF_POPUP, (UINT_PTR)command_menu, "Command");
|
||||
|
||||
/* ---- Window ---- */
|
||||
window_menu = CreatePopupMenu();
|
||||
|
||||
/* Windowed Scale sub-menu */
|
||||
scale_menu = CreatePopupMenu();
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_1X, "1x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_2X, "2x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_3X, "3x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_4X, "4x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_5X, "5x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_6X, "6x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_7X, "7x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_8X, "8x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_9X, "9x");
|
||||
AppendMenuA(scale_menu, MF_STRING, ID_M_WINDOW_SCALE_10X, "10x");
|
||||
AppendMenuA(window_menu, MF_POPUP, (UINT_PTR)scale_menu, "Windowed Scale");
|
||||
|
||||
#ifdef HAVE_QT
|
||||
AppendMenuA(window_menu, MF_STRING, ID_M_TOGGLE_DESKTOP,
|
||||
"Toggle Desktop Menu");
|
||||
#endif
|
||||
AppendMenuA(window_menu, MF_STRING, ID_M_FULL_SCREEN,
|
||||
"Toggle Exclusive Full Screen");
|
||||
AppendMenuA(menu_bar, MF_POPUP, (UINT_PTR)window_menu, "Window");
|
||||
|
||||
return menu_bar;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* "PICK CORE" DIALOG (replaces IDD_PICKCORE)
|
||||
*
|
||||
* Builds DLGTEMPLATE + DLGITEMTEMPLATE structs in memory and calls
|
||||
* DialogBoxIndirectParam, so no compiled resource is needed.
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
/* Align pointer up to DWORD boundary */
|
||||
static LPWORD align_dword(LPWORD ptr)
|
||||
{
|
||||
ULONG_PTR ul = (ULONG_PTR)ptr;
|
||||
ul = (ul + 3) & ~(ULONG_PTR)3;
|
||||
return (LPWORD)ul;
|
||||
}
|
||||
|
||||
/* Append a wide string (including NUL) into template buffer */
|
||||
static LPWORD append_wstr(LPWORD ptr, const WCHAR *str)
|
||||
{
|
||||
int len = (int)wcslen(str) + 1;
|
||||
memcpy(ptr, str, len * sizeof(WCHAR));
|
||||
return ptr + len;
|
||||
}
|
||||
|
||||
int win32_resources_pick_core_dialog(HWND parent, DLGPROC dlg_proc)
|
||||
{
|
||||
BYTE buf[2048];
|
||||
DLGTEMPLATE *dlg;
|
||||
LPWORD p;
|
||||
DLGITEMTEMPLATE *item;
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
dlg = (DLGTEMPLATE *)buf;
|
||||
|
||||
/* Dialog header */
|
||||
dlg->style = DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT
|
||||
| WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU;
|
||||
dlg->dwExtendedStyle = 0;
|
||||
dlg->cdit = 4;
|
||||
dlg->x = 0;
|
||||
dlg->y = 0;
|
||||
dlg->cx = 225;
|
||||
dlg->cy = 118;
|
||||
|
||||
p = (LPWORD)(dlg + 1);
|
||||
*p++ = 0; /* no menu */
|
||||
*p++ = 0; /* default class */
|
||||
p = append_wstr(p, L"Pick Core"); /* caption */
|
||||
*p++ = 8; /* font size */
|
||||
p = append_wstr(p, L"Ms Shell Dlg"); /* font name */
|
||||
|
||||
/* Control 1: LTEXT (static label) */
|
||||
p = align_dword(p);
|
||||
item = (DLGITEMTEMPLATE *)p;
|
||||
item->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
|
||||
item->dwExtendedStyle = WS_EX_LEFT;
|
||||
item->x = 9; item->y = 12;
|
||||
item->cx = 160; item->cy = 17;
|
||||
item->id = 0;
|
||||
p = (LPWORD)(item + 1);
|
||||
*p++ = 0xFFFF; *p++ = 0x0082; /* STATIC class */
|
||||
p = append_wstr(p,
|
||||
L"Please select a core to use for the content loaded.\n"
|
||||
L"Otherwise, press 'Cancel' to cancel loading.");
|
||||
*p++ = 0; /* no creation data */
|
||||
|
||||
/* Control 2: DEFPUSHBUTTON "OK" */
|
||||
p = align_dword(p);
|
||||
item = (DLGITEMTEMPLATE *)p;
|
||||
item->style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON;
|
||||
item->dwExtendedStyle = WS_EX_LEFT;
|
||||
item->x = 170; item->y = 15;
|
||||
item->cx = 50; item->cy = 14;
|
||||
item->id = IDOK;
|
||||
p = (LPWORD)(item + 1);
|
||||
*p++ = 0xFFFF; *p++ = 0x0080; /* BUTTON class */
|
||||
p = append_wstr(p, L"OK");
|
||||
*p++ = 0;
|
||||
|
||||
/* Control 3: PUSHBUTTON "Cancel" */
|
||||
p = align_dword(p);
|
||||
item = (DLGITEMTEMPLATE *)p;
|
||||
item->style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON;
|
||||
item->dwExtendedStyle = WS_EX_LEFT;
|
||||
item->x = 170; item->y = 32;
|
||||
item->cx = 50; item->cy = 14;
|
||||
item->id = IDCANCEL;
|
||||
p = (LPWORD)(item + 1);
|
||||
*p++ = 0xFFFF; *p++ = 0x0080; /* BUTTON class */
|
||||
p = append_wstr(p, L"Cancel");
|
||||
*p++ = 0;
|
||||
|
||||
/* Control 4: LISTBOX (core list) */
|
||||
p = align_dword(p);
|
||||
item = (DLGITEMTEMPLATE *)p;
|
||||
item->style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
|
||||
| LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY;
|
||||
item->dwExtendedStyle = WS_EX_LEFT;
|
||||
item->x = 5; item->y = 55;
|
||||
item->cx = 214; item->cy = 60;
|
||||
item->id = ID_CORELISTBOX;
|
||||
p = (LPWORD)(item + 1);
|
||||
*p++ = 0xFFFF; *p++ = 0x0083; /* LISTBOX class */
|
||||
*p++ = 0; /* empty title */
|
||||
*p++ = 0; /* no creation data */
|
||||
|
||||
return (int)DialogBoxIndirectParamW(
|
||||
GetModuleHandleW(NULL),
|
||||
dlg, parent, dlg_proc, 0);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* PUBLIC INIT / FREE
|
||||
* ---------------------------------------------------------------- */
|
||||
void win32_resources_init(void)
|
||||
{
|
||||
apply_dpi_awareness();
|
||||
s_accel_table = create_accelerator_table();
|
||||
}
|
||||
|
||||
void win32_resources_free(void)
|
||||
{
|
||||
if (s_accel_table)
|
||||
{
|
||||
DestroyAcceleratorTable(s_accel_table);
|
||||
s_accel_table = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
HACCEL win32_resources_get_accelerator(void)
|
||||
{
|
||||
return s_accel_table;
|
||||
}
|
||||
|
||||
#endif /* _WIN32 && !_XBOX && !__WINRT__ */
|
||||
@@ -0,0 +1,62 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2024 - RetroArch contributors
|
||||
*
|
||||
* RetroArch 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 Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch 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 RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Programmatic replacement for the menu, dialog, accelerator,
|
||||
* and manifest resources that were in media/rarch.rc.
|
||||
*
|
||||
* The icon resource remains in rarch.rc (compiled by windres/rc)
|
||||
* so that the .exe has an embedded icon visible in Explorer.
|
||||
* Everything else is created at runtime via Win32 API calls. */
|
||||
|
||||
#ifndef WIN32_RESOURCES_H__
|
||||
#define WIN32_RESOURCES_H__
|
||||
|
||||
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "../../ui/drivers/ui_win32_resource.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Call once before creating any windows.
|
||||
* Applies DPI awareness and creates the accelerator table. */
|
||||
void win32_resources_init(void);
|
||||
|
||||
/* Release resources created by win32_resources_init(). */
|
||||
void win32_resources_free(void);
|
||||
|
||||
/* Build the application menu bar programmatically
|
||||
* (replaces LoadMenu + MAKEINTRESOURCE(IDR_MENU)).
|
||||
* Returns a fresh HMENU each call — caller owns it. */
|
||||
HMENU win32_resources_create_menu(void);
|
||||
|
||||
/* Return the accelerator table
|
||||
* (replaces LoadAccelerators + MAKEINTRESOURCE(IDR_ACCELERATOR1)). */
|
||||
HACCEL win32_resources_get_accelerator(void);
|
||||
|
||||
/* Show the "Pick Core" dialog built in memory
|
||||
* (replaces DialogBoxParam + MAKEINTRESOURCE(IDD_PICKCORE)).
|
||||
* Returns IDOK or IDCANCEL. */
|
||||
int win32_resources_pick_core_dialog(HWND parent, DLGPROC dlg_proc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _WIN32 && !_XBOX && !__WINRT__ */
|
||||
#endif /* WIN32_RESOURCES_H__ */
|
||||
@@ -261,6 +261,7 @@ CHEATS
|
||||
UI COMMON CONTEXT
|
||||
============================================================ */
|
||||
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||
#include "../gfx/common/win32_resources.c"
|
||||
#include "../gfx/common/win32_common.c"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
</assembly>
|
||||
+10
-114
@@ -1,121 +1,17 @@
|
||||
// Generated by ResEdit 1.6.6
|
||||
// Copyright (C) 2006-2015
|
||||
// http://www.resedit.net
|
||||
#include "../ui/drivers/ui_win32_resource.h"
|
||||
// RetroArch icon resource
|
||||
//
|
||||
// This is the only resource that must remain in the .rc file:
|
||||
// the icon must be embedded in the PE executable so that Windows
|
||||
// can display it in Explorer, the taskbar, and Alt+Tab without
|
||||
// running the program.
|
||||
//
|
||||
// All other resources (menus, dialogs, accelerators, manifest)
|
||||
// are now created programmatically — see gfx/common/win32_resources.c
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
// Menu resources
|
||||
//
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||
IDR_MENU MENU
|
||||
{
|
||||
POPUP "File"
|
||||
{
|
||||
MENUITEM "Load Core...", ID_M_LOAD_CORE
|
||||
MENUITEM "Load Content...", ID_M_LOAD_CONTENT
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Close", ID_M_QUIT
|
||||
}
|
||||
POPUP "Command"
|
||||
{
|
||||
POPUP "Audio Options"
|
||||
{
|
||||
MENUITEM "Audio Mute Toggle", ID_M_MUTE_TOGGLE
|
||||
}
|
||||
POPUP "Disk Options"
|
||||
{
|
||||
MENUITEM "Disk Eject Toggle", ID_M_DISK_CYCLE
|
||||
MENUITEM "Disk Previous", ID_M_DISK_PREV
|
||||
MENUITEM "Disk Next", ID_M_DISK_NEXT
|
||||
}
|
||||
POPUP "Save State Options"
|
||||
{
|
||||
POPUP "State Index"
|
||||
{
|
||||
MENUITEM "Auto", ID_M_STATE_INDEX_AUTO
|
||||
MENUITEM "0", ID_M_STATE_INDEX_0
|
||||
MENUITEM "1", ID_M_STATE_INDEX_1
|
||||
MENUITEM "2", ID_M_STATE_INDEX_2
|
||||
MENUITEM "3", ID_M_STATE_INDEX_3
|
||||
MENUITEM "4", ID_M_STATE_INDEX_4
|
||||
MENUITEM "5", ID_M_STATE_INDEX_5
|
||||
MENUITEM "6", ID_M_STATE_INDEX_6
|
||||
MENUITEM "7", ID_M_STATE_INDEX_7
|
||||
MENUITEM "8", ID_M_STATE_INDEX_8
|
||||
MENUITEM "9", ID_M_STATE_INDEX_9
|
||||
}
|
||||
MENUITEM "Load State", ID_M_LOAD_STATE
|
||||
MENUITEM "Save State", ID_M_SAVE_STATE
|
||||
}
|
||||
MENUITEM "Reset", ID_M_RESET
|
||||
MENUITEM "Pause Toggle", ID_M_PAUSE_TOGGLE
|
||||
MENUITEM "Menu Toggle", ID_M_MENU_TOGGLE
|
||||
MENUITEM "Take Screenshot", ID_M_TAKE_SCREENSHOT
|
||||
MENUITEM "Mouse Grab Toggle", ID_M_MOUSE_GRAB
|
||||
}
|
||||
POPUP "Window"
|
||||
{
|
||||
POPUP "Windowed Scale"
|
||||
{
|
||||
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
|
||||
}
|
||||
#ifdef HAVE_QT
|
||||
MENUITEM "Toggle Desktop Menu", ID_M_TOGGLE_DESKTOP
|
||||
#endif
|
||||
MENUITEM "Toggle Exclusive Full Screen", ID_M_FULL_SCREEN
|
||||
// Shader dialog is disabled for now, until video_threaded issues are fixed.
|
||||
//MENUITEM "Shader Parameters", ID_M_SHADER_PARAMETERS
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Dialog resources
|
||||
//
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
IDD_PICKCORE DIALOG 0, 0, 225, 118
|
||||
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
|
||||
CAPTION "Pick Core"
|
||||
FONT 8, "Ms Shell Dlg"
|
||||
{
|
||||
LISTBOX ID_CORELISTBOX, 5, 55, 214, 60, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
|
||||
DEFPUSHBUTTON "OK", IDOK, 170, 15, 50, 14, 0, WS_EX_LEFT
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 170, 32, 50, 14, 0, WS_EX_LEFT
|
||||
LTEXT "Please select a core to use for the content loaded.\nOtherwise, press 'Cancel' to cancel loading.", 0, 9, 12, 160, 17, SS_LEFT, WS_EX_LEFT
|
||||
}
|
||||
|
||||
//
|
||||
// Icon resources
|
||||
//
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
1 ICON "retroarch.ico"
|
||||
|
||||
//
|
||||
// Manifest resources
|
||||
//
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
2 RT_MANIFEST "rarch.manifest"
|
||||
|
||||
|
||||
//
|
||||
// Accelerator
|
||||
//
|
||||
|
||||
IDR_ACCELERATOR1 ACCELERATORS
|
||||
BEGIN
|
||||
"O", ID_M_LOAD_CONTENT, VIRTKEY, CONTROL, NOINVERT
|
||||
VK_RETURN, ID_M_FULL_SCREEN, VIRTKEY, ALT, NOINVERT
|
||||
END
|
||||
|
||||
// Per the documentation, this should be used before including resource files.
|
||||
// https://docs.microsoft.com/en-us/windows/desktop/menurc/pragma-directives
|
||||
#pragma code_page(932)
|
||||
#include "rarch_ja.rc"
|
||||
@@ -1,90 +0,0 @@
|
||||
// Menu resources (Japanese)
|
||||
//
|
||||
// The encoding for this file is CP932.
|
||||
#pragma code_page(932)
|
||||
|
||||
LANGUAGE LANG_JAPANESE, SUBLANG_NEUTRAL
|
||||
IDR_MENU MENU
|
||||
{
|
||||
POPUP "ファイル"
|
||||
{
|
||||
MENUITEM "コアをロード...", ID_M_LOAD_CORE
|
||||
MENUITEM "コンテンツをロード...", ID_M_LOAD_CONTENT
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "終了", ID_M_QUIT
|
||||
}
|
||||
POPUP "コマンド"
|
||||
{
|
||||
POPUP "オーディオ設定"
|
||||
{
|
||||
MENUITEM "オーディオを消音", ID_M_MUTE_TOGGLE
|
||||
}
|
||||
POPUP "ディスク操作"
|
||||
{
|
||||
MENUITEM "ディスク取り出し", ID_M_DISK_CYCLE
|
||||
MENUITEM "前のディスク", ID_M_DISK_PREV
|
||||
MENUITEM "次のディスク", ID_M_DISK_NEXT
|
||||
}
|
||||
POPUP "保存状態設定"
|
||||
{
|
||||
POPUP "状態のインデックス"
|
||||
{
|
||||
MENUITEM "自動", ID_M_STATE_INDEX_AUTO
|
||||
MENUITEM "0", ID_M_STATE_INDEX_0
|
||||
MENUITEM "1", ID_M_STATE_INDEX_1
|
||||
MENUITEM "2", ID_M_STATE_INDEX_2
|
||||
MENUITEM "3", ID_M_STATE_INDEX_3
|
||||
MENUITEM "4", ID_M_STATE_INDEX_4
|
||||
MENUITEM "5", ID_M_STATE_INDEX_5
|
||||
MENUITEM "6", ID_M_STATE_INDEX_6
|
||||
MENUITEM "7", ID_M_STATE_INDEX_7
|
||||
MENUITEM "8", ID_M_STATE_INDEX_8
|
||||
MENUITEM "9", ID_M_STATE_INDEX_9
|
||||
}
|
||||
MENUITEM "保存状態をロード", ID_M_LOAD_STATE
|
||||
MENUITEM "状態保存", ID_M_SAVE_STATE
|
||||
}
|
||||
MENUITEM "リセット", ID_M_RESET
|
||||
MENUITEM "一時停止", ID_M_PAUSE_TOGGLE
|
||||
MENUITEM "メニューに切り替え", ID_M_MENU_TOGGLE
|
||||
MENUITEM "スクリーンショットを撮る", ID_M_TAKE_SCREENSHOT
|
||||
MENUITEM "マウスグラブ切り替え", ID_M_MOUSE_GRAB
|
||||
}
|
||||
POPUP "ウィンドウ"
|
||||
{
|
||||
POPUP "ウィンドウのスケール"
|
||||
{
|
||||
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
|
||||
}
|
||||
#ifdef HAVE_QT
|
||||
MENUITEM "デスクトップメニューを表示", ID_M_TOGGLE_DESKTOP
|
||||
#endif
|
||||
MENUITEM "排他的なフルスクリーン切り替え", ID_M_FULL_SCREEN
|
||||
// Shader dialog is disabled for now, until video_threaded issues are fixed.
|
||||
//MENUITEM "シェーダーのパラメータ", ID_M_SHADER_PARAMETERS
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Dialog resources
|
||||
//
|
||||
LANGUAGE LANG_JAPANESE, SUBLANG_NEUTRAL
|
||||
IDD_PICKCORE DIALOG 0, 0, 225, 118
|
||||
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
|
||||
CAPTION "コア選択"
|
||||
FONT 8, "Ms Shell Dlg"
|
||||
{
|
||||
LISTBOX ID_CORELISTBOX, 5, 55, 214, 60, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
|
||||
DEFPUSHBUTTON "OK", IDOK, 170, 15, 50, 14, 0, WS_EX_LEFT
|
||||
PUSHBUTTON "キャンセル", IDCANCEL, 170, 32, 50, 14, 0, WS_EX_LEFT
|
||||
LTEXT "コンテンツに使用するコアを選択してください。", 0, 9, 12, 160, 17, SS_LEFT, WS_EX_LEFT
|
||||
}
|
||||
Reference in new issue
Block a user