mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-14 14:20:21 +00:00
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:
parent
c533482f80
commit
2fb8b97b65
@ -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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user