From 67aa757077f0e10bea814c2a466de5df9db07b36 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 30 Sep 2012 11:10:17 -0700 Subject: [PATCH] Fixed bug 1593 - SDL_DROPFILE event doesn't work on Windows Philipp Wiesemann 2012-09-30 05:56:09 PDT I attached a patch which tries to implement the dropfile support for Microsoft Windows. If applied SDL_DROPFILE events should be sent for single or multiple files which are dropped on window. The handling on Windows side is always activated (cursor will change and so on) because there is no connection between SDL_EventState() and the window setup. I assumed this additional overhead would be small and can be ignored. --- src/video/windows/SDL_windowsevents.c | 28 ++++++++++++++++++++++++++- src/video/windows/SDL_windowswindow.c | 6 ++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 7f3537a82..b18d31b6a 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -29,6 +29,10 @@ #include "../../events/SDL_events_c.h" #include "../../events/SDL_touch_c.h" +/* Dropfile support */ +#include + + /*#define WMMSG_DEBUG*/ @@ -619,7 +623,29 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } break; - } + + case WM_DROPFILES: + { + UINT i; + HDROP drop = (HDROP) wParam; + UINT count = DragQueryFile(drop, 0xFFFFFFFF, NULL, 0); + for (i = 0; i < count; ++i) { + UINT size = DragQueryFile(drop, i, NULL, 0) + 1; + LPTSTR buffer = SDL_stack_alloc(TCHAR, size); + if (buffer) { + if (DragQueryFile(drop, i, buffer, size)) { + char *file = WIN_StringToUTF8(buffer); + SDL_SendDropFile(file); + SDL_free(file); + } + SDL_stack_free(buffer); + } + } + DragFinish(drop); + return 0; + } + break; + } /* If there's a window proc, assume it's going to handle messages */ if (data->wndproc) { diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 9f36c8fb2..f0c29b100 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -29,6 +29,9 @@ #include "SDL_windowsvideo.h" #include "SDL_windowswindow.h" +/* Dropfile support */ +#include + /* This is included after SDL_windowsvideo.h, which includes windows.h */ #include "SDL_syswm.h" @@ -185,6 +188,9 @@ SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created) videodata->RegisterTouchWindow(hwnd, (TWF_FINETOUCH|TWF_WANTPALM)); } + /* Enable dropping files */ + DragAcceptFiles(hwnd, TRUE); + /* All done! */ return 0; }