Merge branch 'master' into cheater

This commit is contained in:
Sven 2018-07-26 19:40:20 -04:00 committed by GitHub
commit c750235414
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
65 changed files with 6428 additions and 338 deletions

View File

@ -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.

View File

@ -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

View File

@ -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;

View File

@ -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:

View File

@ -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)
{

View File

@ -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:/",

View File

@ -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);

View 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;
}
);

View File

@ -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;

View File

@ -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 */
};

View File

@ -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,
};

View File

@ -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,
};

View File

@ -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,
};

View File

@ -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,
};

View File

@ -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;
}

View File

@ -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 */
};

View File

@ -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 */
};

View File

@ -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,
};

View File

@ -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
};

View File

@ -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,
};

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -29,6 +29,9 @@
#define MAX_PADS 1
/* TODO/FIXME -
* fix game focus toggle */
typedef struct ctr_input
{
bool blocked;

View File

@ -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))

View File

@ -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;

View File

@ -31,6 +31,9 @@
#define MAX_PADS 4
#endif
/* TODO/FIXME -
* fix game focus toggle */
typedef struct gx_input
{
bool blocked;

View File

@ -32,6 +32,9 @@
#include "../input_keymaps.h"
#include "../input_driver.h"
/* TODO/FIXME -
* fix game focus toggle */
typedef struct linuxraw_input
{
bool blocked;

View File

@ -40,6 +40,9 @@
#define MAX_PADS 7
#endif
/* TODO/FIXME -
* fix game focus toggle */
typedef struct
{
float x;

View File

@ -43,6 +43,9 @@
#include "../input_driver.h"
/* TODO/FIXME -
* fix game focus toggle */
typedef struct psp_input
{
bool blocked;

View File

@ -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;

View File

@ -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)
{

View File

@ -31,6 +31,9 @@
#include "../../verbosity.h"
#include "../../tasks/tasks_internal.h"
/* TODO/FIXME -
* fix game focus toggle */
typedef struct sdl_input
{
bool blocked;

View File

@ -13,6 +13,9 @@
#define MAX_PADS 10
/* TODO/FIXME -
* fix game focus toggle */
typedef struct switch_input
{
const input_device_driver_t *joypad;

View File

@ -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)
{

View File

@ -47,6 +47,9 @@
#include "../../verbosity.h"
/* TODO/FIXME -
* fix game focus toggle */
/* Forward declaration */
void flush_wayland_fd(void *data);

View File

@ -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))

View File

@ -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)
{

View File

@ -32,6 +32,9 @@
#define MAX_PADS 4
/* TODO/FIXME -
* fix game focus toggle */
typedef struct xdk_input
{
bool blocked;

View File

@ -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)

View File

@ -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)

View File

@ -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,

View File

@ -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,
"隠しファイルとフォルダを表示:")

View File

@ -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:")

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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),

View File

@ -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>

View File

@ -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",

View File

@ -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>";

View File

@ -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

View File

@ -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

View File

@ -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
}

View 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
View 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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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 {

View File

@ -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;
}

View File

@ -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