summaryrefslogtreecommitdiffstats
path: root/content/browser/web_contents/web_drag_source_gtk.h
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/web_contents/web_drag_source_gtk.h')
-rw-r--r--content/browser/web_contents/web_drag_source_gtk.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/content/browser/web_contents/web_drag_source_gtk.h b/content/browser/web_contents/web_drag_source_gtk.h
new file mode 100644
index 0000000..159a915
--- /dev/null
+++ b/content/browser/web_contents/web_drag_source_gtk.h
@@ -0,0 +1,115 @@
+// 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.
+
+#ifndef CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_
+#define CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_
+#pragma once
+
+#include <gtk/gtk.h>
+
+#include "base/basictypes.h"
+#include "base/file_path.h"
+#include "base/message_loop.h"
+#include "base/string16.h"
+#include "content/common/content_export.h"
+#include "googleurl/src/gurl.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h"
+#include "ui/base/gtk/gtk_signal.h"
+#include "ui/base/gtk/gtk_signal_registrar.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/point.h"
+
+class SkBitmap;
+struct WebDropData;
+
+namespace content {
+
+class RenderViewHostImpl;
+class WebContents;
+
+// WebDragSourceGtk takes care of managing the drag from a WebContents
+// with Gtk.
+class CONTENT_EXPORT WebDragSourceGtk : public MessageLoopForUI::Observer {
+ public:
+ explicit WebDragSourceGtk(WebContents* web_contents);
+ virtual ~WebDragSourceGtk();
+
+ // Starts a drag for the tab contents this WebDragSourceGtk was
+ // created for.
+ void StartDragging(const WebDropData& drop_data,
+ WebKit::WebDragOperationsMask allowed_ops,
+ GdkEventButton* last_mouse_down,
+ const SkBitmap& image,
+ const gfx::Point& image_offset);
+
+ // MessageLoop::Observer implementation:
+ virtual void WillProcessEvent(GdkEvent* event) OVERRIDE;
+ virtual void DidProcessEvent(GdkEvent* event) OVERRIDE;
+
+ private:
+ CHROMEGTK_CALLBACK_2(WebDragSourceGtk, gboolean, OnDragFailed,
+ GdkDragContext*, GtkDragResult);
+ CHROMEGTK_CALLBACK_1(WebDragSourceGtk, void, OnDragBegin,
+ GdkDragContext*);
+ CHROMEGTK_CALLBACK_1(WebDragSourceGtk, void, OnDragEnd,
+ GdkDragContext*);
+ CHROMEGTK_CALLBACK_4(WebDragSourceGtk, void, OnDragDataGet,
+ GdkDragContext*, GtkSelectionData*, guint, guint);
+ CHROMEGTK_CALLBACK_1(WebDragSourceGtk, gboolean, OnDragIconExpose,
+ GdkEventExpose*);
+
+ content::RenderViewHostImpl* GetRenderViewHost() const;
+ gfx::NativeView GetContentNativeView() const;
+
+ // The tab we're manging the drag for.
+ content::WebContents* web_contents_;
+
+ // The drop data for the current drag (for drags that originate in the render
+ // view). Non-NULL iff there is a current drag.
+ scoped_ptr<WebDropData> drop_data_;
+
+ // The image used for depicting the drag, and the offset between the cursor
+ // and the top left pixel.
+ GdkPixbuf* drag_pixbuf_;
+ gfx::Point image_offset_;
+
+ // The mime type for the file contents of the current drag (if any).
+ GdkAtom drag_file_mime_type_;
+
+ // Whether the current drag has failed. Meaningless if we are not the source
+ // for a current drag.
+ bool drag_failed_;
+
+ // This is the widget we use to initiate drags. Since we don't use the
+ // renderer widget, we can persist drags even when our contents is switched
+ // out. We can't use an OwnedWidgetGtk because the GtkInvisible widget
+ // initialization code sinks the reference.
+ GtkWidget* drag_widget_;
+
+ // Context created once drag starts. A NULL value indicates that there is
+ // no drag currently in progress.
+ GdkDragContext* drag_context_;
+
+ // The file mime type for a drag-out download.
+ string16 wide_download_mime_type_;
+
+ // The file name to be saved to for a drag-out download.
+ FilePath download_file_name_;
+
+ // The URL to download from for a drag-out download.
+ GURL download_url_;
+
+ // The widget that provides visual feedback for the drag. We can't use
+ // an OwnedWidgetGtk because the GtkWindow initialization code sinks
+ // the reference.
+ GtkWidget* drag_icon_;
+
+ ui::GtkSignalRegistrar signals_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebDragSourceGtk);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_