mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-06 22:12:47 -05:00
Three more patches from RDB: one to make Atomica work right, one to
fiddle with the widths of characters in DBCS screen fonts, and (the big one) one to enable a mode in which resizing the window locks the terminal size and lets the font change, instead of vice versa. That should shut up a few feature requests! [originally from svn r1269]
This commit is contained in:
73
terminal.c
73
terminal.c
@ -497,6 +497,7 @@ void term_size(int newrows, int newcols, int newsavelines)
|
||||
|
||||
update_sbar();
|
||||
term_update();
|
||||
back->size();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -851,7 +852,7 @@ static void toggle_mode(int mode, int query, int state)
|
||||
break;
|
||||
case 3: /* 80/132 columns */
|
||||
deselect();
|
||||
request_resize(state ? 132 : 80, rows, 1);
|
||||
request_resize(state ? 132 : 80, rows);
|
||||
reset_132 = state;
|
||||
break;
|
||||
case 5: /* reverse video */
|
||||
@ -1339,12 +1340,18 @@ void term_out(void)
|
||||
width = wcwidth((wchar_t) c);
|
||||
switch (width) {
|
||||
case 2:
|
||||
if (curs.x + 1 != cols) {
|
||||
*cpos++ = c | ATTR_WIDE | curr_attr;
|
||||
*cpos++ = UCSWIDE | curr_attr;
|
||||
curs.x++;
|
||||
break;
|
||||
*cpos++ = c | curr_attr;
|
||||
if (++curs.x == cols) {
|
||||
*cpos |= LATTR_WRAPPED;
|
||||
if (curs.y == marg_b)
|
||||
scroll(marg_t, marg_b, 1, TRUE);
|
||||
else if (curs.y < rows - 1)
|
||||
curs.y++;
|
||||
curs.x = 0;
|
||||
fix_cpos;
|
||||
}
|
||||
*cpos++ = UCSWIDE | curr_attr;
|
||||
break;
|
||||
case 1:
|
||||
*cpos++ = c | curr_attr;
|
||||
break;
|
||||
@ -1461,7 +1468,7 @@ void term_out(void)
|
||||
compatibility(VT100);
|
||||
power_on();
|
||||
if (reset_132) {
|
||||
request_resize(80, rows, 1);
|
||||
request_resize(80, rows);
|
||||
reset_132 = 0;
|
||||
}
|
||||
fix_cpos;
|
||||
@ -1906,7 +1913,7 @@ void term_out(void)
|
||||
compatibility(VT340TEXT);
|
||||
if (esc_nargs <= 1
|
||||
&& (esc_args[0] < 1 || esc_args[0] >= 24)) {
|
||||
request_resize(cols, def(esc_args[0], 24), 0);
|
||||
request_resize(cols, def(esc_args[0], 24));
|
||||
deselect();
|
||||
}
|
||||
break;
|
||||
@ -1932,9 +1939,7 @@ void term_out(void)
|
||||
*/
|
||||
compatibility(VT420);
|
||||
if (esc_nargs == 1 && esc_args[0] > 0) {
|
||||
request_resize(cols,
|
||||
def(esc_args[0], cfg.height),
|
||||
0);
|
||||
request_resize(cols, def(esc_args[0], cfg.height));
|
||||
deselect();
|
||||
}
|
||||
break;
|
||||
@ -1945,8 +1950,7 @@ void term_out(void)
|
||||
*/
|
||||
compatibility(VT340TEXT);
|
||||
if (esc_nargs <= 1) {
|
||||
request_resize(def(esc_args[0], cfg.width),
|
||||
rows, 0);
|
||||
request_resize(def(esc_args[0], cfg.width), rows);
|
||||
deselect();
|
||||
}
|
||||
break;
|
||||
@ -2074,9 +2078,9 @@ void term_out(void)
|
||||
*/
|
||||
if (!has_compat(VT420) && has_compat(VT100)) {
|
||||
if (reset_132)
|
||||
request_resize(132, 24, 1);
|
||||
request_resize(132, 24);
|
||||
else
|
||||
request_resize(80, 24, 1);
|
||||
request_resize(80, 24);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
@ -2531,9 +2535,10 @@ static void do_paint(Context ctx, int may_optimise)
|
||||
if (dispcurs && (curstype != cursor ||
|
||||
dispcurs !=
|
||||
disptext + our_curs_y * (cols + 1) + curs.x)) {
|
||||
if (dispcurs > disptext && (dispcurs[-1] & ATTR_WIDE))
|
||||
if (dispcurs > disptext &&
|
||||
(*dispcurs & (CHAR_MASK | CSET_MASK)) == UCSWIDE)
|
||||
dispcurs[-1] |= ATTR_INVALID;
|
||||
if ((*dispcurs & ATTR_WIDE))
|
||||
if ( (dispcurs[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE)
|
||||
dispcurs[1] |= ATTR_INVALID;
|
||||
*dispcurs |= ATTR_INVALID;
|
||||
curstype = 0;
|
||||
@ -2580,6 +2585,8 @@ static void do_paint(Context ctx, int may_optimise)
|
||||
}
|
||||
tattr |= (tchar & CSET_MASK);
|
||||
tchar &= CHAR_MASK;
|
||||
if ((d[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE)
|
||||
tattr |= ATTR_WIDE;
|
||||
|
||||
/* Video reversing things */
|
||||
tattr = (tattr ^ rv
|
||||
@ -2596,6 +2603,17 @@ static void do_paint(Context ctx, int may_optimise)
|
||||
tattr &= ~ATTR_BLINK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the font we'll _probably_ be using to see if
|
||||
* the character is wide when we don't want it to be.
|
||||
*/
|
||||
if ((tchar | tattr) != (disptext[idx]& ~ATTR_NARROW)) {
|
||||
if ((tattr & ATTR_WIDE) == 0 &&
|
||||
CharWidth(ctx, (tchar | tattr) & 0xFFFF) == 2)
|
||||
tattr |= ATTR_NARROW;
|
||||
} else if (disptext[idx]&ATTR_NARROW)
|
||||
tattr |= ATTR_NARROW;
|
||||
|
||||
/* Cursor here ? Save the 'background' */
|
||||
if (i == our_curs_y && j == curs.x) {
|
||||
cursor_background = tattr | tchar;
|
||||
@ -2716,14 +2734,14 @@ void term_invalidate(void)
|
||||
/*
|
||||
* Paint the window in response to a WM_PAINT message.
|
||||
*/
|
||||
void term_paint(Context ctx, int l, int t, int r, int b)
|
||||
void term_paint(Context ctx, int left, int top, int right, int bottom)
|
||||
{
|
||||
int i, j, left, top, right, bottom;
|
||||
int i, j;
|
||||
if (left < 0) left = 0;
|
||||
if (top < 0) top = 0;
|
||||
if (right >= cols) right = cols-1;
|
||||
if (bottom >= rows) bottom = rows-1;
|
||||
|
||||
left = l / font_width;
|
||||
right = (r - 1) / font_width;
|
||||
top = t / font_height;
|
||||
bottom = (b - 1) / font_height;
|
||||
for (i = top; i <= bottom && i < rows; i++) {
|
||||
if ((disptext[i * (cols + 1) + cols] & LATTR_MODE) == LATTR_NORM)
|
||||
for (j = left; j <= right && j < cols; j++)
|
||||
@ -2736,8 +2754,9 @@ void term_paint(Context ctx, int l, int t, int r, int b)
|
||||
/* This should happen soon enough, also for some reason it sometimes
|
||||
* fails to actually do anything when re-sizing ... painting the wrong
|
||||
* window perhaps ?
|
||||
do_paint (ctx, FALSE);
|
||||
*/
|
||||
if (alt_pressed)
|
||||
do_paint (ctx, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2987,6 +3006,12 @@ static int wordtype(int uc)
|
||||
break;
|
||||
}
|
||||
|
||||
/* For DBCS font's I can't do anything usefull. Even this will sometimes
|
||||
* fail as there's such a thing as a double width space. :-(
|
||||
*/
|
||||
if (dbcs_screenfont && font_codepage == line_codepage)
|
||||
return (uc != ' ');
|
||||
|
||||
if (uc < 0x80)
|
||||
return wordness[uc];
|
||||
|
||||
|
Reference in New Issue
Block a user