2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
11 #include "Ecore_Win32.h"
12 #include "ecore_win32_private.h"
15 static int _ecore_win32_dnd_init_count = 0;
17 static HANDLE DataToHandle(const char *data, int size)
20 ptr = (char *)GlobalAlloc(GMEM_FIXED, size);
21 memcpy(ptr, data, size);
27 ecore_win32_dnd_init()
29 if (_ecore_win32_dnd_init_count > 0)
31 _ecore_win32_dnd_init_count++;
32 return _ecore_win32_dnd_init_count;
35 if (OleInitialize(NULL) != S_OK)
38 _ecore_win32_dnd_init_count++;
40 return _ecore_win32_dnd_init_count;
43 int ecore_win32_dnd_shutdown()
45 _ecore_win32_dnd_init_count--;
46 if (_ecore_win32_dnd_init_count > 0) return _ecore_win32_dnd_init_count;
50 if (_ecore_win32_dnd_init_count < 0) _ecore_win32_dnd_init_count = 0;
52 return _ecore_win32_dnd_init_count;
55 int ecore_win32_dnd_begin(const char *data,
58 IDataObject *pDataObject = NULL;
59 IDropSource *pDropSource = NULL;
60 FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
61 STGMEDIUM stgmed = { TYMED_HGLOBAL, { 0 }, 0 };
67 size = strlen(data) + 1;
69 stgmed.hGlobal = DataToHandle(data, size);
71 // create the data object
72 pDataObject = (IDataObject *)_ecore_win32_dnd_data_object_new((void *)&fmtetc,
75 pDropSource = (IDropSource *)_ecore_win32_dnd_drop_source_new();
77 if (pDataObject && pDropSource)
80 DWORD dwEffect = DROPEFFECT_COPY;
83 dwResult = DoDragDrop(pDataObject, pDropSource, DROPEFFECT_COPY, &dwEffect);
85 // finished. Check the return values to see if we need to do anything else
86 if (dwResult == DRAGDROP_S_DROP)
88 //printf(">>> \"%s\" Dropped <<<\n", str);
89 if(dwEffect == DROPEFFECT_MOVE)
91 // remove the data we just dropped from active document
94 //else if (dwResult == DRAGDROP_S_CANCEL)
95 // printf("DND cancelled\n");
97 // printf("DND error\n");
102 _ecore_win32_dnd_data_object_free(pDataObject);
103 _ecore_win32_dnd_drop_source_free(pDropSource);
106 ReleaseStgMedium(&stgmed);
110 int ecore_win32_dnd_register_drop_target(Ecore_Win32_Window *window,
111 Ecore_Win32_Dnd_DropTarget_Callback callback)
113 struct _Ecore_Win32_Window *wnd = (struct _Ecore_Win32_Window *)window;
118 wnd->dnd_drop_target = _ecore_win32_dnd_register_drop_window(wnd->window,
121 return (int)(wnd->dnd_drop_target != NULL);
124 void ecore_win32_dnd_unregister_drop_target(Ecore_Win32_Window *window)
126 struct _Ecore_Win32_Window *wnd = (struct _Ecore_Win32_Window *)window;
131 if (wnd->dnd_drop_target != NULL)
132 _ecore_win32_dnd_unregister_drop_window(wnd->window, wnd->dnd_drop_target);