Advertisement
Guest User

NI drag and drop patch for wine

a guest
Apr 13th, 2014
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.82 KB | None | 0 0
  1. --- wine-1.7.14/dlls/ole32/ole2.c.orig 2011-12-08 14:44:37.811271736 -0800
  2. +++ wine-1.7.14/dlls/ole32/ole2.c 2011-12-08 14:45:46.934191902 -0800
  3. @@ -158,6 +158,7 @@
  4. static void OLEDD_Initialize(void);
  5. static LRESULT WINAPI OLEDD_DragTrackerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  6. static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo);
  7. +static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo);
  8. static DWORD OLEDD_GetButtonState(void);
  9.  
  10. /******************************************************************************
  11. @@ -2198,6 +2199,19 @@
  12. }
  13. case WM_TIMER:
  14. case WM_MOUSEMOVE:
  15. + {
  16. + TrackerWindowInfo* p = (TrackerWindowInfo*)GetWindowLongPtrA(hwnd, 0);
  17. + if (!p->trackingDone)
  18. + {
  19. + p->dwKeyState = OLEDD_GetButtonState();
  20. + if (p->dwKeyState & MK_LBUTTON)
  21. + OLEDD_TrackMouseMove(p);
  22. + else
  23. + OLEDD_TrackStateChange(p);
  24. + }
  25. +
  26. + break;
  27. + }
  28. case WM_LBUTTONUP:
  29. case WM_MBUTTONUP:
  30. case WM_RBUTTONUP:
  31. @@ -2222,6 +2236,158 @@
  32. }
  33.  
  34. /***
  35. + * OLEDD_TrackMouseMove()
  36. + *
  37. + * This method is invoked while a drag and drop operation is in effect.
  38. + * it will generate the appropriate callbacks in the drop source
  39. + * and drop target. It will also provide the expected feedback to
  40. + * the user.
  41. + *
  42. + * params:
  43. + * trackerInfo - Pointer to the structure identifying the
  44. + * drag & drop operation that is currently
  45. + * active.
  46. + */
  47. + static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
  48. + {
  49. + HWND hwndNewTarget = 0;
  50. + HRESULT hr = S_OK;
  51. + POINT pt;
  52. +
  53. + /*
  54. + * Get the handle of the window under the mouse
  55. + */
  56. + pt.x = trackerInfo->curMousePos.x;
  57. + pt.y = trackerInfo->curMousePos.y;
  58. + hwndNewTarget = WindowFromPoint(pt);
  59. +
  60. + /*
  61. + * Every time, we re-initialize the effects passed to the
  62. + * IDropTarget to the effects allowed by the source.
  63. + */
  64. + *trackerInfo->pdwEffect = trackerInfo->dwOKEffect;
  65. +
  66. + /*
  67. + * If we are hovering over the same target as before, send the
  68. + * DragOver notification
  69. + */
  70. + if ( (trackerInfo->curDragTarget != 0) &&
  71. + (trackerInfo->curTargetHWND == hwndNewTarget) )
  72. + {
  73. + IDropTarget_DragOver(trackerInfo->curDragTarget,
  74. + trackerInfo->dwKeyState,
  75. + trackerInfo->curMousePos,
  76. + trackerInfo->pdwEffect);
  77. + }
  78. + else
  79. + {
  80. + /*
  81. + * If we changed window, we have to notify our old target and check for
  82. + * the new one.
  83. + */
  84. + if (trackerInfo->curDragTarget)
  85. + IDropTarget_DragLeave(trackerInfo->curDragTarget);
  86. +
  87. + /*
  88. + * Make sure we're hovering over a window.
  89. + */
  90. + if (hwndNewTarget)
  91. + {
  92. + /*
  93. + * Find-out if there is a drag target under the mouse
  94. + */
  95. + HWND next_target_wnd = hwndNewTarget;
  96. +
  97. + trackerInfo->curTargetHWND = hwndNewTarget;
  98. +
  99. + while (next_target_wnd && !is_droptarget(next_target_wnd))
  100. + next_target_wnd = GetParent(next_target_wnd);
  101. +
  102. + if (next_target_wnd) hwndNewTarget = next_target_wnd;
  103. +
  104. + trackerInfo->curDragTargetHWND = hwndNewTarget;
  105. + if(trackerInfo->curDragTarget) IDropTarget_Release(trackerInfo->curDragTarget);
  106. + trackerInfo->curDragTarget = get_droptarget_pointer(hwndNewTarget);
  107. +
  108. + /*
  109. + * If there is, notify it that we just dragged-in
  110. + */
  111. + if (trackerInfo->curDragTarget)
  112. + {
  113. + hr = IDropTarget_DragEnter(trackerInfo->curDragTarget,
  114. + trackerInfo->dataObject,
  115. + trackerInfo->dwKeyState,
  116. + trackerInfo->curMousePos,
  117. + trackerInfo->pdwEffect);
  118. +
  119. + /* failed DragEnter() means invalid target */
  120. + if (hr != S_OK)
  121. + {
  122. + trackerInfo->curDragTargetHWND = 0;
  123. + trackerInfo->curTargetHWND = 0;
  124. + IDropTarget_Release(trackerInfo->curDragTarget);
  125. + trackerInfo->curDragTarget = 0;
  126. + }
  127. + }
  128. + }
  129. + else
  130. + {
  131. + /*
  132. + * The mouse is not over a window so we don't track anything.
  133. + */
  134. + trackerInfo->curDragTargetHWND = 0;
  135. + trackerInfo->curTargetHWND = 0;
  136. + if(trackerInfo->curDragTarget) IDropTarget_Release(trackerInfo->curDragTarget);
  137. + trackerInfo->curDragTarget = 0;
  138. + }
  139. + }
  140. +
  141. + /*
  142. + * Now that we have done that, we have to tell the source to give
  143. + * us feedback on the work being done by the target. If we don't
  144. + * have a target, simulate no effect.
  145. + */
  146. + if (trackerInfo->curDragTarget==0)
  147. + {
  148. + *trackerInfo->pdwEffect = DROPEFFECT_NONE;
  149. + }
  150. +
  151. + hr = IDropSource_GiveFeedback(trackerInfo->dropSource,
  152. + *trackerInfo->pdwEffect);
  153. +
  154. + /*
  155. + * When we ask for feedback from the drop source, sometimes it will
  156. + * do all the necessary work and sometimes it will not handle it
  157. + * when that's the case, we must display the standard drag and drop
  158. + * cursors.
  159. + */
  160. + if (hr == DRAGDROP_S_USEDEFAULTCURSORS)
  161. + {
  162. + HCURSOR hCur;
  163. +
  164. + if (*trackerInfo->pdwEffect & DROPEFFECT_MOVE)
  165. + {
  166. + hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(2));
  167. + }
  168. + else if (*trackerInfo->pdwEffect & DROPEFFECT_COPY)
  169. + {
  170. + hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(3));
  171. + }
  172. + else if (*trackerInfo->pdwEffect & DROPEFFECT_LINK)
  173. + {
  174. + hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(4));
  175. + }
  176. + else
  177. + {
  178. + hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(1));
  179. + }
  180. +
  181. + SetCursor(hCur);
  182. + }
  183. +}
  184. +
  185. +
  186. + /***
  187. * OLEDD_TrackStateChange()
  188. *
  189. * This method is invoked while a drag and drop operation is in effect.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement