source: trunk/src/user32/oslibdnd.cpp@ 21928

Last change on this file since 21928 was 21928, checked in by dmik, 14 years ago

Fix crash when doing drag & drop.

This is a regression after switching to GCC: tmpnam() returns
forward slashes, while the code expected backward ones.

File size: 7.9 KB
Line 
1/* $Id: oslibdnd.cpp,v 1.1 2003-07-28 11:28:10 sandervl Exp $ */
2/*
3 * Window Drag and Drop functions for OS/2
4 *
5 *
6 * Copyright 2003 Sander van Leeuwen (sandervl@innotek.de)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#define INCL_WIN
13#define INCL_WINSTDDRAG
14#define INCL_PM
15#include <os2wrap.h>
16#include <stdlib.h>
17#include <string.h>
18#include <stdio.h>
19
20#include <dbglog.h>
21#include <winconst.h>
22#include <win32api.h>
23#include <winuser32.h>
24
25#include "oslibdnd.h"
26
27static char *pszFile = NULL;
28static HWND hwndTarget = 0;
29static PDRAGINFO curDragInfo = NULL;
30static char *pszCurDragData = NULL;
31
32#if 0
33 FILE *tmpfile;
34 tmpfile = fopen(pszFile, "wb+");
35 fwrite(lpszDnDString, 1, strlen(lpszDnDString)+1, tmpfile);
36 fclose(tmpfile);
37#endif
38//******************************************************************************
39//******************************************************************************
40LPVOID OSLibCreateDragStruct(HWND hwndWin32, DWORD x, DWORD y, LPSTR lpszDnDString)
41{
42 PDRAGINFO pdinfo; /* Pointer to DRAGINFO structure */
43 HWND hwnd; /* Handle of calling (source) window */
44 BOOL flResult; /* Result indicator */
45 DRAGITEM ditem; /* DRAGITEM structure */
46 RECTL rectl;
47 ULONG ScreenHeight;
48
49 WinQueryWindowRect(HWND_DESKTOP, &rectl);
50 ScreenHeight = rectl.yTop;
51
52 pdinfo = DrgAllocDraginfo(1); /* Create the DRAGINFO structure */
53 /* Set the drag item */
54 if(pdinfo == NULL) {
55 dprintf(("DrgAllocDraginfo FAILED!!"));
56 return NULL;
57 }
58 pdinfo->usOperation = DO_DEFAULT;
59 pdinfo->hwndSource = Win32ToOS2Handle(hwndWin32);
60 pdinfo->xDrop = x;
61 pdinfo->yDrop = ScreenHeight - y;
62
63 char szDir[CCHMAXPATH*4];
64
65 pszFile = tempnam(0, 0);
66 if(pszFile == NULL) {
67 DebugInt3();
68 DrgFreeDraginfo(pdinfo);
69 return NULL;
70 }
71
72 strcpy(szDir, pszFile);
73
74 char *tmp = strrchr(szDir, '\\');
75 if (!tmp)
76 tmp = strrchr(szDir, '/');
77 if (!tmp) {
78 DebugInt3();
79 free(pszFile);
80 DrgFreeDraginfo(pdinfo);
81 return NULL;
82 }
83
84 *tmp = 0;
85 tmp++;
86
87 dprintf(("temporary file %s", pszFile));
88
89 strcat(szDir, "\\");
90
91 ditem.hwndItem = pdinfo->hwndSource;
92 ditem.ulItemID = 0;
93 ditem.hstrType = DrgAddStrHandle(DRT_TEXT);
94 ditem.hstrRMF = DrgAddStrHandle("<DRM_OS2FILE, DRF_TEXT>");
95 ditem.hstrContainerName = DrgAddStrHandle(szDir);
96 ditem.hstrSourceName = 0; //done during rendering
97 ditem.hstrTargetName = 0;
98 ditem.cxOffset = 0;
99 ditem.cyOffset = 0;
100 ditem.fsControl = 0;
101 ditem.fsSupportedOps = DO_COPYABLE | DO_MOVEABLE;
102
103 flResult= DrgSetDragitem(pdinfo, &ditem, (ULONG)sizeof(ditem), 0);
104 if(!flResult) dprintf(("DrgSetDragitem failed for %x", &ditem));
105
106 return pdinfo;
107}
108//******************************************************************************
109//******************************************************************************
110void OSLibFreeDragStruct(LPVOID lpDragStruct)
111{
112 PDRAGINFO pdinfo = (PDRAGINFO)lpDragStruct;
113 BOOL flResult; /* Result indicator */
114
115 flResult = DrgDeleteDraginfoStrHandles(pdinfo);
116 if(!flResult) dprintf(("DrgDeleteDraginfoStrHandles failed for %x", lpDragStruct));
117
118 flResult = DrgFreeDraginfo(pdinfo);
119 if(!flResult) dprintf(("DrgFreeDragInfo failed for %x", lpDragStruct));
120
121 return;
122}
123//******************************************************************************
124//******************************************************************************
125DWORD OSLibDragOver(LPVOID lpDragStruct, DWORD x, DWORD y)
126{
127 PDRAGINFO pdinfo = (PDRAGINFO)lpDragStruct;
128 RECTL rectl;
129 ULONG ScreenHeight, ret;
130 HWND hwnd;
131 POINTL pointl;
132
133 WinQueryWindowRect(HWND_DESKTOP, &rectl);
134 ScreenHeight = rectl.yTop;
135
136 pdinfo->xDrop = x;
137 pdinfo->yDrop = ScreenHeight - y;
138
139 pointl.x = pdinfo->xDrop;
140 pointl.y = pdinfo->yDrop;
141 hwnd = WinWindowFromPoint(HWND_DESKTOP, &pointl, TRUE);
142 if(hwnd == 0) return DROPEFFECT_NONE_W;
143
144 if(hwnd != hwndTarget) {
145 OSLibDragLeave(lpDragStruct);
146 }
147 hwndTarget = hwnd;
148
149 dprintf(("Post DM_DRAGOVER to %x (%x)", OS2ToWin32Handle(hwnd), hwnd));
150 ret = (ULONG)WinSendMsg(hwnd, DM_DRAGOVER, (MPARAM)pdinfo, MPFROM2SHORT(pdinfo->xDrop, pdinfo->yDrop));
151
152 if(LOWORD(ret) != DOR_DROP) {
153 return DROPEFFECT_NONE_W;
154 }
155 if(HIWORD(ret) == DO_LINK) {
156 return DROPEFFECT_LINK_W;
157 }
158 if(HIWORD(ret) == DO_MOVE) {
159 return DROPEFFECT_MOVE_W;
160 }
161 return DROPEFFECT_COPY_W;
162}
163//******************************************************************************
164//******************************************************************************
165DWORD OSLibDragLeave(LPVOID lpDragStruct)
166{
167 PDRAGINFO pdinfo = (PDRAGINFO)lpDragStruct;
168 ULONG ret;
169
170 if(hwndTarget) {
171 dprintf(("Post DM_DRAGLEAVE to %x (%x)", OS2ToWin32Handle(hwndTarget), hwndTarget));
172 ret = (ULONG)WinSendMsg(hwndTarget, DM_DRAGLEAVE, (MPARAM)pdinfo, 0);
173 }
174 return DROPEFFECT_NONE_W;
175}
176//******************************************************************************
177//******************************************************************************
178DWORD OSLibDragDrop(LPVOID lpDragStruct, DWORD x, DWORD y, LPSTR lpszDnDString)
179{
180 PDRAGINFO pdinfo = (PDRAGINFO)lpDragStruct;
181 RECTL rectl;
182 ULONG ScreenHeight, ret;
183 HWND hwnd;
184 POINTL pointl;
185
186 WinQueryWindowRect(HWND_DESKTOP, &rectl);
187 ScreenHeight = rectl.yTop;
188
189 pdinfo->xDrop = x;
190 pdinfo->yDrop = ScreenHeight - y;
191
192 pointl.x = pdinfo->xDrop;
193 pointl.y = pdinfo->yDrop;
194 hwnd = WinWindowFromPoint(HWND_DESKTOP, &pointl, TRUE);
195 if(hwnd == 0) return DROPEFFECT_NONE_W;
196
197 hwndTarget = hwnd;
198 curDragInfo = pdinfo;
199 pszCurDragData = lpszDnDString;
200
201 dprintf(("dnd data %s", pszCurDragData));
202
203 ret = (ULONG)WinSendMsg(hwnd, DM_DROP, (MPARAM)pdinfo, 0);
204
205 pszCurDragData = NULL;
206 curDragInfo = NULL;
207 hwndTarget = 0;
208 return DROPEFFECT_COPY_W;
209}
210//******************************************************************************
211//******************************************************************************
212BOOL OSLibRenderFormat(PDRAGTRANSFER pDragTransfer)
213{
214 PDRAGITEM pDragItem = pDragTransfer->pditem;
215 int size = 0, ulBytes;
216 char *tmp;
217
218#ifdef DEBUG
219 size = DrgQueryStrNameLen(pDragTransfer->hstrSelectedRMF);
220 tmp = (char *)malloc(size+2);
221 if(tmp == NULL) {
222 DebugInt3();
223 return FALSE;
224 }
225 size = DrgQueryStrName(pDragTransfer->hstrSelectedRMF, size+1, tmp);
226 dprintf(("Rendering method %s", tmp));
227 free(tmp);
228#endif
229
230 size = DrgQueryStrNameLen(pDragTransfer->hstrRenderToName);
231 tmp = (char *)malloc(size+2);
232 if(tmp == NULL) {
233 DebugInt3();
234 return FALSE;
235 }
236 size = DrgQueryStrName(pDragTransfer->hstrRenderToName, size+1, tmp);
237
238 dprintf(("Render to file %s", tmp));
239
240 dprintf(("dnd data %s", pszCurDragData));
241
242 FILE *tmpfile;
243 tmpfile = fopen(tmp, "wb+");
244 fwrite(pszCurDragData, 1, strlen(pszCurDragData), tmpfile);
245 fclose(tmpfile);
246
247 DrgPostTransferMsg(pDragTransfer->hwndClient, DM_RENDERCOMPLETE, pDragTransfer,
248 DMFL_RENDEROK, 0, TRUE);
249
250 DrgFreeDragtransfer(pDragTransfer);
251 free(tmp);
252 return TRUE;
253}
254//******************************************************************************
255//******************************************************************************
256ULONG OSLibEndConversation()
257{
258 return 0;
259}
260//******************************************************************************
261//******************************************************************************
Note: See TracBrowser for help on using the repository browser.