| 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.h" | 5 #include "ui/base/clipboard/clipboard.h" |
| 6 | 6 |
| 7 #include <X11/extensions/Xfixes.h> | 7 #include <X11/extensions/Xfixes.h> |
| 8 #include <X11/Xatom.h> | 8 #include <X11/Xatom.h> |
| 9 #include <list> | 9 #include <list> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/memory/ref_counted_memory.h" | 15 #include "base/memory/ref_counted_memory.h" |
| 16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 17 #include "base/memory/singleton.h" | 17 #include "base/memory/singleton.h" |
| 18 #include "base/message_loop/message_pump_observer.h" | 18 #include "base/message_loop/message_pump_observer.h" |
| 19 #include "base/message_loop/message_pump_x11.h" | 19 #include "base/message_loop/message_pump_x11.h" |
| 20 #include "base/stl_util.h" | 20 #include "base/stl_util.h" |
| 21 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 22 #include "third_party/skia/include/core/SkBitmap.h" | 22 #include "third_party/skia/include/core/SkBitmap.h" |
| 23 #include "ui/base/clipboard/custom_data_helper.h" | 23 #include "ui/base/clipboard/custom_data_helper.h" |
| 24 #include "ui/base/x/selection_owner.h" | 24 #include "ui/base/x/selection_owner.h" |
| 25 #include "ui/base/x/selection_requestor.h" | 25 #include "ui/base/x/selection_requestor.h" |
| 26 #include "ui/base/x/selection_utils.h" | 26 #include "ui/base/x/selection_utils.h" |
| 27 #include "ui/base/x/x11_util.h" | 27 #include "ui/base/x/x11_util.h" |
| 28 #include "ui/events/platform/platform_event_dispatcher.h" |
| 29 #include "ui/events/platform/x11/x11_event_source.h" |
| 28 #include "ui/gfx/codec/png_codec.h" | 30 #include "ui/gfx/codec/png_codec.h" |
| 29 #include "ui/gfx/size.h" | 31 #include "ui/gfx/size.h" |
| 30 #include "ui/gfx/x/x11_atom_cache.h" | 32 #include "ui/gfx/x/x11_atom_cache.h" |
| 31 | 33 |
| 32 namespace ui { | 34 namespace ui { |
| 33 | 35 |
| 34 namespace { | 36 namespace { |
| 35 | 37 |
| 36 const char kClipboard[] = "CLIPBOARD"; | 38 const char kClipboard[] = "CLIPBOARD"; |
| 37 const char kMimeTypeFilename[] = "chromium/filename"; | 39 const char kMimeTypeFilename[] = "chromium/filename"; |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 | 219 |
| 218 bool Clipboard::FormatType::Equals(const FormatType& other) const { | 220 bool Clipboard::FormatType::Equals(const FormatType& other) const { |
| 219 return data_ == other.data_; | 221 return data_ == other.data_; |
| 220 } | 222 } |
| 221 | 223 |
| 222 /////////////////////////////////////////////////////////////////////////////// | 224 /////////////////////////////////////////////////////////////////////////////// |
| 223 // Clipboard::AuraX11Details | 225 // Clipboard::AuraX11Details |
| 224 | 226 |
| 225 // Private implementation of our X11 integration. Keeps X11 headers out of the | 227 // Private implementation of our X11 integration. Keeps X11 headers out of the |
| 226 // majority of chrome, which break badly. | 228 // majority of chrome, which break badly. |
| 227 class Clipboard::AuraX11Details : public base::MessagePumpDispatcher { | 229 class Clipboard::AuraX11Details : public PlatformEventDispatcher { |
| 228 public: | 230 public: |
| 229 AuraX11Details(); | 231 AuraX11Details(); |
| 230 virtual ~AuraX11Details(); | 232 virtual ~AuraX11Details(); |
| 231 | 233 |
| 232 X11AtomCache* atom_cache() { return &atom_cache_; } | 234 X11AtomCache* atom_cache() { return &atom_cache_; } |
| 233 | 235 |
| 234 // Returns the X11 type that we pass to various XSelection functions for the | 236 // Returns the X11 type that we pass to various XSelection functions for the |
| 235 // given type. | 237 // given type. |
| 236 ::Atom LookupSelectionForClipboardType(ClipboardType type) const; | 238 ::Atom LookupSelectionForClipboardType(ClipboardType type) const; |
| 237 | 239 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 // Returns a list of all text atoms that we handle. | 277 // Returns a list of all text atoms that we handle. |
| 276 std::vector< ::Atom> GetTextAtoms() const; | 278 std::vector< ::Atom> GetTextAtoms() const; |
| 277 | 279 |
| 278 // Returns a vector with a |format| converted to an X11 atom. | 280 // Returns a vector with a |format| converted to an X11 atom. |
| 279 std::vector< ::Atom> GetAtomsForFormat(const Clipboard::FormatType& format); | 281 std::vector< ::Atom> GetAtomsForFormat(const Clipboard::FormatType& format); |
| 280 | 282 |
| 281 // Clears a certain clipboard type, whether we own it or not. | 283 // Clears a certain clipboard type, whether we own it or not. |
| 282 void Clear(ClipboardType type); | 284 void Clear(ClipboardType type); |
| 283 | 285 |
| 284 private: | 286 private: |
| 285 // Overridden from base::MessagePumpDispatcher: | 287 // PlatformEventDispatcher: |
| 286 virtual uint32_t Dispatch(const base::NativeEvent& event) OVERRIDE; | 288 virtual bool CanDispatchEvent(const PlatformEvent& event) OVERRIDE; |
| 289 virtual uint32_t DispatchEvent(const PlatformEvent& event) OVERRIDE; |
| 287 | 290 |
| 288 // Our X11 state. | 291 // Our X11 state. |
| 289 Display* x_display_; | 292 Display* x_display_; |
| 290 ::Window x_root_window_; | 293 ::Window x_root_window_; |
| 291 | 294 |
| 292 // Input-only window used as a selection owner. | 295 // Input-only window used as a selection owner. |
| 293 ::Window x_window_; | 296 ::Window x_window_; |
| 294 | 297 |
| 295 X11AtomCache atom_cache_; | 298 X11AtomCache atom_cache_; |
| 296 | 299 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 325 atom_cache_.GetAtom(kClipboard)), | 328 atom_cache_.GetAtom(kClipboard)), |
| 326 primary_requestor_(x_display_, x_window_, XA_PRIMARY), | 329 primary_requestor_(x_display_, x_window_, XA_PRIMARY), |
| 327 clipboard_owner_(x_display_, x_window_, atom_cache_.GetAtom(kClipboard)), | 330 clipboard_owner_(x_display_, x_window_, atom_cache_.GetAtom(kClipboard)), |
| 328 primary_owner_(x_display_, x_window_, XA_PRIMARY) { | 331 primary_owner_(x_display_, x_window_, XA_PRIMARY) { |
| 329 // We don't know all possible MIME types at compile time. | 332 // We don't know all possible MIME types at compile time. |
| 330 atom_cache_.allow_uncached_atoms(); | 333 atom_cache_.allow_uncached_atoms(); |
| 331 | 334 |
| 332 XStoreName(x_display_, x_window_, "Chromium clipboard"); | 335 XStoreName(x_display_, x_window_, "Chromium clipboard"); |
| 333 XSelectInput(x_display_, x_window_, PropertyChangeMask); | 336 XSelectInput(x_display_, x_window_, PropertyChangeMask); |
| 334 | 337 |
| 335 base::MessagePumpX11::Current()->AddDispatcherForWindow(this, x_window_); | 338 if (PlatformEventSource::GetInstance()) |
| 339 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
| 336 } | 340 } |
| 337 | 341 |
| 338 Clipboard::AuraX11Details::~AuraX11Details() { | 342 Clipboard::AuraX11Details::~AuraX11Details() { |
| 339 base::MessagePumpX11::Current()->RemoveDispatcherForWindow(x_window_); | 343 if (PlatformEventSource::GetInstance()) |
| 344 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
| 340 | 345 |
| 341 XDestroyWindow(x_display_, x_window_); | 346 XDestroyWindow(x_display_, x_window_); |
| 342 } | 347 } |
| 343 | 348 |
| 344 ::Atom Clipboard::AuraX11Details::LookupSelectionForClipboardType( | 349 ::Atom Clipboard::AuraX11Details::LookupSelectionForClipboardType( |
| 345 ClipboardType type) const { | 350 ClipboardType type) const { |
| 346 if (type == CLIPBOARD_TYPE_COPY_PASTE) | 351 if (type == CLIPBOARD_TYPE_COPY_PASTE) |
| 347 return atom_cache_.GetAtom(kClipboard); | 352 return atom_cache_.GetAtom(kClipboard); |
| 348 | 353 |
| 349 return XA_PRIMARY; | 354 return XA_PRIMARY; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 return atoms; | 483 return atoms; |
| 479 } | 484 } |
| 480 | 485 |
| 481 void Clipboard::AuraX11Details::Clear(ClipboardType type) { | 486 void Clipboard::AuraX11Details::Clear(ClipboardType type) { |
| 482 if (type == CLIPBOARD_TYPE_COPY_PASTE) | 487 if (type == CLIPBOARD_TYPE_COPY_PASTE) |
| 483 clipboard_owner_.ClearSelectionOwner(); | 488 clipboard_owner_.ClearSelectionOwner(); |
| 484 else | 489 else |
| 485 primary_owner_.ClearSelectionOwner(); | 490 primary_owner_.ClearSelectionOwner(); |
| 486 } | 491 } |
| 487 | 492 |
| 488 uint32_t Clipboard::AuraX11Details::Dispatch(const base::NativeEvent& event) { | 493 bool Clipboard::AuraX11Details::CanDispatchEvent(const PlatformEvent& event) { |
| 489 XEvent* xev = event; | 494 return event->xany.window == x_window_; |
| 495 } |
| 490 | 496 |
| 497 uint32_t Clipboard::AuraX11Details::DispatchEvent(const PlatformEvent& xev) { |
| 491 switch (xev->type) { | 498 switch (xev->type) { |
| 492 case SelectionRequest: { | 499 case SelectionRequest: { |
| 493 if (xev->xselectionrequest.selection == XA_PRIMARY) | 500 if (xev->xselectionrequest.selection == XA_PRIMARY) |
| 494 primary_owner_.OnSelectionRequest(xev->xselectionrequest); | 501 primary_owner_.OnSelectionRequest(xev->xselectionrequest); |
| 495 else | 502 else |
| 496 clipboard_owner_.OnSelectionRequest(xev->xselectionrequest); | 503 clipboard_owner_.OnSelectionRequest(xev->xselectionrequest); |
| 497 break; | 504 break; |
| 498 } | 505 } |
| 499 case SelectionNotify: { | 506 case SelectionNotify: { |
| 500 if (xev->xselection.selection == XA_PRIMARY) | 507 if (xev->xselection.selection == XA_PRIMARY) |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 return type; | 869 return type; |
| 863 } | 870 } |
| 864 | 871 |
| 865 // static | 872 // static |
| 866 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { | 873 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { |
| 867 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); | 874 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); |
| 868 return type; | 875 return type; |
| 869 } | 876 } |
| 870 | 877 |
| 871 } // namespace ui | 878 } // namespace ui |
| OLD | NEW |