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/tab_contents_drag_source.h" | 5 #include "chrome/browser/gtk/tab_contents_drag_source.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "app/gtk_dnd_util.h" | 9 #include "app/gtk_dnd_util.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 using WebKit::WebDragOperation; | 26 using WebKit::WebDragOperation; |
27 using WebKit::WebDragOperationsMask; | 27 using WebKit::WebDragOperationsMask; |
28 using WebKit::WebDragOperationNone; | 28 using WebKit::WebDragOperationNone; |
29 | 29 |
30 TabContentsDragSource::TabContentsDragSource( | 30 TabContentsDragSource::TabContentsDragSource( |
31 TabContentsView* tab_contents_view) | 31 TabContentsView* tab_contents_view) |
32 : tab_contents_view_(tab_contents_view), | 32 : tab_contents_view_(tab_contents_view), |
33 drag_pixbuf_(NULL), | 33 drag_pixbuf_(NULL), |
34 drag_failed_(false), | 34 drag_failed_(false), |
35 drag_widget_(NULL), | 35 drag_widget_(gtk_invisible_new()), |
36 drag_icon_(NULL) { | 36 drag_icon_(gtk_window_new(GTK_WINDOW_POPUP)) { |
37 drag_widget_ = gtk_invisible_new(); | 37 g_object_ref(drag_widget_); |
38 g_signal_connect(drag_widget_, "drag-failed", | 38 signals_.Connect(drag_widget_, "drag-failed", |
39 G_CALLBACK(OnDragFailedThunk), this); | 39 G_CALLBACK(OnDragFailedThunk), this); |
40 g_signal_connect(drag_widget_, "drag-begin", G_CALLBACK(OnDragBeginThunk), | 40 signals_.Connect(drag_widget_, "drag-begin", |
| 41 G_CALLBACK(OnDragBeginThunk), |
41 this); | 42 this); |
42 g_signal_connect(drag_widget_, "drag-end", G_CALLBACK(OnDragEndThunk), this); | 43 signals_.Connect(drag_widget_, "drag-end", |
43 g_signal_connect(drag_widget_, "drag-data-get", | 44 G_CALLBACK(OnDragEndThunk), this); |
| 45 signals_.Connect(drag_widget_, "drag-data-get", |
44 G_CALLBACK(OnDragDataGetThunk), this); | 46 G_CALLBACK(OnDragDataGetThunk), this); |
45 g_object_ref_sink(drag_widget_); | 47 |
| 48 g_object_ref(drag_icon_); |
| 49 signals_.Connect(drag_icon_, "expose-event", |
| 50 G_CALLBACK(OnDragIconExposeThunk), this); |
46 } | 51 } |
47 | 52 |
48 TabContentsDragSource::~TabContentsDragSource() { | 53 TabContentsDragSource::~TabContentsDragSource() { |
49 g_signal_handlers_disconnect_by_func(drag_widget_, | |
50 reinterpret_cast<gpointer>(OnDragFailedThunk), this); | |
51 g_signal_handlers_disconnect_by_func(drag_widget_, | |
52 reinterpret_cast<gpointer>(OnDragBeginThunk), this); | |
53 g_signal_handlers_disconnect_by_func(drag_widget_, | |
54 reinterpret_cast<gpointer>(OnDragEndThunk), this); | |
55 g_signal_handlers_disconnect_by_func(drag_widget_, | |
56 reinterpret_cast<gpointer>(OnDragDataGetThunk), this); | |
57 | |
58 // Break the current drag, if any. | 54 // Break the current drag, if any. |
59 if (drop_data_.get()) { | 55 if (drop_data_.get()) { |
60 gtk_grab_add(drag_widget_); | 56 gtk_grab_add(drag_widget_); |
61 gtk_grab_remove(drag_widget_); | 57 gtk_grab_remove(drag_widget_); |
62 MessageLoopForUI::current()->RemoveObserver(this); | 58 MessageLoopForUI::current()->RemoveObserver(this); |
63 drop_data_.reset(); | 59 drop_data_.reset(); |
64 } | 60 } |
65 | 61 |
66 gtk_widget_destroy(drag_widget_); | |
67 g_object_unref(drag_widget_); | 62 g_object_unref(drag_widget_); |
68 drag_widget_ = NULL; | 63 g_object_unref(drag_icon_); |
69 } | 64 } |
70 | 65 |
71 TabContents* TabContentsDragSource::tab_contents() const { | 66 TabContents* TabContentsDragSource::tab_contents() const { |
72 return tab_contents_view_->tab_contents(); | 67 return tab_contents_view_->tab_contents(); |
73 } | 68 } |
74 | 69 |
75 void TabContentsDragSource::StartDragging(const WebDropData& drop_data, | 70 void TabContentsDragSource::StartDragging(const WebDropData& drop_data, |
76 WebDragOperationsMask allowed_ops, | 71 WebDragOperationsMask allowed_ops, |
77 GdkEventButton* last_mouse_down, | 72 GdkEventButton* last_mouse_down, |
78 const SkBitmap& image, | 73 const SkBitmap& image, |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 gtk_dnd_util::GetAtomForTarget( | 307 gtk_dnd_util::GetAtomForTarget( |
313 gtk_dnd_util::TEXT_PLAIN_NO_CHARSET), | 308 gtk_dnd_util::TEXT_PLAIN_NO_CHARSET), |
314 8, | 309 8, |
315 GDK_PROP_MODE_REPLACE, | 310 GDK_PROP_MODE_REPLACE, |
316 reinterpret_cast<const guchar*>( | 311 reinterpret_cast<const guchar*>( |
317 generated_download_file_name.value().c_str()), | 312 generated_download_file_name.value().c_str()), |
318 generated_download_file_name.value().length()); | 313 generated_download_file_name.value().length()); |
319 } | 314 } |
320 | 315 |
321 if (drag_pixbuf_) { | 316 if (drag_pixbuf_) { |
322 drag_icon_ = gtk_window_new(GTK_WINDOW_POPUP); | |
323 g_object_ref_sink(drag_icon_); | |
324 g_signal_connect(drag_icon_, "expose-event", | |
325 G_CALLBACK(OnDragIconExposeThunk), this); | |
326 gtk_widget_set_size_request(drag_icon_, | 317 gtk_widget_set_size_request(drag_icon_, |
327 gdk_pixbuf_get_width(drag_pixbuf_), | 318 gdk_pixbuf_get_width(drag_pixbuf_), |
328 gdk_pixbuf_get_height(drag_pixbuf_)); | 319 gdk_pixbuf_get_height(drag_pixbuf_)); |
329 | 320 |
330 GdkScreen* screen = gtk_widget_get_screen(GTK_WIDGET(drag_icon_)); | 321 GdkScreen* screen = gtk_widget_get_screen(drag_icon_); |
331 GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen); | 322 GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen); |
332 if (rgba) | 323 if (rgba) |
333 gtk_widget_set_colormap(GTK_WIDGET(drag_icon_), rgba); | 324 gtk_widget_set_colormap(drag_icon_, rgba); |
334 | 325 |
335 gtk_drag_set_icon_widget(drag_context, drag_icon_, | 326 gtk_drag_set_icon_widget(drag_context, drag_icon_, |
336 image_offset_.x(), image_offset_.y()); | 327 image_offset_.x(), image_offset_.y()); |
337 } | 328 } |
338 } | 329 } |
339 | 330 |
340 void TabContentsDragSource::OnDragEnd(GtkWidget* sender, | 331 void TabContentsDragSource::OnDragEnd(GtkWidget* sender, |
341 GdkDragContext* drag_context) { | 332 GdkDragContext* drag_context) { |
342 if (drag_icon_) { | |
343 g_object_unref(drag_icon_); | |
344 drag_icon_ = NULL; | |
345 } | |
346 if (drag_pixbuf_) { | 333 if (drag_pixbuf_) { |
347 g_object_unref(drag_pixbuf_); | 334 g_object_unref(drag_pixbuf_); |
348 drag_pixbuf_ = NULL; | 335 drag_pixbuf_ = NULL; |
349 } | 336 } |
350 | 337 |
351 MessageLoopForUI::current()->RemoveObserver(this); | 338 MessageLoopForUI::current()->RemoveObserver(this); |
352 | 339 |
353 if (!download_url_.is_empty()) { | 340 if (!download_url_.is_empty()) { |
354 gdk_property_delete(drag_context->source_window, | 341 gdk_property_delete(drag_context->source_window, |
355 gtk_dnd_util::GetAtomForTarget( | 342 gtk_dnd_util::GetAtomForTarget( |
(...skipping 26 matching lines...) Expand all Loading... |
382 cairo_t* cr = gdk_cairo_create(event->window); | 369 cairo_t* cr = gdk_cairo_create(event->window); |
383 gdk_cairo_rectangle(cr, &event->area); | 370 gdk_cairo_rectangle(cr, &event->area); |
384 cairo_clip(cr); | 371 cairo_clip(cr); |
385 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); | 372 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
386 gdk_cairo_set_source_pixbuf(cr, drag_pixbuf_, 0, 0); | 373 gdk_cairo_set_source_pixbuf(cr, drag_pixbuf_, 0, 0); |
387 cairo_paint(cr); | 374 cairo_paint(cr); |
388 cairo_destroy(cr); | 375 cairo_destroy(cr); |
389 | 376 |
390 return TRUE; | 377 return TRUE; |
391 } | 378 } |
OLD | NEW |