summaryrefslogtreecommitdiff
path: root/src/inlinebox.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/inlinebox.c')
-rw-r--r--src/inlinebox.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/inlinebox.c b/src/inlinebox.c
index 43b75fa..7eeaeae 100644
--- a/src/inlinebox.c
+++ b/src/inlinebox.c
@@ -165,6 +165,29 @@ inline_box_draw (GtkWidget *widget,
sel_width, ibt->alloc.height);
gtk_style_context_remove_class(styleCtx, "rubberband");
}
+ /* duplication here (todo) */
+ if (ib->match_start <= text_position + text_len &&
+ ib->match_end >= text_position) {
+ guint sel_start = ibt->alloc.x, sel_width = ibt->alloc.width;
+ gint x_pos;
+ if (ib->match_start > text_position) {
+ pango_layout_index_to_line_x(ibt->layout,
+ ib->match_start - text_position,
+ FALSE, NULL, &x_pos);
+ sel_start += x_pos / PANGO_SCALE;
+ sel_width -= x_pos / PANGO_SCALE;
+ }
+ if (ib->match_end < text_position + text_len) {
+ pango_layout_index_to_line_x(ibt->layout,
+ ib->match_end - text_position,
+ FALSE, NULL, &x_pos);
+ sel_width -= ibt->alloc.width - x_pos / PANGO_SCALE;
+ }
+ gtk_style_context_add_class(styleCtx, "rubberband");
+ gtk_render_background(styleCtx, cr, sel_start, ibt->alloc.y,
+ sel_width, ibt->alloc.height);
+ gtk_style_context_remove_class(styleCtx, "rubberband");
+ }
gtk_render_layout(styleCtx, cr, ibt->alloc.x, ibt->alloc.y, ibt->layout);
@@ -583,3 +606,40 @@ inline_box_forall (GtkContainer *container, gboolean include_internals,
child = next;
}
}
+
+gchar*
+inline_box_get_text (InlineBox *ib)
+{
+ GList *child;
+ gchar **words = calloc(g_list_length(ib->children) + 1, sizeof(gchar*));
+ guint n = 0;
+ for (child = ib->children; child; child = child->next) {
+ if (IS_IB_TEXT(child->data)) {
+ words[n] = (gchar*)pango_layout_get_text(IB_TEXT(child->data)->layout);
+ n++;
+ }
+ }
+ gchar *result = g_strjoinv(NULL, words);
+ free(words);
+ return result;
+}
+
+gint
+inline_box_search (InlineBox *ib,
+ guint start,
+ gint end,
+ const gchar *str)
+{
+ gchar *orig_text = inline_box_get_text(ib);
+ gchar *text = g_utf8_strdown(orig_text, -1);
+ g_free(orig_text);
+ if (end != -1) {
+ end -= start;
+ }
+ gchar *result = g_strstr_len(text + start, end, str);
+ g_free(text);
+ if (result != NULL) {
+ return result - text;
+ }
+ return -1;
+}