From dc4e9e2fe18e612c12c45961238799286693c6ac Mon Sep 17 00:00:00 2001 From: Shawn Amundson Date: Fri, 2 Jan 1998 20:22:38 +0000 Subject: [PATCH] corrects a small resize bug in the viewport widget. The viewport widget * gtk/gtkviewport.c: corrects a small resize bug in the viewport widget. The viewport widget provides a _set_shadow function to draw its shadows. But if GTK_SHADOW_NONE is sent to this function, the viewport isn't resized correctly (it's still considered as a shadowed widget). (gtk-fortier-971213-0) * gtk/gtknotebook.c: this patch fixes the redraw problems of notebook tabs, without using gdk_gc_set_clip_rectangle. (gtk-hamann_jeske-971218-0) * add gtk_widget_(show/hide)_all (Stefan Wille) (gtk-wille-301297-0) Patch for testgtk not included because it did not patch clean. -Shawn --- ChangeLog | 17 +++ ChangeLog.pre-2-0 | 17 +++ ChangeLog.pre-2-10 | 17 +++ ChangeLog.pre-2-2 | 17 +++ ChangeLog.pre-2-4 | 17 +++ ChangeLog.pre-2-6 | 17 +++ ChangeLog.pre-2-8 | 17 +++ gtk/gtkcontainer.c | 46 ++++++++ gtk/gtkmenu.c | 35 +++++- gtk/gtkmenuitem.c | 41 ++++++++ gtk/gtknotebook.c | 251 +++++++++++++++++++++++++++++--------------- gtk/gtkoptionmenu.c | 39 +++++++ gtk/gtkviewport.c | 12 ++- gtk/gtkwidget.c | 54 ++++++++++ gtk/gtkwidget.h | 4 + 15 files changed, 513 insertions(+), 88 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 7406c9631a..6c6060eb24 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,19 @@ +Fri Jan 2 12:07:33 CST 1998 Shawn T. Amundson + + * gtk/gtkviewport.c: corrects a small resize bug in the + viewport widget. The viewport widget provides a _set_shadow + function to draw its shadows. But if GTK_SHADOW_NONE is sent + to this function, the viewport isn't resized correctly (it's + still considered as a shadowed widget). (gtk-fortier-971213-0) + + * gtk/gtknotebook.c: this patch fixes the redraw problems of + notebook tabs, without using gdk_gc_set_clip_rectangle. + (gtk-hamann_jeske-971218-0) + + * add gtk_widget_(show/hide)_all (Stefan Wille) + (gtk-wille-301297-0) Patch for testgtk not included + because it did not patch clean. + Thu Jan 1 21:21:56 PST 1998 Manish Singh * configure.in: fixed up the xinput test @@ -11,6 +27,7 @@ Mon Dec 29 22:05:45 1997 Miguel de Icaza Sat Dec 27 20:39:99 1997 Elliot Lee * gtk/gtkhandlebox.c: It mostly works now, please test it and make fixes as needed. + Fri Dec 26 11:20:03 1997 Scott Goehring * gtk/Makefile.am (gtkinclude_HEADERS): added gtkhandlebox.c diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index 977fabc29e..0e6672289c 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -83,6 +83,9 @@ static gint gtk_container_focus_move (GtkContainer *container, GtkDirectionType direction); static void gtk_container_children_callback (GtkWidget *widget, gpointer client_data); +static void gtk_container_show_all (GtkWidget *widget); +static void gtk_container_hide_all (GtkWidget *widget); + static gint container_signals[LAST_SIGNAL] = { 0 }; @@ -168,6 +171,13 @@ gtk_container_class_init (GtkContainerClass *class) gtk_object_class_add_signals (object_class, container_signals, LAST_SIGNAL); + /* Other container classes should overwrite show_all and hide_all, + unless they make all their children accessable + through gtk_container_foreach. + */ + widget_class->show_all = gtk_container_show_all; + widget_class->hide_all = gtk_container_hide_all; + class->need_resize = gtk_real_container_need_resize; class->focus = gtk_real_container_focus; } @@ -842,3 +852,39 @@ gtk_container_children_callback (GtkWidget *widget, children = (GList**) client_data; *children = g_list_prepend (*children, widget); } + +static void +gtk_container_show_all (GtkWidget *widget) +{ + GtkContainer *container; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_CONTAINER (widget)); + container = GTK_CONTAINER (widget); + + /* First show children, then self. + This makes sure that toplevel windows get shown as last widget. + Otherwise the user would see the widgets get + visible one after another. + */ + gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL); + gtk_widget_show (widget); +} + + +static void +gtk_container_hide_all (GtkWidget *widget) +{ + GtkContainer *container; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_CONTAINER (widget)); + container = GTK_CONTAINER (widget); + + /* First hide self, then children. + This is the reverse order of gtk_container_show_all. + */ + gtk_widget_hide (widget); + gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL); +} + diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index caab1a0a0d..decf1e7842 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -47,6 +47,8 @@ static gint gtk_menu_key_press (GtkWidget *widget, GdkEventKey *event); static gint gtk_menu_need_resize (GtkContainer *container); static void gtk_menu_deactivate (GtkMenuShell *menu_shell); +static void gtk_menu_show_all (GtkWidget *widget); +static void gtk_menu_hide_all (GtkWidget *widget); guint @@ -93,7 +95,9 @@ gtk_menu_class_init (GtkMenuClass *class) widget_class->expose_event = gtk_menu_expose; widget_class->configure_event = gtk_menu_configure; widget_class->key_press_event = gtk_menu_key_press; - + widget_class->show_all = gtk_menu_show_all; + widget_class->hide_all = gtk_menu_hide_all; + container_class->need_resize = gtk_menu_need_resize; menu_shell_class->submenu_placement = GTK_LEFT_RIGHT; @@ -732,3 +736,32 @@ gtk_menu_deactivate (GtkMenuShell *menu_shell) if (parent) gtk_menu_shell_deactivate (parent); } + + +static void +gtk_menu_show_all (GtkWidget *widget) +{ + GtkContainer *container; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_MENU (widget)); + container = GTK_CONTAINER (widget); + + /* Show children, but not self. */ + gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL); +} + + +static void +gtk_menu_hide_all (GtkWidget *widget) +{ + GtkContainer *container; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_MENU (widget)); + container = GTK_CONTAINER (widget); + + /* Hide children, but not self. */ + gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL); +} + diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index b023a85e5b..9c0993fdbe 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -65,6 +65,8 @@ static void gtk_menu_item_position_menu (GtkMenu *menu, gint *x, gint *y, gpointer user_data); +static void gtk_menu_item_show_all (GtkWidget *widget); +static void gtk_menu_item_hide_all (GtkWidget *widget); static GtkItemClass *parent_class; static gint menu_item_signals[LAST_SIGNAL] = { 0 }; @@ -127,6 +129,8 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass) widget_class->expose_event = gtk_menu_item_expose; widget_class->enter_notify_event = gtk_menu_item_enter; widget_class->leave_notify_event = gtk_menu_item_leave; + widget_class->show_all = gtk_menu_item_show_all; + widget_class->hide_all = gtk_menu_item_hide_all; item_class->select = gtk_real_menu_item_select; item_class->deselect = gtk_real_menu_item_deselect; @@ -745,3 +749,40 @@ gtk_menu_item_right_justify(GtkMenuItem *menuitem) menuitem->right_justify = 1; } + +static void +gtk_menu_item_show_all (GtkWidget *widget) +{ + GtkContainer *container; + GtkMenuItem *menu_item; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_MENU_ITEM (widget)); + container = GTK_CONTAINER (widget); + menu_item = GTK_MENU_ITEM (widget); + + /* Show children, traverse to submenu, show self. */ + gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL); + if (menu_item->submenu) + gtk_widget_show_all (menu_item->submenu); + gtk_widget_show (widget); +} + + +static void +gtk_menu_item_hide_all (GtkWidget *widget) +{ + GtkContainer *container; + GtkMenuItem *menu_item; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_MENU_ITEM (widget)); + container = GTK_CONTAINER (widget); + menu_item = GTK_MENU_ITEM (widget); + + /* Reverse order of gtk_menu_item_show_all */ + gtk_widget_hide (widget); + if (menu_item->submenu) + gtk_widget_hide_all (menu_item->submenu); + gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL); +} diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 7acdce4ba6..f278bed521 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -51,9 +51,6 @@ static void gtk_notebook_foreach (GtkContainer *container, gpointer callback_data); static void gtk_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page); -static void gtk_notebook_set_clip_rect (GtkNotebook *notebook, - GtkStateType state_type, - GdkRectangle *area); static void gtk_notebook_draw_tab (GtkNotebook *notebook, GtkNotebookPage *page, GdkRectangle *area); @@ -738,11 +735,6 @@ gtk_notebook_paint (GtkWidget *widget, { notebook = GTK_NOTEBOOK (widget); - /* Set the clip rectangle here, so we don't overwrite things - * outside of exposed area when drawing shadows */ - gtk_notebook_set_clip_rect (notebook, GTK_STATE_ACTIVE, area); - gtk_notebook_set_clip_rect (notebook, GTK_STATE_NORMAL, area); - gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height); @@ -874,9 +866,6 @@ gtk_notebook_paint (GtkWidget *widget, x, y, width, height); } } - - gtk_notebook_set_clip_rect (notebook, GTK_STATE_ACTIVE, NULL); - gtk_notebook_set_clip_rect (notebook, GTK_STATE_NORMAL, NULL); } } @@ -1071,18 +1060,6 @@ gtk_notebook_switch_page (GtkNotebook *notebook, } } -static void -gtk_notebook_set_clip_rect (GtkNotebook *notebook, - GtkStateType state_type, - GdkRectangle *area) -{ - GtkWidget *widget = GTK_WIDGET (notebook); - - gdk_gc_set_clip_rectangle (widget->style->bg_gc[state_type], area); - gdk_gc_set_clip_rectangle (widget->style->light_gc[state_type], area); - gdk_gc_set_clip_rectangle (widget->style->dark_gc[state_type], area); - gdk_gc_set_clip_rectangle (widget->style->black_gc, area); -} static void gtk_notebook_draw_tab (GtkNotebook *notebook, @@ -1093,7 +1070,8 @@ gtk_notebook_draw_tab (GtkNotebook *notebook, GdkRectangle page_area; GtkStateType state_type; GdkPoint points[6]; - + gint n; + g_return_if_fail (notebook != NULL); g_return_if_fail (page != NULL); g_return_if_fail (area != NULL); @@ -1105,101 +1083,206 @@ gtk_notebook_draw_tab (GtkNotebook *notebook, if (gdk_rectangle_intersect (&page_area, area, &child_area)) { + GtkWidget *widget; + switch (notebook->tab_pos) { case GTK_POS_TOP: - points[0].x = page->allocation.x + page->allocation.width - 1; - points[0].y = page->allocation.y + page->allocation.height - 1; + if( child_area.x + child_area.width > + page->allocation.x + page->allocation.width - TAB_OVERLAP ) + { + points[0].x = page->allocation.x + page->allocation.width - 1; + points[0].y = page->allocation.y + page->allocation.height - 1; - points[1].x = page->allocation.x + page->allocation.width - 1; - points[1].y = page->allocation.y + TAB_CURVATURE; + points[1].x = page->allocation.x + page->allocation.width - 1; + points[1].y = page->allocation.y + TAB_CURVATURE; - points[2].x = page->allocation.x + page->allocation.width - TAB_CURVATURE - 1; - points[2].y = page->allocation.y; + points[2].x = page->allocation.x + page->allocation.width + - TAB_CURVATURE - 1; + points[2].y = page->allocation.y; + n = 3; + } + else + { + points[0].x = page->allocation.x + page->allocation.width + - TAB_OVERLAP - 1; + points[0].y = page->allocation.y; + n = 1; + } + + if( (child_area.x < page->allocation.x + TAB_OVERLAP) && + (page == notebook->cur_page || + page == (GtkNotebookPage *)(notebook->children->data)) ) + { + points[n].x = page->allocation.x + TAB_CURVATURE; + points[n++].y = page->allocation.y; + + points[n].x = page->allocation.x; + points[n++].y = page->allocation.y + TAB_CURVATURE; - points[3].x = page->allocation.x + TAB_CURVATURE; - points[3].y = page->allocation.y; - - points[4].x = page->allocation.x; - points[4].y = page->allocation.y + TAB_CURVATURE; - - points[5].x = page->allocation.x; - points[5].y = page->allocation.y + page->allocation.height - 1; + points[n].x = page->allocation.x; + points[n++].y = page->allocation.y + page->allocation.height - 1; + } + else + { + points[n].x = page->allocation.x + TAB_OVERLAP; + points[n++].y = page->allocation.y; + } break; case GTK_POS_BOTTOM: - points[0].x = page->allocation.x; - points[0].y = page->allocation.y; + if( (child_area.x < page->allocation.x + TAB_OVERLAP) && + (page == notebook->cur_page || + page == (GtkNotebookPage *)(notebook->children->data)) ) + { + points[0].x = page->allocation.x; + points[0].y = page->allocation.y; - points[1].x = page->allocation.x; - points[1].y = page->allocation.y + page->allocation.height - TAB_CURVATURE - 1; + points[1].x = page->allocation.x; + points[1].y = page->allocation.y + page->allocation.height + - TAB_CURVATURE - 1; - points[2].x = page->allocation.x + TAB_CURVATURE; - points[2].y = page->allocation.y + page->allocation.height - 1; + points[2].x = page->allocation.x + TAB_CURVATURE; + points[2].y = page->allocation.y + page->allocation.height - 1; + n = 3; + } + else + { + points[0].x = page->allocation.x + TAB_OVERLAP; + points[0].y = page->allocation.y + page->allocation.height - 1; + n = 1; + } - points[3].x = page->allocation.x + page->allocation.width - TAB_CURVATURE - 1; - points[3].y = page->allocation.y + page->allocation.height - 1; + if( child_area.x + child_area.width > + page->allocation.x + page->allocation.width - TAB_OVERLAP ) + { + points[n].x = page->allocation.x + page->allocation.width + - TAB_CURVATURE - 1; + points[n++].y = page->allocation.y + page->allocation.height - 1; - points[4].x = page->allocation.x + page->allocation.width - 1; - points[4].y = page->allocation.y + page->allocation.height - TAB_CURVATURE - 1; - - points[5].x = page->allocation.x + page->allocation.width - 1; - points[5].y = page->allocation.y; + points[n].x = page->allocation.x + page->allocation.width - 1; + points[n++].y = page->allocation.y + page->allocation.height + - TAB_CURVATURE - 1; + + points[n].x = page->allocation.x + page->allocation.width - 1; + points[n++].y = page->allocation.y; + } + else + { + points[n].x = page->allocation.x + page->allocation.width + - TAB_OVERLAP - 1; + points[n++].y = page->allocation.y + page->allocation.height - 1; + } break; case GTK_POS_LEFT: - points[0].x = page->allocation.x + page->allocation.width - 1; - points[0].y = page->allocation.y; + if( (child_area.y < page->allocation.y + TAB_OVERLAP) && + (page == notebook->cur_page || + page == (GtkNotebookPage *)(notebook->children->data)) ) + { + points[0].x = page->allocation.x + page->allocation.width - 1; + points[0].y = page->allocation.y; + + points[1].x = page->allocation.x + TAB_CURVATURE; + points[1].y = page->allocation.y; - points[1].x = page->allocation.x + TAB_CURVATURE; - points[1].y = page->allocation.y; + points[2].x = page->allocation.x; + points[2].y = page->allocation.y + TAB_CURVATURE; + n = 3; + } + else + { + points[0].x = page->allocation.x; + points[0].y = page->allocation.y + TAB_OVERLAP; + n = 1; + } - points[2].x = page->allocation.x; - points[2].y = page->allocation.y + TAB_CURVATURE; + if( child_area.y + child_area.height > + page->allocation.y + page->allocation.height - TAB_OVERLAP ) + { + points[n].x = page->allocation.x; + points[n++].y = page->allocation.y + page->allocation.height + - TAB_CURVATURE - 1; - points[3].x = page->allocation.x; - points[3].y = page->allocation.y + page->allocation.height - TAB_CURVATURE - 1; + points[n].x = page->allocation.x + TAB_CURVATURE; + points[n++].y = page->allocation.y + page->allocation.height - 1; - points[4].x = page->allocation.x + TAB_CURVATURE; - points[4].y = page->allocation.y + page->allocation.height - 1; - - points[5].x = page->allocation.x + page->allocation.width - 1; - points[5].y = page->allocation.y + page->allocation.height - 1; + points[n].x = page->allocation.x + page->allocation.width - 1; + points[n++].y = page->allocation.y + page->allocation.height - 1; + } + else + { + points[n].x = page->allocation.x; + points[n++].y = page->allocation.y + page->allocation.height + - TAB_OVERLAP - 1; + } break; case GTK_POS_RIGHT: - points[0].x = page->allocation.x; - points[0].y = page->allocation.y + page->allocation.height - 1; + if( child_area.y + child_area.height > + page->allocation.y + page->allocation.height - TAB_OVERLAP ) + { + points[0].x = page->allocation.x; + points[0].y = page->allocation.y + page->allocation.height - 1; - points[1].x = page->allocation.x + page->allocation.width - TAB_CURVATURE - 1; - points[1].y = page->allocation.y + page->allocation.height - 1; + points[1].x = page->allocation.x + page->allocation.width + - TAB_CURVATURE - 1; + points[1].y = page->allocation.y + page->allocation.height - 1; + + points[2].x = page->allocation.x + page->allocation.width - 1; + points[2].y = page->allocation.y + page->allocation.height + - TAB_CURVATURE - 1; + n = 3; + } + else + { + points[0].x = page->allocation.x + page->allocation.width - 1; + points[0].y = page->allocation.y + page->allocation.height + - TAB_OVERLAP - 1; + n = 1; + } - points[2].x = page->allocation.x + page->allocation.width - 1; - points[2].y = page->allocation.y + page->allocation.height - TAB_CURVATURE - 1; + if( (child_area.y < page->allocation.y + TAB_OVERLAP) && + (page == notebook->cur_page || + page == (GtkNotebookPage *)(notebook->children->data)) ) + { + points[n].x = page->allocation.x + page->allocation.width - 1; + points[n++].y = page->allocation.y + TAB_CURVATURE; - points[3].x = page->allocation.x + page->allocation.width - 1; - points[3].y = page->allocation.y + TAB_CURVATURE; + points[n].x = page->allocation.x + page->allocation.width + - TAB_CURVATURE - 1; + points[n++].y = page->allocation.y; - points[4].x = page->allocation.x + page->allocation.width - TAB_CURVATURE - 1; - points[4].y = page->allocation.y; - - points[5].x = page->allocation.x; - points[5].y = page->allocation.y; + points[n].x = page->allocation.x; + points[n++].y = page->allocation.y; + } + else + { + points[n].x = page->allocation.x + page->allocation.width - 1; + points[n++].y = page->allocation.y + TAB_OVERLAP; + } break; } + widget = GTK_WIDGET(notebook); + if (notebook->cur_page == page) state_type = GTK_STATE_NORMAL; - else - state_type = GTK_STATE_ACTIVE; - - gtk_draw_polygon (GTK_WIDGET (notebook)->style, - GTK_WIDGET (notebook)->window, - state_type, GTK_SHADOW_OUT, - points, 6, (notebook->cur_page != page)); + else + { + state_type = GTK_STATE_ACTIVE; + + gdk_draw_rectangle (widget->window, widget->style->bg_gc[state_type], + TRUE, child_area.x, child_area.y, + child_area.width, child_area.height); + } + gtk_draw_polygon (widget->style, widget->window, state_type, + GTK_SHADOW_OUT, points, n, FALSE); + if (gtk_widget_intersect (page->tab_label, area, &child_area)) gtk_widget_draw (page->tab_label, &child_area); } } + static void gtk_notebook_pages_allocate (GtkNotebook *notebook, GtkAllocation *allocation) diff --git a/gtk/gtkoptionmenu.c b/gtk/gtkoptionmenu.c index 493351d06d..0b0f5cc73f 100644 --- a/gtk/gtkoptionmenu.c +++ b/gtk/gtkoptionmenu.c @@ -54,6 +54,8 @@ static void gtk_option_menu_position (GtkMenu *menu, gint *x, gint *y, gpointer user_data); +static void gtk_option_menu_show_all (GtkWidget *widget); +static void gtk_option_menu_hide_all (GtkWidget *widget); static GtkButtonClass *parent_class = NULL; @@ -103,6 +105,8 @@ gtk_option_menu_class_init (GtkOptionMenuClass *class) widget_class->size_allocate = gtk_option_menu_size_allocate; widget_class->expose_event = gtk_option_menu_expose; widget_class->button_press_event = gtk_option_menu_button_press; + widget_class->show_all = gtk_option_menu_show_all; + widget_class->hide_all = gtk_option_menu_hide_all; } static void @@ -583,3 +587,38 @@ gtk_option_menu_position (GtkMenu *menu, *x = menu_xpos; *y = menu_ypos; } + + +static void +gtk_option_menu_show_all (GtkWidget *widget) +{ + GtkContainer *container; + GtkOptionMenu *option_menu; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_OPTION_MENU (widget)); + container = GTK_CONTAINER (widget); + option_menu = GTK_OPTION_MENU (widget); + + gtk_widget_show (widget); + gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL); + if (option_menu->menu) + gtk_widget_show_all (option_menu->menu); + if (option_menu->menu_item) + gtk_widget_show_all (option_menu->menu_item); +} + + +static void +gtk_option_menu_hide_all (GtkWidget *widget) +{ + GtkContainer *container; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_OPTION_MENU (widget)); + container = GTK_CONTAINER (widget); + + gtk_widget_hide (widget); + gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL); +} + diff --git a/gtk/gtkviewport.c b/gtk/gtkviewport.c index a084b13345..46fd1d3c41 100644 --- a/gtk/gtkviewport.c +++ b/gtk/gtkviewport.c @@ -466,10 +466,16 @@ gtk_viewport_size_allocate (GtkWidget *widget, viewport = GTK_VIEWPORT (widget); bin = GTK_BIN (widget); - child_allocation.x = GTK_WIDGET (viewport)->style->klass->xthickness; - child_allocation.width = allocation->width - child_allocation.x * 2; + child_allocation.x = 0; + child_allocation.y = 0; - child_allocation.y = GTK_WIDGET (viewport)->style->klass->ythickness; + if (viewport->shadow_type != GTK_SHADOW_NONE) + { + child_allocation.x = GTK_WIDGET (viewport)->style->klass->xthickness; + child_allocation.y = GTK_WIDGET (viewport)->style->klass->ythickness; + } + + child_allocation.width = allocation->width - child_allocation.x * 2; child_allocation.height = allocation->height - child_allocation.y * 2; if (GTK_WIDGET_REALIZED (widget)) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index a8677ab570..11479e5225 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -596,6 +596,8 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->activate_signal = 0; klass->show = gtk_real_widget_show; klass->hide = gtk_real_widget_hide; + klass->show_all = gtk_real_widget_show; + klass->hide_all = gtk_real_widget_hide; klass->map = gtk_real_widget_map; klass->unmap = gtk_real_widget_unmap; klass->realize = gtk_real_widget_realize; @@ -1009,6 +1011,58 @@ gtk_widget_hide (GtkWidget *widget) gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]); } +/***************************************** + * gtk_widget_show_all: + * + * Shows the widget and all children. + * + * Container classes overwrite + * show_all and hide_all to call + * show_all (hide_all) on both themselves + * and on their child widgets. + * + * arguments: + * + * results: + *****************************************/ + +void +gtk_widget_show_all (GtkWidget *widget) +{ + GtkWidgetClass *widget_class; + + g_return_if_fail (widget != NULL); + + /* show_all shouldn't be invoked through a signal, + because in this case it would be quite slow - there would + be a show and show_all signal emitted for every child widget. + */ + widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass); + widget_class->show_all (widget); +} + +/***************************************** + * gtk_widget_hide_all: + * + * Hides the widget and all children. + * See gtk_widget_show_all. + * + * arguments: + * + * results: + *****************************************/ + +void +gtk_widget_hide_all (GtkWidget *widget) +{ + GtkWidgetClass *widget_class; + + g_return_if_fail (widget != NULL); + + widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass); + widget_class->hide_all (widget); +} + /***************************************** * gtk_widget_map: * diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 51ea9940c8..84da5f9196 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -243,6 +243,8 @@ struct _GtkWidgetClass /* basics */ void (* show) (GtkWidget *widget); void (* hide) (GtkWidget *widget); + void (* show_all) (GtkWidget *widget); + void (* hide_all) (GtkWidget *widget); void (* map) (GtkWidget *widget); void (* unmap) (GtkWidget *widget); void (* realize) (GtkWidget *widget); @@ -362,6 +364,8 @@ void gtk_widget_destroy (GtkWidget *widget); void gtk_widget_unparent (GtkWidget *widget); void gtk_widget_show (GtkWidget *widget); void gtk_widget_hide (GtkWidget *widget); +void gtk_widget_show_all (GtkWidget *widget); +void gtk_widget_hide_all (GtkWidget *widget); void gtk_widget_map (GtkWidget *widget); void gtk_widget_unmap (GtkWidget *widget); void gtk_widget_realize (GtkWidget *widget);