aboutsummaryrefslogtreecommitdiffstats
path: root/src/term.c
diff options
context:
space:
mode:
authorEli Zaretskii2010-04-20 16:31:28 +0300
committerEli Zaretskii2010-04-20 16:31:28 +0300
commit283ccc1841a43a9426b7fa4c397fc9593ae4022b (patch)
tree8365f6715bb866e6c07410f600ae2a43900f77d4 /src/term.c
parent3bb49aaf02507540cefed269bd410d318f8c81b4 (diff)
parent93d68d0c2b085f65a867024fb8e7e28a629a003a (diff)
downloademacs-283ccc1841a43a9426b7fa4c397fc9593ae4022b.tar.gz
emacs-283ccc1841a43a9426b7fa4c397fc9593ae4022b.zip
Implement GUI display of R2L lines, fix TTY display of R2L lines.
xdisp.c [HAVE_WINDOW_SYSTEM]: Add prototype for append_stretch_glyph. (set_cursor_from_row) <cursor_x>: Remove unused variable. Fix off-by-one error in computing x at end of text in the row. (append_stretch_glyph): In reversed row, prepend the glyph rather than append it. Set resolved_level and bidi_type of the glyph. (extend_face_to_end_of_line): If the row is reversed, prepend a stretch glyph whose width is such that the rightmost glyph will be drawn at the right margin of the window. Fix off-by-one error on TTY frames in testing whether a line needs face extension. Fix face extension at ZV. If this is the last glyph row, use DEFAULT_FACE_ID, to avoid painting the rest of the window with the region face. (set_cursor_from_row, display_line): Use MATRIX_ROW_CONTINUATION_LINE_P instead of testing value of row->continuation_lines_width. (next_element_from_buffer): Don't call bidi_paragraph_init if we are at ZV. Fixes a crash when reseated to ZV by try_window_reusing_current_matrix. (display_and_set_cursor, erase_phys_cursor): Handle negative HPOS, which happens with R2L glyph rows. Fixes a crash when inserting a character at end of an R2L line. (set_cursor_from_row): Don't be fooled by truncated rows: don't treat them as having zero-width characters. Improve comments. Don't reverse pos_before and pos_after for reversed glyph rows. Set cursor.x to negative value when the cursor might be on the left fringe. (IT_OVERFLOW_NEWLINE_INTO_FRINGE): For R2L lines, consider the left fringe, not the right one. (notice_overwritten_cursor, draw_phys_cursor_glyph) (erase_phys_cursor): For reversed cursor_row, support cursor on the left fringe. fringe.c (update_window_fringes): For R2L rows, swap the bitmaps of continuation indicators on the fringes. (draw_fringe_bitmap): For reversed glyph rows, allow cursor on the left fringe. w32term.c (w32_draw_window_cursor): For reversed glyph rows, draw cursor on the left fringe. xterm.c (x_draw_window_cursor): For reversed glyph rows, draw cursor on the left fringe. dispnew.c (update_text_area): Handle reversed desired rows when the cursor is on the left fringe. (set_window_cursor_after_update): Limit cursor's hpos by -1 from below, not by 0, for when the cursor is on the left fringe. xdisp.c (unproduce_glyphs): New function. (display_line): Use it when produced glyphs are discarded from R2L glyph rows. (append_composite_glyph): In R2L rows, prepend the glyph rather than appending it. term.c (append_composite_glyph): In R2L rows, prepend the glyph rather than append it. Set up the resolved_level and bidi_type attributes of the appended glyph. (produce_special_glyphs): Mirror the backslash continuation character in R2L lines.
Diffstat (limited to 'src/term.c')
-rw-r--r--src/term.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/term.c b/src/term.c
index 20f746decdb..bb143207758 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1589,7 +1589,6 @@ append_glyph (it)
1589 } 1589 }
1590} 1590}
1591 1591
1592
1593/* Produce glyphs for the display element described by IT. *IT 1592/* Produce glyphs for the display element described by IT. *IT
1594 specifies what we want to produce a glyph for (character, image, ...), 1593 specifies what we want to produce a glyph for (character, image, ...),
1595 and where in the glyph matrix we currently are (glyph row and hpos). 1594 and where in the glyph matrix we currently are (glyph row and hpos).
@@ -1808,6 +1807,17 @@ append_composite_glyph (it)
1808 glyph = it->glyph_row->glyphs[it->area] + it->glyph_row->used[it->area]; 1807 glyph = it->glyph_row->glyphs[it->area] + it->glyph_row->used[it->area];
1809 if (glyph < it->glyph_row->glyphs[1 + it->area]) 1808 if (glyph < it->glyph_row->glyphs[1 + it->area])
1810 { 1809 {
1810 /* If the glyph row is reversed, we need to prepend the glyph
1811 rather than append it. */
1812 if (it->glyph_row->reversed_p && it->area == TEXT_AREA)
1813 {
1814 struct glyph *g;
1815
1816 /* Make room for the new glyph. */
1817 for (g = glyph - 1; g >= it->glyph_row->glyphs[it->area]; g--)
1818 g[1] = *g;
1819 glyph = it->glyph_row->glyphs[it->area];
1820 }
1811 glyph->type = COMPOSITE_GLYPH; 1821 glyph->type = COMPOSITE_GLYPH;
1812 glyph->pixel_width = it->pixel_width; 1822 glyph->pixel_width = it->pixel_width;
1813 glyph->u.cmp.id = it->cmp_it.id; 1823 glyph->u.cmp.id = it->cmp_it.id;
@@ -1828,6 +1838,18 @@ append_composite_glyph (it)
1828 glyph->padding_p = 0; 1838 glyph->padding_p = 0;
1829 glyph->charpos = CHARPOS (it->position); 1839 glyph->charpos = CHARPOS (it->position);
1830 glyph->object = it->object; 1840 glyph->object = it->object;
1841 if (it->bidi_p)
1842 {
1843 glyph->resolved_level = it->bidi_it.resolved_level;
1844 if ((it->bidi_it.type & 7) != it->bidi_it.type)
1845 abort ();
1846 glyph->bidi_type = it->bidi_it.type;
1847 }
1848 else
1849 {
1850 glyph->resolved_level = 0;
1851 glyph->bidi_type = UNKNOWN_BT;
1852 }
1831 1853
1832 ++it->glyph_row->used[it->area]; 1854 ++it->glyph_row->used[it->area];
1833 ++glyph; 1855 ++glyph;
@@ -1889,12 +1911,16 @@ produce_special_glyphs (it, what)
1889 1911
1890 if (what == IT_CONTINUATION) 1912 if (what == IT_CONTINUATION)
1891 { 1913 {
1892 /* Continuation glyph. */ 1914 /* Continuation glyph. For R2L lines, we mirror it by hand. */
1893 SET_GLYPH_FROM_CHAR (glyph, '\\'); 1915 if (it->bidi_it.paragraph_dir == R2L)
1916 SET_GLYPH_FROM_CHAR (glyph, '/');
1917 else
1918 SET_GLYPH_FROM_CHAR (glyph, '\\');
1894 if (it->dp 1919 if (it->dp
1895 && (gc = DISP_CONTINUE_GLYPH (it->dp), GLYPH_CODE_P (gc)) 1920 && (gc = DISP_CONTINUE_GLYPH (it->dp), GLYPH_CODE_P (gc))
1896 && GLYPH_CODE_CHAR_VALID_P (gc)) 1921 && GLYPH_CODE_CHAR_VALID_P (gc))
1897 { 1922 {
1923 /* FIXME: Should we mirror GC for R2L lines? */
1898 SET_GLYPH_FROM_GLYPH_CODE (glyph, gc); 1924 SET_GLYPH_FROM_GLYPH_CODE (glyph, gc);
1899 spec_glyph_lookup_face (XWINDOW (it->window), &glyph); 1925 spec_glyph_lookup_face (XWINDOW (it->window), &glyph);
1900 } 1926 }
@@ -1907,6 +1933,7 @@ produce_special_glyphs (it, what)
1907 && (gc = DISP_TRUNC_GLYPH (it->dp), GLYPH_CODE_P (gc)) 1933 && (gc = DISP_TRUNC_GLYPH (it->dp), GLYPH_CODE_P (gc))
1908 && GLYPH_CODE_CHAR_VALID_P (gc)) 1934 && GLYPH_CODE_CHAR_VALID_P (gc))
1909 { 1935 {
1936 /* FIXME: Should we mirror GC for R2L lines? */
1910 SET_GLYPH_FROM_GLYPH_CODE (glyph, gc); 1937 SET_GLYPH_FROM_GLYPH_CODE (glyph, gc);
1911 spec_glyph_lookup_face (XWINDOW (it->window), &glyph); 1938 spec_glyph_lookup_face (XWINDOW (it->window), &glyph);
1912 } 1939 }