7 #include "Ecore_Win32.h"
8 #include "ecore_win32_private.h"
11 static int _ecore_win32_dnd_init_count = 0;
13 static HANDLE DataToHandle(const char *data, int size)
16 ptr = (char *)GlobalAlloc(GMEM_FIXED, size);
17 memcpy(ptr, data, size);
23 ecore_win32_dnd_init()
25 if (_ecore_win32_dnd_init_count > 0)
27 _ecore_win32_dnd_init_count++;
28 return _ecore_win32_dnd_init_count;
31 if (OleInitialize(NULL) != S_OK)
34 _ecore_win32_dnd_init_count++;
36 return _ecore_win32_dnd_init_count;
39 int ecore_win32_dnd_shutdown()
41 _ecore_win32_dnd_init_count--;
42 if (_ecore_win32_dnd_init_count > 0) return _ecore_win32_dnd_init_count;
46 if (_ecore_win32_dnd_init_count < 0) _ecore_win32_dnd_init_count = 0;
48 return _ecore_win32_dnd_init_count;
51 int ecore_win32_dnd_begin(const char *data,
54 IDataObject *pDataObject = NULL;
55 IDropSource *pDropSource = NULL;
56 FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
57 STGMEDIUM stgmed = { TYMED_HGLOBAL, { 0 }, 0 };
63 size = strlen(data) + 1;
65 stgmed.hGlobal = DataToHandle(data, size);
67 // create the data object
68 pDataObject = (IDataObject *)_ecore_win32_dnd_data_object_new((void *)&fmtetc,
71 pDropSource = (IDropSource *)_ecore_win32_dnd_drop_source_new();
73 if (pDataObject && pDropSource)
76 DWORD dwEffect = DROPEFFECT_COPY;
79 dwResult = DoDragDrop(pDataObject, pDropSource, DROPEFFECT_COPY, &dwEffect);
81 // finished. Check the return values to see if we need to do anything else
82 if (dwResult == DRAGDROP_S_DROP)
84 //printf(">>> \"%s\" Dropped <<<\n", str);
85 if(dwEffect == DROPEFFECT_MOVE)
87 // remove the data we just dropped from active document
90 //else if (dwResult == DRAGDROP_S_CANCEL)
91 // printf("DND cancelled\n");
93 // printf("DND error\n");
98 _ecore_win32_dnd_data_object_free(pDataObject);
99 _ecore_win32_dnd_drop_source_free(pDropSource);
102 ReleaseStgMedium(&stgmed);
106 int ecore_win32_dnd_register_drop_target(Ecore_Win32_Window *window,
107 Ecore_Win32_Dnd_DropTarget_Callback callback)
109 struct _Ecore_Win32_Window *wnd = (struct _Ecore_Win32_Window *)window;
114 wnd->dnd_drop_target = _ecore_win32_dnd_register_drop_window(wnd->window,
117 return (int)(!!wnd->dnd_drop_target);
120 void ecore_win32_dnd_unregister_drop_target(Ecore_Win32_Window *window)
122 struct _Ecore_Win32_Window *wnd = (struct _Ecore_Win32_Window *)window;
127 if (wnd->dnd_drop_target)
128 _ecore_win32_dnd_unregister_drop_window(wnd->window, wnd->dnd_drop_target);