#include #include "notebookbox.h" #define GTK_NOTEBOOK_BOX_GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE((obj), GTK_TYPE_NOTEBOOK_BOX, GtkNotebookBoxPrivate) static void gtk_notebook_box_class_init (GtkNotebookBoxClass *klass); static void gtk_notebook_box_init (GtkNotebookBox *event_box); static void gtk_notebook_box_realize (GtkWidget *widget); static void gtk_notebook_box_unrealize (GtkWidget *widget); static void gtk_notebook_box_map (GtkWidget *widget); static void gtk_notebook_box_unmap (GtkWidget *widget); static void gtk_notebook_box_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_notebook_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static void gtk_notebook_box_paint (GtkWidget *widget, GdkRectangle *area); static gint gtk_notebook_box_expose (GtkWidget *widget, GdkEventExpose *event); static GtkEventBoxClass *parent_class = NULL; typedef struct { GdkWindow *event_window; } GtkNotebookBoxPrivate; GType gtk_notebook_box_get_type (void) { static GType notebook_box_type = 0; if (!notebook_box_type) { static const GTypeInfo notebook_box_info = { sizeof (GtkNotebookBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) gtk_notebook_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (GtkNotebookBox), 0, /* n_preallocs */ (GInstanceInitFunc) gtk_notebook_box_init, }; notebook_box_type = g_type_register_static (GTK_TYPE_BIN, "GtkNotebookBox", ¬ebook_box_info, 0); } return notebook_box_type; } static void gtk_notebook_box_class_init (GtkNotebookBoxClass *class) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); parent_class = g_type_class_peek_parent (class); widget_class->realize = gtk_notebook_box_realize; widget_class->unrealize = gtk_notebook_box_unrealize; widget_class->map = gtk_notebook_box_map; widget_class->unmap = gtk_notebook_box_unmap; widget_class->size_request = gtk_notebook_box_size_request; widget_class->size_allocate = gtk_notebook_box_size_allocate; widget_class->expose_event = gtk_notebook_box_expose; g_type_class_add_private (class, sizeof (GtkNotebookBoxPrivate)); } static void gtk_notebook_box_init (GtkNotebookBox *event_box) { GTK_WIDGET_UNSET_FLAGS (event_box, GTK_NO_WINDOW); } GtkWidget* gtk_notebook_box_new (void) { return g_object_new (GTK_TYPE_NOTEBOOK_BOX, NULL); } static void gtk_notebook_box_realize (GtkWidget *widget) { GdkWindowAttr attributes; gint attributes_mask; gint border_width; GtkNotebookBoxPrivate *priv; gboolean visible_window; GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); border_width = GTK_CONTAINER (widget)->border_width; attributes.x = widget->allocation.x + border_width; attributes.y = widget->allocation.y + border_width; attributes.width = widget->allocation.width - 2*border_width; attributes.height = widget->allocation.height - 2*border_width; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = gtk_widget_get_events (widget) | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK; priv = GTK_NOTEBOOK_BOX_GET_PRIVATE (widget); visible_window = !GTK_WIDGET_NO_WINDOW (widget); attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.wclass = GDK_INPUT_OUTPUT; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, widget); widget->style = gtk_style_attach (widget->style, widget->window); // if (visible_window) // gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); } static void gtk_notebook_box_unrealize (GtkWidget *widget) { GtkNotebookBox *event_box; GtkNotebookBoxPrivate *priv; event_box = GTK_NOTEBOOK_BOX (widget); priv = GTK_NOTEBOOK_BOX_GET_PRIVATE (widget); if (priv->event_window != NULL) { gdk_window_set_user_data (priv->event_window, NULL); gdk_window_destroy (priv->event_window); priv->event_window = NULL; } if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } static void gtk_notebook_box_map (GtkWidget *widget) { GtkNotebookBoxPrivate *priv; priv = GTK_NOTEBOOK_BOX_GET_PRIVATE (widget); if (priv->event_window != NULL) gdk_window_show (priv->event_window); (* GTK_WIDGET_CLASS (parent_class)->map) (widget); } static void gtk_notebook_box_unmap (GtkWidget *widget) { GtkNotebookBoxPrivate *priv; priv = GTK_NOTEBOOK_BOX_GET_PRIVATE (widget); if (priv->event_window != NULL) gdk_window_hide (priv->event_window); (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget); } static void gtk_notebook_box_size_request (GtkWidget *widget, GtkRequisition *requisition) { GtkBin *bin = GTK_BIN (widget); requisition->width = GTK_CONTAINER (widget)->border_width * 2; requisition->height = GTK_CONTAINER (widget)->border_width * 2; if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { GtkRequisition child_requisition; gtk_widget_size_request (bin->child, &child_requisition); requisition->width += child_requisition.width; requisition->height += child_requisition.height; } } static void gtk_notebook_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkBin *bin; GtkAllocation child_allocation; GtkNotebookBoxPrivate *priv; widget->allocation = *allocation; bin = GTK_BIN (widget); if (GTK_WIDGET_NO_WINDOW (widget)) { child_allocation.x = allocation->x + GTK_CONTAINER (widget)->border_width; child_allocation.y = allocation->y + GTK_CONTAINER (widget)->border_width; } else { child_allocation.x = 0; child_allocation.y = 0; } child_allocation.width = MAX (allocation->width - GTK_CONTAINER (widget)->border_width * 2, 0); child_allocation.height = MAX (allocation->height - GTK_CONTAINER (widget)->border_width * 2, 0); if (GTK_WIDGET_REALIZED (widget)) { priv = GTK_NOTEBOOK_BOX_GET_PRIVATE (widget); if (priv->event_window != NULL) gdk_window_move_resize (priv->event_window, child_allocation.x, child_allocation.y, child_allocation.width, child_allocation.height); if (!GTK_WIDGET_NO_WINDOW (widget)) gdk_window_move_resize (widget->window, allocation->x + GTK_CONTAINER (widget)->border_width, allocation->y + GTK_CONTAINER (widget)->border_width, child_allocation.width, child_allocation.height); } if (bin->child) gtk_widget_size_allocate (bin->child, &child_allocation); } static void gtk_notebook_box_paint (GtkWidget *widget, GdkRectangle *area) { gint width, height; gint x, y; gint border_width = GTK_CONTAINER (widget)->border_width; if (!GTK_WIDGET_APP_PAINTABLE (widget)) { x = widget->allocation.x; y = widget->allocation.y; width = widget->allocation.width /2; height = widget->allocation.height /2; printf("X: %d, Y: %d, W: %d, H: %d\n", x, y, width, height); gtk_paint_box(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, area, widget, "notebook", x, y, width, height); /* gtk_paint_flat_box (widget->style, widget->window, widget->state, GTK_SHADOW_NONE, area, widget, "eventbox", 0, 0, -1, -1);*/ } } static gint gtk_notebook_box_expose (GtkWidget *widget, GdkEventExpose *event) { if (GTK_WIDGET_DRAWABLE (widget)) { if (!GTK_WIDGET_NO_WINDOW (widget)) gtk_notebook_box_paint (widget, &event->area); (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); } return FALSE; }