Index: ui/base/x/selection_owner.h |
diff --git a/ui/base/x/selection_owner.h b/ui/base/x/selection_owner.h |
index 232df96c97769547f2abae0488d8a98c11ce5317..df208416e9c57912af51035a206efde1655c80db 100644 |
--- a/ui/base/x/selection_owner.h |
+++ b/ui/base/x/selection_owner.h |
@@ -9,6 +9,9 @@ |
#include "base/basictypes.h" |
#include "base/callback.h" |
+#include "base/memory/ref_counted_memory.h" |
+#include "base/time/time.h" |
+#include "base/timer/timer.h" |
#include "ui/base/ui_base_export.h" |
#include "ui/base/x/selection_utils.h" |
#include "ui/gfx/x/x11_atom_cache.h" |
@@ -45,15 +48,66 @@ class UI_BASE_EXPORT SelectionOwner { |
// It is our owner's responsibility to plumb X11 events on |xwindow_| to us. |
void OnSelectionRequest(const XEvent& event); |
void OnSelectionClear(const XEvent& event); |
- // TODO(erg): Do we also need to follow PropertyNotify events? We currently |
- // don't, but there were open todos in the previous implementation. |
+ |
+ // Returns true if SelectionOwner can process the XChangeProperty event, |
+ // |event|. |
+ bool CanDispatchPropertyEvent(const XEvent& event); |
+ |
+ void OnPropertyEvent(const XEvent& event); |
private: |
+ // Holds state related to an incremental data transfer. |
+ struct IncrTransfer { |
Daniel Erat
2014/07/25 19:38:44
nit: rename to IncrementalTransfer
|
+ IncrTransfer(XID window, |
+ XAtom target, |
+ XAtom property, |
+ const scoped_refptr<base::RefCountedMemory>& incr_data, |
+ int incr_offset, |
+ base::TimeTicks incr_timeout, |
+ int incr_foreign_window_manager_id); |
+ ~IncrTransfer(); |
+ |
+ // Parameters from the XSelectionRequest. The data is transferred over |
+ // |property| on |window|. |
+ XID window; |
+ XAtom target; |
+ XAtom property; |
+ |
+ // The data to be transferred. |
+ scoped_refptr<base::RefCountedMemory> data; |
+ |
+ // The offset from the beginning of |data| of the first byte to be |
+ // transferred in the next chunk. |
+ size_t offset; |
+ |
+ // Time when the transfer should be aborted because the selection requestor |
+ // is taking too long to notify us that we can send the next chunk. |
+ base::TimeTicks timeout; |
+ |
+ // Used to unselect PropertyChangeMask on |window| when we are done with |
+ // the data transfer. |
+ int foreign_window_manager_id; |
+ }; |
+ |
// Attempts to convert the selection to |target|. If the conversion is |
// successful, true is returned and the result is stored in the |property| |
// of |requestor|. |
bool ProcessTarget(XAtom target, XID requestor, XAtom property); |
+ // Sends the next chunk of data for given the incremental data transfer. |
+ void ProcessIncr(IncrTransfer* transfer); |
Daniel Erat
2014/07/25 19:38:44
nit: ProcessIncrementalTransfer
|
+ |
+ // Aborts any incremental data transfers which have timed out. |
+ void AbortStaleIncrTransfers(); |
Daniel Erat
2014/07/25 19:38:44
AbortStaleIncrementalTransfers
|
+ |
+ // Called when the transfer at |it| has completed to do cleanup. |
+ void CompleteIncrTransfer(std::vector<IncrTransfer>::iterator it); |
Daniel Erat
2014/07/25 19:38:44
CompleteIncrementalTransfer
|
+ |
+ // Returns the incremental data transfer, if any, which was waiting for |
+ // |event|. |
+ std::vector<IncrTransfer>::iterator FindIncrTransferForEvent( |
Daniel Erat
2014/07/25 19:38:44
etc.
|
+ const XEvent& event); |
+ |
// Our X11 state. |
XDisplay* x_display_; |
XID x_window_; |
@@ -61,9 +115,17 @@ class UI_BASE_EXPORT SelectionOwner { |
// The X11 selection that this instance communicates on. |
XAtom selection_name_; |
+ // The maximum size of data we can put in XChangeProperty(). |
+ size_t max_request_size_; |
+ |
// The data we are currently serving. |
SelectionFormatMap format_map_; |
+ std::vector<IncrTransfer> incrs_; |
Daniel Erat
2014/07/25 19:38:44
incremental_transfers_
|
+ |
+ // Used to abort stale incremental data transfers. |
+ base::RepeatingTimer<SelectionOwner> incr_timer_; |
Daniel Erat
2014/07/25 19:38:44
incremental_timer_
|
+ |
X11AtomCache atom_cache_; |
DISALLOW_COPY_AND_ASSIGN(SelectionOwner); |