| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome/browser/gtk/gtk_dnd_util.h" | 5 #include "chrome/browser/gtk/gtk_dnd_util.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 | 8 |
| 9 namespace { | |
| 10 | |
| 11 void AddApplicationTarget(GtkTargetList* targets, int code_mask, int target) { | |
| 12 if (code_mask & target) { | |
| 13 gtk_target_list_add(targets, GtkDndUtil::GetAtomForTarget(target), | |
| 14 GTK_TARGET_SAME_APP, target); | |
| 15 } | |
| 16 } | |
| 17 | |
| 18 } // namespace | |
| 19 | |
| 20 // static | 9 // static |
| 21 GdkAtom GtkDndUtil::GetAtomForTarget(int target) { | 10 GdkAtom GtkDndUtil::GetAtomForTarget(int target) { |
| 22 switch (target) { | 11 switch (target) { |
| 23 case CHROME_TAB: | 12 case CHROME_TAB: |
| 24 static GdkAtom tab_atom = gdk_atom_intern( | 13 static GdkAtom tab_atom = gdk_atom_intern( |
| 25 const_cast<char*>("application/x-chrome-tab"), false); | 14 const_cast<char*>("application/x-chrome-tab"), false); |
| 26 return tab_atom; | 15 return tab_atom; |
| 27 | 16 |
| 28 case TEXT_HTML: | 17 case TEXT_HTML: |
| 29 static GdkAtom html_atom = gdk_atom_intern( | 18 static GdkAtom html_atom = gdk_atom_intern( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 54 NOTREACHED(); | 43 NOTREACHED(); |
| 55 } | 44 } |
| 56 | 45 |
| 57 return NULL; | 46 return NULL; |
| 58 } | 47 } |
| 59 | 48 |
| 60 // static | 49 // static |
| 61 GtkTargetList* GtkDndUtil::GetTargetListFromCodeMask(int code_mask) { | 50 GtkTargetList* GtkDndUtil::GetTargetListFromCodeMask(int code_mask) { |
| 62 GtkTargetList* targets = gtk_target_list_new(NULL, 0); | 51 GtkTargetList* targets = gtk_target_list_new(NULL, 0); |
| 63 | 52 |
| 64 if (code_mask & TEXT_PLAIN) | 53 for (size_t i = 1; i < INVALID_TARGET; i = i << 1) { |
| 65 gtk_target_list_add_text_targets(targets, TEXT_PLAIN); | 54 if (i == CHROME_WEBDROP_FILE_CONTENTS) |
| 55 continue; |
| 66 | 56 |
| 67 if (code_mask & TEXT_URI_LIST) | 57 if (i & code_mask) |
| 68 gtk_target_list_add_uri_targets(targets, TEXT_URI_LIST); | 58 AddTargetToList(targets, i); |
| 69 | 59 } |
| 70 if (code_mask & TEXT_HTML) | |
| 71 gtk_target_list_add(targets, GetAtomForTarget(TEXT_PLAIN), 0, TEXT_HTML); | |
| 72 | |
| 73 AddApplicationTarget(targets, code_mask, CHROME_TAB); | |
| 74 AddApplicationTarget(targets, code_mask, CHROME_BOOKMARK_ITEM); | |
| 75 AddApplicationTarget(targets, code_mask, CHROME_NAMED_URL); | |
| 76 | 60 |
| 77 return targets; | 61 return targets; |
| 78 } | 62 } |
| 79 | 63 |
| 80 // static | 64 // static |
| 81 void GtkDndUtil::SetDestTargetListFromCodeMask(GtkWidget* dest, | |
| 82 int code_mask) { | |
| 83 GtkTargetList* targets = GetTargetListFromCodeMask(code_mask); | |
| 84 gtk_drag_dest_set_target_list(dest, targets); | |
| 85 gtk_target_list_unref(targets); | |
| 86 } | |
| 87 | |
| 88 // static | |
| 89 void GtkDndUtil::SetSourceTargetListFromCodeMask(GtkWidget* source, | 65 void GtkDndUtil::SetSourceTargetListFromCodeMask(GtkWidget* source, |
| 90 int code_mask) { | 66 int code_mask) { |
| 91 GtkTargetList* targets = GetTargetListFromCodeMask(code_mask); | 67 GtkTargetList* targets = GetTargetListFromCodeMask(code_mask); |
| 92 gtk_drag_source_set_target_list(source, targets); | 68 gtk_drag_source_set_target_list(source, targets); |
| 93 gtk_target_list_unref(targets); | 69 gtk_target_list_unref(targets); |
| 94 } | 70 } |
| 71 |
| 72 // static |
| 73 void GtkDndUtil::SetDestTargetList(GtkWidget* dest, const int* target_codes) { |
| 74 GtkTargetList* targets = gtk_target_list_new(NULL, 0); |
| 75 |
| 76 for (size_t i = 0; target_codes[i] != 0; ++i) { |
| 77 AddTargetToList(targets, target_codes[i]); |
| 78 } |
| 79 |
| 80 gtk_drag_dest_set_target_list(dest, targets); |
| 81 gtk_target_list_unref(targets); |
| 82 } |
| 83 |
| 84 // static |
| 85 void GtkDndUtil::AddTargetToList(GtkTargetList* targets, int target_code) { |
| 86 switch (target_code) { |
| 87 case TEXT_PLAIN: |
| 88 gtk_target_list_add_text_targets(targets, TEXT_PLAIN); |
| 89 break; |
| 90 |
| 91 case TEXT_URI_LIST: |
| 92 gtk_target_list_add_uri_targets(targets, TEXT_URI_LIST); |
| 93 break; |
| 94 |
| 95 case TEXT_HTML: |
| 96 gtk_target_list_add(targets, GetAtomForTarget(TEXT_PLAIN), 0, TEXT_HTML); |
| 97 break; |
| 98 |
| 99 case CHROME_TAB: |
| 100 case CHROME_BOOKMARK_ITEM: |
| 101 case CHROME_NAMED_URL: |
| 102 gtk_target_list_add(targets, GtkDndUtil::GetAtomForTarget(target_code), |
| 103 GTK_TARGET_SAME_APP, target_code); |
| 104 break; |
| 105 |
| 106 default: |
| 107 NOTREACHED() << " Unexpected target code: " << target_code; |
| 108 } |
| 109 } |
| OLD | NEW |