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 "webkit/glue/plugins/gtk_plugin_container.h" | 5 #include "webkit/glue/plugins/gtk_plugin_container.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 | 10 |
11 namespace { | 11 namespace { |
12 | 12 |
13 // NOTE: This class doesn't have constructors/destructors, it is created | 13 // NOTE: This class doesn't have constructors/destructors, it is created |
14 // through GLib's object management. | 14 // through GLib's object management. |
15 class GtkPluginContainer : public GtkSocket { | 15 class GtkPluginContainer : public GtkSocket { |
16 public: | 16 public: |
17 static GtkWidget* CreateNewWidget() { | |
18 GtkWidget* container = GTK_WIDGET(g_object_new(GetType(), NULL)); | |
19 g_signal_connect(GTK_SOCKET(container), "plug-removed", | |
20 G_CALLBACK(OnPlugRemoved), NULL); | |
21 return container; | |
22 } | |
23 | |
24 // Sets the requested size of the widget. | 17 // Sets the requested size of the widget. |
25 void set_size(int width, int height) { | 18 void set_size(int width, int height) { |
26 width_ = width; | 19 width_ = width; |
27 height_ = height; | 20 height_ = height; |
28 } | 21 } |
29 | 22 |
30 // Casts a widget into a GtkPluginContainer, after checking the type. | 23 // Casts a widget into a GtkPluginContainer, after checking the type. |
31 template <class T> | 24 template <class T> |
32 static GtkPluginContainer *CastChecked(T *instance) { | 25 static GtkPluginContainer *CastChecked(T *instance) { |
33 return G_TYPE_CHECK_INSTANCE_CAST(instance, GetType(), GtkPluginContainer); | 26 return G_TYPE_CHECK_INSTANCE_CAST(instance, GetType(), GtkPluginContainer); |
34 } | 27 } |
35 | 28 |
36 private: | |
37 // Create and register our custom container type with GTK. | 29 // Create and register our custom container type with GTK. |
38 static GType GetType() { | 30 static GType GetType() { |
39 static GType type = 0; // We only want to register our type once. | 31 static GType type = 0; // We only want to register our type once. |
40 if (!type) { | 32 if (!type) { |
41 static const GTypeInfo info = { | 33 static const GTypeInfo info = { |
42 sizeof(GtkSocketClass), | 34 sizeof(GtkSocketClass), |
43 NULL, NULL, | 35 NULL, NULL, |
44 static_cast<GClassInitFunc>(&ClassInit), | 36 static_cast<GClassInitFunc>(&ClassInit), |
45 NULL, NULL, | 37 NULL, NULL, |
46 sizeof(GtkSocket), // We are identical to a GtkSocket. | 38 sizeof(GtkSocket), // We are identical to a GtkSocket. |
(...skipping 20 matching lines...) Expand all Loading... |
67 } | 59 } |
68 | 60 |
69 // Report our allocation size during size requisition. | 61 // Report our allocation size during size requisition. |
70 static void HandleSizeRequest(GtkWidget* widget, | 62 static void HandleSizeRequest(GtkWidget* widget, |
71 GtkRequisition* requisition) { | 63 GtkRequisition* requisition) { |
72 GtkPluginContainer *container = CastChecked(widget); | 64 GtkPluginContainer *container = CastChecked(widget); |
73 requisition->width = container->width_; | 65 requisition->width = container->width_; |
74 requisition->height = container->height_; | 66 requisition->height = container->height_; |
75 } | 67 } |
76 | 68 |
77 static gboolean OnPlugRemoved(GtkSocket* socket) { | |
78 // This is called when the other side of the socket goes away. | |
79 // We return TRUE to indicate that we don't want to destroy our side. | |
80 return TRUE; | |
81 } | |
82 | |
83 int width_; | 69 int width_; |
84 int height_; | 70 int height_; |
85 DISALLOW_IMPLICIT_CONSTRUCTORS(GtkPluginContainer); | 71 DISALLOW_IMPLICIT_CONSTRUCTORS(GtkPluginContainer); |
86 }; | 72 }; |
87 | 73 |
88 } // anonymous namespace | 74 } // anonymous namespace |
89 | 75 |
90 // Create a new instance of our GTK widget object. | 76 // Create a new instance of our GTK widget object. |
91 GtkWidget* gtk_plugin_container_new() { | 77 GtkWidget* gtk_plugin_container_new() { |
92 return GtkPluginContainer::CreateNewWidget(); | 78 return GTK_WIDGET(g_object_new(GtkPluginContainer::GetType(), NULL)); |
93 } | 79 } |
94 | 80 |
95 void gtk_plugin_container_set_size(GtkWidget *widget, int width, int height) { | 81 void gtk_plugin_container_set_size(GtkWidget *widget, int width, int height) { |
96 GtkPluginContainer::CastChecked(widget)->set_size(width, height); | 82 GtkPluginContainer::CastChecked(widget)->set_size(width, height); |
97 // Signal the parent that the size request has changed. | 83 // Signal the parent that the size request has changed. |
98 gtk_widget_queue_resize_no_redraw(widget); | 84 gtk_widget_queue_resize_no_redraw(widget); |
99 } | 85 } |
OLD | NEW |