… | |
… | |
48 | |
48 | |
49 | /* ------------------------------------------------------------------------- * |
49 | /* ------------------------------------------------------------------------- * |
50 | * GENERAL SCREEN AND SELECTION UPDATE ROUTINES * |
50 | * GENERAL SCREEN AND SELECTION UPDATE ROUTINES * |
51 | * ------------------------------------------------------------------------- */ |
51 | * ------------------------------------------------------------------------- */ |
52 | #define ZERO_SCROLLBACK() \ |
52 | #define ZERO_SCROLLBACK() \ |
53 | if ((Options & Opt_scrollTtyOutput) == Opt_scrollTtyOutput) \ |
53 | if (Options & Opt_scrollTtyOutput) \ |
54 | TermWin.view_start = 0 |
54 | TermWin.view_start = 0 |
55 | #define CLEAR_SELECTION() \ |
55 | #define CLEAR_SELECTION() \ |
56 | selection.beg.row = selection.beg.col \ |
56 | selection.beg.row = selection.beg.col \ |
57 | = selection.end.row = selection.end.col = 0 |
57 | = selection.end.row = selection.end.col = 0 |
58 | #define CLEAR_ALL_SELECTION() \ |
58 | #define CLEAR_ALL_SELECTION() \ |
59 | selection.beg.row = selection.beg.col \ |
59 | selection.beg.row = selection.beg.col \ |
60 | = selection.mark.row = selection.mark.col \ |
60 | = selection.mark.row = selection.mark.col \ |
61 | = selection.end.row = selection.end.col = 0 |
61 | = selection.end.row = selection.end.col = 0 |
62 | |
62 | |
63 | #define ROW_AND_COL_IS_AFTER(A, B, C, D) \ |
63 | #define ROW_AND_COL_IS_AFTER(A, B, C, D) \ |
64 | (((A) > (C)) || (((A) == (C)) && ((B) > (D)))) |
64 | (((A) > (C)) || (((A) == (C)) && ((B) > (D)))) |
65 | #define ROW_AND_COL_IS_BEFORE(A, B, C, D) \ |
65 | #define ROW_AND_COL_IS_BEFORE(A, B, C, D) \ |
66 | (((A) < (C)) || (((A) == (C)) && ((B) < (D)))) |
66 | (((A) < (C)) || (((A) == (C)) && ((B) < (D)))) |
67 | #define ROW_AND_COL_IN_ROW_AFTER(A, B, C, D) \ |
67 | #define ROW_AND_COL_IN_ROW_AFTER(A, B, C, D) \ |
68 | (((A) == (C)) && ((B) > (D))) |
68 | (((A) == (C)) && ((B) > (D))) |
69 | #define ROW_AND_COL_IN_ROW_AT_OR_AFTER(A, B, C, D) \ |
69 | #define ROW_AND_COL_IN_ROW_AT_OR_AFTER(A, B, C, D) \ |
70 | (((A) == (C)) && ((B) >= (D))) |
70 | (((A) == (C)) && ((B) >= (D))) |
71 | #define ROW_AND_COL_IN_ROW_BEFORE(A, B, C, D) \ |
71 | #define ROW_AND_COL_IN_ROW_BEFORE(A, B, C, D) \ |
72 | (((A) == (C)) && ((B) < (D))) |
72 | (((A) == (C)) && ((B) < (D))) |
73 | #define ROW_AND_COL_IN_ROW_AT_OR_BEFORE(A, B, C, D) \ |
73 | #define ROW_AND_COL_IN_ROW_AT_OR_BEFORE(A, B, C, D) \ |
74 | (((A) == (C)) && ((B) <= (D))) |
74 | (((A) == (C)) && ((B) <= (D))) |
75 | |
75 | |
76 | /* these must be row_col_t */ |
76 | /* these must be row_col_t */ |
77 | #define ROWCOL_IS_AFTER(X, Y) \ |
77 | #define ROWCOL_IS_AFTER(X, Y) \ |
78 | ROW_AND_COL_IS_AFTER ((X).row, (X).col, (Y).row, (Y).col) |
78 | ROW_AND_COL_IS_AFTER ((X).row, (X).col, (Y).row, (Y).col) |
79 | #define ROWCOL_IS_BEFORE(X, Y) \ |
79 | #define ROWCOL_IS_BEFORE(X, Y) \ |
80 | ROW_AND_COL_IS_BEFORE ((X).row, (X).col, (Y).row, (Y).col) |
80 | ROW_AND_COL_IS_BEFORE ((X).row, (X).col, (Y).row, (Y).col) |
81 | #define ROWCOL_IN_ROW_AFTER(X, Y) \ |
81 | #define ROWCOL_IN_ROW_AFTER(X, Y) \ |
82 | ROW_AND_COL_IN_ROW_AFTER ((X).row, (X).col, (Y).row, (Y).col) |
82 | ROW_AND_COL_IN_ROW_AFTER ((X).row, (X).col, (Y).row, (Y).col) |
83 | #define ROWCOL_IN_ROW_BEFORE(X, Y) \ |
83 | #define ROWCOL_IN_ROW_BEFORE(X, Y) \ |
84 | ROW_AND_COL_IN_ROW_BEFORE ((X).row, (X).col, (Y).row, (Y).col) |
84 | ROW_AND_COL_IN_ROW_BEFORE ((X).row, (X).col, (Y).row, (Y).col) |
85 | #define ROWCOL_IN_ROW_AT_OR_AFTER(X, Y) \ |
85 | #define ROWCOL_IN_ROW_AT_OR_AFTER(X, Y) \ |
86 | ROW_AND_COL_IN_ROW_AT_OR_AFTER ((X).row, (X).col, (Y).row, (Y).col) |
86 | ROW_AND_COL_IN_ROW_AT_OR_AFTER ((X).row, (X).col, (Y).row, (Y).col) |
87 | #define ROWCOL_IN_ROW_AT_OR_BEFORE(X, Y) \ |
87 | #define ROWCOL_IN_ROW_AT_OR_BEFORE(X, Y) \ |
88 | ROW_AND_COL_IN_ROW_AT_OR_BEFORE ((X).row, (X).col, (Y).row, (Y).col) |
88 | ROW_AND_COL_IN_ROW_AT_OR_BEFORE ((X).row, (X).col, (Y).row, (Y).col) |
89 | |
89 | |
90 | /* |
90 | /* |
91 | * CLEAR_ROWS : clear <num> rows starting from row <row> |
91 | * CLEAR_ROWS : clear <num> rows starting from row <row> |
92 | * CLEAR_CHARS: clear <num> chars starting from pixel position <x,y> |
92 | * CLEAR_CHARS: clear <num> chars starting from pixel position <x,y> |
93 | * ERASE_ROWS : set <num> rows starting from row <row> to the foreground colour |
93 | * ERASE_ROWS : set <num> rows starting from row <row> to the foreground colour |
94 | */ |
94 | */ |
95 | #define drawBuffer TermWin.vt |
95 | #define drawBuffer TermWin.vt |
96 | |
96 | |
97 | #define CLEAR_ROWS(row, num) \ |
97 | #define CLEAR_ROWS(row, num) \ |
98 | if (TermWin.mapped) \ |
98 | if (TermWin.mapped) \ |
99 | XClearArea (display->display, drawBuffer, TermWin.int_bwidth, \ |
99 | XClearArea (display->display, drawBuffer, 0, \ |
100 | Row2Pixel (row), (unsigned int)TermWin.width, \ |
100 | Row2Pixel (row), (unsigned int)TermWin.width, \ |
101 | (unsigned int)Height2Pixel (num), False) |
101 | (unsigned int)Height2Pixel (num), False) |
102 | |
102 | |
103 | #define CLEAR_CHARS(x, y, num) \ |
103 | #define CLEAR_CHARS(x, y, num) \ |
104 | if (TermWin.mapped) \ |
104 | if (TermWin.mapped) \ |
105 | XClearArea (display->display, drawBuffer, x, y, \ |
105 | XClearArea (display->display, drawBuffer, x, y, \ |
106 | (unsigned int)Width2Pixel (num), \ |
106 | (unsigned int)Width2Pixel (num), \ |
107 | (unsigned int)Height2Pixel (1), False) |
107 | (unsigned int)Height2Pixel (1), False) |
108 | |
108 | |
109 | #define ERASE_ROWS(row, num) \ |
109 | #define ERASE_ROWS(row, num) \ |
110 | XFillRectangle (display->display, drawBuffer, TermWin.gc, \ |
110 | XFillRectangle (display->display, drawBuffer, TermWin.gc, \ |
111 | TermWin.int_bwidth, Row2Pixel (row), \ |
111 | 0, Row2Pixel (row), \ |
112 | (unsigned int)TermWin.width, \ |
112 | (unsigned int)TermWin.width, \ |
113 | (unsigned int)Height2Pixel (num)) |
113 | (unsigned int)Height2Pixel (num)) |
114 | |
114 | |
115 | /* ------------------------------------------------------------------------- * |
115 | /* ------------------------------------------------------------------------- * |
116 | * SCREEN `COMMON' ROUTINES * |
116 | * SCREEN `COMMON' ROUTINES * |
117 | * ------------------------------------------------------------------------- */ |
117 | * ------------------------------------------------------------------------- */ |
… | |
… | |
897 | #if !UNICODE_3 && ENABLE_COMBINING |
897 | #if !UNICODE_3 && ENABLE_COMBINING |
898 | // trim characters we can't store directly :( |
898 | // trim characters we can't store directly :( |
899 | if (c >= 0x10000) |
899 | if (c >= 0x10000) |
900 | c = rxvt_composite.compose (c); // map to lower 16 bits |
900 | c = rxvt_composite.compose (c); // map to lower 16 bits |
901 | #endif |
901 | #endif |
|
|
902 | bool bold = (Options & Opt_realBold) && ((rstyle & RS_Bold) != 0); |
902 | rend_t rend = SET_FONT (rstyle, TermWin.fontset->find_font (c)); |
903 | rend_t rend = SET_FONT (rstyle, TermWin.fontset->find_font (c, bold)); |
903 | |
904 | |
904 | do |
905 | do |
905 | { |
906 | { |
906 | stp[screen.cur.col] = c; |
907 | stp[screen.cur.col] = c; |
907 | srp[screen.cur.col] = rend; |
908 | srp[screen.cur.col] = rend; |
… | |
… | |
1747 | |
1748 | |
1748 | if (drawn_text == NULL) /* sanity check */ |
1749 | if (drawn_text == NULL) /* sanity check */ |
1749 | return; |
1750 | return; |
1750 | |
1751 | |
1751 | #ifdef DEBUG_STRICT |
1752 | #ifdef DEBUG_STRICT |
1752 | x = max (x, (int)TermWin.int_bwidth); |
1753 | x = max (x, 0); |
1753 | x = min (x, (int)TermWin.width); |
1754 | x = min (x, (int)TermWin.width); |
1754 | y = max (y, (int)TermWin.int_bwidth); |
1755 | y = max (y, 0); |
1755 | y = min (y, (int)TermWin.height); |
1756 | y = min (y, (int)TermWin.height); |
1756 | #endif |
1757 | #endif |
1757 | |
1758 | |
1758 | /* round down */ |
1759 | /* round down */ |
1759 | rc[PART_BEG].col = Pixel2Col (x); |
1760 | rc[PART_BEG].col = Pixel2Col (x); |
… | |
… | |
2206 | rend = GET_ATTR (rend); |
2207 | rend = GET_ATTR (rend); |
2207 | |
2208 | |
2208 | rvid = !!(rend & RS_RVid); |
2209 | rvid = !!(rend & RS_RVid); |
2209 | |
2210 | |
2210 | #ifndef NO_BOLD_UNDERLINE_REVERSE |
2211 | #ifndef NO_BOLD_UNDERLINE_REVERSE |
2211 | if (rend & RS_Bold && fore == Color_fg) |
2212 | if (rend & RS_Bold && fore == Color_fg && !(Options & Opt_realBold)) |
2212 | { |
2213 | { |
2213 | if (ISSET_PIXCOLOR (Color_BD)) |
2214 | if (ISSET_PIXCOLOR (Color_BD)) |
2214 | fore = Color_BD; |
2215 | fore = Color_BD; |
2215 | else |
2216 | else |
2216 | rvid = !rvid; |
2217 | rvid = !rvid; |
… | |
… | |
2322 | scr_reverse_selection (); |
2323 | scr_reverse_selection (); |
2323 | |
2324 | |
2324 | /* |
2325 | /* |
2325 | * I: other general cleanup |
2326 | * I: other general cleanup |
2326 | */ |
2327 | */ |
|
|
2328 | #if 0 |
2327 | if (clearfirst && TermWin.int_bwidth) |
2329 | if (clearfirst && TermWin.int_bwidth) |
2328 | /* |
2330 | /* |
2329 | * clear the whole screen height, note that width == 0 is treated |
2331 | * clear the whole screen height, note that width == 0 is treated |
2330 | * specially by XClearArea |
2332 | * specially by XClearArea |
2331 | */ |
2333 | */ |
… | |
… | |
2340 | */ |
2342 | */ |
2341 | XClearArea (display->display, TermWin.vt, |
2343 | XClearArea (display->display, TermWin.vt, |
2342 | TermWin.width + TermWin.int_bwidth, 0, |
2344 | TermWin.width + TermWin.int_bwidth, 0, |
2343 | (unsigned int)TermWin.int_bwidth, |
2345 | (unsigned int)TermWin.int_bwidth, |
2344 | (unsigned int)TermWin_TotalHeight (), False); |
2346 | (unsigned int)TermWin_TotalHeight (), False); |
|
|
2347 | #endif |
2345 | |
2348 | |
2346 | if (refresh_type & SMOOTH_REFRESH) |
2349 | if (refresh_type & SMOOTH_REFRESH) |
2347 | XSync (display->display, False); |
2350 | XSync (display->display, False); |
2348 | |
2351 | |
2349 | num_scr = 0; |
2352 | num_scr = 0; |