DragAndDropHandler.h [plain text]
#ifndef DragAndDropHandler_h
#define DragAndDropHandler_h
#if ENABLE(DRAG_SUPPORT)
#include <WebCore/DataObjectGtk.h>
#include <WebCore/IntPoint.h>
#include <gtk/gtk.h>
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
typedef struct _GdkDragContext GdkDragContext;
typedef struct _GtkSelectionData GtkSelectionData;
namespace WebCore {
class DragData;
}
namespace WebKit {
class ShareableBitmap;
class WebPageProxy;
class DragAndDropHandler {
WTF_MAKE_NONCOPYABLE(DragAndDropHandler);
public:
DragAndDropHandler(WebPageProxy&);
void startDrag(const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage);
void fillDragData(GdkDragContext*, GtkSelectionData*, unsigned info);
void finishDrag(GdkDragContext*);
void dragEntered(GdkDragContext*, GtkSelectionData*, unsigned info, unsigned time);
void dragMotion(GdkDragContext*, const WebCore::IntPoint& position, unsigned time);
void dragLeave(GdkDragContext*);
bool drop(GdkDragContext*, const WebCore::IntPoint& position, unsigned time);
private:
struct DroppingContext {
DroppingContext(GdkDragContext*, const WebCore::IntPoint& position);
GdkDragContext* gdkContext;
RefPtr<WebCore::DataObjectGtk> dataObject;
WebCore::IntPoint lastMotionPosition;
unsigned pendingDataRequests;
bool dropHappened;
};
WebCore::DataObjectGtk* dataObjectForDropData(GdkDragContext*, GtkSelectionData*, unsigned info, WebCore::IntPoint& position);
WebCore::DataObjectGtk* requestDragData(GdkDragContext*, const WebCore::IntPoint& position, unsigned time);
WebPageProxy& m_page;
HashMap<GdkDragContext*, std::unique_ptr<DroppingContext>> m_droppingContexts;
#if GTK_CHECK_VERSION(3, 16, 0)
GRefPtr<GdkDragContext> m_dragContext;
RefPtr<WebCore::DataObjectGtk> m_draggingDataObject;
#else
HashMap<GdkDragContext*, RefPtr<WebCore::DataObjectGtk>> m_draggingDataObjects;
#endif
};
}
#endif // ENABLE(DRAG_SUPPORT)
#endif // DragAndDropHandler_h