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