16#ifdef WITH_GHOST_DEBUG
18void printLastError(
void);
22 : m_window(window), m_system(system)
42 if (riid == IID_IUnknown || riid == IID_IDropTarget) {
44 *ppv_obj = (
void *)
this;
57 return ::InterlockedIncrement(&m_cRef);
65 ULONG refs = ::InterlockedDecrement(&m_cRef);
86 *pdw_effect = DROPEFFECT_NONE;
88 m_draggedObjectType = getGhostType(p_data_object);
102 *pdw_effect = allowedDropEffect(*pdw_effect);
105 *pdw_effect = DROPEFFECT_NONE;
134 void *data = getGhostData(p_data_object);
136 *pdw_effect = allowedDropEffect(*pdw_effect);
139 *pdw_effect = DROPEFFECT_NONE;
153DWORD GHOST_DropTargetWin32::allowedDropEffect(DWORD dw_allowed)
155 DWORD dw_effect = DROPEFFECT_NONE;
156 if (dw_allowed & DROPEFFECT_COPY) {
157 dw_effect = DROPEFFECT_COPY;
168 FORMATETC fmtetc = {CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
169 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
174 fmtetc.cfFormat = CF_HDROP;
175 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
182void *GHOST_DropTargetWin32::getGhostData(IDataObject *p_data_object)
187 return getDropDataAsFilenames(p_data_object);
189 return getDropDataAsString(p_data_object);
194#ifdef WITH_GHOST_DEBUG
195 ::printf(
"\nGHOST_kDragnDropTypeUnknown");
202void *GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject *p_data_object)
205 FORMATETC fmtetc = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
209 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
211 if (p_data_object->GetData(&fmtetc, &stgmed) == S_OK) {
212 const HDROP hdrop = (HDROP)::GlobalLock(stgmed.hGlobal);
214 const uint totfiles = ::DragQueryFileW(hdrop, -1,
nullptr, 0);
217 str_array->
count = 0;
220 for (
uint nfile = 0; nfile < totfiles; nfile++) {
221 WCHAR fpath[MAX_PATH];
222 if (::DragQueryFileW(hdrop, nfile, fpath, MAX_PATH) > 0) {
233 ::GlobalUnlock(stgmed.hGlobal);
234 ::ReleaseStgMedium(&stgmed);
240void *GHOST_DropTargetWin32::getDropDataAsString(IDataObject *p_data_object)
243 FORMATETC fmtetc = {CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
248 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
249 if (p_data_object->GetData(&fmtetc, &stgmed) == S_OK) {
250 LPCWSTR wstr = (LPCWSTR)::GlobalLock(stgmed.hGlobal);
255 ::GlobalUnlock(stgmed.hGlobal);
256 ::ReleaseStgMedium(&stgmed);
258#ifdef WITH_GHOST_DEBUG
260 ::printf(
"\n<converted droped unicode string>\n%s\n</droped converted unicode string>\n",
268 fmtetc.cfFormat = CF_TEXT;
270 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
271 if (p_data_object->GetData(&fmtetc, &stgmed) == S_OK) {
272 char *
str = (
char *)::GlobalLock(stgmed.hGlobal);
273 int str_size = ::strlen(
str) + 1;
275 tmp_string = (
char *)::malloc(str_size);
277 ::memcpy(tmp_string,
str, str_size);
280 ::GlobalUnlock(stgmed.hGlobal);
281 ::ReleaseStgMedium(&stgmed);
290int GHOST_DropTargetWin32::WideCharToANSI(LPCWSTR in,
char *&out)
296 size = ::WideCharToMultiByte(CP_ACP,
306#ifdef WITH_GHOST_DEBUG
312 out = (
char *)::malloc(size);
318 size = ::WideCharToMultiByte(CP_ACP, 0x00000400, in, -1, (LPSTR)out, size,
nullptr,
nullptr);
321#ifdef WITH_GHOST_DEBUG
330#ifdef WITH_GHOST_DEBUG
331void printLastError(
void)
336 err = GetLastError();
337 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
345 printf(
"\nLastError: (%d) %s\n",
int(err), s);
void BLI_kdtree_nd_ free(KDTree *tree)
@ GHOST_kEventDraggingDropDone
@ GHOST_kEventDraggingExited
@ GHOST_kEventDraggingUpdated
@ GHOST_kEventDraggingEntered
@ GHOST_kDragnDropTypeUnknown
@ GHOST_kDragnDropTypeFilenames
@ GHOST_kDragnDropTypeBitmap
@ GHOST_kDragnDropTypeString
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv_obj)
ULONG __stdcall Release()
HRESULT __stdcall DragEnter(IDataObject *p_data_object, DWORD grf_key_state, POINTL pt, DWORD *pdw_effect)
HRESULT __stdcall DragLeave()
HRESULT __stdcall Drop(IDataObject *p_data_object, DWORD grf_key_state, POINTL pt, DWORD *pdw_effect)
GHOST_DropTargetWin32(GHOST_WindowWin32 *window, GHOST_SystemWin32 *system)
HRESULT __stdcall DragOver(DWORD grf_key_state, POINTL pt, DWORD *pdw_effect)
static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, GHOST_WindowWin32 *window, int mouseX, int mouseY, void *data)
bool canAcceptDragOperation() const override
void setAcceptDragOperation(bool canAccept) override
char * alloc_utf_8_from_16(const wchar_t *in16, size_t add)