diff options
| author | Eli Zaretskii | 2010-04-20 16:31:28 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2010-04-20 16:31:28 +0300 |
| commit | 283ccc1841a43a9426b7fa4c397fc9593ae4022b (patch) | |
| tree | 8365f6715bb866e6c07410f600ae2a43900f77d4 /src/term.c | |
| parent | 3bb49aaf02507540cefed269bd410d318f8c81b4 (diff) | |
| parent | 93d68d0c2b085f65a867024fb8e7e28a629a003a (diff) | |
| download | emacs-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.c | 33 |
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 | } |