#include <Windows.h>
#include "../../API/RainmeterAPI.h"
struct Measure
{
HWND SkinHWND;
Measure() : SkinHWND(NULL) {}
};
static LONG_PTR DefaultWndProc = NULL;
static bool confirm = false;
static void* grm = NULL;
LRESULT CALLBACK DragWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_DROPFILES)
{
RmLog(LOG_DEBUG, L"D&D: Got WM_DROPFILES message (DragWndProc)");
UINT FileCount = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0); //If iFile == 0xFFFFFFFF returns number of files
if (FileCount)
{
SHFILEOPSTRUCT ToDelete;
ToDelete.hwnd = hWnd;
ToDelete.wFunc = FO_DELETE;
ToDelete.pTo = NULL;
ToDelete.fFlags = FOF_ALLOWUNDO;
if (!confirm)
{
ToDelete.fFlags |= FOF_NOCONFIRMATION | FOF_SILENT;
}
ToDelete.pFrom = (LPTSTR)malloc(sizeof(WCHAR) * 1);
UINT CurSize = 1;
LPTSTR buffer = (LPTSTR)malloc(sizeof(WCHAR)* (MAX_PATH + 1));
for (UINT i = 0; i < FileCount; i++)
{
UINT ReqSize = DragQueryFile((HDROP)wParam, i, buffer, (MAX_PATH + 1));
RmLog(LOG_DEBUG, buffer);
ToDelete.pFrom = (LPTSTR)realloc((void *)ToDelete.pFrom, sizeof(WCHAR)* (CurSize + ReqSize + 1));
wcscpy((WCHAR *)(&(ToDelete.pFrom[CurSize - 1])), buffer);
CurSize += ReqSize + 1;
}
((LPTSTR)(ToDelete.pFrom))[CurSize - 1] = L'\0';
free(buffer);
SHFileOperation(&ToDelete);
free((void *)(ToDelete.pFrom));
}
DragFinish((HDROP)wParam);
return 0; //An application should return zero if it processes this message.
}
return ((WNDPROC)DefaultWndProc)(hWnd, uMsg, wParam, lParam);
//return CallWindowProc((WNDPROC)DefaultWndProc, hWnd, uMsg, wParam, lParam); // causing crash ?
}
PLUGIN_EXPORT void Initialize(void** data, void* rm)
{
Measure* measure = new Measure;
*data = measure;
grm = rm;
measure->SkinHWND = RmGetSkinWindow(rm);
RmLogF(rm, LOG_DEBUG, L"HWND == %x (INIT)", measure->SkinHWND);
if (measure->SkinHWND)
{
if (DefaultWndProc = GetWindowLongPtr(measure->SkinHWND, GWLP_WNDPROC))
{
RmLogF(rm, LOG_DEBUG, L"DefaultWndProc == %x (INIT)", DefaultWndProc);
SetWindowLongPtr(measure->SkinHWND, GWLP_WNDPROC, (LONG_PTR)DragWndProc);
DragAcceptFiles(measure->SkinHWND, true);
}
}
}
PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue)
{
Measure* measure = (Measure*)data;
//confirm = RmReadInt(rm, L"Confirm", 0) > 0 ? true : false;
// I think using 0/1 instead of TRUE /FALSE will be better, depending on you.
if (_wcsicmp(RmReadString(rm, L"Confirm", L"FALSE"), L"TRUE") == 0)
{
confirm = true;
}
else
{
confirm = false;
}
RmLogF(rm, LOG_DEBUG, L"confirm == %ls (RELOAD)", confirm ? L"true" : L"false");
RmLogF(rm, LOG_DEBUG, L"D&D: Reload completed");
}
PLUGIN_EXPORT double Update(void* data)
{
Measure* measure = (Measure*)data;
return 0.0;
}
PLUGIN_EXPORT void Finalize(void* data)
{
Measure* measure = (Measure*)data;
RmLogF(grm, LOG_DEBUG, L"Entered finalize! DefaultWndProc = %x, SkinHWND = %x", DefaultWndProc, measure->SkinHWND);
DragAcceptFiles(measure->SkinHWND, false);
SetWindowLongPtr(measure->SkinHWND, GWLP_WNDPROC, (LONG_PTR)DefaultWndProc);
delete measure;
}