| OLD | NEW | 
|---|
| 1 // Copyright (c) 2011 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 <gtk/gtk.h> | 7 #include <gtk/gtk.h> | 
| 8 #include <X11/extensions/Xfixes.h> | 8 #include <X11/extensions/Xfixes.h> | 
| 9 #include <X11/Xatom.h> | 9 #include <X11/Xatom.h> | 
| 10 #include <map> | 10 #include <map> | 
| 11 #include <set> | 11 #include <set> | 
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 122 | 122 | 
| 123 // GtkClipboardGetFunc callback. | 123 // GtkClipboardGetFunc callback. | 
| 124 // GTK will call this when an application wants data we copied to the clipboard. | 124 // GTK will call this when an application wants data we copied to the clipboard. | 
| 125 void GetData(GtkClipboard* clipboard, | 125 void GetData(GtkClipboard* clipboard, | 
| 126              GtkSelectionData* selection_data, | 126              GtkSelectionData* selection_data, | 
| 127              guint info, | 127              guint info, | 
| 128              gpointer user_data) { | 128              gpointer user_data) { | 
| 129   Clipboard::TargetMap* data_map = | 129   Clipboard::TargetMap* data_map = | 
| 130       reinterpret_cast<Clipboard::TargetMap*>(user_data); | 130       reinterpret_cast<Clipboard::TargetMap*>(user_data); | 
| 131 | 131 | 
| 132   std::string target_string = GdkAtomToString(selection_data->target); | 132   std::string target_string = GdkAtomToString( | 
|  | 133       gtk_selection_data_get_target(selection_data)); | 
| 133   Clipboard::TargetMap::iterator iter = data_map->find(target_string); | 134   Clipboard::TargetMap::iterator iter = data_map->find(target_string); | 
| 134 | 135 | 
| 135   if (iter == data_map->end()) | 136   if (iter == data_map->end()) | 
| 136     return; | 137     return; | 
| 137 | 138 | 
| 138   if (target_string == kMimeTypeBitmap) { | 139   if (target_string == kMimeTypeBitmap) { | 
| 139     gtk_selection_data_set_pixbuf(selection_data, | 140     gtk_selection_data_set_pixbuf(selection_data, | 
| 140         reinterpret_cast<GdkPixbuf*>(iter->second.first)); | 141         reinterpret_cast<GdkPixbuf*>(iter->second.first)); | 
| 141   } else { | 142   } else { | 
| 142     gtk_selection_data_set(selection_data, selection_data->target, 8, | 143     gtk_selection_data_set(selection_data, | 
|  | 144                            gtk_selection_data_get_target(selection_data), 8, | 
| 143                            reinterpret_cast<guchar*>(iter->second.first), | 145                            reinterpret_cast<guchar*>(iter->second.first), | 
| 144                            iter->second.second); | 146                            iter->second.second); | 
| 145   } | 147   } | 
| 146 } | 148 } | 
| 147 | 149 | 
| 148 // GtkClipboardClearFunc callback. | 150 // GtkClipboardClearFunc callback. | 
| 149 // We are guaranteed this will be called exactly once for each call to | 151 // We are guaranteed this will be called exactly once for each call to | 
| 150 // gtk_clipboard_set_with_data. | 152 // gtk_clipboard_set_with_data. | 
| 151 void ClearData(GtkClipboard* clipboard, | 153 void ClearData(GtkClipboard* clipboard, | 
| 152                gpointer user_data) { | 154                gpointer user_data) { | 
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 414   *contains_filenames = false; | 416   *contains_filenames = false; | 
| 415 | 417 | 
| 416   GtkClipboard* clipboard = LookupBackingClipboard(buffer); | 418   GtkClipboard* clipboard = LookupBackingClipboard(buffer); | 
| 417   if (!clipboard) | 419   if (!clipboard) | 
| 418     return; | 420     return; | 
| 419 | 421 | 
| 420   GtkSelectionData* data = gtk_clipboard_wait_for_contents( | 422   GtkSelectionData* data = gtk_clipboard_wait_for_contents( | 
| 421       clipboard, GetWebCustomDataFormatType().ToGdkAtom()); | 423       clipboard, GetWebCustomDataFormatType().ToGdkAtom()); | 
| 422   if (!data) | 424   if (!data) | 
| 423     return; | 425     return; | 
| 424   ReadCustomDataTypes(data->data, data->length, types); | 426   ReadCustomDataTypes(gtk_selection_data_get_data(data), | 
|  | 427                       gtk_selection_data_get_length(data), | 
|  | 428                       types); | 
| 425   gtk_selection_data_free(data); | 429   gtk_selection_data_free(data); | 
| 426 } | 430 } | 
| 427 | 431 | 
| 428 | 432 | 
| 429 void Clipboard::ReadText(Clipboard::Buffer buffer, string16* result) const { | 433 void Clipboard::ReadText(Clipboard::Buffer buffer, string16* result) const { | 
| 430   GtkClipboard* clipboard = LookupBackingClipboard(buffer); | 434   GtkClipboard* clipboard = LookupBackingClipboard(buffer); | 
| 431   if (clipboard == NULL) | 435   if (clipboard == NULL) | 
| 432     return; | 436     return; | 
| 433 | 437 | 
| 434   result->clear(); | 438   result->clear(); | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 477   if (clipboard == NULL) | 481   if (clipboard == NULL) | 
| 478     return; | 482     return; | 
| 479   GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, | 483   GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, | 
| 480       GetHtmlFormatType().ToGdkAtom()); | 484       GetHtmlFormatType().ToGdkAtom()); | 
| 481 | 485 | 
| 482   if (!data) | 486   if (!data) | 
| 483     return; | 487     return; | 
| 484 | 488 | 
| 485   // If the data starts with 0xFEFF, i.e., Byte Order Mark, assume it is | 489   // If the data starts with 0xFEFF, i.e., Byte Order Mark, assume it is | 
| 486   // UTF-16, otherwise assume UTF-8. | 490   // UTF-16, otherwise assume UTF-8. | 
| 487   if (data->length >= 2 && | 491   gint data_length = gtk_selection_data_get_length(data); | 
| 488       reinterpret_cast<uint16_t*>(data->data)[0] == 0xFEFF) { | 492   const guchar* raw_data = gtk_selection_data_get_data(data); | 
| 489     markup->assign(reinterpret_cast<uint16_t*>(data->data) + 1, | 493 | 
| 490                    (data->length / 2) - 1); | 494   if (data_length >= 2 && | 
|  | 495       reinterpret_cast<const uint16_t*>(raw_data)[0] == 0xFEFF) { | 
|  | 496     markup->assign(reinterpret_cast<const uint16_t*>(raw_data) + 1, | 
|  | 497                    (data_length / 2) - 1); | 
| 491   } else { | 498   } else { | 
| 492     UTF8ToUTF16(reinterpret_cast<char*>(data->data), data->length, markup); | 499     UTF8ToUTF16(reinterpret_cast<const char*>(raw_data), data_length, markup); | 
| 493   } | 500   } | 
| 494 | 501 | 
| 495   // If there is a terminating NULL, drop it. | 502   // If there is a terminating NULL, drop it. | 
| 496   if (!markup->empty() && markup->at(markup->length() - 1) == '\0') | 503   if (!markup->empty() && markup->at(markup->length() - 1) == '\0') | 
| 497     markup->resize(markup->length() - 1); | 504     markup->resize(markup->length() - 1); | 
| 498 | 505 | 
| 499   *fragment_start = 0; | 506   *fragment_start = 0; | 
| 500   DCHECK(markup->length() <= kuint32max); | 507   DCHECK(markup->length() <= kuint32max); | 
| 501   *fragment_end = static_cast<uint32>(markup->length()); | 508   *fragment_end = static_cast<uint32>(markup->length()); | 
| 502 | 509 | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 525                                const string16& type, | 532                                const string16& type, | 
| 526                                string16* result) const { | 533                                string16* result) const { | 
| 527   GtkClipboard* clipboard = LookupBackingClipboard(buffer); | 534   GtkClipboard* clipboard = LookupBackingClipboard(buffer); | 
| 528   if (!clipboard) | 535   if (!clipboard) | 
| 529     return; | 536     return; | 
| 530 | 537 | 
| 531   GtkSelectionData* data = gtk_clipboard_wait_for_contents( | 538   GtkSelectionData* data = gtk_clipboard_wait_for_contents( | 
| 532       clipboard, GetWebCustomDataFormatType().ToGdkAtom()); | 539       clipboard, GetWebCustomDataFormatType().ToGdkAtom()); | 
| 533   if (!data) | 540   if (!data) | 
| 534     return; | 541     return; | 
| 535   ReadCustomDataForType(data->data, data->length, type, result); | 542   ReadCustomDataForType(gtk_selection_data_get_data(data), | 
|  | 543                         gtk_selection_data_get_length(data), | 
|  | 544                         type, result); | 
| 536   gtk_selection_data_free(data); | 545   gtk_selection_data_free(data); | 
| 537 } | 546 } | 
| 538 | 547 | 
| 539 void Clipboard::ReadBookmark(string16* title, std::string* url) const { | 548 void Clipboard::ReadBookmark(string16* title, std::string* url) const { | 
| 540   // TODO(estade): implement this. | 549   // TODO(estade): implement this. | 
| 541   NOTIMPLEMENTED(); | 550   NOTIMPLEMENTED(); | 
| 542 } | 551 } | 
| 543 | 552 | 
| 544 void Clipboard::ReadData(const FormatType& format, std::string* result) const { | 553 void Clipboard::ReadData(const FormatType& format, std::string* result) const { | 
| 545   GtkSelectionData* data = | 554   GtkSelectionData* data = | 
| 546       gtk_clipboard_wait_for_contents(clipboard_, format.ToGdkAtom()); | 555       gtk_clipboard_wait_for_contents(clipboard_, format.ToGdkAtom()); | 
| 547   if (!data) | 556   if (!data) | 
| 548     return; | 557     return; | 
| 549   result->assign(reinterpret_cast<char*>(data->data), data->length); | 558   result->assign(reinterpret_cast<const char*>( | 
|  | 559                      gtk_selection_data_get_data(data)), | 
|  | 560                  gtk_selection_data_get_length(data)); | 
| 550   gtk_selection_data_free(data); | 561   gtk_selection_data_free(data); | 
| 551 } | 562 } | 
| 552 | 563 | 
| 553 uint64 Clipboard::GetSequenceNumber(Buffer buffer) { | 564 uint64 Clipboard::GetSequenceNumber(Buffer buffer) { | 
| 554   if (buffer == BUFFER_STANDARD) | 565   if (buffer == BUFFER_STANDARD) | 
| 555     return SelectionChangeObserver::GetInstance()->clipboard_sequence_number(); | 566     return SelectionChangeObserver::GetInstance()->clipboard_sequence_number(); | 
| 556   else | 567   else | 
| 557     return SelectionChangeObserver::GetInstance()->primary_sequence_number(); | 568     return SelectionChangeObserver::GetInstance()->primary_sequence_number(); | 
| 558 } | 569 } | 
| 559 | 570 | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 612       return clipboard_; | 623       return clipboard_; | 
| 613     case BUFFER_SELECTION: | 624     case BUFFER_SELECTION: | 
| 614       return primary_selection_; | 625       return primary_selection_; | 
| 615     default: | 626     default: | 
| 616       NOTREACHED(); | 627       NOTREACHED(); | 
| 617       return NULL; | 628       return NULL; | 
| 618   } | 629   } | 
| 619 } | 630 } | 
| 620 | 631 | 
| 621 }  // namespace ui | 632 }  // namespace ui | 
| OLD | NEW | 
|---|