diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 12 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 12 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 12 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 12 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 12 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 12 | ||||
-rw-r--r-- | gtk/gtkcheckmenuitem.c | 6 | ||||
-rw-r--r-- | gtk/gtkhpaned.c | 83 | ||||
-rw-r--r-- | gtk/gtkimagemenuitem.c | 4 | ||||
-rw-r--r-- | gtk/gtkmenuitem.c | 125 | ||||
-rw-r--r-- | gtk/gtkmenuitem.h | 1 | ||||
-rw-r--r-- | gtk/gtkpaned.c | 97 | ||||
-rw-r--r-- | gtk/gtkpaned.h | 7 | ||||
-rw-r--r-- | gtk/gtkradiomenuitem.c | 6 | ||||
-rw-r--r-- | gtk/gtkstyle.c | 13 | ||||
-rw-r--r-- | gtk/gtktearoffmenuitem.c | 4 | ||||
-rw-r--r-- | gtk/gtkvpaned.c | 87 |
18 files changed, 298 insertions, 219 deletions
@@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 2bbf9499c2..8f791a2d95 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 2bbf9499c2..8f791a2d95 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 2bbf9499c2..8f791a2d95 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 2bbf9499c2..8f791a2d95 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 2bbf9499c2..8f791a2d95 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 2bbf9499c2..8f791a2d95 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +Fri Nov 16 00:16:40 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/{gtkmenuitem.[ch],gtkcheckmenuitem.c,gtkimagemenuitem.c, + gtkradiomenuitem.c,gtktearoffmenuitem.c}: Make Menu items + NO_WINDOW widgets. + + * gtk/gtk{h,v,}paned.[ch]: Make NO_WINDOW widgets, some + cleanup. + + * gtk/gtkstyle.c (gtk_default_draw_handle): Don't assume + we are drawing in a window when drawing the paned handle. + 2001-11-16 Sven Neumann <sven@gimp.org> * demos/gtk-demo/appwindow.c diff --git a/gtk/gtkcheckmenuitem.c b/gtk/gtkcheckmenuitem.c index dab287600f..59bc0cd1d3 100644 --- a/gtk/gtkcheckmenuitem.c +++ b/gtk/gtkcheckmenuitem.c @@ -365,9 +365,9 @@ gtk_real_check_menu_item_draw_indicator (GtkCheckMenuItem *check_menu_item, width = 8; height = 8; - x = (GTK_CONTAINER (check_menu_item)->border_width + - widget->style->xthickness + 2); - y = (widget->allocation.height - height) / 2; + x = widget->allocation.x + (GTK_CONTAINER (check_menu_item)->border_width + + widget->style->xthickness + 2); + y = widget->allocation.y + (widget->allocation.height - height) / 2; if (check_menu_item->active || check_menu_item->always_show_toggle || diff --git a/gtk/gtkhpaned.c b/gtk/gtkhpaned.c index d59255ea2c..ba2c5b449f 100644 --- a/gtk/gtkhpaned.c +++ b/gtk/gtkhpaned.c @@ -32,8 +32,6 @@ static void gtk_hpaned_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_hpaned_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static gint gtk_hpaned_expose (GtkWidget *widget, - GdkEventExpose *event); static void gtk_hpaned_xor_line (GtkPaned *paned); static gboolean gtk_hpaned_button_press (GtkWidget *widget, GdkEventButton *event); @@ -80,7 +78,6 @@ gtk_hpaned_class_init (GtkHPanedClass *class) widget_class->size_request = gtk_hpaned_size_request; widget_class->size_allocate = gtk_hpaned_size_allocate; - widget_class->expose_event = gtk_hpaned_expose; widget_class->button_press_event = gtk_hpaned_button_press; widget_class->button_release_event = gtk_hpaned_button_release; widget_class->motion_notify_event = gtk_hpaned_motion; @@ -96,6 +93,7 @@ gtk_hpaned_init (GtkHPaned *hpaned) paned = GTK_PANED (hpaned); paned->cursor_type = GDK_SB_H_DOUBLE_ARROW; + paned->orientation = GTK_ORIENTATION_VERTICAL; } GtkWidget * @@ -155,11 +153,6 @@ gtk_hpaned_size_allocate (GtkWidget *widget, gint border_width = GTK_CONTAINER (paned)->border_width; widget->allocation = *allocation; - if (GTK_WIDGET_REALIZED (widget)) - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, - allocation->height); if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) && paned->child2 && GTK_WIDGET_VISIBLE (paned->child2)) @@ -182,29 +175,27 @@ gtk_hpaned_size_allocate (GtkWidget *widget, child1_requisition.width, child2_requisition.width); - /* Move the handle before the children so we don't get extra expose events */ - - paned->handle_xpos = paned->child1_size + border_width; - paned->handle_ypos = border_width; - paned->handle_width = handle_size; - paned->handle_height = MAX (1, widget->allocation.height - 2 * border_width); + paned->handle_pos.x = widget->allocation.x + paned->child1_size + border_width; + paned->handle_pos.y = widget->allocation.y + border_width; + paned->handle_pos.width = handle_size; + paned->handle_pos.height = MAX (1, widget->allocation.height - 2 * border_width); if (GTK_WIDGET_REALIZED (widget)) { gdk_window_show (paned->handle); gdk_window_move_resize (paned->handle, - paned->handle_xpos, - paned->handle_ypos, + paned->handle_pos.x, + paned->handle_pos.y, handle_size, - paned->handle_height); + paned->handle_pos.height); } child1_allocation.height = child2_allocation.height = MAX (1, (gint) allocation->height - border_width * 2); child1_allocation.width = paned->child1_size; - child1_allocation.x = border_width; - child1_allocation.y = child2_allocation.y = border_width; + child1_allocation.x = widget->allocation.x + border_width; + child1_allocation.y = child2_allocation.y = widget->allocation.y + border_width; - child2_allocation.x = child1_allocation.x + child1_allocation.width + paned->handle_width; + child2_allocation.x = child1_allocation.x + child1_allocation.width + paned->handle_pos.width; child2_allocation.width = MAX (1, (gint) allocation->width - child2_allocation.x - border_width); /* Now allocate the childen, making sure, when resizing not to @@ -240,47 +231,6 @@ gtk_hpaned_size_allocate (GtkWidget *widget, } } -static gint -gtk_hpaned_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkPaned *paned; - guint16 border_width; - - g_return_val_if_fail (GTK_IS_PANED (widget), FALSE); - - if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) - { - paned = GTK_PANED (widget); - border_width = GTK_CONTAINER (paned)->border_width; - - if (event->window == widget->window) - { - gdk_window_clear_area (widget->window, - event->area.x, event->area.y, - event->area.width, - event->area.height); - - /* Chain up to draw children */ - GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); - } - else if (event->window == paned->handle) - { - gtk_paint_handle (widget->style, - paned->handle, - GTK_STATE_NORMAL, - GTK_SHADOW_NONE, - &event->area, - widget, - "paned", - 0, 0, -1, -1, - GTK_ORIENTATION_VERTICAL); - } - } - - return FALSE; -} - static void gtk_hpaned_xor_line (GtkPaned *paned) { @@ -305,14 +255,14 @@ gtk_hpaned_xor_line (GtkPaned *paned) gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL); - xpos = paned->child1_size + xpos = widget->allocation.x + paned->child1_size + GTK_CONTAINER (paned)->border_width + handle_size / 2; gdk_draw_line (widget->window, paned->xor_gc, xpos, - 0, + widget->allocation.y, xpos, - widget->allocation.height - 1); + widget->allocation.y + widget->allocation.height - 1); } static gboolean @@ -383,10 +333,7 @@ gtk_hpaned_motion (GtkWidget *widget, gtk_widget_style_get (widget, "handle_size", &handle_size, NULL); - if (event->is_hint || event->window != widget->window) - gtk_widget_get_pointer(widget, &x, NULL); - else - x = event->x; + gtk_widget_get_pointer (widget, &x, NULL); if (paned->in_drag) { diff --git a/gtk/gtkimagemenuitem.c b/gtk/gtkimagemenuitem.c index 57ededa8ad..0c7476dec5 100644 --- a/gtk/gtkimagemenuitem.c +++ b/gtk/gtkimagemenuitem.c @@ -256,8 +256,8 @@ gtk_image_menu_item_size_allocate (GtkWidget *widget, child_allocation.width = width; child_allocation.height = height; - child_allocation.x = MAX (x, 0); - child_allocation.y = MAX (y, 0); + child_allocation.x = widget->allocation.x + MAX (x, 0); + child_allocation.y = widget->allocation.y + MAX (y, 0); gtk_widget_size_allocate (image_menu_item->image, &child_allocation); } diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index e269a790f0..13c21bb66f 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -56,6 +56,10 @@ static void gtk_menu_item_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_menu_item_size_allocate (GtkWidget *widget, GtkAllocation *allocation); +static void gtk_menu_item_realize (GtkWidget *widget); +static void gtk_menu_item_unrealize (GtkWidget *widget); +static void gtk_menu_item_map (GtkWidget *widget); +static void gtk_menu_item_unmap (GtkWidget *widget); static void gtk_menu_item_paint (GtkWidget *widget, GdkRectangle *area); static gint gtk_menu_item_expose (GtkWidget *widget, @@ -137,6 +141,10 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass) widget_class->size_request = gtk_menu_item_size_request; widget_class->size_allocate = gtk_menu_item_size_allocate; widget_class->expose_event = gtk_menu_item_expose; + widget_class->realize = gtk_menu_item_realize; + widget_class->unrealize = gtk_menu_item_unrealize; + widget_class->map = gtk_menu_item_map; + widget_class->unmap = gtk_menu_item_unmap; widget_class->show_all = gtk_menu_item_show_all; widget_class->hide_all = gtk_menu_item_hide_all; widget_class->mnemonic_activate = gtk_menu_item_mnemonic_activate; @@ -192,6 +200,8 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass) static void gtk_menu_item_init (GtkMenuItem *menu_item) { + GTK_WIDGET_SET_FLAGS (menu_item, GTK_NO_WINDOW); + menu_item->submenu = NULL; menu_item->toggle_size = 0; menu_item->accelerator_width = 0; @@ -477,6 +487,9 @@ gtk_menu_item_size_allocate (GtkWidget *widget, child_allocation.height = MAX (1, (gint)allocation->height - child_allocation.y * 2); child_allocation.x += GTK_MENU_ITEM (widget)->toggle_size; child_allocation.width -= GTK_MENU_ITEM (widget)->toggle_size; + child_allocation.x += widget->allocation.x; + child_allocation.y += widget->allocation.y; + if (menu_item->submenu && menu_item->show_submenu_indicator) child_allocation.width -= 21; @@ -484,7 +497,7 @@ gtk_menu_item_size_allocate (GtkWidget *widget, } if (GTK_WIDGET_REALIZED (widget)) - gdk_window_move_resize (widget->window, + gdk_window_move_resize (menu_item->event_window, allocation->x, allocation->y, allocation->width, allocation->height); @@ -493,6 +506,72 @@ gtk_menu_item_size_allocate (GtkWidget *widget, } static void +gtk_menu_item_realize (GtkWidget *widget) +{ + GtkMenuItem *menu_item = GTK_MENU_ITEM (widget); + GdkWindowAttr attributes; + gint attributes_mask; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + widget->window = gtk_widget_get_parent_window (widget); + gdk_window_ref (widget->window); + + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.window_type = GDK_WINDOW_CHILD; + attributes.wclass = GDK_INPUT_ONLY; + attributes.event_mask = (gtk_widget_get_events (widget) | + GDK_EXPOSURE_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | + GDK_LEAVE_NOTIFY_MASK | + GDK_POINTER_MOTION_MASK); + + attributes_mask = GDK_WA_X | GDK_WA_Y; + menu_item->event_window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); + gdk_window_set_user_data (menu_item->event_window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); +} + +static void +gtk_menu_item_unrealize (GtkWidget *widget) +{ + GtkMenuItem *menu_item = GTK_MENU_ITEM (widget); + + gdk_window_set_user_data (menu_item->event_window, NULL); + gdk_window_destroy (menu_item->event_window); + menu_item->event_window = NULL; + + if (GTK_WIDGET_CLASS (parent_class)->unrealize) + (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); +} + +static void +gtk_menu_item_map (GtkWidget *widget) +{ + GtkMenuItem *menu_item = GTK_MENU_ITEM (widget); + + gdk_window_show (menu_item->event_window); + + GTK_WIDGET_CLASS (parent_class)->map (widget); +} + +static void +gtk_menu_item_unmap (GtkWidget *widget) +{ + GtkMenuItem *menu_item = GTK_MENU_ITEM (widget); + + gdk_window_hide (menu_item->event_window); + + GTK_WIDGET_CLASS (parent_class)->unmap (widget); +} + +static void gtk_menu_item_paint (GtkWidget *widget, GdkRectangle *area) { @@ -501,8 +580,7 @@ gtk_menu_item_paint (GtkWidget *widget, GtkShadowType shadow_type; gint width, height; gint x, y; - - g_return_if_fail (GTK_IS_MENU_ITEM (widget)); + gint border_width = GTK_CONTAINER (menu_item)->border_width; if (GTK_WIDGET_DRAWABLE (widget)) { @@ -510,10 +588,10 @@ gtk_menu_item_paint (GtkWidget *widget, state_type = widget->state; - x = GTK_CONTAINER (menu_item)->border_width; - y = GTK_CONTAINER (menu_item)->border_width; - width = widget->allocation.width - x * 2; - height = widget->allocation.height - y * 2; + x = widget->allocation.x + border_width; + y = widget->allocation.y + border_width; + width = widget->allocation.width - border_width * 2; + height = widget->allocation.height - border_width * 2; if ((state_type == GTK_STATE_PRELIGHT) && (GTK_BIN (menu_item)->child)) @@ -523,11 +601,6 @@ gtk_menu_item_paint (GtkWidget *widget, GTK_SHADOW_OUT, area, widget, "menuitem", x, y, width, height); - else - { - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height); - } if (menu_item->submenu && menu_item->show_submenu_indicator) { @@ -545,7 +618,8 @@ gtk_menu_item_paint (GtkWidget *widget, { gtk_paint_hline (widget->style, widget->window, GTK_STATE_NORMAL, area, widget, "menuitem", - 0, widget->allocation.width, 0); + widget->allocation.x, widget->allocation.width, + widget->allocation.y); } } } @@ -744,6 +818,7 @@ gtk_menu_item_position_menu (GtkMenu *menu, gpointer user_data) { GtkMenuItem *menu_item; + GtkWidget *widget; GtkWidget *parent_menu_item; gint screen_width; gint screen_height; @@ -755,6 +830,7 @@ gtk_menu_item_position_menu (GtkMenu *menu, g_return_if_fail (y != NULL); menu_item = GTK_MENU_ITEM (user_data); + widget = GTK_WIDGET (user_data); twidth = GTK_WIDGET (menu)->requisition.width; theight = GTK_WIDGET (menu)->requisition.height; @@ -762,28 +838,31 @@ gtk_menu_item_position_menu (GtkMenu *menu, screen_width = gdk_screen_width (); screen_height = gdk_screen_height (); - if (!gdk_window_get_origin (GTK_WIDGET (menu_item)->window, &tx, &ty)) + if (!gdk_window_get_origin (widget->window, &tx, &ty)) { g_warning ("Menu not on screen"); return; } + tx += widget->allocation.x; + ty += widget->allocation.y; + switch (menu_item->submenu_placement) { case GTK_TOP_BOTTOM: - if ((ty + GTK_WIDGET (menu_item)->allocation.height + theight) <= screen_height) - ty += GTK_WIDGET (menu_item)->allocation.height; + if ((ty + widget->allocation.height + theight) <= screen_height) + ty += widget->allocation.height; else if ((ty - theight) >= 0) ty -= theight; - else if (screen_height - (ty + GTK_WIDGET (menu_item)->allocation.height) > ty) - ty += GTK_WIDGET (menu_item)->allocation.height; + else if (screen_height - (ty + widget->allocation.height) > ty) + ty += widget->allocation.height; else ty -= theight; break; case GTK_LEFT_RIGHT: menu_item->submenu_direction = GTK_DIRECTION_RIGHT; - parent_menu_item = GTK_MENU (GTK_WIDGET (menu_item)->parent)->parent_menu_item; + parent_menu_item = GTK_MENU (widget->parent)->parent_menu_item; if (parent_menu_item) menu_item->submenu_direction = GTK_MENU_ITEM (parent_menu_item)->submenu_direction; @@ -795,13 +874,13 @@ gtk_menu_item_position_menu (GtkMenu *menu, else { menu_item->submenu_direction = GTK_DIRECTION_RIGHT; - tx += GTK_WIDGET (menu_item)->allocation.width - 5; + tx += widget->allocation.width - 5; } break; case GTK_DIRECTION_RIGHT: - if ((tx + GTK_WIDGET (menu_item)->allocation.width + twidth - 5) <= screen_width) - tx += GTK_WIDGET (menu_item)->allocation.width - 5; + if ((tx + widget->allocation.width + twidth - 5) <= screen_width) + tx += widget->allocation.width - 5; else { menu_item->submenu_direction = GTK_DIRECTION_LEFT; @@ -810,7 +889,7 @@ gtk_menu_item_position_menu (GtkMenu *menu, break; } - ty += GTK_WIDGET (menu_item)->allocation.height / 4; + ty += widget->allocation.height / 4; /* If the height of the menu doesn't fit we move it upward. */ ty = CLAMP (ty, 0, MAX (0, screen_height - theight)); diff --git a/gtk/gtkmenuitem.h b/gtk/gtkmenuitem.h index 2b53d95e0f..c29d2bf8d9 100644 --- a/gtk/gtkmenuitem.h +++ b/gtk/gtkmenuitem.h @@ -53,6 +53,7 @@ struct _GtkMenuItem GtkItem item; GtkWidget *submenu; + GdkWindow *event_window; guint16 toggle_size; guint16 accelerator_width; diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index 9c46b33f0f..85cb4cfb6a 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -45,6 +45,8 @@ static void gtk_paned_get_property (GObject *object, GParamSpec *pspec); static void gtk_paned_realize (GtkWidget *widget); static void gtk_paned_unrealize (GtkWidget *widget); +static void gtk_paned_map (GtkWidget *widget); +static void gtk_paned_unmap (GtkWidget *widget); static gint gtk_paned_expose (GtkWidget *widget, GdkEventExpose *event); static void gtk_paned_add (GtkContainer *container, @@ -103,6 +105,8 @@ gtk_paned_class_init (GtkPanedClass *class) widget_class->realize = gtk_paned_realize; widget_class->unrealize = gtk_paned_unrealize; + widget_class->map = gtk_paned_map; + widget_class->unmap = gtk_paned_unmap; widget_class->expose_event = gtk_paned_expose; container_class->add = gtk_paned_add; @@ -149,7 +153,7 @@ gtk_paned_child_type (GtkContainer *container) static void gtk_paned_init (GtkPaned *paned) { - GTK_WIDGET_UNSET_FLAGS (paned, GTK_NO_WINDOW); + GTK_WIDGET_SET_FLAGS (paned, GTK_NO_WINDOW); paned->child1 = NULL; paned->child2 = NULL; @@ -157,14 +161,14 @@ gtk_paned_init (GtkPaned *paned) paned->xor_gc = NULL; paned->cursor_type = GDK_CROSS; - paned->handle_width = 5; - paned->handle_height = 5; + paned->handle_pos.width = 5; + paned->handle_pos.height = 5; paned->position_set = FALSE; paned->last_allocation = -1; paned->in_drag = FALSE; - paned->handle_xpos = -1; - paned->handle_ypos = -1; + paned->handle_pos.x = -1; + paned->handle_pos.y = -1; } static void @@ -224,31 +228,21 @@ gtk_paned_realize (GtkWidget *widget) GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); paned = GTK_PANED (widget); - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; + widget->window = gtk_widget_get_parent_window (widget); + gdk_window_ref (widget->window); + attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; - 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, paned); - - attributes.x = paned->handle_xpos; - attributes.y = paned->handle_ypos; - attributes.width = paned->handle_width; - attributes.height = paned->handle_height; + attributes.wclass = GDK_INPUT_ONLY; + attributes.x = paned->handle_pos.x; + attributes.y = paned->handle_pos.y; + attributes.width = paned->handle_pos.width; + attributes.height = paned->handle_pos.height; attributes.cursor = gdk_cursor_new (paned->cursor_type); attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); - attributes_mask |= GDK_WA_CURSOR; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_CURSOR; paned->handle = gdk_window_new (widget->window, &attributes, attributes_mask); @@ -257,11 +251,6 @@ gtk_paned_realize (GtkWidget *widget) widget->style = gtk_style_attach (widget->style, widget->window); - gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); - gtk_style_set_background (widget->style, paned->handle, GTK_STATE_NORMAL); - - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) && paned->child2 && GTK_WIDGET_VISIBLE (paned->child2)) gdk_window_show (paned->handle); @@ -293,7 +282,29 @@ gtk_paned_unrealize (GtkWidget *widget) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } +static void +gtk_paned_map (GtkWidget *widget) +{ + GtkPaned *paned = GTK_PANED (widget); + + g_return_if_fail (GTK_IS_PANED (widget)); + + gdk_window_show (paned->handle); + + GTK_WIDGET_CLASS (parent_class)->map (widget); +} + +static void +gtk_paned_unmap (GtkWidget *widget) +{ + GtkPaned *paned = GTK_PANED (widget); + + g_return_if_fail (GTK_IS_PANED (widget)); + + gdk_window_hide (paned->handle); + GTK_WIDGET_CLASS (parent_class)->unmap (widget); +} static gint gtk_paned_expose (GtkWidget *widget, @@ -302,14 +313,34 @@ gtk_paned_expose (GtkWidget *widget, GtkPaned *paned; g_return_val_if_fail (GTK_IS_PANED (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - if (GTK_WIDGET_DRAWABLE (widget)) + if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) { + GdkRegion *region; + paned = GTK_PANED (widget); + + region = gdk_region_rectangle (&paned->handle_pos); + gdk_region_intersect (region, event->region); + + if (!gdk_region_empty (region)) + { + GdkRectangle clip; + + gdk_region_get_clipbox (region, &clip); + + gtk_paint_handle (widget->style, widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_NONE, + &clip, widget, "paned", + paned->handle_pos.x, paned->handle_pos.y, + paned->handle_pos.width, paned->handle_pos.height, + paned->orientation); + } - if (event->window != paned->handle) - (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); + gdk_region_destroy (region); + + /* Chain up to draw children */ + GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); } return FALSE; diff --git a/gtk/gtkpaned.h b/gtk/gtkpaned.h index 673c5b69d6..bc65c72143 100644 --- a/gtk/gtkpaned.h +++ b/gtk/gtkpaned.h @@ -58,8 +58,7 @@ struct _GtkPaned GdkCursorType cursor_type; /*< private >*/ - guint16 handle_width; - guint16 handle_height; + GdkRectangle handle_pos; gint child1_size; gint last_allocation; @@ -72,9 +71,7 @@ struct _GtkPaned guint child1_resize : 1; guint child2_shrink : 1; guint child2_resize : 1; - - gint16 handle_xpos; - gint16 handle_ypos; + guint orientation : 1; }; struct _GtkPanedClass diff --git a/gtk/gtkradiomenuitem.c b/gtk/gtkradiomenuitem.c index 48148fe57f..0debaffb11 100644 --- a/gtk/gtkradiomenuitem.c +++ b/gtk/gtkradiomenuitem.c @@ -312,9 +312,9 @@ gtk_radio_menu_item_draw_indicator (GtkCheckMenuItem *check_menu_item, width = 8; height = 8; - x = (GTK_CONTAINER (check_menu_item)->border_width + - widget->style->xthickness + 2); - y = (widget->allocation.height - height) / 2; + x = widget->allocation.x + (GTK_CONTAINER (check_menu_item)->border_width + + widget->style->xthickness + 2); + y = widget->allocation.y + (widget->allocation.height - height) / 2; if (check_menu_item->active || check_menu_item->always_show_toggle || diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c index f5beb0e2e3..b9cb750952 100644 --- a/gtk/gtkstyle.c +++ b/gtk/gtkstyle.c @@ -3950,17 +3950,12 @@ gtk_default_draw_handle (GtkStyle *style, if (!strcmp (detail, "paned")) { - gint window_width; - gint window_height; - - gdk_window_get_size (window, &window_width, &window_height); - if (orientation == GTK_ORIENTATION_HORIZONTAL) - for (xx = window_width/2 - 15; xx <= window_width/2 + 15; xx += 5) - draw_dot (window, light_gc, dark_gc, xx, window_height/2 - 1, 3); + for (xx = x + width/2 - 15; xx <= x + width/2 + 15; xx += 5) + draw_dot (window, light_gc, dark_gc, xx, y + height/2 - 1, 3); else - for (yy = window_height/2 - 15; yy <= window_height/2 + 15; yy += 5) - draw_dot (window, light_gc, dark_gc, window_width/2 - 1, yy, 3); + for (yy = y + height/2 - 15; yy <= y + height/2 + 15; yy += 5) + draw_dot (window, light_gc, dark_gc, x + width/2 - 1, yy, 3); } else { diff --git a/gtk/gtktearoffmenuitem.c b/gtk/gtktearoffmenuitem.c index d4f9d56c76..1c027b1d0b 100644 --- a/gtk/gtktearoffmenuitem.c +++ b/gtk/gtktearoffmenuitem.c @@ -138,8 +138,8 @@ gtk_tearoff_menu_item_paint (GtkWidget *widget, menu_item = GTK_MENU_ITEM (widget); tearoff_item = GTK_TEAROFF_MENU_ITEM (widget); - x = GTK_CONTAINER (menu_item)->border_width; - y = GTK_CONTAINER (menu_item)->border_width; + x = widget->allocation.x + GTK_CONTAINER (menu_item)->border_width; + y = widget->allocation.y + GTK_CONTAINER (menu_item)->border_width; width = widget->allocation.width - x * 2; height = widget->allocation.height - y * 2; right_max = x + width; diff --git a/gtk/gtkvpaned.c b/gtk/gtkvpaned.c index 7c2a44b219..ffbf88317f 100644 --- a/gtk/gtkvpaned.c +++ b/gtk/gtkvpaned.c @@ -32,8 +32,6 @@ static void gtk_vpaned_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_vpaned_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static gint gtk_vpaned_expose (GtkWidget *widget, - GdkEventExpose *expose); static void gtk_vpaned_xor_line (GtkPaned *paned); static gboolean gtk_vpaned_button_press (GtkWidget *widget, GdkEventButton *event); @@ -80,7 +78,6 @@ gtk_vpaned_class_init (GtkVPanedClass *class) widget_class->size_request = gtk_vpaned_size_request; widget_class->size_allocate = gtk_vpaned_size_allocate; - widget_class->expose_event = gtk_vpaned_expose; widget_class->button_press_event = gtk_vpaned_button_press; widget_class->button_release_event = gtk_vpaned_button_release; widget_class->motion_notify_event = gtk_vpaned_motion; @@ -96,6 +93,7 @@ gtk_vpaned_init (GtkVPaned *vpaned) paned = GTK_PANED (vpaned); paned->cursor_type = GDK_SB_V_DOUBLE_ARROW; + paned->orientation = GTK_ORIENTATION_HORIZONTAL; } GtkWidget * @@ -155,11 +153,6 @@ gtk_vpaned_size_allocate (GtkWidget *widget, gint border_width = GTK_CONTAINER (paned)->border_width; widget->allocation = *allocation; - if (GTK_WIDGET_REALIZED (widget)) - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, - allocation->height); if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) && paned->child2 && GTK_WIDGET_VISIBLE (paned->child2)) @@ -182,29 +175,27 @@ gtk_vpaned_size_allocate (GtkWidget *widget, child1_requisition.height, child2_requisition.height); - /* Move the handle before the children so we don't get extra expose events */ - - paned->handle_xpos = border_width; - paned->handle_ypos = paned->child1_size + border_width; - paned->handle_width = MAX (1, (gint) widget->allocation.width - 2 * border_width); - paned->handle_height = handle_size; + paned->handle_pos.x = widget->allocation.x + border_width; + paned->handle_pos.y = widget->allocation.y + paned->child1_size + border_width; + paned->handle_pos.width = MAX (1, (gint) widget->allocation.width - 2 * border_width); + paned->handle_pos.height = handle_size; if (GTK_WIDGET_REALIZED(widget)) { gdk_window_show (paned->handle); gdk_window_move_resize (paned->handle, - paned->handle_xpos, - paned->handle_ypos, - paned->handle_width, + paned->handle_pos.x, + paned->handle_pos.y, + paned->handle_pos.width, handle_size); } child1_allocation.width = child2_allocation.width = MAX (1, (gint) allocation->width - border_width * 2); child1_allocation.height = paned->child1_size; - child1_allocation.x = child2_allocation.x = border_width; + child1_allocation.x = child2_allocation.x = widget->allocation.x + border_width; child1_allocation.y = border_width; - child2_allocation.y = child1_allocation.y + child1_allocation.height + paned->handle_height; + child2_allocation.y = child1_allocation.y + child1_allocation.height + paned->handle_pos.height; child2_allocation.height = MAX(1, (gint) allocation->height - child2_allocation.y - border_width); /* Now allocate the childen, making sure, when resizing not to @@ -240,49 +231,6 @@ gtk_vpaned_size_allocate (GtkWidget *widget, } } -static gint -gtk_vpaned_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkPaned *paned; - guint16 border_width; - - g_return_val_if_fail (GTK_IS_PANED (widget), FALSE); - - if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) - { - paned = GTK_PANED (widget); - border_width = GTK_CONTAINER (paned)->border_width; - - if (event->window == widget->window) - { - gdk_window_clear_area (widget->window, - event->area.x, event->area.y, - event->area.width, - event->area.height); - - - /* Chain up to draw children */ - GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); - } - else if (event->window == paned->handle) - { - gtk_paint_handle (widget->style, - paned->handle, - GTK_STATE_NORMAL, - GTK_SHADOW_NONE, - &event->area, - widget, - "paned", - 0, 0, -1, -1, - GTK_ORIENTATION_HORIZONTAL); - - } - } - - return FALSE; -} - static void gtk_vpaned_xor_line (GtkPaned *paned) { @@ -307,13 +255,13 @@ gtk_vpaned_xor_line (GtkPaned *paned) gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL); - ypos = paned->child1_size + ypos = widget->allocation.y + paned->child1_size + GTK_CONTAINER (paned)->border_width + handle_size / 2; gdk_draw_line (widget->window, paned->xor_gc, - 0, + widget->allocation.x, ypos, - widget->allocation.width - 1, + widget->allocation.x + widget->allocation.width - 1, ypos); } @@ -385,18 +333,15 @@ gtk_vpaned_motion (GtkWidget *widget, gtk_widget_style_get (widget, "handle_size", &handle_size, NULL); - if (event->is_hint || event->window != widget->window) - gtk_widget_get_pointer (widget, NULL, &y); - else - y = event->y; + gtk_widget_get_pointer (widget, NULL, &y); if (paned->in_drag) { - gint size = y - GTK_CONTAINER(paned)->border_width - handle_size / 2; + gint size = y - GTK_CONTAINER (paned)->border_width - handle_size / 2; gtk_vpaned_xor_line (paned); paned->child1_size = CLAMP (size, paned->min_position, paned->max_position); - gtk_vpaned_xor_line(paned); + gtk_vpaned_xor_line (paned); } return TRUE; |