Chromium Code Reviews| Index: ui/base/x/selection_owner.cc |
| diff --git a/ui/base/x/selection_owner.cc b/ui/base/x/selection_owner.cc |
| index ea0ad226f32eafebc45101073a89fba1b5e146c6..b6beacc1d2216f09f157eb2cea1cfcb9dda0e1b5 100644 |
| --- a/ui/base/x/selection_owner.cc |
| +++ b/ui/base/x/selection_owner.cc |
| @@ -9,6 +9,7 @@ |
| #include <X11/Xatom.h> |
| #include "base/logging.h" |
| +#include "base/memory/ptr_util.h" |
| #include "ui/base/x/selection_utils.h" |
| #include "ui/base/x/x11_util.h" |
| #include "ui/base/x/x11_window_event_manager.h" |
| @@ -201,13 +202,13 @@ bool SelectionOwner::CanDispatchPropertyEvent(const XEvent& event) { |
| } |
| void SelectionOwner::OnPropertyEvent(const XEvent& event) { |
| - std::vector<IncrementalTransfer>::iterator it = |
| - FindIncrementalTransferForEvent(event); |
| + IncrementalTransferIt it = FindIncrementalTransferForEvent(event); |
| if (it == incremental_transfers_.end()) |
| return; |
| - ProcessIncrementalTransfer(&(*it)); |
| - if (!it->data.get()) |
| + IncrementalTransfer* incremental_transfer = (*it).get(); |
|
dcheng
2017/02/17 07:42:13
Does it->get() work?
pkotwicz
2017/02/17 19:19:07
Yes it does :) Thank you!
|
| + ProcessIncrementalTransfer(incremental_transfer); |
| + if (!incremental_transfer->data.get()) |
| CompleteIncrementalTransfer(it); |
| } |
| @@ -269,10 +270,12 @@ bool SelectionOwner::ProcessTarget(XAtom target, |
| base::TimeTicks timeout = |
| base::TimeTicks::Now() + |
| base::TimeDelta::FromMilliseconds(kIncrementalTransferTimeoutMs); |
| - requestor_events_.reset( |
| - new ui::XScopedEventSelector(requestor, PropertyChangeMask)); |
| - incremental_transfers_.push_back(IncrementalTransfer( |
| - requestor, target, property, it->second, 0, timeout)); |
| + std::unique_ptr<IncrementalTransfer> incremental_transfer( |
| + new IncrementalTransfer(requestor, target, property, |
| + base::WrapUnique(new XScopedEventSelector( |
|
dcheng
2017/02/17 07:42:13
Nit: base::MakeUnique
pkotwicz
2017/02/17 19:19:07
Done.
|
| + requestor, PropertyChangeMask)), |
| + it->second, 0, timeout)); |
| + incremental_transfers_.push_back(std::move(incremental_transfer)); |
| // Start a timer to abort the data transfer in case that the selection |
| // requestor does not support the INCR property or gets destroyed during |
| @@ -331,29 +334,25 @@ void SelectionOwner::AbortStaleIncrementalTransfers() { |
| base::TimeTicks now = base::TimeTicks::Now(); |
| for (int i = static_cast<int>(incremental_transfers_.size()) - 1; |
| i >= 0; --i) { |
| - if (incremental_transfers_[i].timeout <= now) |
| + if (incremental_transfers_[i]->timeout <= now) |
| CompleteIncrementalTransfer(incremental_transfers_.begin() + i); |
| } |
| } |
| -void SelectionOwner::CompleteIncrementalTransfer( |
| - std::vector<IncrementalTransfer>::iterator it) { |
| - requestor_events_.reset(); |
|
dcheng
2017/02/17 07:42:13
Is it possible to just only reset this when transf
pkotwicz
2017/02/17 19:19:07
Unfortunately, there may be multiple requesting ap
|
| - |
| +void SelectionOwner::CompleteIncrementalTransfer(IncrementalTransferIt it) { |
| incremental_transfers_.erase(it); |
| if (incremental_transfers_.empty()) |
| incremental_transfer_abort_timer_.Stop(); |
| } |
| -std::vector<SelectionOwner::IncrementalTransfer>::iterator |
| - SelectionOwner::FindIncrementalTransferForEvent(const XEvent& event) { |
| - for (std::vector<IncrementalTransfer>::iterator it = |
| - incremental_transfers_.begin(); |
| - it != incremental_transfers_.end(); |
| - ++it) { |
| - if (it->window == event.xproperty.window && |
| - it->property == event.xproperty.atom) { |
| +SelectionOwner::IncrementalTransferIt |
| +SelectionOwner::FindIncrementalTransferForEvent(const XEvent& event) { |
| + for (IncrementalTransferIt it = incremental_transfers_.begin(); |
| + it != incremental_transfers_.end(); ++it) { |
| + IncrementalTransfer* incremental_transfer = (*it).get(); |
|
dcheng
2017/02/17 07:42:13
Nit: Does it->get() work?
pkotwicz
2017/02/17 19:19:07
Done.
|
| + if (incremental_transfer->window == event.xproperty.window && |
| + incremental_transfer->property == event.xproperty.atom) { |
| return it; |
| } |
| } |
| @@ -364,19 +363,18 @@ SelectionOwner::IncrementalTransfer::IncrementalTransfer( |
| XID window, |
| XAtom target, |
| XAtom property, |
| + std::unique_ptr<XScopedEventSelector> event_selector, |
| const scoped_refptr<base::RefCountedMemory>& data, |
| int offset, |
| base::TimeTicks timeout) |
| : window(window), |
| target(target), |
| property(property), |
| + event_selector(std::move(event_selector)), |
| data(data), |
| offset(offset), |
| timeout(timeout) {} |
| -SelectionOwner::IncrementalTransfer::IncrementalTransfer( |
| - const IncrementalTransfer& other) = default; |
| - |
| SelectionOwner::IncrementalTransfer::~IncrementalTransfer() { |
| } |