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 |