OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/gtk/gtk_input_event_box.h" | |
6 | |
7 #include <gdk/gdkwindow.h> | |
8 #include <gtk/gtk.h> | |
9 #include <gtk/gtkwidget.h> | |
10 #include <gtk/gtkbin.h> | |
11 | |
12 G_BEGIN_DECLS | |
13 | |
14 #define GTK_INPUT_EVENT_BOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ | |
15 GTK_TYPE_INPUT_EVENT_BOX, \ | |
16 GtkInputEventBoxPrivate)) | |
17 | |
18 typedef struct _GtkInputEventBoxPrivate GtkInputEventBoxPrivate; | |
19 | |
20 struct _GtkInputEventBoxPrivate { | |
21 GdkWindow* event_window; | |
22 }; | |
23 | |
24 G_DEFINE_TYPE(GtkInputEventBox, gtk_input_event_box, GTK_TYPE_BIN) | |
25 | |
26 static void gtk_input_event_box_realize(GtkWidget* widget); | |
27 static void gtk_input_event_box_unrealize(GtkWidget* widget); | |
28 static void gtk_input_event_box_map(GtkWidget* widget); | |
29 static void gtk_input_event_box_unmap(GtkWidget* widget); | |
30 static void gtk_input_event_box_size_allocate(GtkWidget* widget, | |
31 GtkAllocation* allocation); | |
32 static void gtk_input_event_box_size_request(GtkWidget* widget, | |
33 GtkRequisition* requisition); | |
34 | |
35 static void gtk_input_event_box_class_init(GtkInputEventBoxClass* klass) { | |
36 GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(klass); | |
37 widget_class->realize = gtk_input_event_box_realize; | |
38 widget_class->unrealize = gtk_input_event_box_unrealize; | |
39 widget_class->map = gtk_input_event_box_map; | |
40 widget_class->unmap = gtk_input_event_box_unmap; | |
41 widget_class->size_allocate = gtk_input_event_box_size_allocate; | |
42 widget_class->size_request = gtk_input_event_box_size_request; | |
43 | |
44 GObjectClass* gobject_class = G_OBJECT_CLASS(klass); | |
45 g_type_class_add_private(gobject_class, sizeof(GtkInputEventBoxPrivate)); | |
46 } | |
47 | |
48 static void gtk_input_event_box_init(GtkInputEventBox* widget) { | |
49 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
50 priv->event_window = NULL; | |
51 } | |
52 | |
53 GtkWidget* gtk_input_event_box_new() { | |
54 return GTK_WIDGET(g_object_new(GTK_TYPE_INPUT_EVENT_BOX, NULL)); | |
55 } | |
56 | |
57 static void gtk_input_event_box_realize(GtkWidget* widget) { | |
58 g_return_if_fail(GTK_IS_INPUT_EVENT_BOX(widget)); | |
59 | |
60 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
61 | |
62 GdkWindow* parent = gtk_widget_get_parent_window(widget); | |
63 GdkWindowAttr attributes; | |
64 GtkAllocation allocation; | |
65 gint attributes_mask = GDK_WA_X | GDK_WA_Y; | |
66 | |
67 gtk_widget_get_allocation(widget, &allocation); | |
68 | |
69 attributes.x = allocation.x; | |
70 attributes.y = allocation.y; | |
71 attributes.width = allocation.width; | |
72 attributes.height = allocation.height; | |
73 | |
74 attributes.window_type = GDK_WINDOW_CHILD; | |
75 attributes.wclass = GDK_INPUT_ONLY; | |
76 | |
77 attributes.event_mask = gtk_widget_get_events(widget) | |
78 | GDK_BUTTON_MOTION_MASK | |
79 | GDK_BUTTON_PRESS_MASK | |
80 | GDK_BUTTON_RELEASE_MASK | |
81 | GDK_EXPOSURE_MASK | |
82 | GDK_ENTER_NOTIFY_MASK | |
83 | GDK_LEAVE_NOTIFY_MASK; | |
84 | |
85 priv->event_window = gdk_window_new(parent, &attributes, attributes_mask); | |
86 gdk_window_set_user_data(priv->event_window, widget); | |
87 | |
88 GTK_WIDGET_CLASS(gtk_input_event_box_parent_class)->realize(widget); | |
89 } | |
90 | |
91 static void gtk_input_event_box_unrealize(GtkWidget* widget) { | |
92 g_return_if_fail(GTK_IS_INPUT_EVENT_BOX(widget)); | |
93 | |
94 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
95 if (priv->event_window) { | |
96 gdk_window_set_user_data(priv->event_window, NULL); | |
97 gdk_window_destroy(priv->event_window); | |
98 priv->event_window = NULL; | |
99 } | |
100 | |
101 GTK_WIDGET_CLASS(gtk_input_event_box_parent_class)->unrealize(widget); | |
102 } | |
103 | |
104 static void gtk_input_event_box_map(GtkWidget* widget) { | |
105 g_return_if_fail(GTK_IS_INPUT_EVENT_BOX(widget)); | |
106 | |
107 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
108 if (priv->event_window) | |
109 gdk_window_show(priv->event_window); | |
110 | |
111 GTK_WIDGET_CLASS(gtk_input_event_box_parent_class)->map(widget); | |
112 } | |
113 | |
114 static void gtk_input_event_box_unmap(GtkWidget* widget) { | |
115 g_return_if_fail(GTK_IS_INPUT_EVENT_BOX(widget)); | |
116 | |
117 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
118 if (priv->event_window) | |
119 gdk_window_hide(priv->event_window); | |
120 | |
121 GTK_WIDGET_CLASS(gtk_input_event_box_parent_class)->unmap(widget); | |
122 } | |
123 | |
124 static void gtk_input_event_box_size_allocate(GtkWidget* widget, | |
125 GtkAllocation* allocation) { | |
126 g_return_if_fail(GTK_IS_INPUT_EVENT_BOX(widget)); | |
127 | |
128 widget->allocation = *allocation; | |
129 | |
130 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
131 if (priv->event_window) { | |
132 gdk_window_move_resize(priv->event_window, | |
133 allocation->x, | |
134 allocation->y, | |
135 allocation->width, | |
136 allocation->height); | |
137 } | |
138 | |
139 GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget)); | |
140 if (child) | |
141 gtk_widget_size_allocate(child, allocation); | |
142 } | |
143 | |
144 static void gtk_input_event_box_size_request(GtkWidget* widget, | |
145 GtkRequisition* requisition) { | |
146 | |
147 GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget)); | |
148 if (child) | |
149 gtk_widget_size_request(child, requisition); | |
150 } | |
151 | |
152 GdkWindow* gtk_input_event_box_get_window(GtkInputEventBox* widget) { | |
153 g_return_val_if_fail(GTK_IS_INPUT_EVENT_BOX(widget), NULL); | |
154 | |
155 GtkInputEventBoxPrivate* priv = GTK_INPUT_EVENT_BOX_GET_PRIVATE(widget); | |
156 return priv->event_window; | |
157 } | |
158 | |
159 G_END_DECLS | |
OLD | NEW |