| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/clipboard/clipboard_aurax11.h" | 5 #include "ui/base/clipboard/clipboard_aurax11.h" |
| 6 | 6 |
| 7 #include <X11/Xatom.h> | 7 #include <X11/Xatom.h> |
| 8 #include <X11/extensions/Xfixes.h> | 8 #include <X11/extensions/Xfixes.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "ui/base/x/selection_owner.h" | 27 #include "ui/base/x/selection_owner.h" |
| 28 #include "ui/base/x/selection_requestor.h" | 28 #include "ui/base/x/selection_requestor.h" |
| 29 #include "ui/base/x/selection_utils.h" | 29 #include "ui/base/x/selection_utils.h" |
| 30 #include "ui/base/x/x11_util.h" | 30 #include "ui/base/x/x11_util.h" |
| 31 #include "ui/base/x/x11_window_event_manager.h" | 31 #include "ui/base/x/x11_window_event_manager.h" |
| 32 #include "ui/events/platform/platform_event_dispatcher.h" | 32 #include "ui/events/platform/platform_event_dispatcher.h" |
| 33 #include "ui/events/platform/platform_event_observer.h" | 33 #include "ui/events/platform/platform_event_observer.h" |
| 34 #include "ui/events/platform/platform_event_source.h" | 34 #include "ui/events/platform/platform_event_source.h" |
| 35 #include "ui/gfx/codec/png_codec.h" | 35 #include "ui/gfx/codec/png_codec.h" |
| 36 #include "ui/gfx/geometry/size.h" | 36 #include "ui/gfx/geometry/size.h" |
| 37 #include "ui/gfx/x/x11_atom_cache.h" | |
| 38 | 37 |
| 39 namespace ui { | 38 namespace ui { |
| 40 | 39 |
| 41 namespace { | 40 namespace { |
| 42 | 41 |
| 43 const char kClipboard[] = "CLIPBOARD"; | 42 const char kClipboard[] = "CLIPBOARD"; |
| 44 const char kClipboardManager[] = "CLIPBOARD_MANAGER"; | 43 const char kClipboardManager[] = "CLIPBOARD_MANAGER"; |
| 45 const char kMimeTypeFilename[] = "chromium/filename"; | 44 const char kMimeTypeFilename[] = "chromium/filename"; |
| 46 const char kSaveTargets[] = "SAVE_TARGETS"; | 45 const char kSaveTargets[] = "SAVE_TARGETS"; |
| 47 const char kTargets[] = "TARGETS"; | 46 const char kTargets[] = "TARGETS"; |
| 48 | 47 |
| 49 const char* kAtomsToCache[] = {kClipboard, | |
| 50 kClipboardManager, | |
| 51 Clipboard::kMimeTypePNG, | |
| 52 kMimeTypeFilename, | |
| 53 Clipboard::kMimeTypeMozillaURL, | |
| 54 Clipboard::kMimeTypeWebkitSmartPaste, | |
| 55 kSaveTargets, | |
| 56 kString, | |
| 57 kTargets, | |
| 58 kText, | |
| 59 kUtf8String, | |
| 60 nullptr}; | |
| 61 | |
| 62 /////////////////////////////////////////////////////////////////////////////// | 48 /////////////////////////////////////////////////////////////////////////////// |
| 63 | 49 |
| 64 // Uses the XFixes API to provide sequence numbers for GetSequenceNumber(). | 50 // Uses the XFixes API to provide sequence numbers for GetSequenceNumber(). |
| 65 class SelectionChangeObserver : public ui::PlatformEventObserver { | 51 class SelectionChangeObserver : public ui::PlatformEventObserver { |
| 66 public: | 52 public: |
| 67 static SelectionChangeObserver* GetInstance(); | 53 static SelectionChangeObserver* GetInstance(); |
| 68 | 54 |
| 69 uint64_t clipboard_sequence_number() const { | 55 uint64_t clipboard_sequence_number() const { |
| 70 return clipboard_sequence_number_; | 56 return clipboard_sequence_number_; |
| 71 } | 57 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 89 DISALLOW_COPY_AND_ASSIGN(SelectionChangeObserver); | 75 DISALLOW_COPY_AND_ASSIGN(SelectionChangeObserver); |
| 90 }; | 76 }; |
| 91 | 77 |
| 92 SelectionChangeObserver::SelectionChangeObserver() | 78 SelectionChangeObserver::SelectionChangeObserver() |
| 93 : event_base_(-1), | 79 : event_base_(-1), |
| 94 clipboard_atom_(None), | 80 clipboard_atom_(None), |
| 95 clipboard_sequence_number_(0), | 81 clipboard_sequence_number_(0), |
| 96 primary_sequence_number_(0) { | 82 primary_sequence_number_(0) { |
| 97 int ignored; | 83 int ignored; |
| 98 if (XFixesQueryExtension(gfx::GetXDisplay(), &event_base_, &ignored)) { | 84 if (XFixesQueryExtension(gfx::GetXDisplay(), &event_base_, &ignored)) { |
| 99 clipboard_atom_ = XInternAtom(gfx::GetXDisplay(), kClipboard, false); | 85 clipboard_atom_ = GetAtom(kClipboard); |
| 100 XFixesSelectSelectionInput(gfx::GetXDisplay(), GetX11RootWindow(), | 86 XFixesSelectSelectionInput(gfx::GetXDisplay(), GetX11RootWindow(), |
| 101 clipboard_atom_, | 87 clipboard_atom_, |
| 102 XFixesSetSelectionOwnerNotifyMask | | 88 XFixesSetSelectionOwnerNotifyMask | |
| 103 XFixesSelectionWindowDestroyNotifyMask | | 89 XFixesSelectionWindowDestroyNotifyMask | |
| 104 XFixesSelectionClientCloseNotifyMask); | 90 XFixesSelectionClientCloseNotifyMask); |
| 105 // This seems to be semi-optional. For some reason, registering for any | 91 // This seems to be semi-optional. For some reason, registering for any |
| 106 // selection notify events seems to subscribe us to events for both the | 92 // selection notify events seems to subscribe us to events for both the |
| 107 // primary and the clipboard buffers. Register anyway just to be safe. | 93 // primary and the clipboard buffers. Register anyway just to be safe. |
| 108 XFixesSelectSelectionInput(gfx::GetXDisplay(), GetX11RootWindow(), | 94 XFixesSelectSelectionInput(gfx::GetXDisplay(), GetX11RootWindow(), |
| 109 XA_PRIMARY, | 95 XA_PRIMARY, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 138 } | 124 } |
| 139 } | 125 } |
| 140 | 126 |
| 141 /////////////////////////////////////////////////////////////////////////////// | 127 /////////////////////////////////////////////////////////////////////////////// |
| 142 | 128 |
| 143 // Represents a list of possible return types. Copy constructable. | 129 // Represents a list of possible return types. Copy constructable. |
| 144 class TargetList { | 130 class TargetList { |
| 145 public: | 131 public: |
| 146 typedef std::vector< ::Atom> AtomVector; | 132 typedef std::vector< ::Atom> AtomVector; |
| 147 | 133 |
| 148 TargetList(const AtomVector& target_list, X11AtomCache* atom_cache); | 134 explicit TargetList(const AtomVector& target_list); |
| 149 | 135 |
| 150 const AtomVector& target_list() { return target_list_; } | 136 const AtomVector& target_list() { return target_list_; } |
| 151 | 137 |
| 152 bool ContainsText() const; | 138 bool ContainsText() const; |
| 153 bool ContainsFormat(const Clipboard::FormatType& format_type) const; | 139 bool ContainsFormat(const Clipboard::FormatType& format_type) const; |
| 154 bool ContainsAtom(::Atom atom) const; | 140 bool ContainsAtom(::Atom atom) const; |
| 155 | 141 |
| 156 private: | 142 private: |
| 157 AtomVector target_list_; | 143 AtomVector target_list_; |
| 158 X11AtomCache* atom_cache_; | |
| 159 }; | 144 }; |
| 160 | 145 |
| 161 TargetList::TargetList(const AtomVector& target_list, | 146 TargetList::TargetList(const AtomVector& target_list) |
| 162 X11AtomCache* atom_cache) | 147 : target_list_(target_list) {} |
| 163 : target_list_(target_list), | |
| 164 atom_cache_(atom_cache) { | |
| 165 } | |
| 166 | 148 |
| 167 bool TargetList::ContainsText() const { | 149 bool TargetList::ContainsText() const { |
| 168 std::vector< ::Atom> atoms = GetTextAtomsFrom(atom_cache_); | 150 std::vector<::Atom> atoms = GetTextAtomsFrom(); |
| 169 for (std::vector< ::Atom>::const_iterator it = atoms.begin(); | 151 for (std::vector< ::Atom>::const_iterator it = atoms.begin(); |
| 170 it != atoms.end(); ++it) { | 152 it != atoms.end(); ++it) { |
| 171 if (ContainsAtom(*it)) | 153 if (ContainsAtom(*it)) |
| 172 return true; | 154 return true; |
| 173 } | 155 } |
| 174 | 156 |
| 175 return false; | 157 return false; |
| 176 } | 158 } |
| 177 | 159 |
| 178 bool TargetList::ContainsFormat( | 160 bool TargetList::ContainsFormat( |
| 179 const Clipboard::FormatType& format_type) const { | 161 const Clipboard::FormatType& format_type) const { |
| 180 ::Atom atom = atom_cache_->GetAtom(format_type.ToString().c_str()); | 162 ::Atom atom = GetAtom(format_type.ToString().c_str()); |
| 181 return ContainsAtom(atom); | 163 return ContainsAtom(atom); |
| 182 } | 164 } |
| 183 | 165 |
| 184 bool TargetList::ContainsAtom(::Atom atom) const { | 166 bool TargetList::ContainsAtom(::Atom atom) const { |
| 185 return find(target_list_.begin(), target_list_.end(), atom) | 167 return find(target_list_.begin(), target_list_.end(), atom) |
| 186 != target_list_.end(); | 168 != target_list_.end(); |
| 187 } | 169 } |
| 188 | 170 |
| 189 } // namespace | 171 } // namespace |
| 190 | 172 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 /////////////////////////////////////////////////////////////////////////////// | 208 /////////////////////////////////////////////////////////////////////////////// |
| 227 // ClipboardAuraX11::AuraX11Details | 209 // ClipboardAuraX11::AuraX11Details |
| 228 | 210 |
| 229 // Private implementation of our X11 integration. Keeps X11 headers out of the | 211 // Private implementation of our X11 integration. Keeps X11 headers out of the |
| 230 // majority of chrome, which break badly. | 212 // majority of chrome, which break badly. |
| 231 class ClipboardAuraX11::AuraX11Details : public PlatformEventDispatcher { | 213 class ClipboardAuraX11::AuraX11Details : public PlatformEventDispatcher { |
| 232 public: | 214 public: |
| 233 AuraX11Details(); | 215 AuraX11Details(); |
| 234 ~AuraX11Details() override; | 216 ~AuraX11Details() override; |
| 235 | 217 |
| 236 X11AtomCache* atom_cache() { return &atom_cache_; } | |
| 237 | |
| 238 // Returns the X11 type that we pass to various XSelection functions for the | 218 // Returns the X11 type that we pass to various XSelection functions for the |
| 239 // given type. | 219 // given type. |
| 240 ::Atom LookupSelectionForClipboardType(ClipboardType type) const; | 220 ::Atom LookupSelectionForClipboardType(ClipboardType type) const; |
| 241 | 221 |
| 242 // Returns the X11 type that we pass to various XSelection functions for | 222 // Returns the X11 type that we pass to various XSelection functions for |
| 243 // CLIPBOARD_TYPE_COPY_PASTE. | 223 // CLIPBOARD_TYPE_COPY_PASTE. |
| 244 ::Atom GetCopyPasteSelection() const; | 224 ::Atom GetCopyPasteSelection() const; |
| 245 | 225 |
| 246 // Finds the SelectionFormatMap for the incoming selection atom. | 226 // Finds the SelectionFormatMap for the incoming selection atom. |
| 247 const SelectionFormatMap& LookupStorageForAtom(::Atom atom); | 227 const SelectionFormatMap& LookupStorageForAtom(::Atom atom); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 // Our X11 state. | 278 // Our X11 state. |
| 299 Display* x_display_; | 279 Display* x_display_; |
| 300 ::Window x_root_window_; | 280 ::Window x_root_window_; |
| 301 | 281 |
| 302 // Input-only window used as a selection owner. | 282 // Input-only window used as a selection owner. |
| 303 ::Window x_window_; | 283 ::Window x_window_; |
| 304 | 284 |
| 305 // Events selected on |x_window_|. | 285 // Events selected on |x_window_|. |
| 306 std::unique_ptr<XScopedEventSelector> x_window_events_; | 286 std::unique_ptr<XScopedEventSelector> x_window_events_; |
| 307 | 287 |
| 308 X11AtomCache atom_cache_; | |
| 309 | |
| 310 // Object which requests and receives selection data. | 288 // Object which requests and receives selection data. |
| 311 SelectionRequestor selection_requestor_; | 289 SelectionRequestor selection_requestor_; |
| 312 | 290 |
| 313 // Temporary target map that we write to during DispatchObects. | 291 // Temporary target map that we write to during DispatchObects. |
| 314 SelectionFormatMap clipboard_data_; | 292 SelectionFormatMap clipboard_data_; |
| 315 | 293 |
| 316 // Objects which offer selection data to other windows. | 294 // Objects which offer selection data to other windows. |
| 317 SelectionOwner clipboard_owner_; | 295 SelectionOwner clipboard_owner_; |
| 318 SelectionOwner primary_owner_; | 296 SelectionOwner primary_owner_; |
| 319 | 297 |
| 320 DISALLOW_COPY_AND_ASSIGN(AuraX11Details); | 298 DISALLOW_COPY_AND_ASSIGN(AuraX11Details); |
| 321 }; | 299 }; |
| 322 | 300 |
| 323 ClipboardAuraX11::AuraX11Details::AuraX11Details() | 301 ClipboardAuraX11::AuraX11Details::AuraX11Details() |
| 324 : x_display_(gfx::GetXDisplay()), | 302 : x_display_(gfx::GetXDisplay()), |
| 325 x_root_window_(DefaultRootWindow(x_display_)), | 303 x_root_window_(DefaultRootWindow(x_display_)), |
| 326 x_window_(XCreateWindow(x_display_, | 304 x_window_(XCreateWindow(x_display_, |
| 327 x_root_window_, | 305 x_root_window_, |
| 328 -100, | 306 -100, |
| 329 -100, | 307 -100, |
| 330 10, | 308 10, |
| 331 10, // x, y, width, height | 309 10, // x, y, width, height |
| 332 0, // border width | 310 0, // border width |
| 333 CopyFromParent, // depth | 311 CopyFromParent, // depth |
| 334 InputOnly, | 312 InputOnly, |
| 335 CopyFromParent, // visual | 313 CopyFromParent, // visual |
| 336 0, | 314 0, |
| 337 NULL)), | 315 NULL)), |
| 338 atom_cache_(x_display_, kAtomsToCache), | |
| 339 selection_requestor_(x_display_, x_window_, this), | 316 selection_requestor_(x_display_, x_window_, this), |
| 340 clipboard_owner_(x_display_, x_window_, atom_cache_.GetAtom(kClipboard)), | 317 clipboard_owner_(x_display_, x_window_, GetAtom(kClipboard)), |
| 341 primary_owner_(x_display_, x_window_, XA_PRIMARY) { | 318 primary_owner_(x_display_, x_window_, XA_PRIMARY) { |
| 342 // We don't know all possible MIME types at compile time. | |
| 343 atom_cache_.allow_uncached_atoms(); | |
| 344 | |
| 345 XStoreName(x_display_, x_window_, "Chromium clipboard"); | 319 XStoreName(x_display_, x_window_, "Chromium clipboard"); |
| 346 x_window_events_.reset( | 320 x_window_events_.reset( |
| 347 new XScopedEventSelector(x_window_, PropertyChangeMask)); | 321 new XScopedEventSelector(x_window_, PropertyChangeMask)); |
| 348 | 322 |
| 349 if (PlatformEventSource::GetInstance()) | 323 if (PlatformEventSource::GetInstance()) |
| 350 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); | 324 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
| 351 } | 325 } |
| 352 | 326 |
| 353 ClipboardAuraX11::AuraX11Details::~AuraX11Details() { | 327 ClipboardAuraX11::AuraX11Details::~AuraX11Details() { |
| 354 if (PlatformEventSource::GetInstance()) | 328 if (PlatformEventSource::GetInstance()) |
| 355 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); | 329 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
| 356 | 330 |
| 357 XDestroyWindow(x_display_, x_window_); | 331 XDestroyWindow(x_display_, x_window_); |
| 358 } | 332 } |
| 359 | 333 |
| 360 ::Atom ClipboardAuraX11::AuraX11Details::LookupSelectionForClipboardType( | 334 ::Atom ClipboardAuraX11::AuraX11Details::LookupSelectionForClipboardType( |
| 361 ClipboardType type) const { | 335 ClipboardType type) const { |
| 362 if (type == CLIPBOARD_TYPE_COPY_PASTE) | 336 if (type == CLIPBOARD_TYPE_COPY_PASTE) |
| 363 return GetCopyPasteSelection(); | 337 return GetCopyPasteSelection(); |
| 364 | 338 |
| 365 return XA_PRIMARY; | 339 return XA_PRIMARY; |
| 366 } | 340 } |
| 367 | 341 |
| 368 ::Atom ClipboardAuraX11::AuraX11Details::GetCopyPasteSelection() const { | 342 ::Atom ClipboardAuraX11::AuraX11Details::GetCopyPasteSelection() const { |
| 369 return atom_cache_.GetAtom(kClipboard); | 343 return GetAtom(kClipboard); |
| 370 } | 344 } |
| 371 | 345 |
| 372 const SelectionFormatMap& | 346 const SelectionFormatMap& |
| 373 ClipboardAuraX11::AuraX11Details::LookupStorageForAtom(::Atom atom) { | 347 ClipboardAuraX11::AuraX11Details::LookupStorageForAtom(::Atom atom) { |
| 374 if (atom == XA_PRIMARY) | 348 if (atom == XA_PRIMARY) |
| 375 return primary_owner_.selection_format_map(); | 349 return primary_owner_.selection_format_map(); |
| 376 | 350 |
| 377 DCHECK_EQ(GetCopyPasteSelection(), atom); | 351 DCHECK_EQ(GetCopyPasteSelection(), atom); |
| 378 return clipboard_owner_.selection_format_map(); | 352 return clipboard_owner_.selection_format_map(); |
| 379 } | 353 } |
| 380 | 354 |
| 381 void ClipboardAuraX11::AuraX11Details::CreateNewClipboardData() { | 355 void ClipboardAuraX11::AuraX11Details::CreateNewClipboardData() { |
| 382 clipboard_data_ = SelectionFormatMap(); | 356 clipboard_data_ = SelectionFormatMap(); |
| 383 } | 357 } |
| 384 | 358 |
| 385 void ClipboardAuraX11::AuraX11Details::InsertMapping( | 359 void ClipboardAuraX11::AuraX11Details::InsertMapping( |
| 386 const std::string& key, | 360 const std::string& key, |
| 387 const scoped_refptr<base::RefCountedMemory>& memory) { | 361 const scoped_refptr<base::RefCountedMemory>& memory) { |
| 388 ::Atom atom_key = atom_cache_.GetAtom(key.c_str()); | 362 ::Atom atom_key = GetAtom(key.c_str()); |
| 389 clipboard_data_.Insert(atom_key, memory); | 363 clipboard_data_.Insert(atom_key, memory); |
| 390 } | 364 } |
| 391 | 365 |
| 392 void ClipboardAuraX11::AuraX11Details::TakeOwnershipOfSelection( | 366 void ClipboardAuraX11::AuraX11Details::TakeOwnershipOfSelection( |
| 393 ClipboardType type) { | 367 ClipboardType type) { |
| 394 if (type == CLIPBOARD_TYPE_COPY_PASTE) | 368 if (type == CLIPBOARD_TYPE_COPY_PASTE) |
| 395 return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_); | 369 return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_); |
| 396 else | 370 else |
| 397 return primary_owner_.TakeOwnershipOfSelection(clipboard_data_); | 371 return primary_owner_.TakeOwnershipOfSelection(clipboard_data_); |
| 398 } | 372 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 for (SelectionFormatMap::const_iterator it = format_map.begin(); | 410 for (SelectionFormatMap::const_iterator it = format_map.begin(); |
| 437 it != format_map.end(); ++it) { | 411 it != format_map.end(); ++it) { |
| 438 out.push_back(it->first); | 412 out.push_back(it->first); |
| 439 } | 413 } |
| 440 } else { | 414 } else { |
| 441 scoped_refptr<base::RefCountedMemory> data; | 415 scoped_refptr<base::RefCountedMemory> data; |
| 442 size_t out_data_items = 0; | 416 size_t out_data_items = 0; |
| 443 ::Atom out_type = None; | 417 ::Atom out_type = None; |
| 444 | 418 |
| 445 if (selection_requestor_.PerformBlockingConvertSelection( | 419 if (selection_requestor_.PerformBlockingConvertSelection( |
| 446 selection_name, | 420 selection_name, GetAtom(kTargets), &data, &out_data_items, |
| 447 atom_cache_.GetAtom(kTargets), | |
| 448 &data, | |
| 449 &out_data_items, | |
| 450 &out_type)) { | 421 &out_type)) { |
| 451 // Some apps return an |out_type| of "TARGETS". (crbug.com/377893) | 422 // Some apps return an |out_type| of "TARGETS". (crbug.com/377893) |
| 452 if (out_type == XA_ATOM || out_type == atom_cache_.GetAtom(kTargets)) { | 423 if (out_type == XA_ATOM || out_type == GetAtom(kTargets)) { |
| 453 const ::Atom* atom_array = | 424 const ::Atom* atom_array = |
| 454 reinterpret_cast<const ::Atom*>(data->front()); | 425 reinterpret_cast<const ::Atom*>(data->front()); |
| 455 for (size_t i = 0; i < out_data_items; ++i) | 426 for (size_t i = 0; i < out_data_items; ++i) |
| 456 out.push_back(atom_array[i]); | 427 out.push_back(atom_array[i]); |
| 457 } | 428 } |
| 458 } else { | 429 } else { |
| 459 // There was no target list. Most Java apps doesn't offer a TARGETS list, | 430 // There was no target list. Most Java apps doesn't offer a TARGETS list, |
| 460 // even though they AWT to. They will offer individual text types if you | 431 // even though they AWT to. They will offer individual text types if you |
| 461 // ask. If this is the case we attempt to make sense of the contents as | 432 // ask. If this is the case we attempt to make sense of the contents as |
| 462 // text. This is pretty unfortunate since it means we have to actually | 433 // text. This is pretty unfortunate since it means we have to actually |
| 463 // copy the data to see if it is available, but at least this path | 434 // copy the data to see if it is available, but at least this path |
| 464 // shouldn't be hit for conforming programs. | 435 // shouldn't be hit for conforming programs. |
| 465 std::vector< ::Atom> types = GetTextAtoms(); | 436 std::vector< ::Atom> types = GetTextAtoms(); |
| 466 for (std::vector< ::Atom>::const_iterator it = types.begin(); | 437 for (std::vector< ::Atom>::const_iterator it = types.begin(); |
| 467 it != types.end(); ++it) { | 438 it != types.end(); ++it) { |
| 468 ::Atom type = None; | 439 ::Atom type = None; |
| 469 if (selection_requestor_.PerformBlockingConvertSelection(selection_name, | 440 if (selection_requestor_.PerformBlockingConvertSelection(selection_name, |
| 470 *it, | 441 *it, |
| 471 NULL, | 442 NULL, |
| 472 NULL, | 443 NULL, |
| 473 &type) && | 444 &type) && |
| 474 type == *it) { | 445 type == *it) { |
| 475 out.push_back(*it); | 446 out.push_back(*it); |
| 476 } | 447 } |
| 477 } | 448 } |
| 478 } | 449 } |
| 479 } | 450 } |
| 480 | 451 |
| 481 return TargetList(out, &atom_cache_); | 452 return TargetList(out); |
| 482 } | 453 } |
| 483 | 454 |
| 484 std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetTextAtoms() const { | 455 std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetTextAtoms() const { |
| 485 return GetTextAtomsFrom(&atom_cache_); | 456 return GetTextAtomsFrom(); |
| 486 } | 457 } |
| 487 | 458 |
| 488 std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetAtomsForFormat( | 459 std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetAtomsForFormat( |
| 489 const Clipboard::FormatType& format) { | 460 const Clipboard::FormatType& format) { |
| 490 std::vector< ::Atom> atoms; | 461 std::vector< ::Atom> atoms; |
| 491 atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str())); | 462 atoms.push_back(GetAtom(format.ToString().c_str())); |
| 492 return atoms; | 463 return atoms; |
| 493 } | 464 } |
| 494 | 465 |
| 495 void ClipboardAuraX11::AuraX11Details::Clear(ClipboardType type) { | 466 void ClipboardAuraX11::AuraX11Details::Clear(ClipboardType type) { |
| 496 if (type == CLIPBOARD_TYPE_COPY_PASTE) | 467 if (type == CLIPBOARD_TYPE_COPY_PASTE) |
| 497 clipboard_owner_.ClearSelectionOwner(); | 468 clipboard_owner_.ClearSelectionOwner(); |
| 498 else | 469 else |
| 499 primary_owner_.ClearSelectionOwner(); | 470 primary_owner_.ClearSelectionOwner(); |
| 500 } | 471 } |
| 501 | 472 |
| 502 void ClipboardAuraX11::AuraX11Details::StoreCopyPasteDataAndWait() { | 473 void ClipboardAuraX11::AuraX11Details::StoreCopyPasteDataAndWait() { |
| 503 ::Atom selection = GetCopyPasteSelection(); | 474 ::Atom selection = GetCopyPasteSelection(); |
| 504 if (XGetSelectionOwner(x_display_, selection) != x_window_) | 475 if (XGetSelectionOwner(x_display_, selection) != x_window_) |
| 505 return; | 476 return; |
| 506 | 477 |
| 507 ::Atom clipboard_manager_atom = atom_cache_.GetAtom(kClipboardManager); | 478 ::Atom clipboard_manager_atom = GetAtom(kClipboardManager); |
| 508 if (XGetSelectionOwner(x_display_, clipboard_manager_atom) == None) | 479 if (XGetSelectionOwner(x_display_, clipboard_manager_atom) == None) |
| 509 return; | 480 return; |
| 510 | 481 |
| 511 const SelectionFormatMap& format_map = LookupStorageForAtom(selection); | 482 const SelectionFormatMap& format_map = LookupStorageForAtom(selection); |
| 512 if (format_map.size() == 0) | 483 if (format_map.size() == 0) |
| 513 return; | 484 return; |
| 514 std::vector<Atom> targets = format_map.GetTypes(); | 485 std::vector<Atom> targets = format_map.GetTypes(); |
| 515 | 486 |
| 516 base::TimeTicks start = base::TimeTicks::Now(); | 487 base::TimeTicks start = base::TimeTicks::Now(); |
| 517 selection_requestor_.PerformBlockingConvertSelectionWithParameter( | 488 selection_requestor_.PerformBlockingConvertSelectionWithParameter( |
| 518 atom_cache_.GetAtom(kClipboardManager), | 489 GetAtom(kClipboardManager), GetAtom(kSaveTargets), targets); |
| 519 atom_cache_.GetAtom(kSaveTargets), | |
| 520 targets); | |
| 521 UMA_HISTOGRAM_TIMES("Clipboard.X11StoreCopyPasteDuration", | 490 UMA_HISTOGRAM_TIMES("Clipboard.X11StoreCopyPasteDuration", |
| 522 base::TimeTicks::Now() - start); | 491 base::TimeTicks::Now() - start); |
| 523 } | 492 } |
| 524 | 493 |
| 525 bool ClipboardAuraX11::AuraX11Details::CanDispatchEvent( | 494 bool ClipboardAuraX11::AuraX11Details::CanDispatchEvent( |
| 526 const PlatformEvent& event) { | 495 const PlatformEvent& event) { |
| 527 if (event->xany.window == x_window_) | 496 if (event->xany.window == x_window_) |
| 528 return true; | 497 return true; |
| 529 | 498 |
| 530 if (event->type == PropertyNotify) { | 499 if (event->type == PropertyNotify) { |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 if (format.Equals(GetBitmapFormatType())) | 914 if (format.Equals(GetBitmapFormatType())) |
| 946 return; | 915 return; |
| 947 | 916 |
| 948 std::vector<unsigned char> bytes(data_data, data_data + data_len); | 917 std::vector<unsigned char> bytes(data_data, data_data + data_len); |
| 949 scoped_refptr<base::RefCountedMemory> mem( | 918 scoped_refptr<base::RefCountedMemory> mem( |
| 950 base::RefCountedBytes::TakeVector(&bytes)); | 919 base::RefCountedBytes::TakeVector(&bytes)); |
| 951 aurax11_details_->InsertMapping(format.ToString(), mem); | 920 aurax11_details_->InsertMapping(format.ToString(), mem); |
| 952 } | 921 } |
| 953 | 922 |
| 954 } // namespace ui | 923 } // namespace ui |
| OLD | NEW |