mirror of
https://github.com/CTCaer/RetroArch.git
synced 2024-12-14 14:28:47 +00:00
Merge branch 'master' into cheater
This commit is contained in:
commit
c750235414
@ -6,6 +6,7 @@
|
||||
- COMMON: Automatically hide "Configuration Override options" in Quick Menu.
|
||||
- COMMON: Small Bugfix to not trigger savestate code when pressing Reset.
|
||||
- COMMON: Added libsixel video driver.
|
||||
- EMSCRIPTEN: Fix Game Focus Toggle.
|
||||
- HID/OSX: Fix to set hid device registration deterministic (#6497), to address issue #6640 re-adding dynamic device registration.
|
||||
- LOCALIZATION: Update Italian translation.
|
||||
- LOCALIZATION: Update Japanese translation.
|
||||
@ -17,18 +18,25 @@
|
||||
- MIDI: Add a Windows driver for MIDI, based on winmm.
|
||||
- MENU/QT/WIMP: QT QSlider styling for Dark Theme.
|
||||
- MENU/QT/WIMP: Remove button ghostly inside highlighting.
|
||||
- MENU/QT/WIMP: Initial grid view.
|
||||
- METAL: Initial work-in-progress video driver for Metal. macOS-only right now, and currently requires macOS 10.13.
|
||||
- METAL: Supports XMB/MaterialUI, has a menu display driver. Has a font rendering driver.
|
||||
- METAL/SLANG: Slang shaders should be compatible with Metal video driver.
|
||||
- QNX: Fix Game Focus Toggle.
|
||||
- PS3: Add audio mixer support for FLAC and MP3.
|
||||
- PSP: Use proper button labels, fix inverted R-Stick Y axis.
|
||||
- REMAPS: Fix the way offsets are calculated for keyboard remapping.
|
||||
- RUNAHEAD: Fix full-screen mode change breaking Secondary Core's environment variables.
|
||||
- VITA: Use proper button labels, fix inverted R-Stick Y axis.
|
||||
- VITA: Add imc0: mount.
|
||||
- VITA: Use sceCtrlIsMultiControllerSupported to detect.
|
||||
- VULKAN: Fix two validation errors.
|
||||
- VULKAN: Try to avoid creating swapchains redundantly. Should fix black screen and having to alt tab out of window again to get display working on Nvidia GPUs (Windows).
|
||||
- VULKAN/OSX: Initial MoltenVK support. Not enabled yet, several MoltenVK bugs should be fixed first before we can have it fully working.
|
||||
- WINDOWS/DINPUT: Add rumble support.
|
||||
- WINDOWS/DINPUT: Fix Game Focus Toggle.
|
||||
- WINDOWS/RAWINPUT: Fix Game Focus Toggle.
|
||||
- X11: Fix Game Focus Toggle.
|
||||
- WII: Change deflicker setting to work in 480p or higher, and always enables vfilter so that the user can easily change brightness.
|
||||
- WIIU: Fix out-of-bounds rendering bug
|
||||
- WIIU: Implement UDP broadcast network logging on Wii U.
|
||||
|
@ -334,14 +334,16 @@ OBJ += ui/drivers/ui_qt.o \
|
||||
ui/drivers/qt/ui_qt_window.o \
|
||||
ui/drivers/qt/ui_qt_browser_window.o \
|
||||
ui/drivers/qt/ui_qt_load_core_window.o \
|
||||
ui/drivers/qt/ui_qt_msg_window.o
|
||||
ui/drivers/qt/ui_qt_msg_window.o \
|
||||
ui/drivers/qt/flowlayout.o
|
||||
|
||||
MOC_HEADERS += ui/drivers/ui_qt.h \
|
||||
ui/drivers/qt/ui_qt_load_core_window.h
|
||||
ui/drivers/qt/ui_qt_load_core_window.h \
|
||||
ui/drivers/qt/flowlayout.h
|
||||
|
||||
DEFINES += $(QT5CORE_CFLAGS) $(QT5GUI_CFLAGS) $(QT5WIDGETS_CFLAGS) -DHAVE_MAIN
|
||||
DEFINES += $(QT5CORE_CFLAGS) $(QT5GUI_CFLAGS) $(QT5WIDGETS_CFLAGS) $(QT5CONCURRENT_CFLAGS) -DHAVE_MAIN
|
||||
#DEFINES += $(QT5WEBENGINE_CFLAGS)
|
||||
LIBS += $(QT5CORE_LIBS) $(QT5GUI_LIBS) $(QT5WIDGETS_LIBS)
|
||||
LIBS += $(QT5CORE_LIBS) $(QT5GUI_LIBS) $(QT5WIDGETS_LIBS) $(QT5CONCURRENT_LIBS)
|
||||
#LIBS += $(QT5WEBENGINE_LIBS)
|
||||
NEED_CXX_LINKER = 1
|
||||
|
||||
@ -741,11 +743,16 @@ ifeq ($(HW_CONTEXT_MENU_DRIVERS), 1)
|
||||
ifeq ($(HAVE_XMB),)
|
||||
HAVE_XMB = 1
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_STRIPES),)
|
||||
HAVE_STRIPES = 1
|
||||
endif
|
||||
else
|
||||
HAVE_ZARCH ?= 0
|
||||
HAVE_MATERIALUI ?= 0
|
||||
#HAVE_NUKLEAR ?= 0
|
||||
HAVE_XMB ?= 0
|
||||
HAVE_STRIPES ?= 0
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RGUI), 1)
|
||||
@ -777,6 +784,12 @@ ifeq ($(HAVE_XMB), 1)
|
||||
HAVE_MENU_COMMON = 1
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_STRIPES), 1)
|
||||
OBJ += menu/drivers/stripes.o
|
||||
DEFINES += -DHAVE_STRIPES
|
||||
HAVE_MENU_COMMON = 1
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_LAKKA), 1)
|
||||
DEFINES += -DHAVE_LAKKA
|
||||
endif
|
||||
|
52
command.c
52
command.c
@ -1051,8 +1051,11 @@ static void command_event_deinit_core(bool reinit)
|
||||
cheevos_unload();
|
||||
#endif
|
||||
|
||||
RARCH_LOG("Unloading game..\n");
|
||||
core_unload_game();
|
||||
RARCH_LOG("Unloading core..\n");
|
||||
core_unload();
|
||||
RARCH_LOG("Unloading core symbols..\n");
|
||||
core_uninit_symbols();
|
||||
|
||||
if (reinit)
|
||||
@ -1398,7 +1401,6 @@ static bool command_event_save_config(
|
||||
static bool command_event_save_core_config(void)
|
||||
{
|
||||
char msg[128];
|
||||
bool ret = false;
|
||||
bool found_path = false;
|
||||
bool overrides_active = false;
|
||||
const char *core_path = NULL;
|
||||
@ -1505,7 +1507,7 @@ static bool command_event_save_core_config(void)
|
||||
free(config_dir);
|
||||
free(config_name);
|
||||
free(config_path);
|
||||
return ret;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1838,14 +1840,21 @@ bool command_event(enum event_command cmd, void *data)
|
||||
if (cheevos_hardcore_active)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
return command_event_main_state(cmd);
|
||||
if (!command_event_main_state(cmd))
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_UNDO_LOAD_STATE:
|
||||
return command_event_main_state(cmd);
|
||||
if (!command_event_main_state(cmd))
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_UNDO_SAVE_STATE:
|
||||
return command_event_main_state(cmd);
|
||||
if (!command_event_main_state(cmd))
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_RESIZE_WINDOWED_SCALE:
|
||||
return command_event_resize_windowed_scale();
|
||||
if (!command_event_resize_windowed_scale())
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_MENU_TOGGLE:
|
||||
#ifdef HAVE_MENU
|
||||
if (menu_driver_is_alive())
|
||||
@ -1886,7 +1895,9 @@ bool command_event(enum event_command cmd, void *data)
|
||||
configuration_set_int(settings, settings->ints.state_slot, new_state_slot);
|
||||
}
|
||||
}
|
||||
return command_event_main_state(cmd);
|
||||
if (!command_event_main_state(cmd))
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_SAVE_STATE_DECREMENT:
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
@ -1936,7 +1947,9 @@ bool command_event(enum event_command cmd, void *data)
|
||||
}
|
||||
break;
|
||||
case CMD_EVENT_QUIT:
|
||||
return retroarch_main_quit();
|
||||
if (!retroarch_main_quit())
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_CHEEVOS_HARDCORE_MODE_TOGGLE:
|
||||
#ifdef HAVE_CHEEVOS
|
||||
cheevos_toggle_hardcore_mode();
|
||||
@ -2046,9 +2059,13 @@ TODO: Add a setting for these tweaks */
|
||||
break;
|
||||
case CMD_EVENT_AUDIO_STOP:
|
||||
midi_driver_set_all_sounds_off();
|
||||
return audio_driver_stop();
|
||||
if (!audio_driver_stop())
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_AUDIO_START:
|
||||
return audio_driver_start(rarch_ctl(RARCH_CTL_IS_SHUTDOWN, NULL));
|
||||
if (!audio_driver_start(rarch_ctl(RARCH_CTL_IS_SHUTDOWN, NULL)))
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_AUDIO_MUTE_TOGGLE:
|
||||
{
|
||||
bool audio_mute_enable = *(audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE));
|
||||
@ -2633,14 +2650,13 @@ TODO: Add a setting for these tweaks */
|
||||
command_event(CMD_EVENT_REMOTE_DEINIT, NULL);
|
||||
input_driver_init_remote();
|
||||
break;
|
||||
|
||||
case CMD_EVENT_MAPPER_DEINIT:
|
||||
input_driver_deinit_mapper();
|
||||
break;
|
||||
case CMD_EVENT_MAPPER_INIT:
|
||||
command_event(CMD_EVENT_MAPPER_DEINIT, NULL);
|
||||
input_driver_init_mapper();
|
||||
break;
|
||||
break;
|
||||
case CMD_EVENT_LOG_FILE_DEINIT:
|
||||
retro_main_log_file_deinit();
|
||||
break;
|
||||
@ -2649,8 +2665,10 @@ TODO: Add a setting for these tweaks */
|
||||
const char *path = (const char*)data;
|
||||
if (string_is_empty(path))
|
||||
return false;
|
||||
return command_event_disk_control_append_image(path);
|
||||
if (!command_event_disk_control_append_image(path))
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case CMD_EVENT_DISK_EJECT_TOGGLE:
|
||||
{
|
||||
rarch_system_info_t *info = runloop_get_system_info();
|
||||
@ -2757,10 +2775,8 @@ TODO: Add a setting for these tweaks */
|
||||
}
|
||||
break;
|
||||
case CMD_EVENT_UI_COMPANION_TOGGLE:
|
||||
{
|
||||
ui_companion_driver_toggle(true);
|
||||
break;
|
||||
}
|
||||
ui_companion_driver_toggle(true);
|
||||
break;
|
||||
case CMD_EVENT_GAME_FOCUS_TOGGLE:
|
||||
{
|
||||
static bool game_focus_state = false;
|
||||
|
@ -284,6 +284,7 @@ enum menu_driver_enum
|
||||
MENU_XUI,
|
||||
MENU_MATERIALUI,
|
||||
MENU_XMB,
|
||||
MENU_STRIPES,
|
||||
MENU_NUKLEAR,
|
||||
MENU_NULL
|
||||
};
|
||||
@ -1026,6 +1027,8 @@ const char *config_get_default_menu(void)
|
||||
return "glui";
|
||||
case MENU_XMB:
|
||||
return "xmb";
|
||||
case MENU_STRIPES:
|
||||
return "stripes";
|
||||
case MENU_NUKLEAR:
|
||||
return "nuklear";
|
||||
case MENU_NULL:
|
||||
|
@ -130,6 +130,10 @@ bool fill_pathname_application_data(char *s, size_t len)
|
||||
const char* xmb_theme_ident(void);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRIPES
|
||||
const char* stripes_theme_ident(void);
|
||||
#endif
|
||||
|
||||
void fill_pathname_application_special(char *s,
|
||||
size_t len, enum application_special_type type)
|
||||
{
|
||||
|
@ -468,6 +468,11 @@ static int frontend_psp_parse_drive_list(void *data, bool load_content)
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR),
|
||||
enum_idx,
|
||||
FILE_TYPE_DIRECTORY, 0, 0);
|
||||
menu_entries_append_enum(list,
|
||||
"imc0:/",
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR),
|
||||
enum_idx,
|
||||
FILE_TYPE_DIRECTORY, 0, 0);
|
||||
#else
|
||||
menu_entries_append_enum(list,
|
||||
"ms0:/",
|
||||
|
@ -104,6 +104,16 @@
|
||||
.height = _video.height,
|
||||
.fullscreen = _video.fullscreen,
|
||||
};
|
||||
|
||||
if (mode.width == 0 || mode.height == 0)
|
||||
{
|
||||
// 0 indicates full screen, so we'll use the view's dimensions, which should already be full screen
|
||||
// If this turns out to be the wrong assumption, we can use NSScreen to query the dimensions
|
||||
CGSize size = view.frame.size;
|
||||
mode.width = (unsigned int)size.width;
|
||||
mode.height = (unsigned int)size.height;
|
||||
}
|
||||
|
||||
[apple_platform setVideoMode:mode];
|
||||
|
||||
*input = NULL;
|
||||
@ -213,6 +223,8 @@
|
||||
|
||||
- (void)_updateViewport:(CGSize)size
|
||||
{
|
||||
RARCH_LOG("[Metal]: _updateViewport size %.0fx%.0f\n", size.width, size.height);
|
||||
|
||||
_viewport->full_width = (unsigned int)size.width;
|
||||
_viewport->full_height = (unsigned int)size.height;
|
||||
video_driver_set_size(&_viewport->full_width, &_viewport->full_height);
|
||||
|
16
gfx/drivers/gl_shaders/pipeline_snow.glsl.vert.h
Normal file
16
gfx/drivers/gl_shaders/pipeline_snow.glsl.vert.h
Normal file
@ -0,0 +1,16 @@
|
||||
#include "shaders_common.h"
|
||||
|
||||
/* Need to duplicate these to work around broken stuff on Android.
|
||||
* Must enforce alpha = 1.0 or 32-bit games can potentially go black. */
|
||||
static const char *stock_vertex_xmb_snow = GLSL(
|
||||
attribute vec2 TexCoord;
|
||||
attribute vec2 VertexCoord;
|
||||
attribute vec4 Color;
|
||||
uniform mat4 MVPMatrix;
|
||||
varying vec2 tex_coord;
|
||||
|
||||
void main() {
|
||||
gl_Position = MVPMatrix * vec4(VertexCoord, 0.0, 1.0);
|
||||
tex_coord = TexCoord;
|
||||
}
|
||||
);
|
@ -2,7 +2,7 @@
|
||||
|
||||
/* Need to duplicate these to work around broken stuff on Android.
|
||||
* Must enforce alpha = 1.0 or 32-bit games can potentially go black. */
|
||||
static const char *stock_vertex_xmb_snow_modern = GLSL(
|
||||
static const char *stock_vertex_xmb_snow_core = GLSL(
|
||||
in vec2 TexCoord;
|
||||
in vec2 VertexCoord;
|
||||
in vec4 Color;
|
@ -129,18 +129,13 @@ static void caca_render_msg(video_frame_info_t *video_info,
|
||||
caca_refresh_display(*font->caca->caca_display);
|
||||
}
|
||||
|
||||
static void caca_font_bind_block(void* data, void* userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t caca_font = {
|
||||
caca_init_font,
|
||||
caca_render_free_font,
|
||||
caca_render_msg,
|
||||
"caca font",
|
||||
caca_font_get_glyph, /* get_glyph */
|
||||
caca_font_bind_block, /* bind_block */
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
caca_get_message_width /* get_message_width */
|
||||
};
|
||||
|
@ -447,12 +447,6 @@ static const struct font_glyph* ctr_font_get_glyph(
|
||||
return font->font_driver->get_glyph((void*)font->font_driver, code);
|
||||
}
|
||||
|
||||
static void ctr_font_bind_block(void* data, void* userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
|
||||
font_renderer_t ctr_font =
|
||||
{
|
||||
ctr_font_init_font,
|
||||
@ -460,7 +454,7 @@ font_renderer_t ctr_font =
|
||||
ctr_font_render_msg,
|
||||
"ctrfont",
|
||||
ctr_font_get_glyph,
|
||||
ctr_font_bind_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush_block */
|
||||
ctr_font_get_message_width,
|
||||
};
|
||||
|
@ -362,18 +362,13 @@ static const struct font_glyph* d3d10_font_get_glyph(void *data, uint32_t code)
|
||||
return font->font_driver->get_glyph((void*)font->font_driver, code);
|
||||
}
|
||||
|
||||
static void d3d10_font_bind_block(void* data, void *userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t d3d10_font = {
|
||||
d3d10_font_init_font,
|
||||
d3d10_font_free_font,
|
||||
d3d10_font_render_msg,
|
||||
"d3d10font",
|
||||
d3d10_font_get_glyph,
|
||||
d3d10_font_bind_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
d3d10_font_get_message_width,
|
||||
};
|
||||
|
@ -359,18 +359,13 @@ static const struct font_glyph* d3d11_font_get_glyph(void *data, uint32_t code)
|
||||
return font->font_driver->get_glyph((void*)font->font_driver, code);
|
||||
}
|
||||
|
||||
static void d3d11_font_bind_block(void* data, void *userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t d3d11_font = {
|
||||
d3d11_font_init_font,
|
||||
d3d11_font_free_font,
|
||||
d3d11_font_render_msg,
|
||||
"d3d11font",
|
||||
d3d11_font_get_glyph,
|
||||
d3d11_font_bind_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
d3d11_font_get_message_width,
|
||||
};
|
||||
|
@ -376,18 +376,13 @@ static const struct font_glyph* d3d12_font_get_glyph(
|
||||
return font->font_driver->get_glyph((void*)font->font_driver, code);
|
||||
}
|
||||
|
||||
static void d3d12_font_bind_block(void* data, void* userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t d3d12_font = {
|
||||
d3d12_font_init_font,
|
||||
d3d12_font_free_font,
|
||||
d3d12_font_render_msg,
|
||||
"d3d12font",
|
||||
d3d12_font_get_glyph,
|
||||
d3d12_font_bind_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
d3d12_font_get_message_width,
|
||||
};
|
||||
|
@ -529,7 +529,7 @@ static const struct font_glyph *metal_raster_font_get_glyph(
|
||||
}
|
||||
|
||||
static void metal_raster_font_flush_block(unsigned width, unsigned height,
|
||||
void *data, video_frame_info_t *video_info)
|
||||
void *data, video_frame_info_t *video_info)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
@ -127,24 +127,13 @@ static void sixel_render_msg(video_frame_info_t *video_info,
|
||||
/* FIXME: add text drawing support */
|
||||
}
|
||||
|
||||
static void sixel_font_flush_block(unsigned width, unsigned height,
|
||||
void* data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static void sixel_font_bind_block(void* data, void* userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t sixel_font = {
|
||||
sixel_init_font,
|
||||
sixel_render_free_font,
|
||||
sixel_render_msg,
|
||||
"sixel font",
|
||||
sixel_font_get_glyph, /* get_glyph */
|
||||
sixel_font_bind_block, /* bind_block */
|
||||
sixel_font_flush_block, /* flush */
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
sixel_get_message_width /* get_message_width */
|
||||
};
|
||||
|
@ -126,18 +126,13 @@ static void vga_render_msg(video_frame_info_t *video_info,
|
||||
}
|
||||
}
|
||||
|
||||
static void vga_font_bind_block(void* data, void* userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t vga_font = {
|
||||
vga_init_font,
|
||||
vga_render_free_font,
|
||||
vga_render_msg,
|
||||
"vga font",
|
||||
vga_font_get_glyph, /* get_glyph */
|
||||
vga_font_bind_block, /* bind_block */
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
vga_get_message_width /* get_message_width */
|
||||
};
|
||||
|
@ -347,18 +347,13 @@ static const struct font_glyph *vita2d_font_get_glyph(
|
||||
return font->font_driver->get_glyph((void*)font->font_driver, code);
|
||||
}
|
||||
|
||||
static void vita2d_font_bind_block(void *data, void *userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t vita2d_vita_font = {
|
||||
vita2d_font_init_font,
|
||||
vita2d_font_free_font,
|
||||
vita2d_font_render_msg,
|
||||
"vita2dfont",
|
||||
vita2d_font_get_glyph,
|
||||
vita2d_font_bind_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
vita2d_font_get_message_width,
|
||||
};
|
||||
|
@ -436,24 +436,13 @@ static const struct font_glyph *vulkan_raster_font_get_glyph(
|
||||
return glyph;
|
||||
}
|
||||
|
||||
static void vulkan_raster_font_flush_block(unsigned width, unsigned height,
|
||||
void *data, video_frame_info_t *video_info)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static void vulkan_raster_font_bind_block(void *data, void *userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
font_renderer_t vulkan_raster_font = {
|
||||
vulkan_raster_font_init_font,
|
||||
vulkan_raster_font_free_font,
|
||||
vulkan_raster_font_render_msg,
|
||||
"Vulkan raster",
|
||||
vulkan_raster_font_get_glyph,
|
||||
vulkan_raster_font_bind_block,
|
||||
vulkan_raster_font_flush_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush_block */
|
||||
vulkan_get_message_width
|
||||
};
|
||||
|
@ -377,12 +377,6 @@ static const struct font_glyph* wiiu_font_get_glyph(
|
||||
return font->font_driver->get_glyph((void*)font->font_driver, code);
|
||||
}
|
||||
|
||||
static void wiiu_font_bind_block(void* data, void* userdata)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
|
||||
font_renderer_t wiiu_font =
|
||||
{
|
||||
wiiu_font_init_font,
|
||||
@ -390,7 +384,7 @@ font_renderer_t wiiu_font =
|
||||
wiiu_font_render_msg,
|
||||
"wiiufont",
|
||||
wiiu_font_get_glyph,
|
||||
wiiu_font_bind_block,
|
||||
NULL, /* bind_block */
|
||||
NULL, /* flush */
|
||||
wiiu_font_get_message_width,
|
||||
};
|
||||
|
@ -125,9 +125,10 @@ static const char *glsl_prefixes[] = {
|
||||
#include "../drivers/gl_shaders/core_pipeline_snowflake.glsl.frag.h"
|
||||
#include "../drivers/gl_shaders/legacy_pipeline_xmb_ribbon_simple.glsl.vert.h"
|
||||
#include "../drivers/gl_shaders/modern_pipeline_xmb_ribbon_simple.glsl.vert.h"
|
||||
#include "../drivers/gl_shaders/modern_pipeline_snow.glsl.vert.h"
|
||||
#include "../drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.frag.h"
|
||||
#include "../drivers/gl_shaders/pipeline_snow.glsl.frag.h"
|
||||
#include "../drivers/gl_shaders/pipeline_snow.glsl.vert.h"
|
||||
#include "../drivers/gl_shaders/pipeline_snow_core.glsl.vert.h"
|
||||
#include "../drivers/gl_shaders/pipeline_snow_simple.glsl.frag.h"
|
||||
#include "../drivers/gl_shaders/legacy_pipeline_snow.glsl.vert.h"
|
||||
#include "../drivers/gl_shaders/legacy_pipeline_xmb_ribbon.glsl.vert.h"
|
||||
@ -843,10 +844,10 @@ static void gl_glsl_init_menu_shaders(void *data)
|
||||
&glsl->uniforms[VIDEO_SHADER_MENU_2]);
|
||||
|
||||
#if defined(HAVE_OPENGLES)
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow_modern;
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow;
|
||||
shader_prog_info.fragment = stock_fragment_xmb_simple_snow;
|
||||
#else
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_core : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.fragment = glsl_core ? stock_fragment_xmb_simple_snow_core : stock_fragment_xmb_simple_snow;
|
||||
#endif
|
||||
|
||||
@ -860,10 +861,10 @@ static void gl_glsl_init_menu_shaders(void *data)
|
||||
&glsl->uniforms[VIDEO_SHADER_MENU_3]);
|
||||
|
||||
#if defined(HAVE_OPENGLES)
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow_modern;
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow;
|
||||
shader_prog_info.fragment = stock_fragment_xmb_snow;
|
||||
#else
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_core : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.fragment = glsl_core ? stock_fragment_xmb_snow_core : stock_fragment_xmb_snow;
|
||||
#endif
|
||||
|
||||
@ -877,10 +878,10 @@ static void gl_glsl_init_menu_shaders(void *data)
|
||||
&glsl->uniforms[VIDEO_SHADER_MENU_4]);
|
||||
|
||||
#if defined(HAVE_OPENGLES)
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow_modern;
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow;
|
||||
shader_prog_info.fragment = stock_fragment_xmb_bokeh;
|
||||
#else
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_core : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.fragment = glsl_core ? stock_fragment_xmb_bokeh_core : stock_fragment_xmb_bokeh;
|
||||
#endif
|
||||
|
||||
@ -894,10 +895,10 @@ static void gl_glsl_init_menu_shaders(void *data)
|
||||
&glsl->uniforms[VIDEO_SHADER_MENU_5]);
|
||||
|
||||
#if defined(HAVE_OPENGLES)
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow_modern;
|
||||
shader_prog_info.vertex = stock_vertex_xmb_snow;
|
||||
shader_prog_info.fragment = stock_fragment_xmb_snowflake;
|
||||
#else
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_core : stock_vertex_xmb_snow_legacy;
|
||||
shader_prog_info.fragment = glsl_core ? stock_fragment_xmb_snowflake_core : stock_fragment_xmb_snowflake;
|
||||
#endif
|
||||
|
||||
|
@ -1240,6 +1240,10 @@ MENU
|
||||
#include "../menu/drivers/xmb.c"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRIPES
|
||||
#include "../menu/drivers/stripes.c"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MATERIALUI
|
||||
#include "../menu/drivers/materialui.c"
|
||||
#endif
|
||||
|
@ -68,6 +68,9 @@ enum {
|
||||
/* Use this to enable/disable using the touch screen as mouse */
|
||||
#define ENABLE_TOUCH_SCREEN_MOUSE 1
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float x;
|
||||
|
@ -33,6 +33,9 @@
|
||||
|
||||
#include "../drivers_keyboard/keyboard_event_apple.h"
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
/* Forward declarations */
|
||||
float get_backing_scale_factor(void);
|
||||
|
||||
|
@ -29,6 +29,9 @@
|
||||
|
||||
#define MAX_PADS 1
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct ctr_input
|
||||
{
|
||||
bool blocked;
|
||||
|
@ -328,8 +328,10 @@ static bool dinput_is_pressed(struct dinput_input *di,
|
||||
{
|
||||
const struct retro_keybind *bind = &binds[id];
|
||||
|
||||
if (!di->blocked && (bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key))
|
||||
return true;
|
||||
if ((bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key))
|
||||
if ((id == RARCH_GAME_FOCUS_TOGGLE) || !di->blocked)
|
||||
return true;
|
||||
|
||||
if (binds && binds[id].valid)
|
||||
{
|
||||
if (dinput_mbutton_pressed(di, port, bind->mbutton))
|
||||
|
@ -21,6 +21,9 @@
|
||||
#include "../input_keymaps.h"
|
||||
#include "../drivers_keyboard/keyboard_event_dos.h"
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct dos_input
|
||||
{
|
||||
const input_device_driver_t *joypad;
|
||||
|
@ -31,6 +31,9 @@
|
||||
#define MAX_PADS 4
|
||||
#endif
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct gx_input
|
||||
{
|
||||
bool blocked;
|
||||
|
@ -32,6 +32,9 @@
|
||||
#include "../input_keymaps.h"
|
||||
#include "../input_driver.h"
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct linuxraw_input
|
||||
{
|
||||
bool blocked;
|
||||
|
@ -40,6 +40,9 @@
|
||||
#define MAX_PADS 7
|
||||
#endif
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float x;
|
||||
|
@ -43,6 +43,9 @@
|
||||
|
||||
#include "../input_driver.h"
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct psp_input
|
||||
{
|
||||
bool blocked;
|
||||
|
@ -736,12 +736,14 @@ static bool qnx_is_pressed(qnx_input_t *qnx,
|
||||
unsigned port, unsigned id)
|
||||
{
|
||||
const struct retro_keybind *bind = &binds[id];
|
||||
int key = bind->key;
|
||||
|
||||
if (id >= RARCH_BIND_LIST_END)
|
||||
return false;
|
||||
|
||||
if (!qnx->blocked && qnx_keyboard_pressed(qnx, bind->key))
|
||||
return true;
|
||||
if (qnx_keyboard_pressed(qnx, key))
|
||||
if ((id == RARCH_GAME_FOCUS_TOGGLE) || !qnx->blocked)
|
||||
return true;
|
||||
if (binds && binds[id].valid && input_joypad_pressed(qnx->joypad, joypad_info, port, binds, id))
|
||||
return true;
|
||||
|
||||
|
@ -479,9 +479,9 @@ static bool rwebinput_is_pressed(rwebinput_input_t *rwebinput,
|
||||
const struct retro_keybind *bind = &binds[id];
|
||||
int key = bind->key;
|
||||
|
||||
if (!rwebinput->blocked && (bind->key < RETROK_LAST) &&
|
||||
rwebinput_key_pressed(rwebinput, key))
|
||||
return true;
|
||||
if ((key < RETROK_LAST) && rwebinput_key_pressed(rwebinput, key))
|
||||
if ((id == RARCH_GAME_FOCUS_TOGGLE) || !rwebinput->blocked)
|
||||
return true;
|
||||
|
||||
if (bind->valid)
|
||||
{
|
||||
|
@ -31,6 +31,9 @@
|
||||
#include "../../verbosity.h"
|
||||
#include "../../tasks/tasks_internal.h"
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct sdl_input
|
||||
{
|
||||
bool blocked;
|
||||
|
@ -13,6 +13,9 @@
|
||||
|
||||
#define MAX_PADS 10
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct switch_input
|
||||
{
|
||||
const input_device_driver_t *joypad;
|
||||
|
@ -900,7 +900,8 @@ static bool udev_is_pressed(udev_input_t *udev,
|
||||
const struct retro_keybind *bind = &binds[id];
|
||||
|
||||
if ( (bind->key < RETROK_LAST) && udev_keyboard_pressed(udev, bind->key) )
|
||||
return true;
|
||||
if ((id == RARCH_GAME_FOCUS_TOGGLE) || !udev->blocked)
|
||||
return true;
|
||||
|
||||
if (binds && binds[id].valid)
|
||||
{
|
||||
|
@ -47,6 +47,9 @@
|
||||
|
||||
#include "../../verbosity.h"
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
/* Forward declaration */
|
||||
|
||||
void flush_wayland_fd(void *data);
|
||||
|
@ -403,8 +403,9 @@ static bool winraw_is_pressed(winraw_input_t *wr,
|
||||
{
|
||||
const struct retro_keybind *bind = &binds[id];
|
||||
|
||||
if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && winraw_keyboard_pressed(wr, bind->key))
|
||||
return true;
|
||||
if ((bind->key < RETROK_LAST) && winraw_keyboard_pressed(wr, bind->key))
|
||||
if ((id == RARCH_GAME_FOCUS_TOGGLE) || !wr->kbd_mapp_block)
|
||||
return true;
|
||||
if (binds && binds[id].valid)
|
||||
{
|
||||
if (winraw_mbutton_pressed(wr, port, bind->mbutton))
|
||||
|
@ -131,8 +131,9 @@ static bool x_is_pressed(x11_input_t *x11,
|
||||
{
|
||||
const struct retro_keybind *bind = &binds[id];
|
||||
|
||||
if ( (bind->key < RETROK_LAST) && x_keyboard_pressed(x11, bind->key) )
|
||||
return true;
|
||||
if ((bind->key < RETROK_LAST) && x_keyboard_pressed(x11, bind->key) )
|
||||
if ((id == RARCH_GAME_FOCUS_TOGGLE) || !x11->blocked)
|
||||
return true;
|
||||
|
||||
if (binds && binds[id].valid)
|
||||
{
|
||||
|
@ -32,6 +32,9 @@
|
||||
|
||||
#define MAX_PADS 4
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
typedef struct xdk_input
|
||||
{
|
||||
bool blocked;
|
||||
|
@ -27,6 +27,9 @@
|
||||
|
||||
#define MAX_PADS 4
|
||||
|
||||
/* TODO/FIXME -
|
||||
* fix game focus toggle */
|
||||
|
||||
static uint64_t state[MAX_PADS];
|
||||
|
||||
static void xenon360_input_poll(void *data)
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include <psp2/ctrl.h>
|
||||
#include <psp2/touch.h>
|
||||
#define PSP_MAX_PADS 4
|
||||
static int psp2_model;
|
||||
static SceCtrlPortInfo old_ctrl_info, curr_ctrl_info;
|
||||
static SceCtrlActuator actuators[PSP_MAX_PADS] = {0};
|
||||
|
||||
@ -64,7 +63,7 @@ extern uint64_t lifecycle_state;
|
||||
static const char *psp_joypad_name(unsigned pad)
|
||||
{
|
||||
#ifdef VITA
|
||||
if (psp2_model != SCE_KERNEL_MODEL_VITATV)
|
||||
if (!sceCtrlIsMultiControllerSupported())
|
||||
return "Vita Controller";
|
||||
|
||||
switch (curr_ctrl_info.port[pad + 1])
|
||||
@ -89,8 +88,7 @@ static bool psp_joypad_init(void *data)
|
||||
(void)data;
|
||||
|
||||
#if defined(VITA)
|
||||
psp2_model = sceKernelGetModelForCDialog();
|
||||
if (psp2_model != SCE_KERNEL_MODEL_VITATV)
|
||||
if (!sceCtrlIsMultiControllerSupported())
|
||||
{
|
||||
sceTouchSetSamplingState(SCE_TOUCH_PORT_BACK, SCE_TOUCH_SAMPLING_STATE_START);
|
||||
sceTouchSetSamplingState(SCE_TOUCH_PORT_FRONT, SCE_TOUCH_SAMPLING_STATE_START);
|
||||
@ -192,7 +190,7 @@ static void psp_joypad_poll(void)
|
||||
#endif
|
||||
|
||||
#ifdef VITA
|
||||
if (psp2_model != SCE_KERNEL_MODEL_VITATV)
|
||||
if (!sceCtrlIsMultiControllerSupported())
|
||||
players_count = 1;
|
||||
else
|
||||
{
|
||||
@ -237,7 +235,7 @@ static void psp_joypad_poll(void)
|
||||
SceCtrlData state_tmp;
|
||||
unsigned i = player;
|
||||
#if defined(VITA)
|
||||
unsigned p = (psp2_model == SCE_KERNEL_MODEL_VITATV) ? player + 1 : player;
|
||||
unsigned p = (sceCtrlIsMultiControllerSupported()) ? player + 1 : player;
|
||||
if (curr_ctrl_info.port[p] == SCE_CTRL_TYPE_UNPAIRED)
|
||||
continue;
|
||||
#elif defined(SN_TARGET_PSP2)
|
||||
@ -261,7 +259,7 @@ static void psp_joypad_poll(void)
|
||||
continue;
|
||||
#endif
|
||||
#if defined(VITA)
|
||||
if (psp2_model == SCE_KERNEL_MODEL_VITA
|
||||
if (!sceCtrlIsMultiControllerSupported()
|
||||
&& settings->bools.input_backtouch_enable)
|
||||
{
|
||||
unsigned i;
|
||||
@ -332,7 +330,7 @@ static bool psp_joypad_rumble(unsigned pad,
|
||||
enum retro_rumble_effect effect, uint16_t strength)
|
||||
{
|
||||
#ifdef VITA
|
||||
if (psp2_model != SCE_KERNEL_MODEL_VITATV)
|
||||
if (!sceCtrlIsMultiControllerSupported())
|
||||
return false;
|
||||
|
||||
switch (effect)
|
||||
|
@ -124,7 +124,10 @@ void input_mapper_poll(input_mapper_t *handle)
|
||||
if (remap_valid)
|
||||
{
|
||||
unsigned current_button_value = BIT256_GET(current_input, j);
|
||||
|
||||
#ifdef HAVE_OVERLAY
|
||||
if (poll_overlay && i == 0)
|
||||
current_button_value |= input_overlay_key_pressed(overlay_ptr, j);
|
||||
#endif
|
||||
if ((current_button_value == 1) && (j != remap_button))
|
||||
{
|
||||
MAPPER_SET_KEY (handle,
|
||||
|
@ -3479,7 +3479,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_GEOMETRY,
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_LAST_TAB,
|
||||
"最後のコンテンツブラウザーのタブを記憶:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME,
|
||||
"テーマ")
|
||||
"テーマ:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_SYSTEM_DEFAULT,
|
||||
"<システムデフォルト>")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_DARK,
|
||||
@ -3543,7 +3543,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS,
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDE,
|
||||
"隠す")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR,
|
||||
"ハイライトカラー")
|
||||
"ハイライトカラー:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CHOOSE,
|
||||
"選択(&C)...")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SELECT_COLOR,
|
||||
@ -3561,7 +3561,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED,
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST,
|
||||
"ファイルは存在しません。")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST,
|
||||
"ロードしたコアを最初に優先する")
|
||||
"ロードしたコアを最初に優先する:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ZOOM,
|
||||
"ズーム")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW,
|
||||
"表示")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_ICONS,
|
||||
"アイコン")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST,
|
||||
"一覧")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS,
|
||||
"オーバーライド")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS,
|
||||
@ -3622,3 +3630,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE,
|
||||
"パフォーマンス維持モード")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT,
|
||||
"mpv対応")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_PROGRESS,
|
||||
"進行状況:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_LIST_MAX_COUNT,
|
||||
"「すべてのプレイリスト」一覧の最大個数:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_GRID_MAX_COUNT,
|
||||
"「すべてのプレイリスト」アイコンの最大個数:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SHOW_HIDDEN_FILES,
|
||||
"隠しファイルとフォルダを表示:")
|
||||
|
@ -3739,7 +3739,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_GEOMETRY,
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_LAST_TAB,
|
||||
"Remember last content browser tab:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME,
|
||||
"Theme")
|
||||
"Theme:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_SYSTEM_DEFAULT,
|
||||
"<System Default>")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_DARK,
|
||||
@ -3811,7 +3811,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS,
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDE,
|
||||
"Hide")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR,
|
||||
"Highlight Color")
|
||||
"Highlight color:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CHOOSE,
|
||||
"&Choose...")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SELECT_COLOR,
|
||||
@ -3829,7 +3829,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED,
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST,
|
||||
"File does not exist.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST,
|
||||
"Suggest loaded core first")
|
||||
"Suggest loaded core first:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ZOOM,
|
||||
"Zoom")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW,
|
||||
"View")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_ICONS,
|
||||
"Icons")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST,
|
||||
"List")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS,
|
||||
"Overrides")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS,
|
||||
@ -4132,3 +4140,11 @@ MSG_HASH(MSG_CHEAT_COPY_AFTER_SUCCESS,
|
||||
"Cheat copied after this one.")
|
||||
MSG_HASH(MSG_CHEAT_DELETE_SUCCESS,
|
||||
"Cheat deleted.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_PROGRESS,
|
||||
"Progress:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_LIST_MAX_COUNT,
|
||||
"\"All Playlists\" max list entries:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_GRID_MAX_COUNT,
|
||||
"\"All Playlists\" max grid entries:")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SHOW_HIDDEN_FILES,
|
||||
"Show hidden files and folders:")
|
||||
|
@ -68,6 +68,84 @@ struct config_include_list
|
||||
static config_file_t *config_file_new_internal(
|
||||
const char *path, unsigned depth);
|
||||
|
||||
static int config_sort_compare_func(struct config_entry_list *a,
|
||||
struct config_entry_list *b)
|
||||
{
|
||||
const char *a_key = a ? a->key : NULL;
|
||||
const char *b_key = b ? b->key : NULL;
|
||||
|
||||
if (!a_key || !b_key)
|
||||
return 0;
|
||||
|
||||
return strcasecmp(a_key, b_key);
|
||||
}
|
||||
|
||||
/* https://stackoverflow.com/questions/7685/merge-sort-a-linked-list */
|
||||
static struct config_entry_list* merge_sort_linked_list(struct config_entry_list *list, int (*compare)(struct config_entry_list *one,struct config_entry_list *two))
|
||||
{
|
||||
struct config_entry_list
|
||||
*right = list,
|
||||
*temp = list,
|
||||
*last = list,
|
||||
*result = 0,
|
||||
*next = 0,
|
||||
*tail = 0;
|
||||
|
||||
/* Trivial case. */
|
||||
if (!list || !list->next)
|
||||
return list;
|
||||
|
||||
/* Find halfway through the list (by running two pointers, one at twice the speed of the other). */
|
||||
while (temp && temp->next)
|
||||
{
|
||||
last = right;
|
||||
right = right->next;
|
||||
temp = temp->next->next;
|
||||
}
|
||||
|
||||
/* Break the list in two. (prev pointers are broken here, but we fix later) */
|
||||
last->next = 0;
|
||||
|
||||
/* Recurse on the two smaller lists: */
|
||||
list = merge_sort_linked_list(list, compare);
|
||||
right = merge_sort_linked_list(right, compare);
|
||||
|
||||
/* Merge: */
|
||||
while (list || right)
|
||||
{
|
||||
/* Take from empty lists, or compare: */
|
||||
if (!right)
|
||||
{
|
||||
next = list;
|
||||
list = list->next;
|
||||
}
|
||||
else if (!list)
|
||||
{
|
||||
next = right;
|
||||
right = right->next;
|
||||
}
|
||||
else if (compare(list, right) < 0)
|
||||
{
|
||||
next = list;
|
||||
list = list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
next = right;
|
||||
right = right->next;
|
||||
}
|
||||
|
||||
if (!result)
|
||||
result = next;
|
||||
else
|
||||
tail->next = next;
|
||||
|
||||
tail = next;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static char *strip_comment(char *str)
|
||||
{
|
||||
/* Remove everything after comment.
|
||||
@ -920,7 +998,7 @@ void config_file_dump(config_file_t *conf, FILE *file)
|
||||
includes = includes->next;
|
||||
}
|
||||
|
||||
list = (struct config_entry_list*)conf->entries;
|
||||
list = merge_sort_linked_list((struct config_entry_list*)conf->entries, config_sort_compare_func);
|
||||
|
||||
while (list)
|
||||
{
|
||||
|
4469
menu/drivers/stripes.c
Executable file
4469
menu/drivers/stripes.c
Executable file
File diff suppressed because it is too large
Load Diff
@ -4002,8 +4002,6 @@ static void xmb_init_ribbon(xmb_handle_t * xmb)
|
||||
free(ribbon_verts);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void *xmb_init(void **userdata, bool video_is_threaded)
|
||||
{
|
||||
unsigned width, height;
|
||||
|
@ -85,6 +85,9 @@ static const menu_ctx_driver_t *menu_ctx_drivers[] = {
|
||||
#if defined(HAVE_XMB)
|
||||
&menu_ctx_xmb,
|
||||
#endif
|
||||
#if defined(HAVE_STRIPES)
|
||||
&menu_ctx_stripes,
|
||||
#endif
|
||||
#if defined(HAVE_RGUI)
|
||||
&menu_ctx_rgui,
|
||||
#endif
|
||||
@ -743,6 +746,56 @@ void menu_display_draw_quad(
|
||||
menu_disp->blend_end(video_info);
|
||||
}
|
||||
|
||||
void menu_display_draw_polygon(
|
||||
video_frame_info_t *video_info,
|
||||
int x1, int y1,
|
||||
int x2, int y2,
|
||||
int x3, int y3,
|
||||
int x4, int y4,
|
||||
unsigned width, unsigned height,
|
||||
float *color)
|
||||
{
|
||||
menu_display_ctx_draw_t draw;
|
||||
struct video_coords coords;
|
||||
|
||||
float vertex[8];
|
||||
|
||||
vertex[0] = x1 / (float)width;
|
||||
vertex[1] = y1 / (float)height;
|
||||
vertex[2] = x2 / (float)width;
|
||||
vertex[3] = y2 / (float)height;
|
||||
vertex[4] = x3 / (float)width;
|
||||
vertex[5] = y3 / (float)height;
|
||||
vertex[6] = x4 / (float)width;
|
||||
vertex[7] = y4 / (float)height;
|
||||
|
||||
coords.vertices = 4;
|
||||
coords.vertex = &vertex[0];
|
||||
coords.tex_coord = NULL;
|
||||
coords.lut_tex_coord = NULL;
|
||||
coords.color = color;
|
||||
|
||||
if (menu_disp && menu_disp->blend_begin)
|
||||
menu_disp->blend_begin(video_info);
|
||||
|
||||
draw.x = 0;
|
||||
draw.y = 0;
|
||||
draw.width = width;
|
||||
draw.height = height;
|
||||
draw.coords = &coords;
|
||||
draw.matrix_data = NULL;
|
||||
draw.texture = menu_display_white_texture;
|
||||
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
|
||||
draw.pipeline.id = 0;
|
||||
draw.scale_factor = 1.0f;
|
||||
draw.rotation = 0.0f;
|
||||
|
||||
menu_display_draw(&draw, video_info);
|
||||
|
||||
if (menu_disp && menu_disp->blend_end)
|
||||
menu_disp->blend_end(video_info);
|
||||
}
|
||||
|
||||
void menu_display_draw_texture(
|
||||
video_frame_info_t *video_info,
|
||||
int x, int y, unsigned w, unsigned h,
|
||||
|
@ -726,6 +726,14 @@ void menu_display_draw_quad(
|
||||
int x, int y, unsigned w, unsigned h,
|
||||
unsigned width, unsigned height,
|
||||
float *color);
|
||||
void menu_display_draw_polygon(
|
||||
video_frame_info_t *video_info,
|
||||
int x1, int y1,
|
||||
int x2, int y2,
|
||||
int x3, int y3,
|
||||
int x4, int y4,
|
||||
unsigned width, unsigned height,
|
||||
float *color);
|
||||
void menu_display_draw_texture(
|
||||
video_frame_info_t *video_info,
|
||||
int x, int y, unsigned w, unsigned h,
|
||||
@ -817,6 +825,7 @@ extern menu_ctx_driver_t menu_ctx_rgui;
|
||||
extern menu_ctx_driver_t menu_ctx_mui;
|
||||
extern menu_ctx_driver_t menu_ctx_nuklear;
|
||||
extern menu_ctx_driver_t menu_ctx_xmb;
|
||||
extern menu_ctx_driver_t menu_ctx_stripes;
|
||||
extern menu_ctx_driver_t menu_ctx_zarch;
|
||||
extern menu_ctx_driver_t menu_ctx_null;
|
||||
|
||||
|
@ -1891,6 +1891,9 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_TITLE,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SHOW_HIDDEN_FILES,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_LIST_MAX_COUNT,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_GRID_MAX_COUNT,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MENU_DOCK_CONTENT_BROWSER,
|
||||
MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART,
|
||||
MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT,
|
||||
@ -1927,6 +1930,11 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_VALUE_QT_FILE_IS_EMPTY,
|
||||
MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED,
|
||||
MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST,
|
||||
MENU_ENUM_LABEL_VALUE_QT_ZOOM,
|
||||
MENU_ENUM_LABEL_VALUE_QT_VIEW,
|
||||
MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_ICONS,
|
||||
MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST,
|
||||
MENU_ENUM_LABEL_VALUE_QT_PROGRESS,
|
||||
|
||||
MENU_LABEL(MIDI_INPUT),
|
||||
MENU_LABEL(MIDI_OUTPUT),
|
||||
|
@ -30,7 +30,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.7.2</string>
|
||||
<string>1.7.3</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
|
@ -541,7 +541,7 @@
|
||||
"-DHAVE_MATERIALUI",
|
||||
"-DHAVE_HID",
|
||||
"-DHAVE_XMB",
|
||||
"-DHAVE_SEGA",
|
||||
"-DHAVE_STRIPES",
|
||||
"-DHAVE_SHADERPIPELINE",
|
||||
"-DHAVE_MMAP",
|
||||
"-DHAVE_LIBRETRODB",
|
||||
@ -604,7 +604,7 @@
|
||||
"-DHAVE_MATERIALUI",
|
||||
"-DHAVE_HID",
|
||||
"-DHAVE_XMB",
|
||||
"-DHAVE_SEGA",
|
||||
"-DHAVE_STRIPES",
|
||||
"-DHAVE_SHADERPIPELINE",
|
||||
"-DHAVE_MMAP",
|
||||
"-DHAVE_LIBRETRODB",
|
||||
|
@ -55,6 +55,14 @@
|
||||
0538875720DE11D300769232 /* retro_assert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_assert.h; sourceTree = "<group>"; };
|
||||
0538875820DE11D300769232 /* retro_endianness.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_endianness.h; sourceTree = "<group>"; };
|
||||
0538875920DE11D300769232 /* libretro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libretro.h; sourceTree = "<group>"; };
|
||||
0548E2B220F976E10094A083 /* driver.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = driver.c; path = ../../driver.c; sourceTree = "<group>"; };
|
||||
0548E2B320F976E10094A083 /* dynamic.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = dynamic.c; path = ../../dynamic.c; sourceTree = "<group>"; };
|
||||
0548E2B420F976E10094A083 /* dynamic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dynamic.h; path = ../../dynamic.h; sourceTree = "<group>"; };
|
||||
0548E2B520F976E20094A083 /* driver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../../driver.h; sourceTree = "<group>"; };
|
||||
0548E2B620F977060094A083 /* playlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = playlist.h; path = ../../playlist.h; sourceTree = "<group>"; };
|
||||
0548E2B720F977060094A083 /* performance_counters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = performance_counters.h; path = ../../performance_counters.h; sourceTree = "<group>"; };
|
||||
0548E2B820F977060094A083 /* performance_counters.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = performance_counters.c; path = ../../performance_counters.c; sourceTree = "<group>"; };
|
||||
0548E2B920F977060094A083 /* playlist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = playlist.c; path = ../../playlist.c; sourceTree = "<group>"; };
|
||||
055312AB20DE130A00C4D7F4 /* gl_capabilities.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gl_capabilities.c; sourceTree = "<group>"; };
|
||||
055312AD20DE130A00C4D7F4 /* scaler_int.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = scaler_int.c; sourceTree = "<group>"; };
|
||||
055312AE20DE130A00C4D7F4 /* pixconv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = pixconv.c; sourceTree = "<group>"; };
|
||||
@ -1070,8 +1078,6 @@
|
||||
05BF821320ED69A500D95B19 /* core */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
05B5F91120ED6AAE009C521F /* retroarch.c */,
|
||||
05B5F91220ED6AAF009C521F /* retroarch.h */,
|
||||
05B5F90F20ED6A03009C521F /* command.c */,
|
||||
05BF821720ED69D100D95B19 /* command.h */,
|
||||
05BF821420ED69D100D95B19 /* config.def.h */,
|
||||
@ -1085,6 +1091,16 @@
|
||||
05BF821B20ED69D100D95B19 /* core_info.h */,
|
||||
05B5F90E20ED6A03009C521F /* core_type.h */,
|
||||
05BF821920ED69D100D95B19 /* core.h */,
|
||||
0548E2B220F976E10094A083 /* driver.c */,
|
||||
0548E2B520F976E20094A083 /* driver.h */,
|
||||
0548E2B320F976E10094A083 /* dynamic.c */,
|
||||
0548E2B420F976E10094A083 /* dynamic.h */,
|
||||
0548E2B820F977060094A083 /* performance_counters.c */,
|
||||
0548E2B720F977060094A083 /* performance_counters.h */,
|
||||
0548E2B920F977060094A083 /* playlist.c */,
|
||||
0548E2B620F977060094A083 /* playlist.h */,
|
||||
05B5F91120ED6AAE009C521F /* retroarch.c */,
|
||||
05B5F91220ED6AAF009C521F /* retroarch.h */,
|
||||
);
|
||||
name = core;
|
||||
sourceTree = "<group>";
|
||||
|
@ -278,14 +278,16 @@ if [ "$HAVE_QT" != 'no' ] && [ "$MOC_PATH" != 'none' ]; then
|
||||
check_pkgconf QT5CORE Qt5Core 5.2
|
||||
check_pkgconf QT5GUI Qt5Gui 5.2
|
||||
check_pkgconf QT5WIDGETS Qt5Widgets 5.2
|
||||
check_pkgconf QT5CONCURRENT Qt5Concurrent 5.2
|
||||
#check_pkgconf QT5WEBENGINE Qt5WebEngine 5.4
|
||||
|
||||
check_val '' QT5CORE -lQt5Core QT5CORE
|
||||
check_val '' QT5GUI -lQt5Gui QT5GUI
|
||||
check_val '' QT5WIDGETS -lQt5Widgets QT5WIDGETS
|
||||
check_val '' QT5CONCURRENT -lQt5Widgets QT5CONCURRENT
|
||||
#check_val '' QT5WEBENGINE -lQt5WebEngine QT5WEBENGINE
|
||||
|
||||
if [ "$HAVE_QT5CORE" = "no" ] || [ "$HAVE_QT5GUI" = "no" ] || [ "$HAVE_QT5WIDGETS" = "no" ]; then
|
||||
if [ "$HAVE_QT5CORE" = "no" ] || [ "$HAVE_QT5GUI" = "no" ] || [ "$HAVE_QT5WIDGETS" = "no" ] || [ "$HAVE_QT5CONCURRENT" = "no" ]; then
|
||||
die : 'Notice: Not building Qt support, required libraries were not found.'
|
||||
HAVE_QT=no
|
||||
else
|
||||
@ -510,6 +512,7 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH"
|
||||
if [ "$HAVE_RGUI" = 'no' ]; then
|
||||
HAVE_MATERIALUI=no
|
||||
HAVE_XMB=no
|
||||
HAVE_STRIPES=no
|
||||
HAVE_ZARCH=no
|
||||
die : 'Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled.'
|
||||
elif [ "$HAVE_OPENGL" = 'no' ] && [ "$HAVE_OPENGLES" = 'no' ] && [ "$HAVE_VULKAN" = 'no' ]; then
|
||||
@ -522,6 +525,7 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH"
|
||||
else
|
||||
HAVE_MATERIALUI=no
|
||||
HAVE_XMB=no
|
||||
HAVE_STRIPES=no
|
||||
HAVE_ZARCH=no
|
||||
die : 'Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled.'
|
||||
fi
|
||||
|
@ -10,6 +10,7 @@ HAVE_LIBRETRODB=yes # Libretrodb support
|
||||
HAVE_RGUI=yes # RGUI menu
|
||||
HAVE_MATERIALUI=auto # MaterialUI menu
|
||||
HAVE_XMB=auto # XMB menu
|
||||
HAVE_STRIPES=no # Stripes menu
|
||||
HAVE_ZARCH=no # Zarch menu
|
||||
HAVE_NUKLEAR=no # Nuklear menu
|
||||
HAVE_RUNAHEAD=yes # Runahead support
|
||||
|
@ -80,7 +80,11 @@ char* get_temp_directory_alloc(void)
|
||||
return path;
|
||||
#endif
|
||||
#else
|
||||
char *path = strcpy_alloc_force(getenv("TMPDIR"));
|
||||
char *path = "/tmp";
|
||||
if (getenv("TMPDIR"))
|
||||
path = getenv("TMPDIR");
|
||||
|
||||
path = strcpy_alloc_force(path);
|
||||
return path;
|
||||
#endif
|
||||
}
|
||||
|
248
ui/drivers/qt/flowlayout.cpp
Normal file
248
ui/drivers/qt/flowlayout.cpp
Normal file
@ -0,0 +1,248 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** BSD License Usage
|
||||
** Alternatively, you may use this file under the terms of the BSD license
|
||||
** as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/* Original work Copyright (C) 2016 The Qt Company Ltd.
|
||||
* Modified work Copyright (C) 2018 - Brad Parker
|
||||
*/
|
||||
|
||||
#include <QtWidgets>
|
||||
|
||||
#include "flowlayout.h"
|
||||
#include "../ui_qt.h"
|
||||
|
||||
FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
|
||||
: QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
|
||||
{
|
||||
setContentsMargins(margin, margin, margin, margin);
|
||||
|
||||
connect(this, SIGNAL(signalAddWidgetDeferred(QPointer<ThumbnailWidget>)), this, SLOT(onAddWidgetDeferred(QPointer<ThumbnailWidget>)), Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing)
|
||||
: m_hSpace(hSpacing), m_vSpace(vSpacing)
|
||||
{
|
||||
setContentsMargins(margin, margin, margin, margin);
|
||||
}
|
||||
|
||||
FlowLayout::~FlowLayout()
|
||||
{
|
||||
QLayoutItem *item = NULL;
|
||||
|
||||
while ((item = takeAt(0)) != NULL)
|
||||
delete item;
|
||||
}
|
||||
|
||||
void FlowLayout::addItem(QLayoutItem *item)
|
||||
{
|
||||
itemList.append(item);
|
||||
}
|
||||
|
||||
int FlowLayout::horizontalSpacing() const
|
||||
{
|
||||
if (m_hSpace >= 0)
|
||||
return m_hSpace;
|
||||
else
|
||||
return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
|
||||
}
|
||||
|
||||
int FlowLayout::verticalSpacing() const
|
||||
{
|
||||
if (m_vSpace >= 0)
|
||||
return m_vSpace;
|
||||
else
|
||||
return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
|
||||
}
|
||||
|
||||
int FlowLayout::count() const
|
||||
{
|
||||
return itemList.size();
|
||||
}
|
||||
|
||||
QLayoutItem* FlowLayout::itemAt(int index) const
|
||||
{
|
||||
return itemList.value(index);
|
||||
}
|
||||
|
||||
QLayoutItem* FlowLayout::takeAt(int index)
|
||||
{
|
||||
if (index >= 0 && index < itemList.size())
|
||||
return itemList.takeAt(index);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Qt::Orientations FlowLayout::expandingDirections() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool FlowLayout::hasHeightForWidth() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
int FlowLayout::heightForWidth(int width) const
|
||||
{
|
||||
int height = doLayout(QRect(0, 0, width, 0), true);
|
||||
return height;
|
||||
}
|
||||
|
||||
void FlowLayout::setGeometry(const QRect &rect)
|
||||
{
|
||||
QLayout::setGeometry(rect);
|
||||
doLayout(rect, false);
|
||||
}
|
||||
|
||||
QSize FlowLayout::sizeHint() const
|
||||
{
|
||||
return minimumSize();
|
||||
}
|
||||
|
||||
QSize FlowLayout::minimumSize() const
|
||||
{
|
||||
QSize size;
|
||||
int i = 0;
|
||||
|
||||
if (itemList.isEmpty())
|
||||
return size;
|
||||
|
||||
for (i = 0; i < itemList.count(); i++)
|
||||
{
|
||||
const QLayoutItem *item = itemList.at(i);
|
||||
size = size.expandedTo(item->minimumSize());
|
||||
}
|
||||
|
||||
size += QSize(2 * margin(), 2 * margin());
|
||||
return size;
|
||||
}
|
||||
|
||||
int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
|
||||
{
|
||||
QRect effectiveRect;
|
||||
int left = 0, top = 0, right = 0, bottom = 0;
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int lineHeight = 0;
|
||||
int i = 0;
|
||||
|
||||
getContentsMargins(&left, &top, &right, &bottom);
|
||||
effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
|
||||
x = effectiveRect.x();
|
||||
y = effectiveRect.y();
|
||||
|
||||
if (itemList.isEmpty())
|
||||
return y + lineHeight - rect.y() + bottom;
|
||||
|
||||
for (i = 0; i < itemList.count(); i++)
|
||||
{
|
||||
QLayoutItem *item = itemList.at(i);
|
||||
const QWidget *wid = item->widget();
|
||||
int spaceX = horizontalSpacing();
|
||||
int spaceY = 0;
|
||||
int nextX = 0;
|
||||
|
||||
if (spaceX == -1)
|
||||
spaceX = wid->style()->layoutSpacing(
|
||||
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
|
||||
|
||||
spaceY = verticalSpacing();
|
||||
|
||||
if (spaceY == -1)
|
||||
spaceY = wid->style()->layoutSpacing(
|
||||
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
|
||||
|
||||
nextX = x + item->sizeHint().width() + spaceX;
|
||||
|
||||
if (nextX - spaceX > effectiveRect.right() && lineHeight > 0)
|
||||
{
|
||||
x = effectiveRect.x();
|
||||
y = y + lineHeight + spaceY;
|
||||
nextX = x + item->sizeHint().width() + spaceX;
|
||||
lineHeight = 0;
|
||||
}
|
||||
|
||||
if (!testOnly)
|
||||
item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
|
||||
|
||||
x = nextX;
|
||||
lineHeight = qMax(lineHeight, item->sizeHint().height());
|
||||
}
|
||||
|
||||
return y + lineHeight - rect.y() + bottom;
|
||||
}
|
||||
|
||||
int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
|
||||
{
|
||||
const QObject *parentObj = parent();
|
||||
|
||||
if (!parentObj)
|
||||
return -1;
|
||||
else if (parentObj->isWidgetType())
|
||||
{
|
||||
const QWidget *pw = static_cast<const QWidget*>(parentObj);
|
||||
return pw->style()->pixelMetric(pm, NULL, pw);
|
||||
}
|
||||
else
|
||||
return static_cast<const QLayout*>(parentObj)->spacing();
|
||||
}
|
||||
|
||||
void FlowLayout::addWidgetDeferred(QPointer<ThumbnailWidget> widget)
|
||||
{
|
||||
emit signalAddWidgetDeferred(widget);
|
||||
}
|
||||
|
||||
void FlowLayout::onAddWidgetDeferred(QPointer<ThumbnailWidget> widget)
|
||||
{
|
||||
/* widget might have been deleted before we got to it since this uses a queued connection, hence the guarded QPointer */
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
addWidget(widget);
|
||||
}
|
105
ui/drivers/qt/flowlayout.h
Normal file
105
ui/drivers/qt/flowlayout.h
Normal file
@ -0,0 +1,105 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** BSD License Usage
|
||||
** Alternatively, you may use this file under the terms of the BSD license
|
||||
** as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/* Original work Copyright (C) 2016 The Qt Company Ltd.
|
||||
* Modified work Copyright (C) 2018 - Brad Parker
|
||||
*/
|
||||
|
||||
/* bparker: Removed C++11 override keyword from original source
|
||||
* Changed QList to QVector
|
||||
*/
|
||||
|
||||
#ifndef FLOWLAYOUT_H
|
||||
#define FLOWLAYOUT_H
|
||||
|
||||
#include <QLayout>
|
||||
#include <QRect>
|
||||
#include <QStyle>
|
||||
|
||||
class ThumbnailWidget;
|
||||
|
||||
class FlowLayout : public QLayout
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1);
|
||||
explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1);
|
||||
~FlowLayout();
|
||||
|
||||
void addItem(QLayoutItem *item);
|
||||
int horizontalSpacing() const;
|
||||
int verticalSpacing() const;
|
||||
Qt::Orientations expandingDirections() const;
|
||||
bool hasHeightForWidth() const;
|
||||
int heightForWidth(int) const;
|
||||
int count() const;
|
||||
QLayoutItem* itemAt(int index) const;
|
||||
QSize minimumSize() const;
|
||||
void setGeometry(const QRect &rect);
|
||||
QSize sizeHint() const;
|
||||
QLayoutItem* takeAt(int index);
|
||||
void addWidgetDeferred(QPointer<ThumbnailWidget> widget);
|
||||
|
||||
signals:
|
||||
void signalAddWidgetDeferred(QPointer<ThumbnailWidget> widget);
|
||||
|
||||
private slots:
|
||||
void onAddWidgetDeferred(QPointer<ThumbnailWidget> widget);
|
||||
|
||||
private:
|
||||
int doLayout(const QRect &rect, bool testOnly) const;
|
||||
int smartSpacing(QStyle::PixelMetric pm) const;
|
||||
|
||||
QVector<QLayoutItem*> itemList;
|
||||
int m_hSpace;
|
||||
int m_vSpace;
|
||||
};
|
||||
|
||||
#endif // FLOWLAYOUT_H
|
@ -266,8 +266,11 @@ void LoadCoreWindow::initCoreList(const QStringList &extensionFilters)
|
||||
|
||||
if (rowsToHide.size() != m_table->rowCount())
|
||||
{
|
||||
foreach (const int &row, rowsToHide)
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < rowsToHide.count() && rowsToHide.count() > 0; i++)
|
||||
{
|
||||
const int &row = rowsToHide.at(i);
|
||||
m_table->setRowHidden(row, true);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,22 @@
|
||||
#include <QString>
|
||||
|
||||
/* %1 is a placeholder for palette(highlight) or the equivalent chosen by the user */
|
||||
static const QString qt_theme_default_stylesheet = QStringLiteral("");
|
||||
static const QString qt_theme_default_stylesheet = QStringLiteral(""
|
||||
"QPushButton[flat=\"true\"] {\n"
|
||||
" min-height:20px;\n"
|
||||
" min-width:80px;\n"
|
||||
" padding:1px 3px 1px 3px;\n"
|
||||
" background-color: transparent;\n"
|
||||
" border: 1px solid #ddd;\n"
|
||||
"}\n"
|
||||
"ThumbnailWidget#thumbnailWidget, ThumbnailLabel#thumbnailGridLabel, QLabel#thumbnailQLabel {\n"
|
||||
" background-color:#555555;\n"
|
||||
"}\n"
|
||||
"ThumbnailWidget#thumbnailWidgetSelected {\n"
|
||||
" background-color:#555555;\n"
|
||||
" border:3px solid %1;\n"
|
||||
"}\n"
|
||||
);
|
||||
|
||||
static const QString qt_theme_dark_stylesheet = QStringLiteral(""
|
||||
"QWidget {\n"
|
||||
@ -233,6 +248,10 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(""
|
||||
" border:1px solid %1;\n"
|
||||
" border-radius:4px;\n"
|
||||
"}\n"
|
||||
"QPushButton[flat=\"true\"] {\n"
|
||||
" background-color: transparent;\n"
|
||||
" border: 1px solid #ddd;\n"
|
||||
"}\n"
|
||||
"QRadioButton::indicator {\n"
|
||||
" width:18px;\n"
|
||||
" height:18px;\n"
|
||||
@ -374,4 +393,11 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(""
|
||||
"QSizeGrip {\n"
|
||||
" background-color:solid;\n"
|
||||
"}\n"
|
||||
"ThumbnailWidget#thumbnailWidget, ThumbnailLabel#thumbnailGridLabel, QLabel#thumbnailQLabel {\n"
|
||||
" background-color:#555555;\n"
|
||||
"}\n"
|
||||
"ThumbnailWidget#thumbnailWidgetSelected {\n"
|
||||
" background-color:#555555;\n"
|
||||
" border:3px solid %1;\n"
|
||||
"}\n"
|
||||
);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -42,6 +42,24 @@
|
||||
#import <MetalKit/MetalKit.h>
|
||||
#endif
|
||||
|
||||
@interface WindowListener : NSResponder<NSWindowDelegate>
|
||||
@end
|
||||
|
||||
@implementation WindowListener
|
||||
|
||||
/* Similarly to SDL, we'll respond to key events by doing nothing so we don't beep.
|
||||
*/
|
||||
- (void)flagsChanged:(NSEvent *)event
|
||||
{}
|
||||
|
||||
- (void)keyDown:(NSEvent *)event
|
||||
{}
|
||||
|
||||
- (void)keyUp:(NSEvent *)event
|
||||
{}
|
||||
|
||||
@end
|
||||
|
||||
id<ApplePlatform> apple_platform;
|
||||
|
||||
#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
|
||||
@ -54,7 +72,7 @@ id<ApplePlatform> apple_platform;
|
||||
apple_view_type_t _vt;
|
||||
NSView* _renderView;
|
||||
id _sleepActivity;
|
||||
|
||||
WindowListener *_listener;
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) NSWindow IBOutlet* window;
|
||||
@ -109,7 +127,7 @@ static void app_terminate(void)
|
||||
case NSEventTypeKeyDown:
|
||||
case NSEventTypeKeyUp:
|
||||
{
|
||||
NSString* ch = (NSString*)event.characters;
|
||||
NSString* ch = event.characters;
|
||||
uint32_t character = 0;
|
||||
uint32_t mod = 0;
|
||||
|
||||
@ -164,13 +182,13 @@ static void app_terminate(void)
|
||||
return;
|
||||
|
||||
/* Relative */
|
||||
apple->mouse_rel_x = event.deltaX;
|
||||
apple->mouse_rel_y = event.deltaY;
|
||||
apple->mouse_rel_x = (int16_t)event.deltaX;
|
||||
apple->mouse_rel_y = (int16_t)event.deltaY;
|
||||
|
||||
/* Absolute */
|
||||
pos = [apple_platform.renderView convertPoint:[event locationInWindow] fromView:nil];
|
||||
apple->touches[0].screen_x = pos.x;
|
||||
apple->touches[0].screen_y = pos.y;
|
||||
apple->touches[0].screen_x = (int16_t)pos.x;
|
||||
apple->touches[0].screen_y = (int16_t)pos.y;
|
||||
|
||||
mouse_pos = [apple_platform.renderView convertPoint:[event locationInWindow] fromView:nil];
|
||||
apple->window_pos_x = (int16_t)mouse_pos.x;
|
||||
@ -245,8 +263,13 @@ static char** waiting_argv;
|
||||
[self.window setCollectionBehavior:NS_WINDOW_COLLECTION_BEHAVIOR_FULLSCREEN_PRIMARY];
|
||||
}
|
||||
#endif
|
||||
|
||||
_listener = [WindowListener new];
|
||||
|
||||
[self.window setAcceptsMouseMovedEvents: YES];
|
||||
|
||||
[self.window setNextResponder:_listener];
|
||||
self.window.delegate = _listener;
|
||||
|
||||
[[self.window contentView] setAutoresizesSubviews:YES];
|
||||
|
||||
for (i = 0; i < waiting_argc; i++)
|
||||
@ -262,7 +285,10 @@ static char** waiting_argv;
|
||||
app_terminate();
|
||||
|
||||
waiting_argc = 0;
|
||||
|
||||
|
||||
[self.window makeMainWindow];
|
||||
[self.window makeKeyWindow];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(rarch_main) withObject:nil waitUntilDone:NO];
|
||||
}
|
||||
|
||||
@ -271,7 +297,7 @@ static char** waiting_argv;
|
||||
return;
|
||||
}
|
||||
|
||||
RARCH_LOG("[Cocoa] change view type: %d → %d\n", _vt, vt);
|
||||
RARCH_LOG("[Cocoa]: change view type: %d → %d\n", _vt, vt);
|
||||
|
||||
_vt = vt;
|
||||
if (_renderView != nil)
|
||||
@ -279,6 +305,7 @@ static char** waiting_argv;
|
||||
_renderView.wantsLayer = NO;
|
||||
_renderView.layer = nil;
|
||||
[_renderView removeFromSuperview];
|
||||
self.window.contentView = nil;
|
||||
_renderView = nil;
|
||||
}
|
||||
|
||||
@ -294,7 +321,7 @@ static char** waiting_argv;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
||||
case APPLE_VIEW_TYPE_OPENGL:
|
||||
{
|
||||
_renderView = [CocoaView get];
|
||||
@ -308,9 +335,9 @@ static char** waiting_argv;
|
||||
|
||||
_renderView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
|
||||
_renderView.frame = self.window.contentView.bounds;
|
||||
|
||||
[self.window.contentView addSubview:_renderView];
|
||||
[self.window makeFirstResponder:_renderView];
|
||||
|
||||
self.window.contentView = _renderView;
|
||||
[self.window.contentView setNextResponder:_listener];
|
||||
}
|
||||
|
||||
- (apple_view_type_t)viewType {
|
||||
|
@ -56,21 +56,36 @@ typedef struct ui_companion_qt
|
||||
} ui_companion_qt_t;
|
||||
|
||||
ThumbnailWidget::ThumbnailWidget(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
QFrame(parent)
|
||||
,m_sizeHint(QSize(256, 256))
|
||||
{
|
||||
}
|
||||
|
||||
void ThumbnailWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mousePressEvent(event);
|
||||
|
||||
emit mousePressed();
|
||||
}
|
||||
|
||||
void ThumbnailWidget::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mouseDoubleClickEvent(event);
|
||||
|
||||
emit mouseDoubleClicked();
|
||||
}
|
||||
|
||||
void ThumbnailWidget::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QStyleOption o;
|
||||
QPainter p;
|
||||
o.initFrom(this);
|
||||
p.begin(this);
|
||||
style()->drawPrimitive(
|
||||
QStyle::PE_Widget, &o, &p, this);
|
||||
p.end();
|
||||
QStyleOption o;
|
||||
QPainter p;
|
||||
o.initFrom(this);
|
||||
p.begin(this);
|
||||
style()->drawPrimitive(
|
||||
QStyle::PE_Widget, &o, &p, this);
|
||||
p.end();
|
||||
|
||||
QWidget::paintEvent(event);
|
||||
QFrame::paintEvent(event);
|
||||
}
|
||||
|
||||
void ThumbnailWidget::resizeEvent(QResizeEvent *event)
|
||||
@ -80,7 +95,12 @@ void ThumbnailWidget::resizeEvent(QResizeEvent *event)
|
||||
|
||||
QSize ThumbnailWidget::sizeHint() const
|
||||
{
|
||||
return QSize(256, 256);
|
||||
return m_sizeHint;
|
||||
}
|
||||
|
||||
void ThumbnailWidget::setSizeHint(QSize size)
|
||||
{
|
||||
m_sizeHint = size;
|
||||
}
|
||||
|
||||
ThumbnailLabel::ThumbnailLabel(QWidget *parent) :
|
||||
@ -231,6 +251,8 @@ static void* ui_companion_qt_init(void)
|
||||
QAction *exitAction = NULL;
|
||||
QComboBox *launchWithComboBox = NULL;
|
||||
QSettings *qsettings = NULL;
|
||||
QListWidget *listWidget = NULL;
|
||||
int i = 0;
|
||||
|
||||
if (!handle)
|
||||
return NULL;
|
||||
@ -251,11 +273,14 @@ static void* ui_companion_qt_init(void)
|
||||
mainwindow->setWindowTitle("RetroArch");
|
||||
mainwindow->setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks | GROUPED_DRAGGING);
|
||||
|
||||
listWidget = mainwindow->playlistListWidget();
|
||||
|
||||
widget = new QWidget(mainwindow);
|
||||
widget->setObjectName("tableWidget");
|
||||
|
||||
layout = new QVBoxLayout();
|
||||
layout->addWidget(mainwindow->contentTableWidget());
|
||||
layout->addWidget(mainwindow->contentGridWidget());
|
||||
|
||||
widget->setLayout(layout);
|
||||
|
||||
@ -286,6 +311,10 @@ static void* ui_companion_qt_init(void)
|
||||
|
||||
QObject::connect(viewClosedDocksMenu, SIGNAL(aboutToShow()), mainwindow, SLOT(onViewClosedDocksAboutToShow()));
|
||||
|
||||
viewMenu->addSeparator();
|
||||
viewMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_ICONS), mainwindow, SLOT(onIconViewClicked()));
|
||||
viewMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST), mainwindow, SLOT(onListViewClicked()));
|
||||
viewMenu->addSeparator();
|
||||
viewMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS), mainwindow->viewOptionsDialog(), SLOT(showDialog()));
|
||||
|
||||
playlistWidget = new QWidget();
|
||||
@ -447,6 +476,12 @@ static void* ui_companion_qt_init(void)
|
||||
/* this should come last */
|
||||
mainwindow->resizeThumbnails(true, true, true);
|
||||
|
||||
if (qsettings->contains("all_playlists_list_max_count"))
|
||||
mainwindow->setAllPlaylistsListMaxCount(qsettings->value("all_playlists_list_max_count", 0).toInt());
|
||||
|
||||
if (qsettings->contains("all_playlists_grid_max_count"))
|
||||
mainwindow->setAllPlaylistsGridMaxCount(qsettings->value("all_playlists_grid_max_count", 5000).toInt());
|
||||
|
||||
if (qsettings->contains("geometry"))
|
||||
if (qsettings->contains("save_geometry"))
|
||||
mainwindow->restoreGeometry(qsettings->value("geometry").toByteArray());
|
||||
@ -455,17 +490,6 @@ static void* ui_companion_qt_init(void)
|
||||
if (qsettings->contains("dock_positions"))
|
||||
mainwindow->restoreState(qsettings->value("dock_positions").toByteArray());
|
||||
|
||||
if (qsettings->contains("save_last_tab"))
|
||||
{
|
||||
if (qsettings->contains("last_tab"))
|
||||
{
|
||||
int lastTabIndex = qsettings->value("last_tab", 0).toInt();
|
||||
|
||||
if (lastTabIndex >= 0 && browserAndPlaylistTabWidget->count() > lastTabIndex)
|
||||
browserAndPlaylistTabWidget->setCurrentIndex(lastTabIndex);
|
||||
}
|
||||
}
|
||||
|
||||
if (qsettings->contains("theme"))
|
||||
{
|
||||
QString themeStr = qsettings->value("theme").toString();
|
||||
@ -483,6 +507,58 @@ static void* ui_companion_qt_init(void)
|
||||
else
|
||||
mainwindow->setTheme();
|
||||
|
||||
if (qsettings->contains("view_type"))
|
||||
{
|
||||
QString viewType = qsettings->value("view_type", "list").toString();
|
||||
|
||||
if (viewType == "list")
|
||||
mainwindow->setCurrentViewType(MainWindow::VIEW_TYPE_LIST);
|
||||
else if (viewType == "icons")
|
||||
mainwindow->setCurrentViewType(MainWindow::VIEW_TYPE_ICONS);
|
||||
else
|
||||
mainwindow->setCurrentViewType(MainWindow::VIEW_TYPE_LIST);
|
||||
|
||||
/* we set it to the same thing a second time so that m_lastViewType is also equal to the startup view type */
|
||||
mainwindow->setCurrentViewType(mainwindow->getCurrentViewType());
|
||||
}
|
||||
else
|
||||
mainwindow->setCurrentViewType(MainWindow::VIEW_TYPE_LIST);
|
||||
|
||||
/* We make sure to hook up the tab widget callback only after the tabs themselves have been added,
|
||||
* but before changing to a specific one, to avoid the callback firing before the view type is set.
|
||||
*/
|
||||
QObject::connect(browserAndPlaylistTabWidget, SIGNAL(currentChanged(int)), mainwindow, SLOT(onTabWidgetIndexChanged(int)));
|
||||
|
||||
/* setting the last tab must come after setting the view type */
|
||||
if (qsettings->contains("save_last_tab"))
|
||||
{
|
||||
if (qsettings->contains("last_tab"))
|
||||
{
|
||||
int lastTabIndex = qsettings->value("last_tab", 0).toInt();
|
||||
|
||||
if (lastTabIndex >= 0 && browserAndPlaylistTabWidget->count() > lastTabIndex)
|
||||
{
|
||||
browserAndPlaylistTabWidget->setCurrentIndex(lastTabIndex);
|
||||
mainwindow->onTabWidgetIndexChanged(lastTabIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
browserAndPlaylistTabWidget->setCurrentIndex(0);
|
||||
mainwindow->onTabWidgetIndexChanged(0);
|
||||
}
|
||||
|
||||
for (i = 0; i < listWidget->count() && listWidget->count() > 0; i++)
|
||||
{
|
||||
/* select the first non-hidden row */
|
||||
if (!listWidget->isRowHidden(i))
|
||||
{
|
||||
listWidget->setCurrentRow(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
|
@ -22,14 +22,21 @@
|
||||
#include <QMainWindow>
|
||||
#include <QTreeView>
|
||||
#include <QTableWidget>
|
||||
#include <QFrame>
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QLabel>
|
||||
#include <QRegularExpression>
|
||||
#include <QPalette>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QFutureWatcher>
|
||||
#include <QPixmap>
|
||||
#include <QImage>
|
||||
#include <QPointer>
|
||||
#include <QProgressBar>
|
||||
|
||||
extern "C" {
|
||||
#include <retro_assert.h>
|
||||
#include <retro_common_api.h>
|
||||
#include "../ui_companion_driver.h"
|
||||
}
|
||||
@ -52,21 +59,51 @@ class QPixmap;
|
||||
class QPaintEvent;
|
||||
class QSettings;
|
||||
class QCheckBox;
|
||||
class QSpinBox;
|
||||
class QFormLayout;
|
||||
class QStyle;
|
||||
class QScrollArea;
|
||||
class QSlider;
|
||||
class LoadCoreWindow;
|
||||
class MainWindow;
|
||||
class ThumbnailWidget;
|
||||
class ThumbnailLabel;
|
||||
class FlowLayout;
|
||||
|
||||
class ThumbnailWidget : public QWidget
|
||||
class GridItem : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GridItem();
|
||||
|
||||
QPointer<ThumbnailWidget> widget;
|
||||
QPointer<ThumbnailLabel> label;
|
||||
QHash<QString, QString> hash;
|
||||
QImage image;
|
||||
QPixmap pixmap;
|
||||
QFutureWatcher<GridItem*> imageWatcher;
|
||||
QString labelText;
|
||||
};
|
||||
|
||||
class ThumbnailWidget : public QFrame
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ThumbnailWidget(QWidget *parent = 0);
|
||||
ThumbnailWidget(const ThumbnailWidget& other) { retro_assert(false && "DONT EVER USE THIS"); }
|
||||
|
||||
QSize sizeHint() const;
|
||||
void setSizeHint(QSize size);
|
||||
signals:
|
||||
void mouseDoubleClicked();
|
||||
void mousePressed();
|
||||
private:
|
||||
QSize m_sizeHint;
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event);
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
};
|
||||
|
||||
class ThumbnailLabel : public QWidget
|
||||
@ -156,6 +193,8 @@ private:
|
||||
QLabel *m_highlightColorLabel;
|
||||
QString m_customThemePath;
|
||||
QCheckBox *m_suggestLoadedCoreFirstCheckBox;
|
||||
QSpinBox *m_allPlaylistsListMaxCountSpinBox;
|
||||
QSpinBox *m_allPlaylistsGridMaxCountSpinBox;
|
||||
};
|
||||
|
||||
class CoreInfoLabel : public QLabel
|
||||
@ -204,6 +243,12 @@ class MainWindow : public QMainWindow
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum ViewType
|
||||
{
|
||||
VIEW_TYPE_ICONS,
|
||||
VIEW_TYPE_LIST
|
||||
};
|
||||
|
||||
enum Theme
|
||||
{
|
||||
THEME_SYSTEM_DEFAULT,
|
||||
@ -223,6 +268,8 @@ public:
|
||||
TreeView* dirTreeView();
|
||||
QListWidget* playlistListWidget();
|
||||
TableWidget* contentTableWidget();
|
||||
FlowLayout* contentGridLayout();
|
||||
QWidget* contentGridWidget();
|
||||
QWidget* searchWidget();
|
||||
QLineEdit* searchLineEdit();
|
||||
QComboBox* launchWithComboBox();
|
||||
@ -231,10 +278,10 @@ public:
|
||||
QToolButton* runPushButton();
|
||||
QToolButton* stopPushButton();
|
||||
QTabWidget* browserAndPlaylistTabWidget();
|
||||
QList<QHash<QString, QString> > getPlaylistDefaultCores();
|
||||
QVector<QHash<QString, QString> > getPlaylistDefaultCores();
|
||||
ViewOptionsDialog* viewOptionsDialog();
|
||||
QSettings* settings();
|
||||
QList<QHash<QString, QString> > getCoreInfo();
|
||||
QVector<QHash<QString, QString> > getCoreInfo();
|
||||
void setTheme(Theme theme = THEME_SYSTEM_DEFAULT);
|
||||
Theme theme();
|
||||
Theme getThemeFromString(QString themeString);
|
||||
@ -245,6 +292,12 @@ public:
|
||||
bool setCustomThemeFile(QString filePath);
|
||||
void setCustomThemeString(QString qss);
|
||||
const QString& customThemeString() const;
|
||||
GridItem* doDeferredImageLoad(GridItem *item, QString path);
|
||||
void setCurrentViewType(ViewType viewType);
|
||||
QString getCurrentViewTypeString();
|
||||
ViewType getCurrentViewType();
|
||||
void setAllPlaylistsListMaxCount(int count);
|
||||
void setAllPlaylistsGridMaxCount(int count);
|
||||
|
||||
signals:
|
||||
void thumbnailChanged(const QPixmap &pixmap);
|
||||
@ -259,10 +312,12 @@ public slots:
|
||||
void onBrowserUpClicked();
|
||||
void onBrowserStartClicked();
|
||||
void initContentTableWidget();
|
||||
void initContentGridLayout();
|
||||
void onViewClosedDocksAboutToShow();
|
||||
void onShowHiddenDockWidgetAction();
|
||||
void setCoreActions();
|
||||
void onRunClicked();
|
||||
void loadContent(const QHash<QString, QString> &contentHash);
|
||||
void onStartCoreClicked();
|
||||
void onTableWidgetEnterPressed();
|
||||
void selectBrowserDir(QString path);
|
||||
@ -277,6 +332,9 @@ public slots:
|
||||
void deferReloadPlaylists();
|
||||
void onGotReloadPlaylists();
|
||||
void showWelcomeScreen();
|
||||
void onIconViewClicked();
|
||||
void onListViewClicked();
|
||||
void onTabWidgetIndexChanged(int index);
|
||||
|
||||
private slots:
|
||||
void onLoadCoreClicked(const QStringList &extensionFilters = QStringList());
|
||||
@ -285,24 +343,38 @@ private slots:
|
||||
void onCoreLoaded();
|
||||
void onCurrentListItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
|
||||
void onCurrentTableItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
|
||||
void currentItemChanged(const QHash<QString, QString> &hash);
|
||||
void onSearchEnterPressed();
|
||||
void onSearchLineEditEdited(const QString &text);
|
||||
void addPlaylistItemsToTable(QString path);
|
||||
void addPlaylistItemsToTable(const QStringList &paths, bool all = false);
|
||||
void addPlaylistHashToTable(const QVector<QHash<QString, QString> > &items);
|
||||
void addPlaylistItemsToGrid(const QStringList &paths, bool all = false);
|
||||
void addPlaylistHashToGrid(const QVector<QHash<QString, QString> > &items);
|
||||
void onContentItemDoubleClicked(QTableWidgetItem *item);
|
||||
void onCoreLoadWindowClosed();
|
||||
void onTabWidgetIndexChanged(int index);
|
||||
void onTreeViewItemsSelected(QModelIndexList selectedIndexes);
|
||||
void onSearchResetClicked();
|
||||
void onLaunchWithComboBoxIndexChanged(int index);
|
||||
void onFileBrowserTreeContextMenuRequested(const QPoint &pos);
|
||||
void onPlaylistWidgetContextMenuRequested(const QPoint &pos);
|
||||
void onStopClicked();
|
||||
void onDeferredImageLoaded();
|
||||
void onZoomValueChanged(int value);
|
||||
void onContentGridInited();
|
||||
void onUpdateGridItemPixmapFromImage(GridItem *item);
|
||||
void onPendingItemUpdates();
|
||||
void onGridItemDoubleClicked();
|
||||
void onGridItemClicked();
|
||||
|
||||
private:
|
||||
void setCurrentCoreLabel();
|
||||
void getPlaylistFiles();
|
||||
bool isCoreLoaded();
|
||||
bool isContentLessCore();
|
||||
void removeGridItems();
|
||||
void loadImageDeferred(GridItem *item, QString path);
|
||||
void calcGridItemSize(GridItem *item, int zoomValue);
|
||||
QVector<QHash<QString, QString> > getPlaylistItems(QString pathString);
|
||||
|
||||
LoadCoreWindow *m_loadCoreWindow;
|
||||
QTimer *m_timer;
|
||||
@ -344,12 +416,31 @@ private:
|
||||
QListWidgetItem *m_historyPlaylistsItem;
|
||||
QIcon m_folderIcon;
|
||||
QString m_customThemeString;
|
||||
FlowLayout *m_gridLayout;
|
||||
QWidget *m_gridWidget;
|
||||
QScrollArea *m_gridScrollArea;
|
||||
QVector<QPointer<GridItem> > m_gridItems;
|
||||
QWidget *m_gridLayoutWidget;
|
||||
QSlider *m_zoomSlider;
|
||||
int m_lastZoomSliderValue;
|
||||
QList<GridItem*> m_pendingItemUpdates;
|
||||
ViewType m_viewType;
|
||||
QProgressBar *m_gridProgressBar;
|
||||
QWidget *m_gridProgressWidget;
|
||||
QHash<QString, QString> m_currentGridHash;
|
||||
ViewType m_lastViewType;
|
||||
QPointer<ThumbnailWidget> m_currentGridWidget;
|
||||
int m_allPlaylistsListMaxCount;
|
||||
int m_allPlaylistsGridMaxCount;
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event);
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(ThumbnailWidget)
|
||||
Q_DECLARE_METATYPE(QPointer<ThumbnailWidget>)
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
typedef struct ui_application_qt
|
||||
|
Loading…
Reference in New Issue
Block a user