| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "base/clipboard.h" | 5 #include "base/clipboard.h" |
| 6 | 6 |
| 7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/file_path.h" | 13 #include "base/file_path.h" |
| 14 #include "base/gfx/size.h" | 14 #include "base/gfx/size.h" |
| 15 #include "base/scoped_ptr.h" | 15 #include "base/scoped_ptr.h" |
| 16 #include "base/linux_util.h" | 16 #include "base/linux_util.h" |
| 17 #include "base/string_util.h" | 17 #include "base/string_util.h" |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 const char kMimeBmp[] = "image/bmp"; | 21 const char kMimeBmp[] = "image/bmp"; |
| 22 const char kMimeHtml[] = "text/html"; | 22 const char kMimeHtml[] = "text/html"; |
| 23 const char kMimeText[] = "text/plain"; | 23 const char kMimeText[] = "text/plain"; |
| 24 const char kMimeURI[] = "text/uri-list"; |
| 24 const char kMimeWebkitSmartPaste[] = "chromium/x-webkit-paste"; | 25 const char kMimeWebkitSmartPaste[] = "chromium/x-webkit-paste"; |
| 25 | 26 |
| 26 std::string GdkAtomToString(const GdkAtom& atom) { | 27 std::string GdkAtomToString(const GdkAtom& atom) { |
| 27 gchar* name = gdk_atom_name(atom); | 28 gchar* name = gdk_atom_name(atom); |
| 28 std::string rv(name); | 29 std::string rv(name); |
| 29 g_free(name); | 30 g_free(name); |
| 30 return rv; | 31 return rv; |
| 31 } | 32 } |
| 32 | 33 |
| 33 GdkAtom StringToGdkAtom(const std::string& str) { | 34 GdkAtom StringToGdkAtom(const std::string& str) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 45 | 46 |
| 46 std::string target_string = GdkAtomToString(selection_data->target); | 47 std::string target_string = GdkAtomToString(selection_data->target); |
| 47 Clipboard::TargetMap::iterator iter = data_map->find(target_string); | 48 Clipboard::TargetMap::iterator iter = data_map->find(target_string); |
| 48 | 49 |
| 49 if (iter == data_map->end()) | 50 if (iter == data_map->end()) |
| 50 return; | 51 return; |
| 51 | 52 |
| 52 if (target_string == kMimeBmp) { | 53 if (target_string == kMimeBmp) { |
| 53 gtk_selection_data_set_pixbuf(selection_data, | 54 gtk_selection_data_set_pixbuf(selection_data, |
| 54 reinterpret_cast<GdkPixbuf*>(iter->second.first)); | 55 reinterpret_cast<GdkPixbuf*>(iter->second.first)); |
| 56 } else if (target_string == kMimeURI) { |
| 57 gchar* uri_list[2]; |
| 58 uri_list[0] = reinterpret_cast<gchar*>(iter->second.first); |
| 59 uri_list[1] = NULL; |
| 60 gtk_selection_data_set_uris(selection_data, uri_list); |
| 55 } else { | 61 } else { |
| 56 gtk_selection_data_set(selection_data, selection_data->target, 8, | 62 gtk_selection_data_set(selection_data, selection_data->target, 8, |
| 57 reinterpret_cast<guchar*>(iter->second.first), | 63 reinterpret_cast<guchar*>(iter->second.first), |
| 58 iter->second.second); | 64 iter->second.second); |
| 59 } | 65 } |
| 60 } | 66 } |
| 61 | 67 |
| 62 // GtkClipboardClearFunc callback. | 68 // GtkClipboardClearFunc callback. |
| 63 // We are guaranteed this will be called exactly once for each call to | 69 // We are guaranteed this will be called exactly once for each call to |
| 64 // gtk_clipboard_set_with_data | 70 // gtk_clipboard_set_with_data |
| 65 void ClearData(GtkClipboard* clipboard, | 71 void ClearData(GtkClipboard* clipboard, |
| 66 gpointer user_data) { | 72 gpointer user_data) { |
| 67 Clipboard::TargetMap* map = | 73 Clipboard::TargetMap* map = |
| 68 reinterpret_cast<Clipboard::TargetMap*>(user_data); | 74 reinterpret_cast<Clipboard::TargetMap*>(user_data); |
| 69 std::set<char*> ptrs; | 75 std::set<char*> ptrs; |
| 70 | 76 |
| 71 for (Clipboard::TargetMap::iterator iter = map->begin(); | 77 for (Clipboard::TargetMap::iterator iter = map->begin(); |
| 72 iter != map->end(); ++iter) { | 78 iter != map->end(); ++iter) { |
| 73 if (iter->first == kMimeBmp) | 79 if (iter->first == kMimeBmp) |
| 74 g_object_unref(reinterpret_cast<GdkPixbuf*>(iter->second.first)); | 80 g_object_unref(reinterpret_cast<GdkPixbuf*>(iter->second.first)); |
| 75 else | 81 else |
| 76 ptrs.insert(iter->second.first); | 82 ptrs.insert(iter->second.first); |
| 77 } | 83 } |
| 78 | 84 |
| 79 for (std::set<char*>::iterator iter = ptrs.begin(); | 85 for (std::set<char*>::iterator iter = ptrs.begin(); |
| 80 iter != ptrs.end(); ++iter) | 86 iter != ptrs.end(); ++iter) { |
| 81 delete[] *iter; | 87 delete[] *iter; |
| 88 } |
| 82 | 89 |
| 83 delete map; | 90 delete map; |
| 84 } | 91 } |
| 85 | 92 |
| 86 // Called on GdkPixbuf destruction; see WriteBitmap(). | 93 // Called on GdkPixbuf destruction; see WriteBitmap(). |
| 87 void GdkPixbufFree(guchar* pixels, gpointer data) { | 94 void GdkPixbufFree(guchar* pixels, gpointer data) { |
| 88 free(pixels); | 95 free(pixels); |
| 89 } | 96 } |
| 90 | 97 |
| 91 } // namespace | 98 } // namespace |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 8, size->width(), size->height(), | 183 8, size->width(), size->height(), |
| 177 size->width() * 4, GdkPixbufFree, NULL); | 184 size->width() * 4, GdkPixbufFree, NULL); |
| 178 // We store the GdkPixbuf*, and the size_t half of the pair is meaningless. | 185 // We store the GdkPixbuf*, and the size_t half of the pair is meaningless. |
| 179 // Note that this contrasts with the vast majority of entries in our target | 186 // Note that this contrasts with the vast majority of entries in our target |
| 180 // map, which directly store the data and its length. | 187 // map, which directly store the data and its length. |
| 181 InsertMapping(kMimeBmp, reinterpret_cast<char*>(pixbuf), 0); | 188 InsertMapping(kMimeBmp, reinterpret_cast<char*>(pixbuf), 0); |
| 182 } | 189 } |
| 183 | 190 |
| 184 void Clipboard::WriteBookmark(const char* title_data, size_t title_len, | 191 void Clipboard::WriteBookmark(const char* title_data, size_t title_len, |
| 185 const char* url_data, size_t url_len) { | 192 const char* url_data, size_t url_len) { |
| 186 // TODO(estade): implement this, but for now fail silently so we do not | 193 // Write as plain text. |
| 187 // write error output during layout tests. | 194 WriteText(url_data, url_len); |
| 188 // NOTIMPLEMENTED(); | |
| 189 } | |
| 190 | 195 |
| 191 void Clipboard::WriteHyperlink(const char* title_data, size_t title_len, | 196 // Write as a URI. |
| 192 const char* url_data, size_t url_len) { | 197 char* data = new char[url_len + 1]; |
| 193 NOTIMPLEMENTED(); | 198 memcpy(data, url_data, url_len); |
| 199 data[url_len] = NULL; |
| 200 InsertMapping(kMimeURI, data, url_len + 1); |
| 194 } | 201 } |
| 195 | 202 |
| 196 void Clipboard::WriteFiles(const char* file_data, size_t file_len) { | 203 void Clipboard::WriteFiles(const char* file_data, size_t file_len) { |
| 197 NOTIMPLEMENTED(); | 204 NOTIMPLEMENTED(); |
| 198 } | 205 } |
| 199 | 206 |
| 200 void Clipboard::WriteData(const char* format_name, size_t format_len, | 207 void Clipboard::WriteData(const char* format_name, size_t format_len, |
| 201 const char* data_data, size_t data_len) { | 208 const char* data_data, size_t data_len) { |
| 202 char* data = new char[data_len]; | 209 char* data = new char[data_len]; |
| 203 memcpy(data, data_data, data_len); | 210 memcpy(data, data_data, data_len); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 case BUFFER_SELECTION: | 393 case BUFFER_SELECTION: |
| 387 result = primary_selection_; | 394 result = primary_selection_; |
| 388 break; | 395 break; |
| 389 default: | 396 default: |
| 390 NOTREACHED(); | 397 NOTREACHED(); |
| 391 result = NULL; | 398 result = NULL; |
| 392 break; | 399 break; |
| 393 } | 400 } |
| 394 return result; | 401 return result; |
| 395 } | 402 } |
| 396 | |
| OLD | NEW |