16#ifdef WITH_GHOST_DEBUG
18void printLastError(
void);
22 : window_(window), system_(system)
42 if (riid == IID_IUnknown || riid == IID_IDropTarget) {
44 *ppv_obj = (
void *)
this;
57 return ::InterlockedIncrement(&c_ref_);
65 ULONG refs = ::InterlockedDecrement(&c_ref_);
85 window_->setAcceptDragOperation(
true);
86 *pdw_effect = DROPEFFECT_NONE;
88 dragged_object_type_ = getGhostType(p_data_object);
89 system_->pushDragDropEvent(
101 if (window_->canAcceptDragOperation()) {
102 *pdw_effect = allowedDropEffect(*pdw_effect);
105 *pdw_effect = DROPEFFECT_NONE;
109 system_->pushDragDropEvent(
119 system_->pushDragDropEvent(
134 void *
data = getGhostData(p_data_object);
135 if (window_->canAcceptDragOperation()) {
136 *pdw_effect = allowedDropEffect(*pdw_effect);
139 *pdw_effect = DROPEFFECT_NONE;
142 system_->pushDragDropEvent(
153DWORD GHOST_DropTargetWin32::allowedDropEffect(DWORD dw_allowed)
155 DWORD dw_effect = DROPEFFECT_NONE;
156 if (dw_allowed & DROPEFFECT_COPY) {
157 dw_effect = DROPEFFECT_COPY;
166 FORMATETC fmtetc = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
167 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
175 fmtetc.cfFormat = CF_UNICODETEXT;
176 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
180 fmtetc.cfFormat = CF_TEXT;
181 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
188void *GHOST_DropTargetWin32::getGhostData(IDataObject *p_data_object)
193 return getDropDataAsFilenames(p_data_object);
195 return getDropDataAsString(p_data_object);
200#ifdef WITH_GHOST_DEBUG
201 ::printf(
"\nGHOST_kDragnDropTypeUnknown");
208void *GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject *p_data_object)
210 GHOST_TStringArray *str_array =
nullptr;
211 FORMATETC fmtetc = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
215 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
217 if (p_data_object->GetData(&fmtetc, &stgmed) == S_OK) {
218 const HDROP hdrop = (HDROP)::GlobalLock(stgmed.hGlobal);
220 const uint totfiles = ::DragQueryFileW(hdrop, -1,
nullptr, 0);
222 str_array = (GHOST_TStringArray *)::malloc(
sizeof(GHOST_TStringArray));
223 str_array->
count = 0;
224 str_array->
strings = (
uint8_t **)::malloc(totfiles *
sizeof(uint8_t *));
226 for (
uint nfile = 0; nfile < totfiles; nfile++) {
227 WCHAR fpath[MAX_PATH];
228 if (::DragQueryFileW(hdrop, nfile, fpath, MAX_PATH) > 0) {
239 ::GlobalUnlock(stgmed.hGlobal);
240 ::ReleaseStgMedium(&stgmed);
246void *GHOST_DropTargetWin32::getDropDataAsString(IDataObject *p_data_object)
249 FORMATETC fmtetc = {CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
254 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
255 if (p_data_object->GetData(&fmtetc, &stgmed) == S_OK) {
256 LPCWSTR wstr = (LPCWSTR)::GlobalLock(stgmed.hGlobal);
261 ::GlobalUnlock(stgmed.hGlobal);
262 ::ReleaseStgMedium(&stgmed);
264#ifdef WITH_GHOST_DEBUG
266 ::printf(
"\n<converted droped unicode string>\n%s\n</droped converted unicode string>\n",
274 fmtetc.cfFormat = CF_TEXT;
276 if (p_data_object->QueryGetData(&fmtetc) == S_OK) {
277 if (p_data_object->GetData(&fmtetc, &stgmed) == S_OK) {
278 char *
str = (
char *)::GlobalLock(stgmed.hGlobal);
279 int str_size = ::strlen(
str) + 1;
281 tmp_string = (
char *)::malloc(str_size);
283 ::memcpy(tmp_string,
str, str_size);
286 ::GlobalUnlock(stgmed.hGlobal);
287 ::ReleaseStgMedium(&stgmed);
296int GHOST_DropTargetWin32::WideCharToANSI(LPCWSTR
in,
char *&
out)
302 size = ::WideCharToMultiByte(CP_ACP,
312#ifdef WITH_GHOST_DEBUG
324 size = ::WideCharToMultiByte(CP_ACP, 0x00000400,
in, -1, (LPSTR)
out,
size,
nullptr,
nullptr);
327#ifdef WITH_GHOST_DEBUG
336#ifdef WITH_GHOST_DEBUG
337void printLastError(
void)
342 err = GetLastError();
343 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
351 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
BMesh const char void * data
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)
char * alloc_utf_8_from_16(const wchar_t *in16, size_t add)