| 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 |