summaryrefslogtreecommitdiff
path: root/chromium/ui/base/x/x11_drag_drop_client.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/base/x/x11_drag_drop_client.cc')
-rw-r--r--chromium/ui/base/x/x11_drag_drop_client.cc82
1 files changed, 44 insertions, 38 deletions
diff --git a/chromium/ui/base/x/x11_drag_drop_client.cc b/chromium/ui/base/x/x11_drag_drop_client.cc
index 91dba2f20d9..c96e99425d5 100644
--- a/chromium/ui/base/x/x11_drag_drop_client.cc
+++ b/chromium/ui/base/x/x11_drag_drop_client.cc
@@ -6,8 +6,10 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
+#include "base/notreached.h"
#include "ui/base/clipboard/clipboard_constants.h"
#include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/base/x/x11_os_exchange_data_provider.h"
#include "ui/base/x/x11_util.h"
@@ -28,9 +30,10 @@
// All the readings are freely available online.
namespace ui {
-
namespace {
+using mojom::DragOperation;
+
constexpr int kWillAcceptDrop = 1;
constexpr int kWantFurtherPosEvents = 2;
@@ -120,29 +123,29 @@ const char kXdndStatus[] = "XdndStatus";
static base::LazyInstance<std::map<x11::Window, XDragDropClient*>>::Leaky
g_live_client_map = LAZY_INSTANCE_INITIALIZER;
-// Converts a bitfield of actions into an Atom that represents what action
-// we're most likely to take on drop.
-x11::Atom XDragOperationToAtom(int drag_operation) {
- if (drag_operation & DragDropTypes::DRAG_COPY)
- return x11::GetAtom(kXdndActionCopy);
- if (drag_operation & DragDropTypes::DRAG_MOVE)
- return x11::GetAtom(kXdndActionMove);
- if (drag_operation & DragDropTypes::DRAG_LINK)
- return x11::GetAtom(kXdndActionLink);
-
+x11::Atom DragOperationToAtom(DragOperation operation) {
+ switch (operation) {
+ case DragOperation::kNone:
+ return x11::Atom::None;
+ case DragOperation::kCopy:
+ return x11::GetAtom(kXdndActionCopy);
+ case DragOperation::kMove:
+ return x11::GetAtom(kXdndActionMove);
+ case DragOperation::kLink:
+ return x11::GetAtom(kXdndActionLink);
+ }
+ NOTREACHED();
return x11::Atom::None;
}
-// Converts a single action atom to a drag operation.
-DragDropTypes::DragOperation AtomToDragOperation(x11::Atom atom) {
+DragOperation AtomToDragOperation(x11::Atom atom) {
if (atom == x11::GetAtom(kXdndActionCopy))
- return DragDropTypes::DRAG_COPY;
+ return DragOperation::kCopy;
if (atom == x11::GetAtom(kXdndActionMove))
- return DragDropTypes::DRAG_MOVE;
+ return DragOperation::kMove;
if (atom == x11::GetAtom(kXdndActionLink))
- return DragDropTypes::DRAG_LINK;
-
- return DragDropTypes::DRAG_NONE;
+ return DragOperation::kLink;
+ return DragOperation::kNone;
}
} // namespace
@@ -203,18 +206,19 @@ XDragDropClient::~XDragDropClient() {
std::vector<x11::Atom> XDragDropClient::GetOfferedDragOperations() const {
std::vector<x11::Atom> operations;
- if (drag_operation_ & DragDropTypes::DRAG_COPY)
+ if (allowed_operations_ & DragDropTypes::DRAG_COPY)
operations.push_back(x11::GetAtom(kXdndActionCopy));
- if (drag_operation_ & DragDropTypes::DRAG_MOVE)
+ if (allowed_operations_ & DragDropTypes::DRAG_MOVE)
operations.push_back(x11::GetAtom(kXdndActionMove));
- if (drag_operation_ & DragDropTypes::DRAG_LINK)
+ if (allowed_operations_ & DragDropTypes::DRAG_LINK)
operations.push_back(x11::GetAtom(kXdndActionLink));
return operations;
}
void XDragDropClient::CompleteXdndPosition(x11::Window source_window,
const gfx::Point& screen_point) {
- int drag_operation = delegate_->UpdateDrag(screen_point);
+ DragOperation drag_operation =
+ PreferredDragOperation(delegate_->UpdateDrag(screen_point));
// Sends an XdndStatus message back to the source_window. l[2,3]
// theoretically represent an area in the window where the current action is
@@ -223,10 +227,11 @@ void XDragDropClient::CompleteXdndPosition(x11::Window source_window,
// first bit of l[1] to disable the feature, and it appears that gtk neither
// sets this nor respects it if set.
auto xev = PrepareXdndClientMessage(kXdndStatus, source_window);
- xev.data.data32[1] =
- (drag_operation != 0) ? (kWantFurtherPosEvents | kWillAcceptDrop) : 0;
+ xev.data.data32[1] = (drag_operation != DragOperation::kNone)
+ ? (kWantFurtherPosEvents | kWillAcceptDrop)
+ : 0;
xev.data.data32[4] =
- static_cast<uint32_t>(XDragOperationToAtom(drag_operation));
+ static_cast<uint32_t>(DragOperationToAtom(drag_operation));
SendXClientEvent(source_window, xev);
}
@@ -246,7 +251,7 @@ void XDragDropClient::ProcessMouseMove(const gfx::Point& screen_point,
waiting_on_status_ = false;
next_position_message_.reset();
status_received_since_enter_ = false;
- negotiated_operation_ = DragDropTypes::DRAG_NONE;
+ negotiated_operation_ = DragOperation::kNone;
if (target_current_window_ != x11::Window::None) {
std::vector<x11::Atom> targets;
@@ -367,12 +372,12 @@ void XDragDropClient::OnXdndStatus(const x11::ClientMessageEvent& event) {
x11::Atom atom_operation = static_cast<x11::Atom>(event.data.data32[4]);
negotiated_operation_ = AtomToDragOperation(atom_operation);
} else {
- negotiated_operation_ = DragDropTypes::DRAG_NONE;
+ negotiated_operation_ = DragOperation::kNone;
}
if (source_state_ == SourceState::kPendingDrop) {
// We were waiting on the status message so we could send the XdndDrop.
- if (negotiated_operation_ == DragDropTypes::DRAG_NONE) {
+ if (negotiated_operation_ == DragOperation::kNone) {
EndMoveLoop();
return;
}
@@ -411,12 +416,12 @@ void XDragDropClient::OnXdndDrop(const x11::ClientMessageEvent& event) {
auto source_window = static_cast<x11::Window>(event.data.data32[0]);
- int drag_operation = delegate_->PerformDrop();
+ DragOperation drag_operation = delegate_->PerformDrop();
auto xev = PrepareXdndClientMessage(kXdndFinished, source_window);
- xev.data.data32[1] = (drag_operation != 0) ? 1 : 0;
+ xev.data.data32[1] = (drag_operation != DragOperation::kNone) ? 1 : 0;
xev.data.data32[2] =
- static_cast<uint32_t>(XDragOperationToAtom(drag_operation));
+ static_cast<uint32_t>(DragOperationToAtom(drag_operation));
SendXClientEvent(source_window, xev);
}
@@ -428,7 +433,7 @@ void XDragDropClient::OnXdndFinished(const x11::ClientMessageEvent& event) {
// Clear |negotiated_operation_| if the drag was rejected.
if ((event.data.data32[1] & 1) == 0)
- negotiated_operation_ = DragDropTypes::DRAG_NONE;
+ negotiated_operation_ = DragOperation::kNone;
// Clear |target_current_window_| to avoid sending XdndLeave upon ending the
// move loop.
@@ -447,14 +452,15 @@ void XDragDropClient::OnSelectionNotify(
x11::DeleteProperty(xwindow_, xselection.property);
}
-void XDragDropClient::InitDrag(int operation, const OSExchangeData* data) {
+void XDragDropClient::InitDrag(int allowed_operations,
+ const OSExchangeData* data) {
target_current_window_ = x11::Window::None;
source_state_ = SourceState::kOther;
waiting_on_status_ = false;
next_position_message_.reset();
status_received_since_enter_ = false;
- drag_operation_ = operation;
- negotiated_operation_ = DragDropTypes::DRAG_NONE;
+ allowed_operations_ = allowed_operations;
+ negotiated_operation_ = DragOperation::kNone;
source_provider_ =
static_cast<const XOSExchangeDataProvider*>(&data->provider());
@@ -544,7 +550,7 @@ void XDragDropClient::HandleMouseReleased() {
return;
}
- if (negotiated_operation() != DragDropTypes::DRAG_NONE) {
+ if (negotiated_operation() != DragOperation::kNone) {
// Start timer to end the move loop if the target takes too long to send
// an XdndFinished message. It is important that StartEndMoveLoopTimer()
// is called before SendXdndDrop() because SendXdndDrop()
@@ -657,8 +663,8 @@ void XDragDropClient::SendXdndPosition(x11::Window dest_window,
auto xev = PrepareXdndClientMessage(kXdndPosition, dest_window);
xev.data.data32[2] = (screen_point.x() << 16) | screen_point.y();
xev.data.data32[3] = event_time;
- xev.data.data32[4] =
- static_cast<uint32_t>(XDragOperationToAtom(drag_operation_));
+ xev.data.data32[4] = static_cast<uint32_t>(
+ DragOperationToAtom(PreferredDragOperation(allowed_operations_)));
SendXClientEvent(dest_window, xev);
// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html and