| Index: base/clipboard_linux.cc
 | 
| ===================================================================
 | 
| --- base/clipboard_linux.cc	(revision 25640)
 | 
| +++ base/clipboard_linux.cc	(working copy)
 | 
| @@ -92,6 +92,7 @@
 | 
|  
 | 
|  Clipboard::Clipboard() {
 | 
|    clipboard_ = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
 | 
| +  primary_selection_ = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
 | 
|  }
 | 
|  
 | 
|  Clipboard::~Clipboard() {
 | 
| @@ -207,18 +208,23 @@
 | 
|  // We do not use gtk_clipboard_wait_is_target_available because of
 | 
|  // a bug with the gtk clipboard. It caches the available targets
 | 
|  // and does not always refresh the cache when it is appropriate.
 | 
| -bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format) const {
 | 
| +bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
 | 
| +                                  Clipboard::Buffer buffer) const {
 | 
| +  GtkClipboard* clipboard = LookupBackingClipboard(buffer);
 | 
| +  if (clipboard == NULL)
 | 
| +    return false;
 | 
| +
 | 
|    bool format_is_plain_text = GetPlainTextFormatType() == format;
 | 
|    if (format_is_plain_text) {
 | 
|      // This tries a number of common text targets.
 | 
| -    if (gtk_clipboard_wait_is_text_available(clipboard_))
 | 
| +    if (gtk_clipboard_wait_is_text_available(clipboard))
 | 
|        return true;
 | 
|    }
 | 
|  
 | 
|    bool retval = false;
 | 
|    GdkAtom* targets = NULL;
 | 
|    GtkSelectionData* data =
 | 
| -      gtk_clipboard_wait_for_contents(clipboard_,
 | 
| +      gtk_clipboard_wait_for_contents(clipboard,
 | 
|                                        gdk_atom_intern("TARGETS", false));
 | 
|  
 | 
|    if (!data)
 | 
| @@ -234,7 +240,7 @@
 | 
|    // programs.
 | 
|    if (num <= 0) {
 | 
|      if (format_is_plain_text) {
 | 
| -      gchar* text = gtk_clipboard_wait_for_text(clipboard_);
 | 
| +      gchar* text = gtk_clipboard_wait_for_text(clipboard);
 | 
|        if (text) {
 | 
|          g_free(text);
 | 
|          retval = true;
 | 
| @@ -257,13 +263,18 @@
 | 
|    return retval;
 | 
|  }
 | 
|  
 | 
| -bool Clipboard::IsFormatAvailableByString(const std::string& format) const {
 | 
| -  return IsFormatAvailable(format);
 | 
| +bool Clipboard::IsFormatAvailableByString(const std::string& format,
 | 
| +                                          Clipboard::Buffer buffer) const {
 | 
| +  return IsFormatAvailable(format, buffer);
 | 
|  }
 | 
|  
 | 
| -void Clipboard::ReadText(string16* result) const {
 | 
| +void Clipboard::ReadText(Clipboard::Buffer buffer, string16* result) const {
 | 
| +  GtkClipboard* clipboard = LookupBackingClipboard(buffer);
 | 
| +  if (clipboard == NULL)
 | 
| +    return;
 | 
| +
 | 
|    result->clear();
 | 
| -  gchar* text = gtk_clipboard_wait_for_text(clipboard_);
 | 
| +  gchar* text = gtk_clipboard_wait_for_text(clipboard);
 | 
|  
 | 
|    if (text == NULL)
 | 
|      return;
 | 
| @@ -273,9 +284,14 @@
 | 
|    g_free(text);
 | 
|  }
 | 
|  
 | 
| -void Clipboard::ReadAsciiText(std::string* result) const {
 | 
| +void Clipboard::ReadAsciiText(Clipboard::Buffer buffer,
 | 
| +                              std::string* result) const {
 | 
| +  GtkClipboard* clipboard = LookupBackingClipboard(buffer);
 | 
| +  if (clipboard == NULL)
 | 
| +    return;
 | 
| +
 | 
|    result->clear();
 | 
| -  gchar* text = gtk_clipboard_wait_for_text(clipboard_);
 | 
| +  gchar* text = gtk_clipboard_wait_for_text(clipboard);
 | 
|  
 | 
|    if (text == NULL)
 | 
|      return;
 | 
| @@ -290,10 +306,14 @@
 | 
|  
 | 
|  // TODO(estade): handle different charsets.
 | 
|  // TODO(port): set *src_url.
 | 
| -void Clipboard::ReadHTML(string16* markup, std::string* src_url) const {
 | 
| +void Clipboard::ReadHTML(Clipboard::Buffer buffer, string16* markup,
 | 
| +                         std::string* src_url) const {
 | 
| +  GtkClipboard* clipboard = LookupBackingClipboard(buffer);
 | 
| +  if (clipboard == NULL)
 | 
| +    return;
 | 
|    markup->clear();
 | 
|  
 | 
| -  GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard_,
 | 
| +  GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard,
 | 
|        StringToGdkAtom(GetHtmlFormatType()));
 | 
|  
 | 
|    if (!data)
 | 
| @@ -355,3 +375,22 @@
 | 
|  
 | 
|    (*clipboard_data_)[key] = std::make_pair(data, data_len);
 | 
|  }
 | 
| +
 | 
| +GtkClipboard* Clipboard::LookupBackingClipboard(Buffer clipboard) const {
 | 
| +  GtkClipboard* result;
 | 
| +
 | 
| +  switch (clipboard) {
 | 
| +    case BUFFER_STANDARD:
 | 
| +      result = clipboard_;
 | 
| +      break;
 | 
| +    case BUFFER_SELECTION:
 | 
| +      result = primary_selection_;
 | 
| +      break;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +      result = NULL;
 | 
| +      break;
 | 
| +  }
 | 
| +  return result;
 | 
| +}
 | 
| +
 | 
| 
 |