// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/gtk/custom_drag.h" #include "ui/base/dragdrop/gtk_dnd_util.h" #include "ui/gfx/image/image.h" CustomDrag::CustomDrag(gfx::Image* icon, int code_mask, GdkDragAction action) : drag_widget_(gtk_invisible_new()), image_(icon) { g_signal_connect(drag_widget_, "drag-data-get", G_CALLBACK(OnDragDataGetThunk), this); g_signal_connect(drag_widget_, "drag-begin", G_CALLBACK(OnDragBeginThunk), this); g_signal_connect(drag_widget_, "drag-end", G_CALLBACK(OnDragEndThunk), this); GtkTargetList* list = ui::GetTargetListFromCodeMask(code_mask); GdkEvent* event = gtk_get_current_event(); gtk_drag_begin(drag_widget_, list, action, 1, event); if (event) gdk_event_free(event); gtk_target_list_unref(list); } CustomDrag::~CustomDrag() { gtk_widget_destroy(drag_widget_); } void CustomDrag::OnDragBegin(GtkWidget* widget, GdkDragContext* drag_context) { if (image_) gtk_drag_set_icon_pixbuf(drag_context, image_->ToGdkPixbuf(), 0, 0); } void CustomDrag::OnDragEnd(GtkWidget* widget, GdkDragContext* drag_context) { delete this; }