summaryrefslogtreecommitdiff
path: root/gtk/gtktextview.c
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2018-02-16 17:39:02 +0100
committerTimm Bäder <mail@baedert.org>2018-02-16 17:41:41 +0100
commit78c6f713ddf4cb756bd4c060d61f8b0153429928 (patch)
tree9e5eed6404a42b5c1be225e492d55fc372c0a14a /gtk/gtktextview.c
parent689537d75b9fc59be313fdbfd0582af04716d7be (diff)
downloadgtk+-78c6f713ddf4cb756bd4c060d61f8b0153429928.tar.gz
textview: Implement measure()
Don't use the current layout size as minimum size anymore, that doesn't make sense. Also move the code from size_request() from gtk2 into the now current measure() function.
Diffstat (limited to 'gtk/gtktextview.c')
-rw-r--r--gtk/gtktextview.c118
1 files changed, 26 insertions, 92 deletions
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 9e6964727d..85f2207d38 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -194,18 +194,6 @@ struct _GtkTextViewPrivate
gint width;
gint height;
- /* This is used to monitor the overall size request
- * and decide whether we need to queue resizes when
- * the buffer content changes.
- *
- * FIXME: This could be done in a simpler way by
- * consulting the above width/height of the buffer + some
- * padding values, however all of this request code needs
- * to be changed to use GtkWidget Iface and deserves
- * more attention.
- */
- GtkRequisition cached_size_request;
-
/* The virtual cursor position is normally the same as the
* actual (strong) cursor position, except in two circumstances:
*
@@ -373,8 +361,6 @@ static void gtk_text_view_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
static void gtk_text_view_destroy (GtkWidget *widget);
-static void gtk_text_view_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
static void gtk_text_view_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
@@ -3899,87 +3885,52 @@ gtk_text_view_get_property (GObject *object,
}
static void
-gtk_text_view_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
+gtk_text_view_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ int for_size,
+ int *minimum,
+ int *natural,
+ int *minimum_baseline,
+ int *natural_baseline)
{
- GtkTextView *text_view;
- GtkTextViewPrivate *priv;
+ GtkTextViewPrivate *priv = GTK_TEXT_VIEW (widget)->priv;
+ int min = 0, nat = 0;
GSList *tmp_list;
- text_view = GTK_TEXT_VIEW (widget);
- priv = text_view->priv;
-
- if (priv->layout)
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
- requisition->width = priv->layout->width;
- requisition->height = priv->layout->height;
+ min += priv->border_window_size.left + priv->border_window_size.right;
+ min += priv->left_margin + priv->right_margin;
}
- else
+ else /* orientation == VERTICAL */
{
- requisition->width = 0;
- requisition->height = 0;
+ min += priv->border_window_size.top + priv->border_window_size.bottom;
+ min += priv->top_margin + priv->bottom_margin;
}
-
- requisition->width += priv->border_window_size.left + priv->border_window_size.right;
- requisition->height += priv->border_window_size.top + priv->border_window_size.bottom;
- requisition->height += priv->top_margin + priv->bottom_margin;
- requisition->width += priv->left_margin + priv->right_margin;
+ nat = min;
tmp_list = priv->children;
while (tmp_list != NULL)
{
GtkTextViewChild *child = tmp_list->data;
+ int child_min = 0, child_nat = 0;
- if (child->anchor)
- {
- GtkRequisition child_req;
- GtkRequisition old_req;
+ gtk_widget_measure (child->widget, orientation, for_size, &child_min, &child_nat, NULL, NULL);
- gtk_widget_get_preferred_size (child->widget, &old_req, NULL);
+ /* Invalidate layout lines if required */
+ if (child->anchor && priv->layout)
+ gtk_text_child_anchor_queue_resize (child->anchor,
+ priv->layout);
- gtk_widget_get_preferred_size (child->widget, &child_req, NULL);
-
- /* Invalidate layout lines if required */
- if (priv->layout &&
- (old_req.width != child_req.width ||
- old_req.height != child_req.height))
- gtk_text_child_anchor_queue_resize (child->anchor,
- priv->layout);
- }
- else
- {
- GtkRequisition child_req;
-
- gtk_widget_get_preferred_size (child->widget,
- &child_req, NULL);
- }
+ min = MAX (min, child_min);
+ nat = MAX (nat, child_nat);
tmp_list = tmp_list->next;
}
- /* Cache the requested size of the text view so we can
- * compare it in the changed_handler() */
- priv->cached_size_request = *requisition;
-}
-
-static void
-gtk_text_view_measure (GtkWidget *widget,
- GtkOrientation orientation,
- int for_size,
- int *minimum,
- int *natural,
- int *minimum_baseline,
- int *natural_baseline)
-{
- GtkRequisition requisition;
-
- gtk_text_view_size_request (widget, &requisition);
-
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- *minimum = *natural = requisition.width;
- else
- *minimum = *natural = requisition.height;
+ *minimum = min;
+ *natural = nat;
}
static void
@@ -4497,23 +4448,6 @@ changed_handler (GtkTextLayout *layout,
tmp_list = tmp_list->next;
}
}
-
- {
- GtkRequisition old_req = priv->cached_size_request;
- GtkRequisition new_req;
-
- /* Use this instead of gtk_widget_size_request wrapper
- * to avoid the optimization which just returns widget->requisition
- * if a resize hasn't been queued.
- */
- gtk_text_view_size_request (widget, &new_req);
-
- if (old_req.width != new_req.width ||
- old_req.height != new_req.height)
- {
- gtk_widget_queue_resize_no_redraw (widget);
- }
- }
}
static void