| 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 |