15 #ifdef WITH_GHOST_DEBUG
17 void printLastError(
void);
21 : m_window(window), m_system(system)
42 if (riid == IID_IUnknown || riid == IID_IDropTarget) {
44 *ppvObj = (
void *)
this;
59 return ::InterlockedIncrement(&m_cRef);
67 ULONG refs = ::InterlockedDecrement(&m_cRef);
88 *pdwEffect = DROPEFFECT_NONE;
90 m_draggedObjectType = getGhostType(pDataObject);
102 *pdwEffect = allowedDropEffect(*pdwEffect);
105 *pdwEffect = DROPEFFECT_NONE;
134 void *
data = getGhostData(pDataObject);
136 *pdwEffect = allowedDropEffect(*pdwEffect);
139 *pdwEffect = DROPEFFECT_NONE;
153 DWORD GHOST_DropTargetWin32::allowedDropEffect(DWORD dwAllowed)
155 DWORD dwEffect = DROPEFFECT_NONE;
156 if (dwAllowed & DROPEFFECT_COPY)
157 dwEffect = DROPEFFECT_COPY;
168 FORMATETC fmtetc = {CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
169 if (pDataObject->QueryGetData(&fmtetc) == S_OK) {
174 fmtetc.cfFormat = CF_HDROP;
175 if (pDataObject->QueryGetData(&fmtetc) == S_OK) {
182 void *GHOST_DropTargetWin32::getGhostData(IDataObject *pDataObject)
187 return getDropDataAsFilenames(pDataObject);
190 return getDropDataAsString(pDataObject);
196 #ifdef WITH_GHOST_DEBUG
197 ::printf(
"\nGHOST_kDragnDropTypeUnknown");
205 void *GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject *pDataObject)
207 UINT totfiles, nvalid = 0;
208 WCHAR fpath[MAX_PATH];
211 FORMATETC fmtetc = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
217 if (pDataObject->QueryGetData(&fmtetc) == S_OK) {
218 if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK) {
219 hdrop = (HDROP)::GlobalLock(stgmed.hGlobal);
221 totfiles = ::DragQueryFileW(hdrop, -1,
NULL, 0);
223 ::GlobalUnlock(stgmed.hGlobal);
231 for (
UINT nfile = 0; nfile < totfiles; nfile++) {
232 if (::DragQueryFileW(hdrop, nfile, fpath, MAX_PATH) > 0) {
239 strArray->
count = nvalid + 1;
244 ::GlobalUnlock(stgmed.hGlobal);
245 ::ReleaseStgMedium(&stgmed);
253 void *GHOST_DropTargetWin32::getDropDataAsString(IDataObject *pDataObject)
256 FORMATETC fmtetc = {CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
261 if (pDataObject->QueryGetData(&fmtetc) == S_OK) {
262 if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK) {
263 LPCWSTR wstr = (LPCWSTR)::GlobalLock(stgmed.hGlobal);
265 ::GlobalUnlock(stgmed.hGlobal);
269 ::GlobalUnlock(stgmed.hGlobal);
270 ::ReleaseStgMedium(&stgmed);
271 #ifdef WITH_GHOST_DEBUG
272 ::printf(
"\n<converted droped unicode string>\n%s\n</droped converted unicode string>\n",
279 fmtetc.cfFormat = CF_TEXT;
281 if (pDataObject->QueryGetData(&fmtetc) == S_OK) {
282 if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK) {
283 char *
str = (
char *)::GlobalLock(stgmed.hGlobal);
285 tmp_string = (
char *)::malloc(::strlen(
str) + 1);
287 ::GlobalUnlock(stgmed.hGlobal);
291 if (!::strcpy(tmp_string,
str)) {
293 ::GlobalUnlock(stgmed.hGlobal);
297 ::GlobalUnlock(stgmed.hGlobal);
298 ::ReleaseStgMedium(&stgmed);
307 int GHOST_DropTargetWin32::WideCharToANSI(LPCWSTR in,
char *&
out)
313 size = ::WideCharToMultiByte(CP_ACP,
323 #ifdef WITH_GHOST_DEBUG
331 ::printf(
"\nmalloc failed!!!");
338 #ifdef WITH_GHOST_DEBUG
347 #ifdef WITH_GHOST_DEBUG
348 void printLastError(
void)
353 err = GetLastError();
354 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
361 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
typedef UINT(API *GHOST_WIN32_GetDpiForWindow)(HWND)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
HRESULT __stdcall DragLeave(void)
HRESULT __stdcall QueryInterface(REFIID riid, void **ppvObj)
HRESULT __stdcall DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
HRESULT __stdcall DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
GHOST_DropTargetWin32(GHOST_WindowWin32 *window, GHOST_SystemWin32 *system)
ULONG __stdcall AddRef(void)
ULONG __stdcall Release(void)
HRESULT __stdcall Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, GHOST_WindowWin32 *window, int mouseX, int mouseY, void *data)
bool canAcceptDragOperation() const
void setAcceptDragOperation(bool canAccept)
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
char * alloc_utf_8_from_16(const wchar_t *in16, size_t add)