void DragAndDropHandler::finishDrag(GdkDragContext* context) { #if GTK_CHECK_VERSION(3, 16, 0) // This can happen when attempting to call finish drag from webkitWebViewBaseDragEnd() // for a obsolete DnD operation that got previously cancelled in startDrag(). if (m_dragContext.get() != context) return; if (!m_draggingSelectionData) return; m_dragContext = nullptr; m_draggingSelectionData = nullptr; #else if (!m_draggingSelectionDataMap.remove(context)) return; #endif GdkDevice* device = gdk_drag_context_get_device(context); int x = 0, y = 0; gdk_device_get_window_at_position(device, &x, &y); int xRoot = 0, yRoot = 0; gdk_device_get_position(device, nullptr, &xRoot, &yRoot); m_page.dragEnded(IntPoint(x, y), IntPoint(xRoot, yRoot), gdkDragActionToDragOperation(gdk_drag_context_get_selected_action(context))); }
void DragAndDropHandler::finishDrag(GdkDragContext* context) { if (!m_draggingDataObjects.remove(context)) return; GdkDevice* device = gdk_drag_context_get_device(context); int x = 0, y = 0; gdk_device_get_window_at_position(device, &x, &y); int xRoot = 0, yRoot = 0; gdk_device_get_position(device, nullptr, &xRoot, &yRoot); m_page.dragEnded(IntPoint(x, y), IntPoint(xRoot, yRoot), gdkDragActionToDragOperation(gdk_drag_context_get_selected_action(context))); }
bool DragAndDropHandler::drop(GdkDragContext* context, const IntPoint& position, unsigned time) { DroppingContext* droppingContext = m_droppingContexts.get(context); if (!droppingContext) return false; droppingContext->dropHappened = true; DataObjectGtk* dataObject = droppingContext->dataObject.get(); if (!dataObject) return false; DragData dragData(dataObject, position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), gdkDragActionToDragOperation(gdk_drag_context_get_actions(context))); SandboxExtension::Handle handle; SandboxExtension::HandleArray sandboxExtensionForUpload; m_page.performDragOperation(dragData, String(), handle, sandboxExtensionForUpload); gtk_drag_finish(context, TRUE, FALSE, time); return true; }
void DragAndDropHandler::dragMotion(GdkDragContext* context, const IntPoint& position, unsigned time) { DataObjectGtk* dataObject = requestDragData(context, position, time); if (!dataObject) return; DragData dragData(dataObject, position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), gdkDragActionToDragOperation(gdk_drag_context_get_actions(context))); m_page.dragUpdated(dragData); DragOperation operation = m_page.currentDragOperation(); gdk_drag_status(context, dragOperationToSingleGdkDragAction(operation), time); }
void DragAndDropHandler::dragEntered(GdkDragContext* context, GtkSelectionData* selectionData, unsigned info, unsigned time) { IntPoint position; DataObjectGtk* dataObject = dataObjectForDropData(context, selectionData, info, position); if (!dataObject) return; DragData dragData(dataObject, position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), gdkDragActionToDragOperation(gdk_drag_context_get_actions(context))); m_page.resetCurrentDragInformation(); m_page.dragEntered(dragData); DragOperation operation = m_page.currentDragOperation(); gdk_drag_status(context, dragOperationToSingleGdkDragAction(operation), time); }