15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#ifndef CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_MANAGER_H_
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _GtkWidget GtkWidget;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WebPluginGeometry;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class that creates and manages plugin containers (GtkSocket).
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass GtkPluginContainerManager {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkPluginContainerManager();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~GtkPluginContainerManager();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the widget that will host the plugin containers. Must be a GtkFixed.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_host_widget(GtkWidget *widget) { host_widget_ = widget; }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new plugin container, for a given plugin XID.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* CreatePluginContainer(gfx::PluginWindowHandle id);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroys a plugin container, given the plugin XID.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyPluginContainer(gfx::PluginWindowHandle id);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes an update from WebKit about a plugin's position and side and moves
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the plugin accordingly.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MovePluginContainer(const WebPluginGeometry& move);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps a plugin XID to the corresponding container widget.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* MapIDToWidget(gfx::PluginWindowHandle id);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps a container widget to the corresponding plugin XID.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::PluginWindowHandle MapWidgetToID(GtkWidget* widget);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for when the plugin container gets realized, at which point it
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugs the plugin XID.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RealizeCallback(GtkWidget *widget, void *user_data);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parent of the plugin containers.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* host_widget_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map that associates plugin containers to the plugin XID.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<gfx::PluginWindowHandle, GtkWidget*> PluginWindowToWidgetMap;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginWindowToWidgetMap plugin_window_to_widget_map_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace content
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif  // CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_MANAGER_H_
59