summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtktextlayout.c9
-rw-r--r--gtk/gtktextlayoutprivate.h3
-rw-r--r--gtk/gtktextlinedisplaycache.c30
-rw-r--r--gtk/gtktextlinedisplaycacheprivate.h2
-rw-r--r--gtk/gtktextview.c12
5 files changed, 54 insertions, 2 deletions
diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c
index fee6d59a4a..f51dd42fcb 100644
--- a/gtk/gtktextlayout.c
+++ b/gtk/gtktextlayout.c
@@ -4210,3 +4210,12 @@ gtk_text_line_display_compare (const GtkTextLineDisplay *display1,
else
return 0;
}
+
+void
+gtk_text_layout_set_mru_size (GtkTextLayout *layout,
+ guint mru_size)
+{
+ GtkTextLayoutPrivate *priv = GTK_TEXT_LAYOUT_GET_PRIVATE (layout);
+
+ gtk_text_line_display_cache_set_mru_size (priv->cache, mru_size);
+}
diff --git a/gtk/gtktextlayoutprivate.h b/gtk/gtktextlayoutprivate.h
index 27da15d2bd..99d4f812e8 100644
--- a/gtk/gtktextlayoutprivate.h
+++ b/gtk/gtktextlayoutprivate.h
@@ -414,6 +414,9 @@ void gtk_text_layout_snapshot (GtkTextLayout *layout,
const GdkRectangle *clip,
float cursor_alpha);
+void gtk_text_layout_set_mru_size (GtkTextLayout *layout,
+ guint mru_size);
+
G_END_DECLS
#endif /* __GTK_TEXT_LAYOUT_PRIVATE_H__ */
diff --git a/gtk/gtktextlinedisplaycache.c b/gtk/gtktextlinedisplaycache.c
index 267d9f6182..2fe174c0f6 100644
--- a/gtk/gtktextlinedisplaycache.c
+++ b/gtk/gtktextlinedisplaycache.c
@@ -24,7 +24,7 @@
#include "gtktextiterprivate.h"
#include "gtktextlinedisplaycacheprivate.h"
-#define MRU_MAX_SIZE 250
+#define DEFAULT_MRU_SIZE 250
#define BLOW_CACHE_TIMEOUT_SEC 20
#define DEBUG_LINE_DISPLAY_CACHE 0
@@ -35,6 +35,7 @@ struct _GtkTextLineDisplayCache
GtkTextLine *cursor_line;
GQueue mru;
GSource *evict_source;
+ guint mru_size;
#if DEBUG_LINE_DISPLAY_CACHE
guint log_source;
@@ -78,6 +79,7 @@ gtk_text_line_display_cache_new (void)
ret = g_slice_new0 (GtkTextLineDisplayCache);
ret->sorted_by_line = g_sequence_new ((GDestroyNotify)gtk_text_line_display_unref);
ret->line_to_display = g_hash_table_new (NULL, NULL);
+ ret->mru_size = DEFAULT_MRU_SIZE;
#if DEBUG_LINE_DISPLAY_CACHE
ret->log_source = g_timeout_add_seconds (1, dump_stats, ret);
@@ -200,7 +202,7 @@ gtk_text_line_display_cache_take_display (GtkTextLineDisplayCache *cache,
g_queue_push_head_link (&cache->mru, &display->mru_link);
/* Cull the cache if we're at capacity */
- while (cache->mru.length > MRU_MAX_SIZE)
+ while (cache->mru.length > cache->mru_size)
{
display = g_queue_peek_tail (&cache->mru);
@@ -716,3 +718,27 @@ gtk_text_line_display_cache_set_cursor_line (GtkTextLineDisplayCache *cache,
if (display != NULL)
gtk_text_line_display_cache_invalidate_display (cache, display, FALSE);
}
+
+void
+gtk_text_line_display_cache_set_mru_size (GtkTextLineDisplayCache *cache,
+ guint mru_size)
+{
+ GtkTextLineDisplay *display;
+
+ g_assert (cache != NULL);
+
+ if (mru_size == 0)
+ mru_size = DEFAULT_MRU_SIZE;
+
+ if (mru_size != cache->mru_size)
+ {
+ cache->mru_size = mru_size;
+
+ while (cache->mru.length > cache->mru_size)
+ {
+ display = g_queue_peek_tail (&cache->mru);
+
+ gtk_text_line_display_cache_invalidate_display (cache, display, FALSE);
+ }
+ }
+}
diff --git a/gtk/gtktextlinedisplaycacheprivate.h b/gtk/gtktextlinedisplaycacheprivate.h
index 5639ec2070..89adbffc2d 100644
--- a/gtk/gtktextlinedisplaycacheprivate.h
+++ b/gtk/gtktextlinedisplaycacheprivate.h
@@ -53,6 +53,8 @@ void gtk_text_line_display_cache_invalidate_y_range (GtkText
gint y,
gint height,
gboolean cursors_only);
+void gtk_text_line_display_cache_set_mru_size (GtkTextLineDisplayCache *cache,
+ guint mru_size);
G_END_DECLS
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 6d405df097..1d01f9c454 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -4109,6 +4109,8 @@ gtk_text_view_size_allocate (GtkWidget *widget,
GdkRectangle top_rect;
GdkRectangle bottom_rect;
GtkWidget *chooser;
+ PangoLayout *layout;
+ guint mru_size;
text_view = GTK_TEXT_VIEW (widget);
priv = text_view->priv;
@@ -4178,6 +4180,16 @@ gtk_text_view_size_allocate (GtkWidget *widget,
if (!gtk_adjustment_is_animating (priv->vadjustment))
gtk_text_view_set_vadjustment_values (text_view);
+ /* Optimize display cache size */
+ layout = gtk_widget_create_pango_layout (widget, "X");
+ pango_layout_get_pixel_size (layout, &width, &height);
+ if (height > 0)
+ {
+ mru_size = SCREEN_HEIGHT (widget) / height * 3;
+ gtk_text_layout_set_mru_size (priv->layout, mru_size);
+ }
+ g_object_unref (layout);
+
/* The GTK resize loop processes all the pending exposes right
* after doing the resize stuff, so the idle sizer won't have a
* chance to run. So we do the work here.