Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: ui/base/x/selection_owner.cc

Issue 2700043002: [Desktop Linux]: Fix copy and pasting long selections (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/base/x/selection_owner.h ('K') | « ui/base/x/selection_owner.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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() {
}
« ui/base/x/selection_owner.h ('K') | « ui/base/x/selection_owner.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698