Unify File Open and File Drag Drop code

* Code in `win32_drag_query_file` was split off into `win32_load_content_from_gui`
* File Open dialog now uses the same code as drag drop instead of the non-working code that was in there before.
* File Dialog and Core Select Dialog show and hide mouse cursor if they were invoked in fullscreen mode
This commit is contained in:
Dwedit 2018-05-09 20:17:04 -05:00
parent 72a77884fa
commit f3f0d4f787
4 changed files with 121 additions and 93 deletions

View File

@ -500,9 +500,101 @@ void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id)
GetMonitorInfo(*hm_to_use, (LPMONITORINFO)mon);
}
/* Get the count of the files dropped */
static int win32_drag_query_file(HWND hwnd, WPARAM wparam)
bool win32_load_content_from_gui(const char *szFilename)
{
/* poll list of current cores */
size_t list_size;
content_ctx_info_t content_info = { 0 };
core_info_list_t *core_info_list = NULL;
const core_info_t *core_info = NULL;
core_info_get_list(&core_info_list);
if (!core_info_list)
return false;
core_info_list_get_supported_cores(core_info_list,
(const char*)szFilename, &core_info, &list_size);
if (!list_size)
{
return false;
}
path_set(RARCH_PATH_CONTENT, szFilename);
if (!path_is_empty(RARCH_PATH_CONTENT))
{
unsigned i;
core_info_t *current_core = NULL;
core_info_get_current_core(&current_core);
/*we already have path for libretro core */
for (i = 0; i < list_size; i++)
{
const core_info_t *info = (const core_info_t*)&core_info[i];
if (!string_is_equal(info->systemname, current_core->systemname))
break;
if (string_is_equal(path_get(RARCH_PATH_CORE), info->path))
{
/* Our previous core supports the current rom */
content_ctx_info_t content_info = { 0 };
task_push_load_content_with_current_core_from_companion_ui(
NULL,
&content_info,
CORE_TYPE_PLAIN,
NULL, NULL);
return true;
}
}
}
/* Poll for cores for current rom since none exist. */
if (list_size == 1)
{
/*pick core that only exists and is bound to work. Ish. */
const core_info_t *info = (const core_info_t*)&core_info[0];
if (info)
{
task_push_load_content_with_new_core_from_companion_ui(
info->path, NULL, &content_info, NULL, NULL);
return true;
}
}
else
{
bool okay = false;
settings_t *settings = config_get_ptr();
/* Fullscreen: Show mouse cursor for dialog */
if (settings->bools.video_fullscreen)
{
video_driver_show_mouse();
}
/* Pick one core that could be compatible, ew */
if (DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_PICKCORE),
main_window.hwnd, PickCoreProc, (LPARAM)NULL) == IDOK)
{
task_push_load_content_with_current_core_from_companion_ui(
NULL, &content_info, CORE_TYPE_PLAIN, NULL, NULL);
okay = true;
}
/* Fullscreen: Hide mouse cursor after dialog */
if (settings->bools.video_fullscreen)
{
video_driver_hide_mouse();
}
return okay;
}
return false;
}
static bool win32_drag_query_file(HWND hwnd, WPARAM wparam)
{
bool okay = false;
#ifdef LEGACY_WIN32
char szFilename[1024];
szFilename[0] = '\0';
@ -514,92 +606,20 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam)
if (DragQueryFileR((HDROP)wparam, 0xFFFFFFFF, NULL, 0))
{
/* poll list of current cores */
size_t list_size;
content_ctx_info_t content_info = {0};
core_info_list_t *core_info_list = NULL;
const core_info_t *core_info = NULL;
#ifdef LEGACY_WIN32
DragQueryFileR((HDROP)wparam, 0, szFilename, sizeof(szFilename));
#else
DragQueryFileR((HDROP)wparam, 0, wszFilename, sizeof(wszFilename));
szFilename = utf16_to_utf8_string_alloc(wszFilename);
#endif
core_info_get_list(&core_info_list);
if (!core_info_list)
return 0;
core_info_list_get_supported_cores(core_info_list,
(const char*)szFilename, &core_info, &list_size);
if (!list_size)
{
#ifndef LEGACY_WIN32
if (szFilename)
free(szFilename);
#endif
return 0;
}
path_set(RARCH_PATH_CONTENT, szFilename);
okay = win32_load_content_from_gui(szFilename);
#ifndef LEGACY_WIN32
if (szFilename)
free(szFilename);
#endif
if (!path_is_empty(RARCH_PATH_CONTENT))
{
unsigned i;
core_info_t *current_core = NULL;
core_info_get_current_core(&current_core);
/*we already have path for libretro core */
for (i = 0; i < list_size; i++)
{
const core_info_t *info = (const core_info_t*)&core_info[i];
if (!string_is_equal(info->systemname, current_core->systemname))
break;
if (string_is_equal(path_get(RARCH_PATH_CORE), info->path))
{
/* Our previous core supports the current rom */
content_ctx_info_t content_info = {0};
task_push_load_content_with_current_core_from_companion_ui(
NULL,
&content_info,
CORE_TYPE_PLAIN,
NULL, NULL);
return 0;
}
}
}
/* Poll for cores for current rom since none exist. */
if (list_size ==1)
{
/*pick core that only exists and is bound to work. Ish. */
const core_info_t *info = (const core_info_t*)&core_info[0];
if (info)
task_push_load_content_with_new_core_from_companion_ui(
info->path, NULL, &content_info, NULL, NULL);
}
else
{
/* Pick one core that could be compatible, ew */
if (DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_PICKCORE),
hwnd,PickCoreProc,(LPARAM)NULL)==IDOK)
task_push_load_content_with_current_core_from_companion_ui(
NULL, &content_info, CORE_TYPE_PLAIN, NULL, NULL);
}
}
return 0;
return okay;
}
#ifndef _XBOX
@ -691,10 +711,8 @@ static LRESULT CALLBACK WndProcCommon(bool *quit, HWND hwnd, UINT message,
break;
case WM_DROPFILES:
{
int ret = win32_drag_query_file(hwnd, wparam);
win32_drag_query_file(hwnd, wparam);
DragFinish((HDROP)wparam);
if (ret != 0)
return 0;
}
break;
case WM_CHAR:

View File

@ -141,6 +141,8 @@ BOOL IsIconic(HWND hwnd);
LRESULT win32_menu_loop(HWND owner, WPARAM wparam);
bool win32_load_content_from_gui(const char *szFilename);
RETRO_END_DECLS
#endif

View File

@ -645,17 +645,9 @@ LRESULT win32_menu_loop(HWND owner, WPARAM wparam)
cmd = CMD_EVENT_LOAD_CORE;
break;
case ID_M_LOAD_CONTENT:
if (win32_load_content_from_gui(win32_file))
{
content_ctx_info_t content_info = {0};
path_set(RARCH_PATH_CONTENT, win32_file);
do_wm_close = true;
task_push_load_content_with_current_core_from_companion_ui(
NULL,
&content_info,
CORE_TYPE_PLAIN,
NULL, NULL);
}
break;
}

View File

@ -25,9 +25,12 @@
#include <commctrl.h>
#include "../../ui_companion_driver.h"
#include "../../configuration.h"
static bool ui_browser_window_win32_core(ui_browser_window_state_t *state, bool save)
{
bool okay = false;
settings_t *settings = config_get_ptr();
OPENFILENAME ofn;
ofn.lStructSize = sizeof(OPENFILENAME);
@ -56,12 +59,25 @@ static bool ui_browser_window_win32_core(ui_browser_window_state_t *state, bool
ofn.FlagsEx = 0;
#endif
if (!save && !GetOpenFileName(&ofn))
return false;
if ( save && !GetSaveFileName(&ofn))
return false;
/* Full Screen: Show mouse for the file dialog */
if (settings->bools.video_fullscreen)
{
video_driver_show_mouse();
}
return true;
okay = true;
if (!save && !GetOpenFileName(&ofn))
okay = false;
if (save && !GetSaveFileName(&ofn))
okay = false;
/* Full screen: Hide mouse after the file dialog */
if (settings->bools.video_fullscreen)
{
video_driver_hide_mouse();
}
return okay;
}
static bool ui_browser_window_win32_open(ui_browser_window_state_t *state)