832 lines
29 KiB
Diff
832 lines
29 KiB
Diff
--- gtk+-2.6.4/gtk/gtknotebook.c 2004-09-27 06:43:55.000000000 +0300
|
|
+++ gtk+-2.6.4/gtk/gtknotebook.c 2005-04-06 16:19:37.033908352 +0300
|
|
@@ -40,10 +40,10 @@
|
|
|
|
#define TAB_OVERLAP 2
|
|
#define TAB_CURVATURE 1
|
|
-#define ARROW_SIZE 12
|
|
+#define ARROW_WIDTH 20
|
|
+#define ARROW_HEIGHT 27
|
|
#define ARROW_SPACING 0
|
|
-#define NOTEBOOK_INIT_SCROLL_DELAY (200)
|
|
-#define NOTEBOOK_SCROLL_DELAY (100)
|
|
+#define LABEL_PADDING 0
|
|
|
|
|
|
enum {
|
|
@@ -57,7 +57,9 @@
|
|
|
|
enum {
|
|
STEP_PREV,
|
|
- STEP_NEXT
|
|
+ STEP_NEXT,
|
|
+ STEP_PREV_CYCLE,
|
|
+ STEP_NEXT_CYCLE
|
|
};
|
|
|
|
typedef enum
|
|
@@ -216,7 +218,7 @@
|
|
GList *list,
|
|
gboolean destroying);
|
|
static void gtk_notebook_update_labels (GtkNotebook *notebook);
|
|
-static gint gtk_notebook_timer (GtkNotebook *notebook);
|
|
+static gint gtk_notebook_timer (GtkNotebook *notebook );
|
|
static gint gtk_notebook_page_compare (gconstpointer a,
|
|
gconstpointer b);
|
|
static GList* gtk_notebook_find_child (GtkNotebook *notebook,
|
|
@@ -458,7 +460,7 @@
|
|
g_param_spec_boolean ("scrollable",
|
|
P_("Scrollable"),
|
|
P_("If TRUE, scroll arrows are added if there are too many tabs to fit"),
|
|
- FALSE,
|
|
+ TRUE,
|
|
G_PARAM_READWRITE));
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_ENABLE_POPUP,
|
|
@@ -584,6 +586,75 @@
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
+ /* Hildon: for adding paddings to the inner borders of the visible page */
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("inner_left_border",
|
|
+ _("Inner left border of the visible page"),
|
|
+ _("Width of inner left border of the visible page"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ 0,
|
|
+ G_PARAM_READABLE));
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("inner_right_border",
|
|
+ _("Inner right border of the visible page"),
|
|
+ _("Width of inner right border of the visible page"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ 0,
|
|
+ G_PARAM_READABLE));
|
|
+
|
|
+ /* Hildon: previously hardcoded constants ARROW_WIDTH, ARROW_HEIGHT,
|
|
+ ARROW_SPACING, TAB_OVERLAP and TAB_CURVATURE are now style properties */
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("arrow-width",
|
|
+ _("Arrow width"),
|
|
+ _("Scroll arrow width"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ ARROW_WIDTH,
|
|
+ G_PARAM_READABLE));
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("arrow-height",
|
|
+ _("Arrow height"),
|
|
+ _("Scroll arrow height"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ ARROW_HEIGHT,
|
|
+ G_PARAM_READABLE));
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("arrow-spacing",
|
|
+ _("Arrow spacing"),
|
|
+ _("Scroll arrow spacing"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ ARROW_SPACING,
|
|
+ G_PARAM_READABLE));
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("tab-overlap",
|
|
+ _("Tab overlap"),
|
|
+ _("Tab overlap"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ TAB_OVERLAP,
|
|
+ G_PARAM_READABLE));
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("tab-curvature",
|
|
+ _("Tab curvature"),
|
|
+ _("Tab curvature"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ TAB_CURVATURE,
|
|
+ G_PARAM_READABLE));
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("label-padding",
|
|
+ _("Label padding"),
|
|
+ _("Label padding"),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ LABEL_PADDING,
|
|
+ G_PARAM_READABLE));
|
|
+
|
|
notebook_signals[SWITCH_PAGE] =
|
|
g_signal_new ("switch_page",
|
|
G_TYPE_FROM_CLASS (gobject_class),
|
|
@@ -705,11 +776,10 @@
|
|
notebook->show_tabs = TRUE;
|
|
notebook->show_border = TRUE;
|
|
notebook->tab_pos = GTK_POS_TOP;
|
|
- notebook->scrollable = FALSE;
|
|
+ notebook->scrollable = TRUE;
|
|
notebook->in_child = 0;
|
|
notebook->click_child = 0;
|
|
notebook->button = 0;
|
|
- notebook->need_timer = 0;
|
|
notebook->child_has_focus = FALSE;
|
|
notebook->have_visible_child = FALSE;
|
|
notebook->focus_out = FALSE;
|
|
@@ -1189,9 +1259,18 @@
|
|
GtkRequisition child_requisition;
|
|
gboolean switch_page = FALSE;
|
|
gint vis_pages;
|
|
- gint focus_width;
|
|
+ gint focus_width, label_padding;
|
|
+ gint arrow_width, arrow_height, arrow_spacing, tab_overlap, tab_curvature;
|
|
|
|
- gtk_widget_style_get (widget, "focus-line-width", &focus_width, NULL);
|
|
+ gtk_widget_style_get (widget,
|
|
+ "focus-line-width", &focus_width,
|
|
+ "arrow-width", &arrow_width,
|
|
+ "arrow-height", &arrow_height,
|
|
+ "arrow-spacing", &arrow_spacing,
|
|
+ "tab-overlap", &tab_overlap,
|
|
+ "tab-curvature", &tab_curvature,
|
|
+ "label-padding", &label_padding,
|
|
+ NULL);
|
|
|
|
widget->requisition.width = 0;
|
|
widget->requisition.height = 0;
|
|
@@ -1229,6 +1308,22 @@
|
|
{
|
|
widget->requisition.width += widget->style->xthickness * 2;
|
|
widget->requisition.height += widget->style->ythickness * 2;
|
|
+
|
|
+ /* Hildon kludge: inner border paddings */
|
|
+ if (notebook->children && notebook->show_border)
|
|
+ {
|
|
+ gint inner_left_border, inner_right_border;
|
|
+
|
|
+ gtk_widget_style_get (widget,
|
|
+ "inner_left_border",
|
|
+ &inner_left_border,
|
|
+ "inner_right_border",
|
|
+ &inner_right_border,
|
|
+ NULL);
|
|
+
|
|
+ widget->requisition.width += inner_left_border + inner_right_border;
|
|
+ }
|
|
+
|
|
|
|
if (notebook->show_tabs)
|
|
{
|
|
@@ -1249,6 +1344,7 @@
|
|
|
|
gtk_widget_size_request (page->tab_label,
|
|
&child_requisition);
|
|
+ child_requisition.width += 2 * label_padding;
|
|
|
|
page->requisition.width =
|
|
child_requisition.width +
|
|
@@ -1292,10 +1388,10 @@
|
|
|
|
if (notebook->scrollable && vis_pages > 1 &&
|
|
widget->requisition.width < tab_width)
|
|
- tab_height = MAX (tab_height, ARROW_SIZE);
|
|
+ tab_height = MAX (tab_height, arrow_height);
|
|
|
|
- padding = 2 * (TAB_CURVATURE + focus_width +
|
|
- notebook->tab_hborder) - TAB_OVERLAP;
|
|
+ padding = 2 * (tab_curvature + focus_width +
|
|
+ notebook->tab_hborder) - tab_overlap;
|
|
tab_max += padding;
|
|
while (children)
|
|
{
|
|
@@ -1316,15 +1412,15 @@
|
|
|
|
if (notebook->scrollable && vis_pages > 1 &&
|
|
widget->requisition.width < tab_width)
|
|
- tab_width = tab_max + 2 * (ARROW_SIZE + ARROW_SPACING);
|
|
+ tab_width = tab_max + 2 * (arrow_width + arrow_spacing);
|
|
|
|
if (notebook->homogeneous && !notebook->scrollable)
|
|
widget->requisition.width = MAX (widget->requisition.width,
|
|
vis_pages * tab_max +
|
|
- TAB_OVERLAP);
|
|
+ tab_overlap);
|
|
else
|
|
widget->requisition.width = MAX (widget->requisition.width,
|
|
- tab_width + TAB_OVERLAP);
|
|
+ tab_width + tab_overlap);
|
|
|
|
widget->requisition.height += tab_height;
|
|
break;
|
|
@@ -1335,10 +1431,10 @@
|
|
|
|
if (notebook->scrollable && vis_pages > 1 &&
|
|
widget->requisition.height < tab_height)
|
|
- tab_width = MAX (tab_width, ARROW_SPACING + 2 * ARROW_SIZE);
|
|
+ tab_width = MAX (tab_width, arrow_spacing + 2 * arrow_width);
|
|
|
|
- padding = 2 * (TAB_CURVATURE + focus_width +
|
|
- notebook->tab_vborder) - TAB_OVERLAP;
|
|
+ padding = 2 * (tab_curvature + focus_width +
|
|
+ notebook->tab_vborder) - tab_overlap;
|
|
tab_max += padding;
|
|
|
|
while (children)
|
|
@@ -1361,24 +1457,24 @@
|
|
|
|
if (notebook->scrollable && vis_pages > 1 &&
|
|
widget->requisition.height < tab_height)
|
|
- tab_height = tab_max + ARROW_SIZE + ARROW_SPACING;
|
|
+ tab_height = tab_max + arrow_height + arrow_spacing;
|
|
|
|
widget->requisition.width += tab_width;
|
|
|
|
if (notebook->homogeneous && !notebook->scrollable)
|
|
widget->requisition.height =
|
|
MAX (widget->requisition.height,
|
|
- vis_pages * tab_max + TAB_OVERLAP);
|
|
+ vis_pages * tab_max + tab_overlap);
|
|
else
|
|
widget->requisition.height =
|
|
MAX (widget->requisition.height,
|
|
- tab_height + TAB_OVERLAP);
|
|
+ tab_height + tab_overlap);
|
|
|
|
if (!notebook->homogeneous || notebook->scrollable)
|
|
vis_pages = 1;
|
|
widget->requisition.height = MAX (widget->requisition.height,
|
|
vis_pages * tab_max +
|
|
- TAB_OVERLAP);
|
|
+ tab_overlap);
|
|
break;
|
|
}
|
|
}
|
|
@@ -1499,7 +1595,26 @@
|
|
}
|
|
}
|
|
|
|
+ /* Hildon kludge: inner border paddings */
|
|
+ if (notebook->show_border)
|
|
+ {
|
|
+ gint inner_left_border, inner_right_border;
|
|
+
|
|
+ gtk_widget_style_get (widget,
|
|
+ "inner_left_border",
|
|
+ &inner_left_border,
|
|
+ "inner_right_border",
|
|
+ &inner_right_border,
|
|
+ NULL);
|
|
+
|
|
+ child_allocation.x += inner_left_border;
|
|
+ child_allocation.width -= inner_left_border + inner_right_border;
|
|
+ if (child_allocation.width < 0)
|
|
+ child_allocation.width = 0;
|
|
+ }
|
|
+
|
|
children = notebook->children;
|
|
+
|
|
while (children)
|
|
{
|
|
page = children->data;
|
|
@@ -1580,11 +1695,18 @@
|
|
GdkRectangle event_window_pos;
|
|
gboolean before = ARROW_IS_BEFORE (arrow);
|
|
gboolean left = ARROW_IS_LEFT (arrow);
|
|
+ gint arrow_width, arrow_height, arrow_spacing;
|
|
+
|
|
+ gtk_widget_style_get (GTK_WIDGET(notebook),
|
|
+ "arrow-width", &arrow_width,
|
|
+ "arrow-height", &arrow_height,
|
|
+ "arrow-spacing", &arrow_spacing,
|
|
+ NULL);
|
|
|
|
if (gtk_notebook_get_event_window_position (notebook, &event_window_pos))
|
|
{
|
|
- rectangle->width = ARROW_SIZE;
|
|
- rectangle->height = ARROW_SIZE;
|
|
+ rectangle->width = arrow_width;
|
|
+ rectangle->height = arrow_height;
|
|
|
|
switch (notebook->tab_pos)
|
|
{
|
|
@@ -1602,6 +1724,8 @@
|
|
rectangle->y += event_window_pos.height - rectangle->height;
|
|
break;
|
|
case GTK_POS_TOP:
|
|
+ arrow_spacing = - arrow_spacing;
|
|
+ /* Fall through */
|
|
case GTK_POS_BOTTOM:
|
|
if (before)
|
|
{
|
|
@@ -1617,7 +1741,11 @@
|
|
else
|
|
rectangle->x = event_window_pos.x + event_window_pos.width - 2 * rectangle->width;
|
|
}
|
|
- rectangle->y = event_window_pos.y + (event_window_pos.height - rectangle->height) / 2;
|
|
+ rectangle->y = event_window_pos.y;
|
|
+ if (arrow_spacing > 0)
|
|
+ rectangle->y += arrow_spacing;
|
|
+ else
|
|
+ rectangle->y += (event_window_pos.height - rectangle->height) / 2;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1696,6 +1824,10 @@
|
|
gboolean is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
|
|
gboolean left = (ARROW_IS_LEFT (arrow) && !is_rtl) ||
|
|
(!ARROW_IS_LEFT (arrow) && is_rtl);
|
|
+ GtkSettings *settings = gtk_settings_get_default ();
|
|
+ guint timeout;
|
|
+
|
|
+ g_object_get (settings, "gtk-initial-timeout", &timeout, NULL);
|
|
|
|
if (!GTK_WIDGET_HAS_FOCUS (widget))
|
|
gtk_widget_grab_focus (widget);
|
|
@@ -1706,14 +1838,14 @@
|
|
if (event->button == 1)
|
|
{
|
|
gtk_notebook_do_arrow (notebook, arrow);
|
|
-
|
|
+
|
|
if (!notebook->timer)
|
|
- {
|
|
- notebook->timer = g_timeout_add (NOTEBOOK_INIT_SCROLL_DELAY,
|
|
- (GSourceFunc) gtk_notebook_timer,
|
|
- (gpointer) notebook);
|
|
- notebook->need_timer = TRUE;
|
|
- }
|
|
+ {
|
|
+ notebook->timer = g_timeout_add (timeout,
|
|
+ (GSourceFunc) gtk_notebook_timer,
|
|
+ (gpointer) notebook);
|
|
+ notebook->need_timer = TRUE;
|
|
+ }
|
|
}
|
|
else if (event->button == 2)
|
|
gtk_notebook_page_select (notebook, TRUE);
|
|
@@ -1862,7 +1994,7 @@
|
|
static void
|
|
stop_scrolling (GtkNotebook *notebook)
|
|
{
|
|
- if (notebook->timer)
|
|
+ if (notebook->timer)
|
|
{
|
|
g_source_remove (notebook->timer);
|
|
notebook->timer = 0;
|
|
@@ -2343,9 +2475,9 @@
|
|
*/
|
|
return focus_child_in (notebook, GTK_DIR_TAB_FORWARD);
|
|
case GTK_DIR_LEFT:
|
|
- return focus_tabs_move (notebook, direction, STEP_PREV);
|
|
+ return focus_tabs_move (notebook, direction, STEP_PREV_CYCLE);
|
|
case GTK_DIR_RIGHT:
|
|
- return focus_tabs_move (notebook, direction, STEP_NEXT);
|
|
+ return focus_tabs_move (notebook, direction, STEP_NEXT_CYCLE);
|
|
}
|
|
}
|
|
else /* Focus was not on widget */
|
|
@@ -2481,7 +2613,6 @@
|
|
* gtk_notebook_redraw_tabs
|
|
* gtk_notebook_real_remove
|
|
* gtk_notebook_update_labels
|
|
- * gtk_notebook_timer
|
|
* gtk_notebook_page_compare
|
|
* gtk_notebook_real_page_position
|
|
* gtk_notebook_search_page
|
|
@@ -2574,22 +2705,27 @@
|
|
gtk_notebook_timer (GtkNotebook *notebook)
|
|
{
|
|
gboolean retval = FALSE;
|
|
+ guint timeout;
|
|
+ GtkSettings *settings;
|
|
|
|
GDK_THREADS_ENTER ();
|
|
|
|
+ settings = gtk_settings_get_default ();
|
|
+ g_object_get (settings, "gtk-update-timeout", &timeout, NULL);
|
|
+
|
|
if (notebook->timer)
|
|
{
|
|
gtk_notebook_do_arrow (notebook, notebook->click_child);
|
|
|
|
- if (notebook->need_timer)
|
|
- {
|
|
- notebook->need_timer = FALSE;
|
|
- notebook->timer = g_timeout_add (NOTEBOOK_SCROLL_DELAY,
|
|
- (GSourceFunc) gtk_notebook_timer,
|
|
- (gpointer) notebook);
|
|
- }
|
|
+ if (notebook->need_timer)
|
|
+ {
|
|
+ notebook->need_timer = FALSE;
|
|
+ notebook->timer = g_timeout_add (timeout,
|
|
+ (GSourceFunc) gtk_notebook_timer,
|
|
+ (gpointer) notebook);
|
|
+ }
|
|
else
|
|
- retval = TRUE;
|
|
+ retval = TRUE;
|
|
}
|
|
|
|
GDK_THREADS_LEAVE ();
|
|
@@ -2781,10 +2917,12 @@
|
|
switch (direction)
|
|
{
|
|
case STEP_PREV:
|
|
+ case STEP_PREV_CYCLE:
|
|
flag = GTK_PACK_END;
|
|
break;
|
|
|
|
case STEP_NEXT:
|
|
+ case STEP_NEXT_CYCLE:
|
|
flag = GTK_PACK_START;
|
|
break;
|
|
}
|
|
@@ -2827,6 +2965,37 @@
|
|
old_list = list;
|
|
list = list->prev;
|
|
}
|
|
+
|
|
+ /* Hildon hack: keyboard navigation should cycle around */
|
|
+ if (direction == STEP_PREV_CYCLE)
|
|
+ {
|
|
+ /* find and return the last (visible) page */
|
|
+ list = g_list_last (notebook->children);
|
|
+ if (!find_visible)
|
|
+ return list;
|
|
+ while (list)
|
|
+ {
|
|
+ page = list->data;
|
|
+ if (GTK_WIDGET_VISIBLE (page->child))
|
|
+ return list;
|
|
+ list = list->prev;
|
|
+ }
|
|
+ }
|
|
+ if (direction == STEP_NEXT_CYCLE)
|
|
+ {
|
|
+ /* find and return the first (visible) page */
|
|
+ list = g_list_first (notebook->children);
|
|
+ if (!find_visible)
|
|
+ return list;
|
|
+ while (list)
|
|
+ {
|
|
+ page = list->data;
|
|
+ if (GTK_WIDGET_VISIBLE (page->child))
|
|
+ return list;
|
|
+ list = list->next;
|
|
+ }
|
|
+ }
|
|
+
|
|
return NULL;
|
|
}
|
|
|
|
@@ -2850,6 +3019,7 @@
|
|
gint gap_x = 0, gap_width = 0, step = STEP_PREV;
|
|
gboolean is_rtl;
|
|
gint tab_pos;
|
|
+ gboolean paint_box_gap = FALSE;
|
|
|
|
g_return_if_fail (GTK_IS_NOTEBOOK (widget));
|
|
g_return_if_fail (area != NULL);
|
|
@@ -2933,15 +3103,37 @@
|
|
step = STEP_PREV;
|
|
break;
|
|
}
|
|
- gtk_paint_box_gap (widget->style, widget->window,
|
|
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
|
|
- area, widget, "notebook",
|
|
- x, y, width, height,
|
|
- tab_pos, gap_x, gap_width);
|
|
+
|
|
+ /* hildon hack to postpone painting until it
|
|
+ is known if scroll arrows will be drawn */
|
|
+ paint_box_gap = TRUE;
|
|
}
|
|
|
|
+ /* first, figure out if arrows should be drawn */
|
|
showarrow = FALSE;
|
|
children = gtk_notebook_search_page (notebook, NULL, step, TRUE);
|
|
+ while (children && !showarrow)
|
|
+ {
|
|
+ page = children->data;
|
|
+ children = gtk_notebook_search_page (notebook, children,
|
|
+ step, TRUE);
|
|
+ if (!GTK_WIDGET_MAPPED (page->tab_label))
|
|
+ showarrow = TRUE;
|
|
+ }
|
|
+
|
|
+ /* then draw content area frame */
|
|
+ if (paint_box_gap)
|
|
+ gtk_paint_box_gap (widget->style, widget->window,
|
|
+ GTK_STATE_NORMAL, GTK_SHADOW_OUT,
|
|
+ area, widget,
|
|
+ (showarrow && notebook->scrollable)
|
|
+ ? "notebook_show_arrow"
|
|
+ : "notebook",
|
|
+ x, y, width, height,
|
|
+ tab_pos, gap_x, gap_width);
|
|
+
|
|
+ /* and finally draw tabs */
|
|
+ children = gtk_notebook_search_page (notebook, NULL, step, TRUE);
|
|
while (children)
|
|
{
|
|
page = children->data;
|
|
@@ -3069,10 +3261,15 @@
|
|
GdkRectangle arrow_rect;
|
|
GtkArrowType arrow;
|
|
gboolean is_rtl, left;
|
|
+ gint arrow_width, arrow_height;
|
|
|
|
gtk_notebook_get_arrow_rect (notebook, &arrow_rect, nbarrow);
|
|
|
|
widget = GTK_WIDGET (notebook);
|
|
+ gtk_widget_style_get (widget,
|
|
+ "arrow-width", &arrow_width,
|
|
+ "arrow-height", &arrow_height,
|
|
+ NULL);
|
|
|
|
is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
|
|
left = (ARROW_IS_LEFT (nbarrow) && !is_rtl) ||
|
|
@@ -3112,7 +3309,7 @@
|
|
gtk_paint_arrow (widget->style, widget->window, state_type,
|
|
shadow_type, NULL, widget, "notebook",
|
|
arrow, TRUE, arrow_rect.x, arrow_rect.y,
|
|
- ARROW_SIZE, ARROW_SIZE);
|
|
+ arrow_width, arrow_height);
|
|
}
|
|
}
|
|
|
|
@@ -3143,13 +3340,25 @@
|
|
gboolean is_rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL &&
|
|
(tab_pos == GTK_POS_TOP || tab_pos == GTK_POS_BOTTOM));
|
|
gint memo_x;
|
|
+ gboolean truncate = FALSE;
|
|
+ gint arrow_width, arrow_height, arrow_spacing, tab_overlap;
|
|
+ gint total_width, ideal_tab_width, n_expanding_tabs;
|
|
|
|
if (!notebook->show_tabs || !notebook->children || !notebook->cur_page)
|
|
return;
|
|
|
|
+ gtk_widget_style_get (widget,
|
|
+ "arrow-width", &arrow_width,
|
|
+ "arrow-height", &arrow_height,
|
|
+ "arrow-spacing", &arrow_spacing,
|
|
+ "tab-overlap", &tab_overlap,
|
|
+ NULL);
|
|
+
|
|
child_allocation.x = widget->allocation.x + container->border_width;
|
|
child_allocation.y = widget->allocation.y + container->border_width;
|
|
|
|
+ total_width = allocation->width - 2 * container->border_width - tab_overlap;
|
|
+
|
|
switch (tab_pos)
|
|
{
|
|
case GTK_POS_BOTTOM:
|
|
@@ -3198,27 +3407,26 @@
|
|
if (GTK_WIDGET_VISIBLE (page->child))
|
|
tab_space += page->requisition.width;
|
|
}
|
|
- if (tab_space >
|
|
- allocation->width - 2 * container->border_width - TAB_OVERLAP)
|
|
+ if (tab_space > total_width)
|
|
{
|
|
showarrow = TRUE;
|
|
page = focus_tab->data;
|
|
|
|
- tab_space = allocation->width - TAB_OVERLAP -
|
|
+ tab_space = allocation->width - tab_overlap -
|
|
page->requisition.width - 2 * container->border_width;
|
|
if (notebook->has_after_previous)
|
|
- tab_space -= ARROW_SPACING + ARROW_SIZE;
|
|
+ tab_space -= arrow_spacing + arrow_width;
|
|
if (notebook->has_after_next)
|
|
- tab_space -= ARROW_SPACING + ARROW_SIZE;
|
|
+ tab_space -= arrow_spacing + arrow_width;
|
|
if (notebook->has_before_previous)
|
|
{
|
|
- tab_space -= ARROW_SPACING + ARROW_SIZE;
|
|
- child_allocation.x += ARROW_SPACING + ARROW_SIZE;
|
|
+ tab_space -= arrow_spacing + arrow_width;
|
|
+ child_allocation.x += arrow_spacing + arrow_width;
|
|
}
|
|
if (notebook->has_before_next)
|
|
{
|
|
- tab_space -= ARROW_SPACING + ARROW_SIZE;
|
|
- child_allocation.x += ARROW_SPACING + ARROW_SIZE;
|
|
+ tab_space -= arrow_spacing + arrow_width;
|
|
+ child_allocation.x += arrow_spacing + arrow_width;
|
|
}
|
|
}
|
|
break;
|
|
@@ -3233,19 +3441,19 @@
|
|
tab_space += page->requisition.height;
|
|
}
|
|
if (tab_space >
|
|
- (allocation->height - 2 * container->border_width - TAB_OVERLAP))
|
|
+ (allocation->height - 2 * container->border_width - tab_overlap))
|
|
{
|
|
showarrow = TRUE;
|
|
page = focus_tab->data;
|
|
tab_space = allocation->height
|
|
- - TAB_OVERLAP - 2 * container->border_width
|
|
+ - tab_overlap - 2 * container->border_width
|
|
- page->requisition.height;
|
|
if (notebook->has_after_previous || notebook->has_after_next)
|
|
- tab_space -= ARROW_SPACING + ARROW_SIZE;
|
|
+ tab_space -= arrow_spacing + arrow_height;
|
|
if (notebook->has_before_previous || notebook->has_before_next)
|
|
{
|
|
- tab_space -= ARROW_SPACING + ARROW_SIZE;
|
|
- child_allocation.y += ARROW_SPACING + ARROW_SIZE;
|
|
+ tab_space -= arrow_spacing + arrow_height;
|
|
+ child_allocation.y += arrow_spacing + arrow_height;
|
|
}
|
|
}
|
|
break;
|
|
@@ -3257,6 +3465,10 @@
|
|
notebook->first_tab = focus_tab;
|
|
last_child = gtk_notebook_search_page (notebook, focus_tab,
|
|
STEP_NEXT, TRUE);
|
|
+
|
|
+ /* Hildon: there is only one visible tab label
|
|
+ and it doesn't fit unless it is truncated */
|
|
+ truncate = TRUE;
|
|
}
|
|
else
|
|
{
|
|
@@ -3413,7 +3625,7 @@
|
|
}
|
|
tab_space -= allocation->height;
|
|
}
|
|
- tab_space += 2 * container->border_width + TAB_OVERLAP;
|
|
+ tab_space += 2 * container->border_width + tab_overlap;
|
|
tab_space *= -1;
|
|
notebook->first_tab = gtk_notebook_search_page (notebook, NULL,
|
|
STEP_NEXT, TRUE);
|
|
@@ -3432,12 +3644,29 @@
|
|
if (showarrow)
|
|
{
|
|
if (notebook->has_after_previous)
|
|
- child_allocation.x -= ARROW_SPACING + ARROW_SIZE;
|
|
+ child_allocation.x -= arrow_spacing + arrow_width;
|
|
if (notebook->has_after_next)
|
|
- child_allocation.x -= ARROW_SPACING + ARROW_SIZE;
|
|
+ child_allocation.x -= arrow_spacing + arrow_width;
|
|
}
|
|
}
|
|
|
|
+ ideal_tab_width = (total_width / n);
|
|
+ n_expanding_tabs = 0;
|
|
+
|
|
+ while (children)
|
|
+ {
|
|
+ if (children == last_child)
|
|
+ break;
|
|
+
|
|
+ page = children->data;
|
|
+ children = gtk_notebook_search_page (notebook, children, STEP_NEXT,TRUE);
|
|
+
|
|
+ if (page->requisition.width <= ideal_tab_width)
|
|
+ n_expanding_tabs++;
|
|
+ }
|
|
+
|
|
+ children = notebook->first_tab;
|
|
+
|
|
while (children)
|
|
{
|
|
if (children == last_child)
|
|
@@ -3452,9 +3681,11 @@
|
|
children = gtk_notebook_search_page (notebook, children, STEP_NEXT,TRUE);
|
|
|
|
delta = 0;
|
|
- if (n && (showarrow || page->expand || notebook->homogeneous))
|
|
+
|
|
+ if (n && (showarrow || page->expand || notebook->homogeneous) &&
|
|
+ (page->requisition.width <= ideal_tab_width))
|
|
{
|
|
- new_fill = (tab_space * i++) / n;
|
|
+ new_fill = (tab_space * i++) / n_expanding_tabs;
|
|
delta = new_fill - old_fill;
|
|
old_fill = new_fill;
|
|
}
|
|
@@ -3463,15 +3694,18 @@
|
|
{
|
|
case GTK_POS_TOP:
|
|
case GTK_POS_BOTTOM:
|
|
+ if (truncate)
|
|
+ delta *= -1;
|
|
+
|
|
child_allocation.width = (page->requisition.width +
|
|
- TAB_OVERLAP + delta);
|
|
+ tab_overlap + delta);
|
|
if (is_rtl)
|
|
child_allocation.x -= child_allocation.width;
|
|
break;
|
|
case GTK_POS_LEFT:
|
|
case GTK_POS_RIGHT:
|
|
child_allocation.height = (page->requisition.height +
|
|
- TAB_OVERLAP + delta);
|
|
+ tab_overlap + delta);
|
|
break;
|
|
}
|
|
|
|
@@ -3482,13 +3716,13 @@
|
|
case GTK_POS_TOP:
|
|
case GTK_POS_BOTTOM:
|
|
if (!is_rtl)
|
|
- child_allocation.x += child_allocation.width - TAB_OVERLAP;
|
|
+ child_allocation.x += child_allocation.width - tab_overlap;
|
|
else
|
|
- child_allocation.x += TAB_OVERLAP;
|
|
+ child_allocation.x += tab_overlap;
|
|
break;
|
|
case GTK_POS_LEFT:
|
|
case GTK_POS_RIGHT:
|
|
- child_allocation.y += child_allocation.height - TAB_OVERLAP;
|
|
+ child_allocation.y += child_allocation.height - tab_overlap;
|
|
break;
|
|
}
|
|
|
|
@@ -3538,14 +3772,14 @@
|
|
case GTK_POS_TOP:
|
|
case GTK_POS_BOTTOM:
|
|
child_allocation.width = (page->requisition.width +
|
|
- TAB_OVERLAP + delta);
|
|
+ tab_overlap + delta);
|
|
if (!is_rtl)
|
|
child_allocation.x -= child_allocation.width;
|
|
break;
|
|
case GTK_POS_LEFT:
|
|
case GTK_POS_RIGHT:
|
|
child_allocation.height = (page->requisition.height +
|
|
- TAB_OVERLAP + delta);
|
|
+ tab_overlap + delta);
|
|
child_allocation.y -= child_allocation.height;
|
|
break;
|
|
}
|
|
@@ -3557,13 +3791,13 @@
|
|
case GTK_POS_TOP:
|
|
case GTK_POS_BOTTOM:
|
|
if (!is_rtl)
|
|
- child_allocation.x += TAB_OVERLAP;
|
|
+ child_allocation.x += tab_overlap;
|
|
else
|
|
- child_allocation.x += child_allocation.width - TAB_OVERLAP;
|
|
+ child_allocation.x += child_allocation.width - tab_overlap;
|
|
break;
|
|
case GTK_POS_LEFT:
|
|
case GTK_POS_RIGHT:
|
|
- child_allocation.y += TAB_OVERLAP;
|
|
+ child_allocation.y += tab_overlap;
|
|
break;
|
|
}
|
|
|
|
@@ -3589,8 +3823,12 @@
|
|
gint padding;
|
|
gint focus_width;
|
|
gint tab_pos = get_effective_tab_pos (notebook);
|
|
+ gint tab_curvature;
|
|
|
|
- gtk_widget_style_get (widget, "focus-line-width", &focus_width, NULL);
|
|
+ gtk_widget_style_get (widget,
|
|
+ "focus-line-width", &focus_width,
|
|
+ "tab-curvature", &tab_curvature,
|
|
+ NULL);
|
|
|
|
xthickness = widget->style->xthickness;
|
|
ythickness = widget->style->ythickness;
|
|
@@ -3621,7 +3859,7 @@
|
|
{
|
|
case GTK_POS_TOP:
|
|
case GTK_POS_BOTTOM:
|
|
- padding = TAB_CURVATURE + focus_width + notebook->tab_hborder;
|
|
+ padding = tab_curvature + focus_width + notebook->tab_hborder;
|
|
if (page->fill)
|
|
{
|
|
child_allocation.x = (xthickness + focus_width +
|
|
@@ -3646,7 +3884,7 @@
|
|
break;
|
|
case GTK_POS_LEFT:
|
|
case GTK_POS_RIGHT:
|
|
- padding = TAB_CURVATURE + focus_width + notebook->tab_vborder;
|
|
+ padding = tab_curvature + focus_width + notebook->tab_vborder;
|
|
if (page->fill)
|
|
{
|
|
child_allocation.y = ythickness + padding;
|
|
@@ -4340,7 +4578,7 @@
|
|
}
|
|
page->tab_label = tab_label;
|
|
page->menu_label = menu_label;
|
|
- page->expand = FALSE;
|
|
+ page->expand = TRUE;
|
|
page->fill = TRUE;
|
|
page->pack = GTK_PACK_START;
|
|
|
|
@@ -5046,6 +5284,7 @@
|
|
{
|
|
page->default_tab = FALSE;
|
|
page->tab_label = tab_label;
|
|
+
|
|
gtk_widget_set_parent (page->tab_label, GTK_WIDGET (notebook));
|
|
}
|
|
else
|