summaryrefslogtreecommitdiff
path: root/gdk/win32/gdkdnd-win32.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2010-05-25 18:38:44 -0400
committerMatthias Clasen <mclasen@redhat.com>2010-05-25 18:38:44 -0400
commitbd4609b14042a91646cd9057764eecfbc6faf42b (patch)
tree8721405d2b45a998f87cccc672b4070780907fb8 /gdk/win32/gdkdnd-win32.c
parenta538f639b69a39d7bb85b39af2dfd296d28fc0aa (diff)
downloadgtk+-bd4609b14042a91646cd9057764eecfbc6faf42b.tar.gz
Merge the xi2-for-master branch
Diffstat (limited to 'gdk/win32/gdkdnd-win32.c')
-rw-r--r--gdk/win32/gdkdnd-win32.c222
1 files changed, 148 insertions, 74 deletions
diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c
index f0b57a9b68..6436fb7817 100644
--- a/gdk/win32/gdkdnd-win32.c
+++ b/gdk/win32/gdkdnd-win32.c
@@ -98,6 +98,7 @@ typedef enum {
* this is used on both source and destination sides.
*/
struct _GdkDragContextPrivateWin32 {
+ GdkDevice *device;
gboolean being_finalized;
gint ref_count;
IUnknown *iface;
@@ -203,6 +204,39 @@ gdk_drag_context_new (void)
return g_object_new (GDK_TYPE_DRAG_CONTEXT, NULL);
}
+GdkDevice *
+gdk_drag_context_get_device (GdkDragContext *context)
+{
+ GdkDragContextPrivateWin32 *private;
+
+ g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), NULL);
+
+ private = PRIVATE_DATA (context);
+
+ return private->device;
+}
+
+void
+gdk_drag_context_set_device (GdkDragContext *context,
+ GdkDevice *device)
+{
+ GdkDragContextPrivateWin32 *private;
+
+ g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
+ g_return_if_fail (GDK_IS_DEVICE (device));
+
+ private = PRIVATE_DATA (context);
+
+ if (private->device)
+ {
+ g_object_unref (private->device);
+ private->device = NULL;
+ }
+
+ if (device)
+ private->device = g_object_ref (device);
+}
+
static GdkDragContext *
gdk_drag_context_find (gboolean is_source,
GdkWindow *source,
@@ -425,24 +459,28 @@ dnd_event_put (GdkEventType type,
const POINTL pt,
gboolean to_dest_window)
{
- GdkEvent e;
- e.type = type;
+ GdkEvent *e;
+
+ e = gdk_event_new (type);
+
if (to_dest_window)
- e.dnd.window = context->dest_window;
+ e->dnd.window = context->dest_window;
else
- e.dnd.window = context->source_window;
- e.dnd.send_event = FALSE;
- e.dnd.context = context;
- e.dnd.time = GDK_CURRENT_TIME;
- e.dnd.x_root = pt.x + _gdk_offset_x;
- e.dnd.y_root = pt.x + _gdk_offset_y;
+ e->dnd.window = context->source_window;
+ e->dnd.send_event = FALSE;
+ e->dnd.context = g_object_ref (context);
+ e->dnd.time = GDK_CURRENT_TIME;
+ e->dnd.x_root = pt.x + _gdk_offset_x;
+ e->dnd.y_root = pt.x + _gdk_offset_y;
- g_object_ref (e.dnd.context);
- if (e.dnd.window != NULL)
- g_object_ref (e.dnd.window);
+ if (e->dnd.window != NULL)
+ g_object_ref (e->dnd.window);
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&e));
- gdk_event_put (&e);
+ gdk_event_set_device (e, gdk_drag_context_get_device (context));
+
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (e));
+ gdk_event_put (e);
+ gdk_event_free (e);
}
static HRESULT STDMETHODCALLTYPE
@@ -1173,6 +1211,7 @@ target_context_new (GdkWindow *window)
{
target_drag_context *result;
GdkDragContextPrivateWin32 *private;
+ GdkDevice *device;
result = g_new0 (target_drag_context, 1);
@@ -1182,6 +1221,9 @@ target_context_new (GdkWindow *window)
result->context->protocol = GDK_DRAG_PROTO_OLE2;
result->context->is_source = FALSE;
+ device = gdk_display_get_core_pointer (_gdk_display);
+ gdk_drag_context_set_device (result->context, device);
+
result->context->source_window = NULL;
result->context->dest_window = window;
@@ -1208,6 +1250,7 @@ source_context_new (GdkWindow *window,
{
source_drag_context *result;
GdkDragContextPrivateWin32 *private;
+ GdkDevice *device;
result = g_new0 (source_drag_context, 1);
@@ -1217,6 +1260,9 @@ source_context_new (GdkWindow *window,
result->context->protocol = GDK_DRAG_PROTO_OLE2;
result->context->is_source = TRUE;
+ device = gdk_display_get_core_pointer (_gdk_display);
+ gdk_drag_context_set_device (result->context, device);
+
result->context->source_window = window;
g_object_ref (window);
@@ -1428,6 +1474,7 @@ gdk_dropfiles_filter (GdkXEvent *xev,
POINT pt;
gint nfiles, i;
gchar *fileName, *linkedFile;
+ GdkDevice *device;
if (msg->message == WM_DROPFILES)
{
@@ -1437,6 +1484,9 @@ gdk_dropfiles_filter (GdkXEvent *xev,
context->protocol = GDK_DRAG_PROTO_WIN32_DROPFILES;
context->is_source = FALSE;
+ device = gdk_display_get_core_pointer (_gdk_display);
+ gdk_drag_context_set_device (context, device);
+
context->source_window = _gdk_root;
g_object_ref (context->source_window);
@@ -1452,6 +1502,7 @@ gdk_dropfiles_filter (GdkXEvent *xev,
event->dnd.type = GDK_DROP_START;
event->dnd.context = current_dest_drag;
+ gdk_event_set_device (event, gdk_drag_context_get_device (current_dest_drag));
hdrop = (HANDLE) msg->wParam;
DragQueryPoint (hdrop, &pt);
@@ -1615,7 +1666,7 @@ static void
local_send_leave (GdkDragContext *context,
guint32 time)
{
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
GDK_NOTE (DND, g_print ("local_send_leave: context=%p current_dest_drag=%p\n",
context,
@@ -1625,17 +1676,20 @@ local_send_leave (GdkDragContext *context,
(current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
(current_dest_drag->source_window == context->source_window))
{
- tmp_event.dnd.type = GDK_DRAG_LEAVE;
- tmp_event.dnd.window = context->dest_window;
+ tmp_event = gdk_event_new (GDK_DRAG_LEAVE);
+
+ tmp_event->dnd.window = g_object_ref (context->dest_window);
/* Pass ownership of context to the event */
- tmp_event.dnd.send_event = FALSE;
- tmp_event.dnd.context = current_dest_drag;
- tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+ tmp_event->dnd.send_event = FALSE;
+ tmp_event->dnd.context = g_object_ref (current_dest_drag);
+ tmp_event->dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+ gdk_event_set_device (tmp_event, gdk_drag_context_get_device (context));
current_dest_drag = NULL;
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
}
@@ -1643,9 +1697,10 @@ static void
local_send_enter (GdkDragContext *context,
guint32 time)
{
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
GdkDragContextPrivateWin32 *private;
GdkDragContext *new_context;
+ GdkDevice *device;
GDK_NOTE (DND, g_print ("local_send_enter: context=%p current_dest_drag=%p\n",
context,
@@ -1663,6 +1718,9 @@ local_send_enter (GdkDragContext *context,
new_context->protocol = GDK_DRAG_PROTO_LOCAL;
new_context->is_source = FALSE;
+ device = gdk_display_get_core_pointer (_gdk_display);
+ gdk_drag_context_set_device (new_context, device);
+
new_context->source_window = context->source_window;
g_object_ref (new_context->source_window);
@@ -1676,16 +1734,18 @@ local_send_enter (GdkDragContext *context,
GDK_PROPERTY_CHANGE_MASK);
new_context->actions = context->actions;
- tmp_event.type = GDK_DRAG_ENTER;
- tmp_event.dnd.window = context->dest_window;
- tmp_event.dnd.send_event = FALSE;
- tmp_event.dnd.context = new_context;
- tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+ tmp_event = gdk_event_new (GDK_DRAG_ENTER);
+ tmp_event->dnd.window = g_object_ref (context->dest_window);
+ tmp_event->dnd.send_event = FALSE;
+ tmp_event->dnd.context = g_object_ref (new_context);
+ tmp_event->dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+ gdk_event_set_device (tmp_event, gdk_drag_context_get_device (context));
current_dest_drag = new_context;
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
static void
@@ -1695,7 +1755,7 @@ local_send_motion (GdkDragContext *context,
GdkDragAction action,
guint32 time)
{
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
GDK_NOTE (DND, g_print ("local_send_motion: context=%p (%d,%d) current_dest_drag=%p\n",
context, x_root, y_root,
@@ -1705,24 +1765,26 @@ local_send_motion (GdkDragContext *context,
(current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
(current_dest_drag->source_window == context->source_window))
{
- tmp_event.type = GDK_DRAG_MOTION;
- tmp_event.dnd.window = current_dest_drag->dest_window;
- tmp_event.dnd.send_event = FALSE;
- tmp_event.dnd.context = current_dest_drag;
- tmp_event.dnd.time = time;
+ 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;
+ tmp_event->dnd.context = g_object_ref (current_dest_drag);
+ tmp_event->dnd.time = time;
+ gdk_event_set_device (tmp_event, gdk_drag_context_get_device (current_dest_drag));
current_dest_drag->suggested_action = action;
- tmp_event.dnd.x_root = x_root;
- tmp_event.dnd.y_root = y_root;
+ 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;
PRIVATE_DATA (context)->drag_status = GDK_DRAG_STATUS_MOTION_WAIT;
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
}
@@ -1730,7 +1792,7 @@ static void
local_send_drop (GdkDragContext *context,
guint32 time)
{
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
GDK_NOTE (DND, g_print ("local_send_drop: context=%p current_dest_drag=%p\n",
context,
@@ -1744,19 +1806,21 @@ local_send_drop (GdkDragContext *context,
private = PRIVATE_DATA (current_dest_drag);
/* Pass ownership of context to the event */
- tmp_event.type = GDK_DROP_START;
- tmp_event.dnd.window = current_dest_drag->dest_window;
- tmp_event.dnd.send_event = FALSE;
- tmp_event.dnd.context = current_dest_drag;
- tmp_event.dnd.time = GDK_CURRENT_TIME;
+ tmp_event = gdk_event_new (GDK_DROP_START);
+ tmp_event->dnd.window = g_object_ref (current_dest_drag->dest_window);
+ tmp_event->dnd.send_event = FALSE;
+ tmp_event->dnd.context = g_object_ref (current_dest_drag);
+ 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;
+ tmp_event->dnd.x_root = private->last_pt.x + _gdk_offset_x;
+ tmp_event->dnd.y_root = private->last_pt.y + _gdk_offset_y;
current_dest_drag = NULL;
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
}
@@ -1787,11 +1851,15 @@ gdk_drag_begin (GdkWindow *window,
if (!use_ole2_dnd)
{
GdkDragContext *new_context;
+ GdkDevice *device;
g_return_val_if_fail (window != NULL, NULL);
new_context = gdk_drag_context_new ();
+ device = gdk_display_get_core_pointer (_gdk_display);
+ gdk_drag_context_set_device (new_context, device);
+
new_context->is_source = TRUE;
new_context->source_window = window;
@@ -2043,7 +2111,7 @@ gdk_drag_motion (GdkDragContext *context,
}
else
{
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
/* Send a leave to the last destination */
gdk_drag_do_leave (context, time);
@@ -2076,18 +2144,20 @@ gdk_drag_motion (GdkDragContext *context,
/* Push a status event, to let the client know that
* the drag changed
*/
- tmp_event.type = GDK_DRAG_STATUS;
- tmp_event.dnd.window = context->source_window;
+ 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...
*/
- tmp_event.dnd.send_event = TRUE;
+ tmp_event->dnd.send_event = TRUE;
- tmp_event.dnd.context = context;
- tmp_event.dnd.time = time;
+ 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_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
/* Send a drag-motion event */
@@ -2176,7 +2246,7 @@ gdk_drag_status (GdkDragContext *context,
{
GdkDragContextPrivateWin32 *private;
GdkDragContext *src_context;
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
g_return_if_fail (context != NULL);
@@ -2205,19 +2275,21 @@ gdk_drag_status (GdkDragContext *context,
if (private->drag_status == GDK_DRAG_STATUS_MOTION_WAIT)
private->drag_status = GDK_DRAG_STATUS_DRAG;
- tmp_event.type = GDK_DRAG_STATUS;
- tmp_event.dnd.window = context->source_window;
- tmp_event.dnd.send_event = FALSE;
- tmp_event.dnd.context = src_context;
- tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+ 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));
if (action == GDK_ACTION_DEFAULT)
action = 0;
src_context->action = action;
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
}
}
@@ -2246,7 +2318,7 @@ gdk_drop_finish (GdkDragContext *context,
{
GdkDragContextPrivateWin32 *private;
GdkDragContext *src_context;
- GdkEvent tmp_event;
+ GdkEvent *tmp_event;
g_return_if_fail (context != NULL);
@@ -2261,13 +2333,15 @@ gdk_drop_finish (GdkDragContext *context,
context->dest_window);
if (src_context)
{
- tmp_event.type = GDK_DROP_FINISHED;
- tmp_event.dnd.window = src_context->source_window;
- tmp_event.dnd.send_event = FALSE;
- tmp_event.dnd.context = src_context;
-
- GDK_NOTE (EVENTS, _gdk_win32_print_event (&tmp_event));
- gdk_event_put (&tmp_event);
+ tmp_event = gdk_event_new (GDK_DROP_FINISHED);
+ tmp_event->dnd.window = g_object_ref (src_context->source_window);
+ tmp_event->dnd.send_event = FALSE;
+ tmp_event->dnd.context = g_object_ref (src_context);
+ gdk_event_set_device (tmp_event, gdk_drag_context_get_device (src_context));
+
+ GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+ gdk_event_put (tmp_event);
+ gdk_event_free (tmp_event);
}
}
else