Fixes #959. In xtext.c:find_x() return offset to hidden text if appropriate.
This commit is contained in:
parent
015cecf724
commit
6fb8cf40e1
|
@ -172,6 +172,7 @@ gtk_xtext_text_width_8bit (GtkXText *xtext, unsigned char *str, int len)
|
||||||
|
|
||||||
#define EMPH_ITAL 1
|
#define EMPH_ITAL 1
|
||||||
#define EMPH_BOLD 2
|
#define EMPH_BOLD 2
|
||||||
|
#define EMPH_HIDDEN 4
|
||||||
static PangoAttrList *attr_lists[4];
|
static PangoAttrList *attr_lists[4];
|
||||||
static int fontwidths[4][128];
|
static int fontwidths[4][128];
|
||||||
|
|
||||||
|
@ -311,6 +312,10 @@ backend_get_text_width_emph (GtkXText *xtext, guchar *str, int len, int emphasis
|
||||||
if (*str == 0)
|
if (*str == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if ((emphasis & EMPH_HIDDEN))
|
||||||
|
return 0;
|
||||||
|
emphasis &= (EMPH_ITAL | EMPH_BOLD);
|
||||||
|
|
||||||
width = 0;
|
width = 0;
|
||||||
pango_layout_set_attributes (xtext->layout, attr_lists[emphasis]);
|
pango_layout_set_attributes (xtext->layout, attr_lists[emphasis]);
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
|
@ -823,6 +828,7 @@ find_x (GtkXText *xtext, textentry *ent, int x, int subline, int indent)
|
||||||
int xx = indent;
|
int xx = indent;
|
||||||
int suboff;
|
int suboff;
|
||||||
GSList *list;
|
GSList *list;
|
||||||
|
GSList *hid = NULL;
|
||||||
offlen_t *meta;
|
offlen_t *meta;
|
||||||
int off, len, wid, mbl, mbw;
|
int off, len, wid, mbl, mbw;
|
||||||
|
|
||||||
|
@ -847,6 +853,8 @@ find_x (GtkXText *xtext, textentry *ent, int x, int subline, int indent)
|
||||||
meta = list->data;
|
meta = list->data;
|
||||||
off = meta->off;
|
off = meta->off;
|
||||||
len = meta->len;
|
len = meta->len;
|
||||||
|
if (meta->emph & EMPH_HIDDEN)
|
||||||
|
hid = list;
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
if (off >= suboff)
|
if (off >= suboff)
|
||||||
|
@ -873,6 +881,8 @@ find_x (GtkXText *xtext, textentry *ent, int x, int subline, int indent)
|
||||||
off += mbl;
|
off += mbl;
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
|
if (meta->emph & EMPH_HIDDEN)
|
||||||
|
hid = list;
|
||||||
list = g_slist_next (list);
|
list = g_slist_next (list);
|
||||||
if (list == NULL)
|
if (list == NULL)
|
||||||
return ent->str_len;
|
return ent->str_len;
|
||||||
|
@ -882,6 +892,13 @@ find_x (GtkXText *xtext, textentry *ent, int x, int subline, int indent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If previous chunk exists and is marked hidden, regard it as unhidden */
|
||||||
|
if (hid && list && hid->next == list)
|
||||||
|
{
|
||||||
|
meta = hid->data;
|
||||||
|
off = meta->off;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return offset of character at x within subline */
|
/* Return offset of character at x within subline */
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
|
@ -908,7 +925,8 @@ gtk_xtext_find_x (GtkXText * xtext, int x, textentry * ent, int subline,
|
||||||
if (str >= ent->str + ent->str_len)
|
if (str >= ent->str + ent->str_len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (x < indent)
|
/* Let user select left a few pixels to grab hidden text e.g. '<' */
|
||||||
|
if (x < indent - xtext->space_width)
|
||||||
{
|
{
|
||||||
*out_of_bounds = 1;
|
*out_of_bounds = 1;
|
||||||
return (str - ent->str);
|
return (str - ent->str);
|
||||||
|
@ -2410,10 +2428,11 @@ gtk_xtext_strip_color (unsigned char *text, int len, unsigned char *outbuf,
|
||||||
break;
|
break;
|
||||||
case ATTR_HIDDEN:
|
case ATTR_HIDDEN:
|
||||||
xtext_do_chunk (&c);
|
xtext_do_chunk (&c);
|
||||||
|
c.emph ^= EMPH_HIDDEN;
|
||||||
hidden = !hidden;
|
hidden = !hidden;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!(hidden && strip_hidden))
|
if (strip_hidden == 2 || (!(hidden && strip_hidden)))
|
||||||
{
|
{
|
||||||
if (c.len1 == 0)
|
if (c.len1 == 0)
|
||||||
c.off1 = text - text0;
|
c.off1 = text - text0;
|
||||||
|
@ -2459,7 +2478,7 @@ gtk_xtext_text_width_ent (GtkXText *xtext, textentry *ent)
|
||||||
}
|
}
|
||||||
|
|
||||||
new_buf = gtk_xtext_strip_color (ent->str, ent->str_len, xtext->scratch_buffer,
|
new_buf = gtk_xtext_strip_color (ent->str, ent->str_len, xtext->scratch_buffer,
|
||||||
NULL, &slp0, !xtext->ignore_hidden);
|
NULL, &slp0, 2);
|
||||||
|
|
||||||
width = backend_get_text_width_slp (xtext, new_buf, slp0);
|
width = backend_get_text_width_slp (xtext, new_buf, slp0);
|
||||||
ent->slp = slp0;
|
ent->slp = slp0;
|
||||||
|
|
Loading…
Reference in New Issue