diff options
author | Owen Taylor <otaylor@src.gnome.org> | 1998-11-06 22:05:02 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1998-11-06 22:05:02 +0000 |
commit | e2a521922085c8010028e227f61bba59ea6b8242 (patch) | |
tree | 2500d6aa6f63aab4b58c17546532ecce8fdcca37 /gtk/gtknotebook.c | |
parent | 3c0df19a588bd96f328bda975db8eb9fa7f79e81 (diff) | |
download | gtk+-e2a521922085c8010028e227f61bba59ea6b8242.tar.gz |
Merge from themes-2. See the ChangeLog for a somewhat detailed
history of the evolution of the changes involved. Most of this
is actually minor painting tweaks.
Diffstat (limited to 'gtk/gtknotebook.c')
-rw-r--r-- | gtk/gtknotebook.c | 680 |
1 files changed, 259 insertions, 421 deletions
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 71b69cd7e6..e10724624a 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -28,8 +28,8 @@ #define TAB_OVERLAP 2 #define TAB_CURVATURE 1 -#define ARROW_SIZE 11 -#define ARROW_SPACING 3 +#define ARROW_SIZE 12 +#define ARROW_SPACING 0 #define NOTEBOOK_INIT_SCROLL_DELAY (200) #define NOTEBOOK_SCROLL_DELAY (100) @@ -168,7 +168,9 @@ static void gtk_notebook_menu_item_create (GtkNotebook *notebook, static GtkType gtk_notebook_child_type (GtkContainer *container); static gint gtk_notebook_find_page (gconstpointer a, gconstpointer b); - +static void gtk_notebook_set_shape (GtkNotebook *notebook); +static void gtk_notebook_style_set (GtkWidget *widget, + GtkStyle *previous_style); static GtkContainerClass *parent_class = NULL; static guint notebook_signals[LAST_SIGNAL] = { 0 }; @@ -254,7 +256,8 @@ gtk_notebook_class_init (GtkNotebookClass *class) widget_class->focus_in_event = gtk_notebook_focus_in; widget_class->focus_out_event = gtk_notebook_focus_out; widget_class->draw_focus = gtk_notebook_draw_focus; - + widget_class->style_set = gtk_notebook_style_set; + container_class->add = gtk_notebook_add; container_class->remove = gtk_notebook_remove; container_class->forall = gtk_notebook_forall; @@ -643,7 +646,7 @@ gtk_notebook_insert_page_menu (GtkNotebook *notebook, page->allocation.height = 0; page->default_menu = FALSE; page->default_tab = FALSE; - + nchildren = g_list_length (notebook->children); if ((position < 0) || (position > nchildren)) position = nchildren; @@ -1182,11 +1185,7 @@ gtk_notebook_set_tab_pos (GtkNotebook *notebook, notebook->tab_pos = pos; if (GTK_WIDGET_VISIBLE (notebook)) - { - gtk_widget_queue_resize (GTK_WIDGET (notebook)); - if (notebook->panel) - gdk_window_clear (notebook->panel); - } + gtk_widget_queue_resize (GTK_WIDGET (notebook)); } } @@ -1275,17 +1274,28 @@ gtk_notebook_set_scrollable (GtkNotebook *notebook, g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); + scrollable = (scrollable != FALSE); + if (scrollable != notebook->scrollable) { - if ( (notebook->scrollable = (scrollable != 0)) ) - gtk_notebook_panel_realize (notebook); - else if (notebook->panel) + notebook->scrollable = scrollable; + + if (GTK_WIDGET_REALIZED (notebook)) { - gdk_window_destroy (notebook->panel); - notebook->panel = NULL; + if (scrollable) + { + gtk_notebook_panel_realize (notebook); + } + else if (notebook->panel) + { + gdk_window_destroy (notebook->panel); + notebook->panel = NULL; + } } - gtk_widget_queue_resize (GTK_WIDGET(notebook)); - } + + if (GTK_WIDGET_VISIBLE (notebook)) + gtk_widget_queue_resize (GTK_WIDGET(notebook)); + } } static void @@ -1361,8 +1371,8 @@ gtk_notebook_realize (GtkWidget *widget) attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK - | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK; + attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; @@ -1372,6 +1382,7 @@ gtk_notebook_realize (GtkWidget *widget) widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (widget->window, NULL, TRUE); if (notebook->scrollable) gtk_notebook_panel_realize (notebook); } @@ -1417,6 +1428,7 @@ gtk_notebook_panel_realize (GtkNotebook *notebook) attributes_mask); gtk_style_set_background (widget->style, notebook->panel, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (widget->window, NULL, TRUE); gdk_window_set_user_data (notebook->panel, widget); } @@ -1636,6 +1648,7 @@ gtk_notebook_size_allocate (GtkWidget *widget, gtk_notebook_pages_allocate (notebook, allocation); } + gtk_notebook_set_shape (notebook); } static void @@ -1645,11 +1658,11 @@ gtk_notebook_paint (GtkWidget *widget, GtkNotebook *notebook; GtkNotebookPage *page; GList *children; - GdkPoint points[6]; gint width, height; gint x, y; gint showarrow; - + gint gap_x = 0, gap_width = 0; + g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (widget)); g_return_if_fail (area != NULL); @@ -1658,10 +1671,6 @@ gtk_notebook_paint (GtkWidget *widget, { notebook = GTK_NOTEBOOK (widget); - gdk_window_clear_area (widget->window, - area->x, area->y, - area->width, area->height); - if (notebook->show_tabs || notebook->show_border) { x = GTK_CONTAINER (widget)->border_width; @@ -1693,16 +1702,15 @@ gtk_notebook_paint (GtkWidget *widget, case GTK_POS_RIGHT: width -= page->allocation.width + widget->style->klass->xthickness; - break; + break; } - gtk_draw_shadow (widget->style, widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_OUT, - x, y, width, height); + gtk_paint_box (widget->style, widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_OUT, + area, widget, "notebook", + x, y, width, height); } else { - gint i = 0; - switch (notebook->tab_pos) { case GTK_POS_TOP: @@ -1716,141 +1724,35 @@ gtk_notebook_paint (GtkWidget *widget, width -= notebook->cur_page->allocation.width; break; } - - switch (notebook->tab_pos) + + switch (notebook->tab_pos) { case GTK_POS_TOP: - if (x != notebook->cur_page->allocation.x) - { - points[i].x = notebook->cur_page->allocation.x; - points[i++].y = y; - } - - points[i].x = x; - points[i++].y = y; - points[i].x = x; - points[i++].y = y + height - 1; - points[i].x = x + width - 1; - points[i++].y = y + height - 1; - points[i].x = x + width - 1; - points[i++].y = y; - - if ((notebook->cur_page->allocation.x + - notebook->cur_page->allocation.width - - widget->style->klass->xthickness) < - x + width - widget->style->klass->xthickness) - { - points[i].x = (notebook->cur_page->allocation.x + - notebook->cur_page->allocation.width - - widget->style->klass->xthickness); - - if (points[i].x == (x + width)) - points[i].x -= 1; - - points[i++].y = y; - } + gap_x = notebook->cur_page->allocation.x - + GTK_CONTAINER(notebook)->border_width; + gap_width = notebook->cur_page->allocation.width; break; - case GTK_POS_BOTTOM: - if ((notebook->cur_page->allocation.x + - notebook->cur_page->allocation.width - - widget->style->klass->xthickness) < - x + width - widget->style->klass->xthickness) - { - points[i].x = (notebook->cur_page->allocation.x + - notebook->cur_page->allocation.width - - widget->style->klass->xthickness); - - if (points[i].x == (x + width)) - points[i].x -= 1; - - points[i++].y = y + height - 1; - } - - points[i].x = x + width - 1; - points[i++].y = y + height - 1; - points[i].x = x + width - 1; - points[i++].y = y; - points[i].x = x; - points[i++].y = y; - points[i].x = x; - points[i++].y = y + height - 1; - - if (notebook->cur_page->allocation.x != x) - { - points[i].x = notebook->cur_page->allocation.x; - points[i++].y = y + height - 1; - } + gap_x = notebook->cur_page->allocation.x - + GTK_CONTAINER(notebook)->border_width; + gap_width = notebook->cur_page->allocation.width; break; - case GTK_POS_LEFT: - if ((notebook->cur_page->allocation.y + - notebook->cur_page->allocation.height - - widget->style->klass->ythickness) < - y + height - widget->style->klass->ythickness) - { - points[i].x = x; - points[i++].y = notebook->cur_page->allocation.y + - notebook->cur_page->allocation.height - - widget->style->klass->ythickness; - - if (points[0].y == (y + height)) - points[0].y -= 1; - } - - points[i].x = x; - points[i++].y = y + height - 1; - points[i].x = x + width - 1; - points[i++].y = y + height - 1; - points[i].x = x + width - 1; - points[i++].y = y; - points[i].x = x; - points[i++].y = y; - - if (notebook->cur_page->allocation.y != y) - { - points[i].x = x; - points[i++].y = notebook->cur_page->allocation.y; - } + gap_x = notebook->cur_page->allocation.y - + GTK_CONTAINER(notebook)->border_width; + gap_width = notebook->cur_page->allocation.height; break; - case GTK_POS_RIGHT: - if (notebook->cur_page->allocation.y != y) - { - points[i].x = x + width - 1; - points[i++].y = notebook->cur_page->allocation.y; - } - - points[i].x = x + width - 1; - points[i++].y = y; - points[i].x = x; - points[i++].y = y; - points[i].x = x; - points[i++].y = y + height - 1; - points[i].x = x + width - 1; - points[i++].y = y + height - 1; - - if ((notebook->cur_page->allocation.y + - notebook->cur_page->allocation.height - - widget->style->klass->ythickness) < - y + height - widget->style->klass->ythickness) - { - points[i].x = x + width - 1; - points[i++].y = notebook->cur_page->allocation.y + - notebook->cur_page->allocation.height - - widget->style->klass->ythickness; - - if (points[i - 1].y == (y + height)) - points[i - 1].y -= 1; - } + gap_x = notebook->cur_page->allocation.y - + GTK_CONTAINER(notebook)->border_width; + gap_width = notebook->cur_page->allocation.height; break; - } - - gtk_draw_polygon (widget->style, widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_OUT, - points, i, FALSE); - + gtk_paint_box_gap(widget->style, widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_OUT, + area, widget, "notebook", + x, y, width, height, + notebook->tab_pos, gap_x, gap_width); } children = g_list_last (notebook->children); showarrow = FALSE; @@ -1878,9 +1780,10 @@ gtk_notebook_paint (GtkWidget *widget, } else if (notebook->show_border) { - gtk_draw_shadow (widget->style, widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_OUT, - x, y, width, height); + gtk_paint_box(widget->style, widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_OUT, + area, widget, "notebook", + x, y, width, height); } } } @@ -1916,7 +1819,8 @@ gtk_notebook_expose (GtkWidget *widget, { GtkNotebook *notebook; GdkEventExpose child_event; - + GdkRectangle child_area; + g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_NOTEBOOK (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); @@ -1926,7 +1830,10 @@ gtk_notebook_expose (GtkWidget *widget, notebook = GTK_NOTEBOOK (widget); gtk_notebook_paint (widget, &event->area); - gtk_widget_draw_focus (widget); + if (notebook->cur_page && + gtk_widget_intersect (notebook->cur_page->tab_label, + &event->area, &child_area)) + gtk_widget_draw_focus (widget); child_event = *event; if (notebook->cur_page && @@ -2059,6 +1966,7 @@ gtk_notebook_button_press (GtkWidget *widget, if (!children && !GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); } + gtk_notebook_set_shape (notebook); return FALSE; } @@ -2277,9 +2185,12 @@ gtk_notebook_draw_arrow (GtkNotebook *notebook, guint arrow) if (notebook->tab_pos == GTK_POS_LEFT || notebook->tab_pos == GTK_POS_RIGHT) arrow = GTK_ARROW_UP; - gtk_draw_arrow (widget->style, notebook->panel, state_type, - shadow_type, arrow, TRUE, - 0, 0, ARROW_SIZE, ARROW_SIZE); + + gdk_window_clear_area (notebook->panel, 0, 0, ARROW_SIZE, ARROW_SIZE); + gtk_paint_arrow (widget->style, notebook->panel, state_type, + shadow_type, NULL, GTK_WIDGET(notebook), "notebook", + arrow, TRUE, + 0, 0, ARROW_SIZE, ARROW_SIZE); } else { @@ -2292,9 +2203,12 @@ gtk_notebook_draw_arrow (GtkNotebook *notebook, guint arrow) if (notebook->tab_pos == GTK_POS_LEFT || notebook->tab_pos == GTK_POS_RIGHT) arrow = GTK_ARROW_DOWN; - gtk_draw_arrow (widget->style, notebook->panel, state_type, - shadow_type, arrow, TRUE, ARROW_SIZE + ARROW_SPACING, - 0, ARROW_SIZE, ARROW_SIZE); + gdk_window_clear_area(notebook->panel, ARROW_SIZE + ARROW_SPACING, + 0, ARROW_SIZE, ARROW_SIZE); + gtk_paint_arrow (widget->style, notebook->panel, state_type, + shadow_type, NULL, GTK_WIDGET(notebook), "notebook", + arrow, TRUE, ARROW_SIZE + ARROW_SPACING, + 0, ARROW_SIZE, ARROW_SIZE); } } } @@ -2322,7 +2236,6 @@ gtk_notebook_real_switch_page (GtkNotebook *notebook, g_list_find (notebook->children, notebook->cur_page); gtk_notebook_pages_allocate (notebook, >K_WIDGET (notebook)->allocation); - gtk_notebook_expose_tabs (notebook); if (GTK_WIDGET_MAPPED (notebook)) { @@ -2338,6 +2251,7 @@ gtk_notebook_real_switch_page (GtkNotebook *notebook, if (GTK_WIDGET_DRAWABLE (notebook)) gtk_widget_queue_draw (GTK_WIDGET (notebook)); + gtk_notebook_set_shape (notebook); } static void @@ -2348,14 +2262,14 @@ gtk_notebook_draw_tab (GtkNotebook *notebook, GdkRectangle child_area; GdkRectangle page_area; GtkStateType state_type; - GdkPoint points[6]; - gint n = 0; - + GtkPositionType gap_side; + g_return_if_fail (notebook != NULL); g_return_if_fail (page != NULL); g_return_if_fail (area != NULL); - if (!GTK_WIDGET_MAPPED (page->tab_label)) + if (!GTK_WIDGET_MAPPED (page->tab_label) || + (page->allocation.width == 0) || (page->allocation.height == 0)) return; page_area.x = page->allocation.x; @@ -2367,207 +2281,45 @@ gtk_notebook_draw_tab (GtkNotebook *notebook, { GtkWidget *widget; + widget = GTK_WIDGET (notebook); + gap_side = 0; switch (notebook->tab_pos) { case GTK_POS_TOP: - 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[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) || - (notebook->scrollable && - page == (GtkNotebookPage *)(notebook->first_tab->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[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; - } + gap_side = GTK_POS_BOTTOM; break; case GTK_POS_BOTTOM: - if ( (child_area.x < page->allocation.x + TAB_OVERLAP) && - (page == notebook->cur_page || - page == (GtkNotebookPage *)(notebook->children->data) || - (notebook->scrollable && - page == (GtkNotebookPage *)(notebook->first_tab->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[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; - } - - 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[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; - } + gap_side = GTK_POS_TOP; break; case GTK_POS_LEFT: - if ( (child_area.y < page->allocation.y + TAB_OVERLAP) && - (page == notebook->cur_page || - page == (GtkNotebookPage *)(notebook->children->data) || - (notebook->scrollable && - page == (GtkNotebookPage *)(notebook->first_tab->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[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; - } - - 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[n].x = page->allocation.x + TAB_CURVATURE; - points[n++].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; - } + gap_side = GTK_POS_RIGHT; break; case GTK_POS_RIGHT: - 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[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; - } - - if ( (child_area.y < page->allocation.y + TAB_OVERLAP) && - (page == notebook->cur_page || - page == (GtkNotebookPage *)(notebook->children->data) || - (notebook->scrollable && - page == (GtkNotebookPage *)(notebook->first_tab->data))) ) - { - points[n].x = page->allocation.x + page->allocation.width - 1; - points[n++].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[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; - } + gap_side = GTK_POS_RIGHT; break; } - - widget = GTK_WIDGET(notebook); - + if (notebook->cur_page == page) - { - state_type = GTK_STATE_NORMAL; - } + state_type = GTK_STATE_NORMAL; else + state_type = GTK_STATE_ACTIVE; + gtk_paint_extension(widget->style, widget->window, + state_type, GTK_SHADOW_OUT, + area, widget, "tab", + page_area.x, page_area.y, + page_area.width, page_area.height, + gap_side); + if ((GTK_WIDGET_HAS_FOCUS (widget)) && + notebook->focus_tab && (notebook->focus_tab->data == page) && + (page)) { - 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_paint_focus (widget->style, widget->window, + area, widget, "tab", + page->tab_label->allocation.x - 1, + page->tab_label->allocation.y - 1, + page->tab_label->allocation.width + 1, + page->tab_label->allocation.height + 1); } - - 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); } @@ -2649,77 +2401,27 @@ gtk_notebook_draw_focus (GtkWidget *widget) if (GTK_WIDGET_DRAWABLE (widget) && notebook->show_tabs && notebook->focus_tab) { - GtkNotebookPage *page; - GdkGC *gc; - - page = notebook->focus_tab->data; - - if (GTK_WIDGET_HAS_FOCUS (widget)) - gc = widget->style->black_gc; - else if (page == notebook->cur_page) - gc = widget->style->bg_gc[GTK_STATE_NORMAL]; - else - gc = widget->style->bg_gc[GTK_STATE_ACTIVE]; - - gdk_draw_rectangle (widget->window, - gc, FALSE, - page->tab_label->allocation.x - 1, - page->tab_label->allocation.y - 1, - page->tab_label->allocation.width + 1, - page->tab_label->allocation.height + 1); + GtkNotebookPage *page; + GdkRectangle area; + + page = notebook->focus_tab->data; + + area.x = widget->allocation.x; + area.y = widget->allocation.y; + area.width = widget->allocation.width; + area.height = widget->allocation.height; + + gtk_notebook_draw_tab(GTK_NOTEBOOK(widget), page, &area); } } static void gtk_notebook_focus_changed (GtkNotebook *notebook, GtkNotebookPage *old_page) { - GtkWidget *widget; - g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - widget = GTK_WIDGET (notebook); - - if (GTK_WIDGET_DRAWABLE (widget) && notebook->show_tabs) - { - GdkGC *gc; - - if (notebook->focus_tab) - { - GtkNotebookPage *page; - - page = notebook->focus_tab->data; - - if (GTK_WIDGET_HAS_FOCUS (widget)) - gc = widget->style->black_gc; - else if (page == notebook->cur_page) - gc = widget->style->bg_gc[GTK_STATE_NORMAL]; - else - gc = widget->style->bg_gc[GTK_STATE_ACTIVE]; - - gdk_draw_rectangle (widget->window, - gc, FALSE, - page->tab_label->allocation.x - 1, - page->tab_label->allocation.y - 1, - page->tab_label->allocation.width + 1, - page->tab_label->allocation.height + 1); - } - - if (old_page) - { - if (old_page == notebook->cur_page) - gc = widget->style->bg_gc[GTK_STATE_NORMAL]; - else - gc = widget->style->bg_gc[GTK_STATE_ACTIVE]; - - gdk_draw_rectangle (widget->window, - gc, FALSE, - old_page->tab_label->allocation.x - 1, - old_page->tab_label->allocation.y - 1, - old_page->tab_label->allocation.width + 1, - old_page->tab_label->allocation.height + 1); - } - } + gtk_notebook_expose_tabs(notebook); } static void @@ -3033,6 +2735,7 @@ gtk_notebook_pages_allocate (GtkNotebook *notebook, gtk_widget_map (page->tab_label); } } + gtk_notebook_set_shape (notebook); } static void @@ -3338,7 +3041,7 @@ gtk_notebook_switch_focus_tab (GtkNotebook *notebook, old_tab = notebook->focus_tab; notebook->focus_tab = new_child; - if (notebook->scrollable) + if (notebook->scrollable && GTK_WIDGET_DRAWABLE (notebook)) { if ((new_child == NULL) != (old_tab == NULL)) { @@ -3380,6 +3083,8 @@ gtk_notebook_switch_focus_tab (GtkNotebook *notebook, &(GTK_WIDGET (notebook)->allocation)); gtk_notebook_expose_tabs (notebook); } + + gtk_notebook_set_shape (notebook); } static gint @@ -3579,3 +3284,136 @@ gtk_notebook_find_page (gconstpointer a, { return (((GtkNotebookPage *) a)->child != b); } + +static void +gtk_notebook_set_shape (GtkNotebook *notebook) +{ + GtkWidget *widget = NULL; + GdkPixmap *pm = NULL; + GdkGC *pmgc = NULL; + GdkColor col; + gint x, y, width, height, w, h, depth; + GtkNotebookPage *page; + GList *children; + + if (!GTK_WIDGET(notebook)->window) + return; + + widget = GTK_WIDGET(notebook); + + w = widget->allocation.width; + h = widget->allocation.height; + + pm = gdk_pixmap_new (widget->window, w, h, 1); + pmgc = gdk_gc_new (pm); + + /* clear the shape mask */ + col.pixel = 0; + gdk_gc_set_foreground(pmgc, &col); + gdk_draw_rectangle(pm, pmgc, TRUE, 0, 0, w, h); + + col.pixel = 1; + gdk_gc_set_foreground(pmgc, &col); + + /* draw the shape for the notebook page itself */ + x = GTK_CONTAINER(notebook)->border_width; + y = GTK_CONTAINER(notebook)->border_width; + width = widget->allocation.width - x * 2; + height = widget->allocation.height - y * 2; + + if (notebook->show_tabs && notebook->children) + { + if (!(notebook->show_tabs)) + { + page = notebook->first_tab->data; + switch (notebook->tab_pos) + { + case GTK_POS_TOP: + y += page->allocation.height + + widget->style->klass->ythickness; + case GTK_POS_BOTTOM: + height -= page->allocation.height + + widget->style->klass->ythickness; + break; + case GTK_POS_LEFT: + x += page->allocation.width + + widget->style->klass->xthickness; + case GTK_POS_RIGHT: + width -= page->allocation.width + + widget->style->klass->xthickness; + break; + } + } + else + { + page = notebook->cur_page; + if (!GTK_WIDGET_MAPPED (page->tab_label)) + { + if (notebook->tab_pos == GTK_POS_LEFT) + { + x -= widget->style->klass->xthickness * 2; + width += widget->style->klass->xthickness * 2; + } + else if (notebook->tab_pos == GTK_POS_RIGHT) + width += widget->style->klass->xthickness * 2; + } + switch (notebook->tab_pos) + { + case GTK_POS_TOP: + y += page->allocation.height; + case GTK_POS_BOTTOM: + height -= page->allocation.height; + break; + case GTK_POS_LEFT: + x += page->allocation.width; + case GTK_POS_RIGHT: + width -= page->allocation.width; + break; + } + } + } + gdk_draw_rectangle(pm, pmgc, TRUE, x, y, width, height); + + /* if theres an area for scrollign arrows draw the shape for them */ + if (notebook->panel) + { + gdk_window_get_geometry(notebook->panel, &x, &y, &width, &height, &depth); + gdk_draw_rectangle(pm, pmgc, TRUE, x, y, width, height); + } + + /* draw the shapes of all the children */ + children = notebook->children; + while (children) + { + page = children->data; + if (GTK_WIDGET_MAPPED (page->tab_label)) + { + x = page->allocation.x; + y = page->allocation.y; + width = page->allocation.width; + height = page->allocation.height; + gdk_draw_rectangle(pm, pmgc, TRUE, x, y, width, height); + } + children = children->next; + } + /* set the mask */ + gdk_window_shape_combine_mask(widget->window, pm, 0, 0); + gdk_pixmap_unref(pm); + gdk_gc_destroy(pmgc); +} + +static void +gtk_notebook_style_set (GtkWidget *widget, + GtkStyle *previous_style) +{ + if (GTK_WIDGET_REALIZED (widget) && + !GTK_WIDGET_NO_WINDOW (widget)) + { + gtk_style_set_background (widget->style, widget->window, widget->state); + if (GTK_WIDGET_DRAWABLE (widget)) + gdk_window_clear (widget->window); + } + + gtk_widget_queue_draw (widget); + gtk_notebook_set_shape (GTK_NOTEBOOK(widget)); +} |