win32: get rid of GdkDragContextPrivateWin32 and related machinery.

This turns GdkWin32DragContext into a proper GdkDragContext subclass.
Because we now correctly initialize GdkWin32DragContext in
gdk_drag_context_new, we no longer crash immediatly when a DnD
operation is initialized (the find_window, drag_status, ... vfuncs
where all pointing to 0x0 instead of their proper win32 implementations).

We now try to consistently refer to GdkDragContext as "context",
GdkWin32DragContext as "win32_context" and the ole2 related
target_drag_context and source_drag_context as "ctx".

Members of GdkWin32DragContext only used by the ole2 DnD codepaths
are now explicitly marked with a ole2_dnd_ prefix.
This commit is contained in:
Dieter Verfaillie 2011-09-22 22:47:23 +02:00 committed by Alexander Larsson
parent c533482f80
commit 2fb8b97b65

View File

@ -88,8 +88,6 @@
#include <gdk/gdk.h>
#include <glib/gstdio.h>
typedef struct _GdkDragContextPrivateWin32 GdkDragContextPrivateWin32;
typedef enum {
GDK_DRAG_STATUS_DRAG,
GDK_DRAG_STATUS_MOTION_WAIT,
@ -97,29 +95,18 @@ typedef enum {
GDK_DRAG_STATUS_DROP
} GdkDragStatus;
/* Structure that holds information about a drag in progress.
* this is used on both source and destination sides.
*/
struct _GdkDragContextPrivateWin32 {
gboolean being_finalized;
gint ref_count;
IUnknown *iface;
DWORD last_key_state;
POINT last_pt; /* Coordinates from last event */
guint drag_status : 4; /* Current status of drag */
guint drop_failed : 1; /* Whether the drop was unsuccessful */
};
#define PRIVATE_DATA(context) (GDK_WIN32_DRAG_CONTEXT (context)->windowing_data)
static GList *contexts;
static GdkDragContext *current_dest_drag = NULL;
struct _GdkWin32DragContext
{
GdkDragContext context;
GdkDragContextPrivateWin32 *windowing_data;
guint drag_status : 4; /* Current status of drag */
guint drop_failed : 1; /* Whether the drop was unsuccessful */
POINT ole2_dnd_last_pt; /* Coordinates from last event */
DWORD ole2_dnd_last_key_state; /* Key state from last event */
gboolean ole2_dnd_being_finalized;
gint ole2_dnd_ref_count;
IUnknown *ole2_dnd_iface;
};
struct _GdkWin32DragContextClass
@ -127,42 +114,42 @@ struct _GdkWin32DragContextClass
GdkDragContextClass parent_class;
};
G_DEFINE_TYPE (GdkWin32DragContext, gdk_win32_drag_context, GDK_TYPE_DRAG_CONTEXT)
static GList *contexts;
static GdkDragContext *current_dest_drag = NULL;
static gboolean use_ole2_dnd = FALSE;
G_DEFINE_TYPE (GdkWin32DragContext, gdk_win32_drag_context, GDK_TYPE_DRAG_CONTEXT)
static void
gdk_win32_drag_context_init (GdkWin32DragContext *dragcontext)
gdk_win32_drag_context_init (GdkWin32DragContext *context)
{
GdkDragContextPrivateWin32 *private;
private = G_TYPE_INSTANCE_GET_PRIVATE (dragcontext,
GDK_TYPE_DRAG_CONTEXT,
GdkDragContextPrivateWin32);
dragcontext->windowing_data = private;
if (!use_ole2_dnd)
{
contexts = g_list_prepend (contexts, dragcontext);
contexts = g_list_prepend (contexts, context);
}
else
{
private->being_finalized = FALSE;
private->ref_count = 1;
private->iface = NULL;
context->ole2_dnd_being_finalized = FALSE;
context->ole2_dnd_ref_count = 1;
context->ole2_dnd_iface = NULL;
}
GDK_NOTE (DND, g_print ("gdk_drag_context_init %p\n", dragcontext));
GDK_NOTE (DND, g_print ("gdk_drag_context_init %p\n", context));
}
static void
gdk_win32_drag_context_finalize (GObject *object)
{
GdkDragContext *context = GDK_DRAG_CONTEXT (object);
GdkDragContext *context;
GdkWin32DragContext *context_win32;
GDK_NOTE (DND, g_print ("gdk_drag_context_finalize %p\n", object));
g_return_if_fail (GDK_IS_WIN32_DRAG_CONTEXT (object));
context = GDK_DRAG_CONTEXT (object);
context_win32 = GDK_WIN32_DRAG_CONTEXT (object);
g_list_free (context->targets);
if (context->source_window)
@ -180,12 +167,11 @@ gdk_win32_drag_context_finalize (GObject *object)
}
else
{
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (context);
if (private->iface)
if (context_win32->ole2_dnd_iface)
{
private->being_finalized = TRUE;
private->iface->lpVtbl->Release (private->iface);
private->iface = NULL;
context_win32->ole2_dnd_being_finalized = TRUE;
context_win32->ole2_dnd_iface->lpVtbl->Release (context_win32->ole2_dnd_iface);
context_win32->ole2_dnd_iface = NULL;
}
}
@ -197,7 +183,13 @@ gdk_win32_drag_context_finalize (GObject *object)
GdkDragContext *
gdk_drag_context_new (void)
{
return g_object_new (GDK_TYPE_DRAG_CONTEXT, NULL);
GdkWin32DragContext *context_win32;
GdkDragContext *context;
context_win32 = g_object_new (GDK_TYPE_WIN32_DRAG_CONTEXT, NULL);
context = GDK_DRAG_CONTEXT(context_win32);
return context;
}
static GdkDragContext *
@ -207,12 +199,10 @@ gdk_drag_context_find (gboolean is_source,
{
GList *tmp_list = contexts;
GdkDragContext *context;
GdkDragContextPrivateWin32 *private;
while (tmp_list)
{
context = (GdkDragContext *)tmp_list->data;
private = PRIVATE_DATA (context);
if ((!context->is_source == !is_source) &&
((source == NULL) || (context->source_window && (context->source_window == source))) &&
@ -279,8 +269,9 @@ static ULONG STDMETHODCALLTYPE
idroptarget_addref (LPDROPTARGET This)
{
target_drag_context *ctx = (target_drag_context *) This;
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
int ref_count = ++private->ref_count;
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (ctx->context);
int ref_count = ++context_win32->ole2_dnd_ref_count;
GDK_NOTE (DND, g_print ("idroptarget_addref %p %d\n", This, ref_count));
g_object_ref (G_OBJECT (ctx->context));
@ -325,12 +316,13 @@ static ULONG STDMETHODCALLTYPE
idroptarget_release (LPDROPTARGET This)
{
target_drag_context *ctx = (target_drag_context *) This;
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
int ref_count = --private->ref_count;
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (ctx->context);
int ref_count = --context_win32->ole2_dnd_ref_count;
GDK_NOTE (DND, g_print ("idroptarget_release %p %d\n", This, ref_count));
if (!private->being_finalized)
if (!context_win32->ole2_dnd_being_finalized)
g_object_unref (G_OBJECT (ctx->context));
if (ref_count == 0)
@ -540,8 +532,9 @@ static ULONG STDMETHODCALLTYPE
idropsource_addref (LPDROPSOURCE This)
{
source_drag_context *ctx = (source_drag_context *) This;
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
int ref_count = ++private->ref_count;
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (ctx->context);
int ref_count = ++context_win32->ole2_dnd_ref_count;
GDK_NOTE (DND, g_print ("idropsource_addref %p %d\n", This, ref_count));
g_object_ref (G_OBJECT (ctx->context));
@ -586,12 +579,13 @@ static ULONG STDMETHODCALLTYPE
idropsource_release (LPDROPSOURCE This)
{
source_drag_context *ctx = (source_drag_context *) This;
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
int ref_count = --private->ref_count;
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (ctx->context);
int ref_count = --context_win32->ole2_dnd_ref_count;
GDK_NOTE (DND, g_print ("idropsource_release %p %d\n", This, ref_count));
if (!private->being_finalized)
if (!context_win32->ole2_dnd_being_finalized)
g_object_unref (G_OBJECT (ctx->context));
if (ref_count == 0)
@ -605,14 +599,14 @@ idropsource_release (LPDROPSOURCE This)
* have been emitted and false otherwise.
*/
static gboolean
send_change_events (GdkDragContext *ctx,
send_change_events (GdkDragContext *context,
DWORD key_state,
gboolean esc_pressed)
{
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx);
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (context);
POINT pt;
gboolean changed = FALSE;
HWND hwnd = GDK_WINDOW_HWND (ctx->source_window);
HWND hwnd = GDK_WINDOW_HWND (context->source_window);
LPARAM lparam;
WPARAM wparam;
@ -622,46 +616,46 @@ send_change_events (GdkDragContext *ctx,
if (!API_CALL (ScreenToClient, (hwnd, &pt)))
return FALSE;
if (pt.x != private->last_pt.x || pt.y != private->last_pt.y ||
key_state != private->last_key_state)
if (pt.x != context_win32->ole2_dnd_last_pt.x || pt.y != context_win32->ole2_dnd_last_pt.y ||
key_state != context_win32->ole2_dnd_last_key_state)
{
lparam = MAKELPARAM (pt.x, pt.y);
wparam = key_state;
if (pt.x != private->last_pt.x || pt.y != private->last_pt.y)
if (pt.x != context_win32->ole2_dnd_last_pt.x || pt.y != context_win32->ole2_dnd_last_pt.y)
{
GDK_NOTE (DND, g_print ("Sending WM_MOUSEMOVE (%ld,%ld)\n", pt.x, pt.y));
SendMessage (hwnd, WM_MOUSEMOVE, wparam, lparam);
}
if ((key_state & MK_LBUTTON) != (private->last_key_state & MK_LBUTTON))
if ((key_state & MK_LBUTTON) != (context_win32->ole2_dnd_last_key_state & MK_LBUTTON))
{
if (key_state & MK_LBUTTON)
SendMessage (hwnd, WM_LBUTTONDOWN, wparam, lparam);
else
SendMessage (hwnd, WM_LBUTTONUP, wparam, lparam);
}
if ((key_state & MK_MBUTTON) != (private->last_key_state & MK_MBUTTON))
if ((key_state & MK_MBUTTON) != (context_win32->ole2_dnd_last_key_state & MK_MBUTTON))
{
if (key_state & MK_MBUTTON)
SendMessage (hwnd, WM_MBUTTONDOWN, wparam, lparam);
else
SendMessage (hwnd, WM_MBUTTONUP, wparam, lparam);
}
if ((key_state & MK_RBUTTON) != (private->last_key_state & MK_RBUTTON))
if ((key_state & MK_RBUTTON) != (context_win32->ole2_dnd_last_key_state & MK_RBUTTON))
{
if (key_state & MK_RBUTTON)
SendMessage (hwnd, WM_RBUTTONDOWN, wparam, lparam);
else
SendMessage (hwnd, WM_RBUTTONUP, wparam, lparam);
}
if ((key_state & MK_CONTROL) != (private->last_key_state & MK_CONTROL))
if ((key_state & MK_CONTROL) != (context_win32->ole2_dnd_last_key_state & MK_CONTROL))
{
if (key_state & MK_CONTROL)
SendMessage (hwnd, WM_KEYDOWN, VK_CONTROL, 0);
else
SendMessage (hwnd, WM_KEYUP, VK_CONTROL, 0);
}
if ((key_state & MK_SHIFT) != (private->last_key_state & MK_SHIFT))
if ((key_state & MK_SHIFT) != (context_win32->ole2_dnd_last_key_state & MK_SHIFT))
{
if (key_state & MK_CONTROL)
SendMessage (hwnd, WM_KEYDOWN, VK_SHIFT, 0);
@ -670,8 +664,8 @@ send_change_events (GdkDragContext *ctx,
}
changed = TRUE;
private->last_key_state = key_state;
private->last_pt = pt;
context_win32->ole2_dnd_last_key_state = key_state;
context_win32->ole2_dnd_last_pt = pt;
}
if (esc_pressed)
@ -1172,16 +1166,19 @@ static IEnumFORMATETCVtbl ief_vtbl = {
static target_drag_context *
target_context_new (GdkWindow *window)
{
GdkDragContext *context;
GdkWin32DragContext *context_win32;
target_drag_context *result;
GdkDragContextPrivateWin32 *private;
GdkDevice *device;
GdkDeviceManager *device_manager;
result = g_new0 (target_drag_context, 1);
context = gdk_drag_context_new ();
context_win32 = GDK_WIN32_DRAG_CONTEXT (context);
result = g_new0 (target_drag_context, 1);
result->context = context;
result->idt.lpVtbl = &idt_vtbl;
result->context = gdk_drag_context_new ();
result->context->protocol = GDK_DRAG_PROTO_OLE2;
result->context->is_source = FALSE;
@ -1194,14 +1191,12 @@ target_context_new (GdkWindow *window)
result->context->dest_window = window;
g_object_ref (window);
/* FIXME: result->context->targets? */
/* FIXME: context->targets? */
result->context->actions = GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE;
result->context->suggested_action = GDK_ACTION_MOVE;
result->context->action = GDK_ACTION_MOVE;
private = PRIVATE_DATA(result->context);
private->iface = (IUnknown *) &result->idt;
context_win32->ole2_dnd_iface = (IUnknown *) &result->idt;
idroptarget_addref (&result->idt);
GDK_NOTE (DND, g_print ("target_context_new: %p\n", result));
@ -1213,16 +1208,19 @@ static source_drag_context *
source_context_new (GdkWindow *window,
GList *targets)
{
GdkDragContext *context;
GdkWin32DragContext *context_win32;
source_drag_context *result;
GdkDragContextPrivateWin32 *private;
GdkDevice *device;
GdkDeviceManager *device_manager;
result = g_new0 (source_drag_context, 1);
context = gdk_drag_context_new ();
context_win32 = GDK_WIN32_DRAG_CONTEXT (context);
result = g_new0 (source_drag_context, 1);
result->context = context;
result->ids.lpVtbl = &ids_vtbl;
result->context = gdk_drag_context_new ();
result->context->protocol = GDK_DRAG_PROTO_OLE2;
result->context->is_source = TRUE;
@ -1236,8 +1234,7 @@ source_context_new (GdkWindow *window,
result->context->dest_window = NULL;
result->context->targets = g_list_copy (targets);
private = PRIVATE_DATA(result->context);
private->iface = (IUnknown *) &result->ids;
context_win32->ole2_dnd_iface = (IUnknown *) &result->ids;
idropsource_addref (&result->ids);
GDK_NOTE (DND, g_print ("source_context_new: %p\n", result));
@ -1667,7 +1664,6 @@ local_send_enter (GdkDragContext *context,
guint32 time)
{
GdkEvent *tmp_event;
GdkDragContextPrivateWin32 *private;
GdkDragContext *new_context;
GdkDevice *device;
GdkDeviceManager *device_manager;
@ -1676,8 +1672,6 @@ local_send_enter (GdkDragContext *context,
context,
current_dest_drag));
private = PRIVATE_DATA (context);
if (current_dest_drag != NULL)
{
g_object_unref (G_OBJECT (current_dest_drag));
@ -1727,6 +1721,7 @@ local_send_motion (GdkDragContext *context,
guint32 time)
{
GdkEvent *tmp_event;
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (context);
GDK_NOTE (DND, g_print ("local_send_motion: context=%p (%d,%d) current_dest_drag=%p\n",
context, x_root, y_root,
@ -1736,6 +1731,8 @@ local_send_motion (GdkDragContext *context,
(current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
(current_dest_drag->source_window == context->source_window))
{
GdkWin32DragContext *current_dest_drag_win32;
tmp_event = gdk_event_new (GDK_DRAG_MOTION);
tmp_event->dnd.window = g_object_ref (current_dest_drag->dest_window);
tmp_event->dnd.send_event = FALSE;
@ -1748,10 +1745,11 @@ local_send_motion (GdkDragContext *context,
tmp_event->dnd.x_root = x_root;
tmp_event->dnd.y_root = y_root;
PRIVATE_DATA (current_dest_drag)->last_pt.x = x_root - _gdk_offset_x;
PRIVATE_DATA (current_dest_drag)->last_pt.y = y_root - _gdk_offset_y;
current_dest_drag_win32 = GDK_WIN32_DRAG_CONTEXT (current_dest_drag);
current_dest_drag_win32->ole2_dnd_last_pt.x = x_root - _gdk_offset_x;
current_dest_drag_win32->ole2_dnd_last_pt.y = y_root - _gdk_offset_y;
PRIVATE_DATA (context)->drag_status = GDK_DRAG_STATUS_MOTION_WAIT;
context_win32->drag_status = GDK_DRAG_STATUS_MOTION_WAIT;
GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
gdk_event_put (tmp_event);
@ -1773,8 +1771,7 @@ local_send_drop (GdkDragContext *context,
(current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
(current_dest_drag->source_window == context->source_window))
{
GdkDragContextPrivateWin32 *private;
private = PRIVATE_DATA (current_dest_drag);
GdkWin32DragContext *context_win32;
/* Pass ownership of context to the event */
tmp_event = gdk_event_new (GDK_DROP_START);
@ -1784,8 +1781,9 @@ local_send_drop (GdkDragContext *context,
tmp_event->dnd.time = GDK_CURRENT_TIME;
gdk_event_set_device (tmp_event, gdk_drag_context_get_device (current_dest_drag));
tmp_event->dnd.x_root = private->last_pt.x + _gdk_offset_x;
tmp_event->dnd.y_root = private->last_pt.y + _gdk_offset_y;
context_win32 = GDK_WIN32_DRAG_CONTEXT (current_dest_drag);
tmp_event->dnd.x_root = context_win32->ole2_dnd_last_pt.x + _gdk_offset_x;
tmp_event->dnd.y_root = context_win32->ole2_dnd_last_pt.y + _gdk_offset_y;
current_dest_drag = NULL;
@ -1870,11 +1868,12 @@ _gdk_win32_dnd_do_dragdrop (void)
if (use_ole2_dnd)
{
GdkDragContext* drag_ctx;
GdkDragContextPrivateWin32 *private;
GdkWin32DragContext *drag_ctx_win32;
BYTE kbd_state[256];
data_object *dobj;
HRESULT hr;
DWORD dwEffect;
#if 0
HGLOBAL global;
STGMEDIUM medium;
@ -1884,25 +1883,25 @@ _gdk_win32_dnd_do_dragdrop (void)
return;
drag_ctx = pending_src_context->context;
private = PRIVATE_DATA (drag_ctx);
drag_ctx_win32 = GDK_WIN32_DRAG_CONTEXT (drag_ctx);
dobj = data_object_new (drag_ctx);
API_CALL (GetCursorPos, (&private->last_pt));
API_CALL (ScreenToClient, (GDK_WINDOW_HWND (drag_ctx->source_window), &private->last_pt));
private->last_key_state = 0;
API_CALL (GetCursorPos, (&drag_ctx_win32->ole2_dnd_last_pt));
API_CALL (ScreenToClient, (GDK_WINDOW_HWND (drag_ctx->source_window), &drag_ctx_win32->ole2_dnd_last_pt));
drag_ctx_win32->ole2_dnd_last_key_state = 0;
API_CALL (GetKeyboardState, (kbd_state));
if (kbd_state[VK_CONTROL])
private->last_key_state |= MK_CONTROL;
drag_ctx_win32->ole2_dnd_last_key_state |= MK_CONTROL;
if (kbd_state[VK_SHIFT])
private->last_key_state |= MK_SHIFT;
drag_ctx_win32->ole2_dnd_last_key_state |= MK_SHIFT;
if (kbd_state[VK_LBUTTON])
private->last_key_state |= MK_LBUTTON;
drag_ctx_win32->ole2_dnd_last_key_state |= MK_LBUTTON;
if (kbd_state[VK_MBUTTON])
private->last_key_state |= MK_MBUTTON;
drag_ctx_win32->ole2_dnd_last_key_state |= MK_MBUTTON;
if (kbd_state[VK_RBUTTON])
private->last_key_state |= MK_RBUTTON;
drag_ctx_win32->ole2_dnd_last_key_state |= MK_RBUTTON;
#if 0
global = GlobalAlloc (GMEM_FIXED, sizeof (ctx));
@ -2097,7 +2096,7 @@ gdk_win32_drag_context_drag_motion (GdkDragContext *context,
GdkDragAction possible_actions,
guint32 time)
{
GdkDragContextPrivateWin32 *private;
GdkWin32DragContext *context_win32;
g_return_val_if_fail (context != NULL, FALSE);
@ -2113,7 +2112,7 @@ gdk_win32_drag_context_drag_motion (GdkDragContext *context,
_gdk_win32_drag_action_to_string (context->suggested_action),
_gdk_win32_drag_action_to_string (context->action)));
private = PRIVATE_DATA (context);
context_win32 = GDK_WIN32_DRAG_CONTEXT (context);
if (!use_ole2_dnd)
{
@ -2136,7 +2135,7 @@ gdk_win32_drag_context_drag_motion (GdkDragContext *context,
/* Send a leave to the last destination */
gdk_drag_do_leave (context, time);
private->drag_status = GDK_DRAG_STATUS_DRAG;
context_win32->drag_status = GDK_DRAG_STATUS_DRAG;
/* Check if new destination accepts drags, and which protocol */
if (dest_window)
@ -2165,7 +2164,7 @@ gdk_win32_drag_context_drag_motion (GdkDragContext *context,
/* Push a status event, to let the client know that
* the drag changed
*/
tmp_event = gdk_event_new (GDK_DRAG_STATUS);
tmp_event = gdk_event_new (GDK_DRAG_STATUS);
tmp_event->dnd.window = g_object_ref (context->source_window);
/* We use this to signal a synthetic status. Perhaps
* we should use an extra field...
@ -2174,21 +2173,21 @@ gdk_win32_drag_context_drag_motion (GdkDragContext *context,
tmp_event->dnd.context = g_object_ref (context);
tmp_event->dnd.time = time;
gdk_event_set_device (tmp_event, gdk_drag_context_get_device (context));
gdk_event_set_device (tmp_event, gdk_drag_context_get_device (context));
GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
gdk_event_put (tmp_event);
gdk_event_free (tmp_event);
gdk_event_free (tmp_event);
}
/* Send a drag-motion event */
private->last_pt.x = x_root - _gdk_offset_x;
private->last_pt.y = y_root - _gdk_offset_y;
context_win32->ole2_dnd_last_pt.x = x_root - _gdk_offset_x;
context_win32->ole2_dnd_last_pt.y = y_root - _gdk_offset_y;
if (context->dest_window)
{
if (private->drag_status == GDK_DRAG_STATUS_DRAG)
if (context_win32->drag_status == GDK_DRAG_STATUS_DRAG)
{
switch (context->protocol)
{
@ -2265,14 +2264,11 @@ gdk_win32_drag_context_drag_status (GdkDragContext *context,
GdkDragAction action,
guint32 time)
{
GdkDragContextPrivateWin32 *private;
GdkDragContext *src_context;
GdkEvent *tmp_event;
g_return_if_fail (context != NULL);
private = PRIVATE_DATA (context);
GDK_NOTE (DND, g_print ("gdk_drag_status: %s\n"
" context=%p:{actions=%s,suggested=%s,action=%s}\n",
_gdk_win32_drag_action_to_string (action),
@ -2291,17 +2287,17 @@ gdk_win32_drag_context_drag_status (GdkDragContext *context,
if (src_context)
{
GdkDragContextPrivateWin32 *private = PRIVATE_DATA (src_context);
GdkWin32DragContext *src_context_win32 = GDK_WIN32_DRAG_CONTEXT (src_context);
if (private->drag_status == GDK_DRAG_STATUS_MOTION_WAIT)
private->drag_status = GDK_DRAG_STATUS_DRAG;
if (src_context_win32->drag_status == GDK_DRAG_STATUS_MOTION_WAIT)
src_context_win32->drag_status = GDK_DRAG_STATUS_DRAG;
tmp_event = gdk_event_new (GDK_DRAG_STATUS);
tmp_event->dnd.window = g_object_ref (context->source_window);
tmp_event->dnd.send_event = FALSE;
tmp_event->dnd.context = g_object_ref (src_context);
tmp_event->dnd.time = GDK_CURRENT_TIME; /* FIXME? */
gdk_event_set_device (tmp_event, gdk_drag_context_get_device (src_context));
gdk_event_set_device (tmp_event, gdk_drag_context_get_device (src_context));
if (action == GDK_ACTION_DEFAULT)
action = 0;
@ -2310,7 +2306,7 @@ gdk_win32_drag_context_drag_status (GdkDragContext *context,
GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
gdk_event_put (tmp_event);
gdk_event_free (tmp_event);
gdk_event_free (tmp_event);
}
}
}
@ -2337,7 +2333,6 @@ gdk_win32_drag_context_drop_finish (GdkDragContext *context,
gboolean success,
guint32 time)
{
GdkDragContextPrivateWin32 *private;
GdkDragContext *src_context;
GdkEvent *tmp_event;
@ -2345,8 +2340,6 @@ gdk_win32_drag_context_drop_finish (GdkDragContext *context,
GDK_NOTE (DND, g_print ("gdk_drop_finish\n"));
private = PRIVATE_DATA (context);
if (!use_ole2_dnd)
{
src_context = gdk_drag_context_find (TRUE,
@ -2467,7 +2460,9 @@ _gdk_win32_window_register_dnd (GdkWindow *window)
static gboolean
gdk_win32_drag_context_drop_status (GdkDragContext *context)
{
return ! PRIVATE_DATA (context)->drop_failed;
GdkWin32DragContext *context_win32 = GDK_WIN32_DRAG_CONTEXT (context);
return ! context_win32->drop_failed;
}
static GdkAtom
@ -2492,8 +2487,6 @@ gdk_win32_drag_context_class_init (GdkWin32DragContextClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdkDragContextClass *context_class = GDK_DRAG_CONTEXT_CLASS (klass);
gdk_win32_drag_context_parent_class = g_type_class_peek_parent (klass);
object_class->finalize = gdk_win32_drag_context_finalize;
context_class->find_window = gdk_win32_drag_context_find_window;
@ -2505,6 +2498,4 @@ gdk_win32_drag_context_class_init (GdkWin32DragContextClass *klass)
context_class->drop_finish = gdk_win32_drag_context_drop_finish;
context_class->drop_status = gdk_win32_drag_context_drop_status;
context_class->get_selection = gdk_win32_drag_context_get_selection;
g_type_class_add_private (object_class, sizeof (GdkDragContextPrivateWin32));
}