X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gdk%2Fwin32%2Fgdkdnd-win32.c;h=1c7f42a99db5a73da0d6cb5732db63063a4d3276;hb=00c5e838710a01ed97a46d96910b6f118d240b99;hp=4ea435441ed3cef95b8e0d63d9968a2f47fee8af;hpb=1c84483f3ee8559179b49a200d3cc6854e81b873;p=~andy%2Fgtk diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c index 4ea435441..1c7f42a99 100644 --- a/gdk/win32/gdkdnd-win32.c +++ b/gdk/win32/gdkdnd-win32.c @@ -27,21 +27,27 @@ #include "config.h" +#include + #define INITGUID -#include +#include "gdkdnd.h" +#include "gdkproperty.h" +#include "gdkprivate.h" +#include "gdkx.h" #ifdef OLE2_DND #include +#else +#include #endif -#ifdef _MSC_VER +#ifdef _MSC_VER /* These aren't in mingw32 */ #include #include #endif #include -#include "gdkx.h" typedef struct _GdkDragContextPrivate GdkDragContextPrivate; @@ -59,6 +65,21 @@ typedef enum { #ifdef OLE2_DND +#define PRINT_RIID(riid) \ + g_print ("riid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \ + ((gulong *) riid)[0], \ + ((gushort *) riid)[2], \ + ((gushort *) riid)[3], \ + ((guchar *) riid)[8], \ + ((guchar *) riid)[9], \ + ((guchar *) riid)[10], \ + ((guchar *) riid)[11], \ + ((guchar *) riid)[12], \ + ((guchar *) riid)[13], \ + ((guchar *) riid)[14], \ + ((guchar *) riid)[15]); + + HRESULT STDMETHODCALLTYPE m_query_interface_target (IDropTarget __RPC_FAR *This, /* [in] */ REFIID riid, @@ -169,30 +190,20 @@ m_query_interface_target (IDropTarget __RPC_FAR *This, *ppvObject = NULL; - g_print ("riid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", - ((gulong *) riid)[0], - ((gushort *) riid)[2], - ((gushort *) riid)[3], - ((guchar *) riid)[8], - ((guchar *) riid)[9], - ((guchar *) riid)[10], - ((guchar *) riid)[11], - ((guchar *) riid)[12], - ((guchar *) riid)[13], - ((guchar *) riid)[14], - ((guchar *) riid)[15]); + PRINT_RIID (riid); + if (IsEqualGUID (riid, &IID_IUnknown)) { + g_print ("...IUnknown\n"); m_add_ref_target (This); *ppvObject = This; - g_print ("...IUnknown\n"); return S_OK; } else if (IsEqualGUID (riid, &IID_IDropTarget)) { + g_print ("...IDropTarget\n"); m_add_ref_target (This); *ppvObject = This; - g_print ("...IDropTarget\n"); return S_OK; } else @@ -280,35 +291,19 @@ m_query_interface_source (IDropSource __RPC_FAR *This, *ppvObject = NULL; - g_print ("riid = %.02x%.02x%.02x%.02x-%.02x%.02x-%.02x%.02x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", - ((guchar *) riid)[0], - ((guchar *) riid)[1], - ((guchar *) riid)[2], - ((guchar *) riid)[3], - ((guchar *) riid)[4], - ((guchar *) riid)[5], - ((guchar *) riid)[6], - ((guchar *) riid)[7], - ((guchar *) riid)[8], - ((guchar *) riid)[9], - ((guchar *) riid)[10], - ((guchar *) riid)[11], - ((guchar *) riid)[12], - ((guchar *) riid)[13], - ((guchar *) riid)[14], - ((guchar *) riid)[15]); + PRINT_RIID (riid); if (IsEqualGUID (riid, &IID_IUnknown)) { + g_print ("...IUnknown\n"); m_add_ref_source (This); *ppvObject = This; - g_print ("...IUnknown\n"); return S_OK; } else if (IsEqualGUID (riid, &IID_IDropSource)) { + g_print ("...IDropSource\n"); m_add_ref_source (This); *ppvObject = This; - g_print ("...IDropSource\n"); return S_OK; } else @@ -603,7 +598,7 @@ gdk_dropfiles_filter (GdkXEvent *xev, private = (GdkDragContextPrivate *) context; context->protocol = GDK_DRAG_PROTO_WIN32_DROPFILES; context->is_source = FALSE; - context->source_window = (GdkWindow *) &gdk_root_parent; + context->source_window = (GdkWindow *) gdk_root_parent; context->dest_window = event->any.window; gdk_window_ref (context->dest_window); /* WM_DROPFILES drops are always file names */ @@ -645,7 +640,7 @@ gdk_dropfiles_filter (GdkXEvent *xev, } g_string_append (result, "\015\012"); } - gdk_sel_prop_store ((GdkWindow *) &gdk_root_parent, + gdk_sel_prop_store ((GdkWindow *) gdk_root_parent, text_uri_list_atom, 8, result->str, result->len + 1); DragFinish (hdrop); @@ -740,7 +735,7 @@ gdk_drag_find_window (GdkDragContext *context, GdkDragProtocol *protocol) { GdkDragContextPrivate *private = (GdkDragContextPrivate *)context; - GdkWindowPrivate *drag_window_private = (GdkWindowPrivate *) drag_window; + GdkDrawablePrivate *drag_window_private = (GdkDrawablePrivate*) drag_window; HWND recipient; POINT pt; @@ -817,10 +812,30 @@ gdk_drop_finish (GdkDragContext *context, { } +static GdkFilterReturn +gdk_destroy_filter (GdkXEvent *xev, + GdkEvent *event, + gpointer data) +{ +#ifdef OLE2_DND + MSG *msg = (MSG *) xev; + + if (msg->message == WM_DESTROY) + { + IDropTarget *idtp = (IDropTarget *) data; + + GDK_NOTE (DND, g_print ("gdk_destroy_filter: WM_DESTROY: %#x\n", msg->hwnd)); + RevokeDragDrop (msg->hwnd); + CoLockObjectExternal (idtp, FALSE, TRUE); + } +#endif + return GDK_FILTER_CONTINUE; +} + void gdk_window_register_dnd (GdkWindow *window) { - GdkWindowPrivate *private = (GdkWindowPrivate *) window; + GdkDrawablePrivate *private = (GdkDrawablePrivate *) window; #ifdef OLE2_DND target_drag_context *context; HRESULT hres; @@ -854,6 +869,10 @@ gdk_window_register_dnd (GdkWindow *window) } else if (!SUCCEEDED (hres)) g_warning ("gdk_window_register_dnd: RegisterDragDrop failed"); + else + { + gdk_window_add_filter (window, gdk_destroy_filter, &context->idt); + } } #endif }