ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/command.C
(Generate patch)

Comparing rxvt-unicode/src/command.C (file contents):
Revision 1.587 by sf-exg, Sat May 8 06:16:21 2021 UTC vs.
Revision 1.601 by sf-exg, Sat May 6 06:47:29 2023 UTC

25 * - extensive modifications 25 * - extensive modifications
26 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org> 26 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org>
27 * Copyright (c) 2001 Marius Gedminas 27 * Copyright (c) 2001 Marius Gedminas
28 * - Ctrl/Mod4+Tab works like Meta+Tab (options) 28 * - Ctrl/Mod4+Tab works like Meta+Tab (options)
29 * Copyright (c) 2003 Rob McMullen <robm@flipturn.org> 29 * Copyright (c) 2003 Rob McMullen <robm@flipturn.org>
30 * Copyright (c) 2003-2014 Marc Lehmann <schmorp@schmorp.de> 30 * Copyright (c) 2003-2021 Marc Lehmann <schmorp@schmorp.de>
31 * Copyright (c) 2007,2015 Emanuele Giaquinta <e.giaquinta@glauco.it> 31 * Copyright (c) 2007,2015 Emanuele Giaquinta <e.giaquinta@glauco.it>
32 * 32 *
33 * This program is free software; you can redistribute it and/or modify 33 * This program is free software; you can redistribute it and/or modify
34 * it under the terms of the GNU General Public License as published by 34 * it under the terms of the GNU General Public License as published by
35 * the Free Software Foundation; either version 3 of the License, or 35 * the Free Software Foundation; either version 3 of the License, or
168 int len; 168 int len;
169 169
170# if ENABLE_COMBINING 170# if ENABLE_COMBINING
171 if (IS_COMPOSE (ch)) 171 if (IS_COMPOSE (ch))
172 { 172 {
173 len = rxvt_composite.expand (ch, 0); 173 len = rxvt_composite.expand (ch);
174 alloc = chr = new wchar_t[len]; 174 alloc = chr = new wchar_t[len];
175 rxvt_composite.expand (ch, chr); 175 rxvt_composite.expand (ch, chr);
176 } 176 }
177 else 177 else
178# endif 178# endif
1016/* checks whether a refresh is requested and starts the refresh timer */ 1016/* checks whether a refresh is requested and starts the refresh timer */
1017void 1017void
1018rxvt_term::refresh_check () 1018rxvt_term::refresh_check ()
1019{ 1019{
1020 if (want_refresh && !flush_ev.is_active ()) 1020 if (want_refresh && !flush_ev.is_active ())
1021 flush_ev.start (1. / 60.); // refresh at max. 60 Hz normally 1021 flush_ev.start ();
1022 1022
1023 display->flush (); 1023 display->flush ();
1024} 1024}
1025 1025
1026void 1026void
1295 mouse_col = y; 1295 mouse_col = y;
1296 state += 32; 1296 state += 32;
1297 } 1297 }
1298 1298
1299 button_number = MEvent.button - Button1; 1299 button_number = MEvent.button - Button1;
1300 /* add 0x3D for wheel events, like xterm does */ 1300 if (button_number > 10)
1301 return;
1302 else if (button_number >= 7)
1303 button_number += 128 - 7;
1301 if (button_number >= 3) 1304 else if (button_number >= 3)
1302 button_number += 64 - 3; 1305 button_number += 64 - 3;
1303 1306
1304 if (priv_modes & PrivMode_MouseX10) 1307 if (priv_modes & PrivMode_MouseX10)
1305 { 1308 {
1306 /* 1309 /*
1356 tt_printf ("\033[%d;%d;%dM", 1359 tt_printf ("\033[%d;%d;%dM",
1357 code, 1360 code,
1358 x, 1361 x,
1359 y); 1362 y);
1360 else if (priv_modes & PrivMode_ExtMouseUTF8) 1363 else if (priv_modes & PrivMode_ExtMouseUTF8)
1364 if (code < 128)
1361 tt_printf ("\033[M%c%lc%lc", 1365 tt_printf ("\033[M%c%lc%lc",
1362 code, 1366 code,
1363 wint_t (32 + x), 1367 wint_t (32 + x),
1364 wint_t (32 + y)); 1368 wint_t (32 + y));
1369 else
1370 tt_printf ("\033[M%c%c%lc%lc",
1371 0xc0 + (code >> 6),
1372 0x80 + (code & 0x3f),
1373 wint_t (32 + x),
1374 wint_t (32 + y));
1365 else 1375 else
1366#endif 1376#endif
1367 tt_printf ("\033[M%c%c%c", 1377 tt_printf ("\033[M%c%c%c",
1368 code, 1378 code,
1369 32 + x, 1379 32 + x,
2141 2151
2142 if (reportmode) 2152 if (reportmode)
2143 { 2153 {
2144 /* mouse report from vt window */ 2154 /* mouse report from vt window */
2145 /* don't report release of wheel "buttons" */ 2155 /* don't report release of wheel "buttons" */
2146 if (ev.button >= 4) 2156 if (ev.button >= 4 && ev.button <= 7)
2147 return; 2157 return;
2148#ifdef MOUSE_REPORT_DOUBLECLICK 2158#ifdef MOUSE_REPORT_DOUBLECLICK
2149 /* only report the release of 'slow' single clicks */ 2159 /* only report the release of 'slow' single clicks */
2150 if (MEvent.button != AnyButton 2160 if (MEvent.button != AnyButton
2151 && (ev.button != MEvent.button 2161 && (ev.button != MEvent.button
2352 } 2362 }
2353} 2363}
2354 2364
2355// read the next character 2365// read the next character
2356wchar_t ecb_hot 2366wchar_t ecb_hot
2357rxvt_term::next_char () NOTHROW 2367rxvt_term::next_char () noexcept
2358{ 2368{
2359 while (cmdbuf_ptr < cmdbuf_endp) 2369 while (cmdbuf_ptr < cmdbuf_endp)
2360 { 2370 {
2361 // assume 7-bit to be ascii ALWAYS (always true in POSIX) 2371 // assume 7-bit to be ascii ALWAYS (always true in POSIX)
2362 if (ecb_likely ((unsigned char)*cmdbuf_ptr <= 0x7f)) 2372 if (ecb_likely ((unsigned char)*cmdbuf_ptr <= 0x7f))
2388 return NOCHAR; 2398 return NOCHAR;
2389} 2399}
2390 2400
2391// read the next octet 2401// read the next octet
2392uint32_t ecb_hot 2402uint32_t ecb_hot
2393rxvt_term::next_octet () NOTHROW 2403rxvt_term::next_octet () noexcept
2394{ 2404{
2395 return cmdbuf_ptr < cmdbuf_endp 2405 return cmdbuf_ptr < cmdbuf_endp
2396 ? (unsigned char)*cmdbuf_ptr++ 2406 ? (unsigned char)*cmdbuf_ptr++
2397 : NOCHAR; 2407 : NOCHAR;
2398} 2408}
2399 2409
2400static class out_of_input out_of_input; 2410static class out_of_input out_of_input;
2401 2411
2402wchar_t ecb_hot 2412wchar_t ecb_hot
2403rxvt_term::cmd_getc () THROW ((class out_of_input)) 2413rxvt_term::cmd_getc ()
2404{ 2414{
2405 wchar_t c = next_char (); 2415 wchar_t c = next_char ();
2406 2416
2407 if (c == NOCHAR) 2417 if (c == NOCHAR)
2408 throw out_of_input; 2418 throw out_of_input;
2409 2419
2410 return c; 2420 return c;
2411} 2421}
2412 2422
2413uint32_t ecb_hot 2423uint32_t ecb_hot
2414rxvt_term::cmd_get8 () THROW ((class out_of_input)) 2424rxvt_term::cmd_get8 ()
2415{ 2425{
2416 uint32_t c = next_octet (); 2426 uint32_t c = next_octet ();
2417 2427
2418 if (c == NOCHAR) 2428 if (c == NOCHAR)
2419 throw out_of_input; 2429 throw out_of_input;
2866 } 2876 }
2867 break; 2877 break;
2868 2878
2869 case '?': 2879 case '?':
2870 if (ch == 'h' || ch == 'l' || ch == 'r' || ch == 's' || ch == 't') 2880 if (ch == 'h' || ch == 'l' || ch == 'r' || ch == 's' || ch == 't')
2881 process_terminal_mode (ch, priv, nargs, arg);
2882 if (prev_ch == '$' && ch == 'p')
2871 process_terminal_mode (ch, priv, nargs, arg); 2883 process_terminal_mode (ch, priv, nargs, arg);
2872 break; 2884 break;
2873 2885
2874 case '!': 2886 case '!':
2875 if (ch == CSI_70) 2887 if (ch == CSI_70)
3017 case 7: /* unofficial extension */ 3029 case 7: /* unofficial extension */
3018 if (option (Opt_insecure)) 3030 if (option (Opt_insecure))
3019 tt_printf ("%-.250s\012", rs[Rs_display_name]); 3031 tt_printf ("%-.250s\012", rs[Rs_display_name]);
3020 break; 3032 break;
3021 case 8: /* unofficial extension */ 3033 case 8: /* unofficial extension */
3034 {
3035 string_term st;
3036 st.v[0] = CHAR_ST;
3037 st.v[1] = '\0';
3022 process_xterm_seq (XTerm_title, RESNAME "-" VERSION, CHAR_ST); 3038 process_xterm_seq (XTerm_title, (char *)RESNAME "-" VERSION, st); // char * cast verified
3023 break; 3039 break;
3040 }
3024 } 3041 }
3025 break; 3042 break;
3026 3043
3027 case CSI_TBC: /* 8.3.155: (0) TABULATION CLEAR */ 3044 case CSI_TBC: /* 8.3.155: (0) TABULATION CLEAR */
3028 switch (arg[0]) 3045 switch (arg[0])
3213/* 3230/*
3214 * get input up until STRING TERMINATOR (or BEL) 3231 * get input up until STRING TERMINATOR (or BEL)
3215 * ends_how is terminator used. returned input must be free()'d 3232 * ends_how is terminator used. returned input must be free()'d
3216 */ 3233 */
3217char * 3234char *
3218rxvt_term::get_to_st (unicode_t &ends_how) 3235rxvt_term::get_to_st (string_term &st)
3219{ 3236{
3220 unicode_t ch; 3237 unicode_t ch;
3221 bool seen_esc = false; 3238 bool seen_esc = false;
3222 unsigned int n = 0; 3239 unsigned int n = 0;
3223 wchar_t string[CBUFSIZ]; 3240 wchar_t string[CBUFSIZ];
3252 string[n++] = ch; 3269 string[n++] = ch;
3253 } 3270 }
3254 3271
3255 string[n++] = '\0'; 3272 string[n++] = '\0';
3256 3273
3257 ends_how = (ch == 0x5c ? C0_ESC : ch); 3274 n = 0;
3275 if (ch == 0x5c)
3276 st.v[n++] = C0_ESC;
3277 st.v[n++] = ch;
3278 st.v[n] = '\0';
3258 3279
3259 return rxvt_wcstombs (string); 3280 return rxvt_wcstombs (string);
3260} 3281}
3261 3282
3262/*----------------------------------------------------------------------*/ 3283/*----------------------------------------------------------------------*/
3268{ 3289{
3269 /* 3290 /*
3270 * Not handled yet 3291 * Not handled yet
3271 */ 3292 */
3272 3293
3273 unicode_t eh; 3294 string_term st;
3274 char *s = get_to_st (eh); 3295 char *s = get_to_st (st);
3275 if (s) 3296 if (s)
3276 free (s); 3297 free (s);
3277 3298
3278 return; 3299 return;
3279} 3300}
3291 for (arg = 0; isdigit (ch); ch = cmd_getc ()) 3312 for (arg = 0; isdigit (ch); ch = cmd_getc ())
3292 arg = arg * 10 + (ch - '0'); 3313 arg = arg * 10 + (ch - '0');
3293 3314
3294 if (ch == ';') 3315 if (ch == ';')
3295 { 3316 {
3296 unicode_t eh; 3317 string_term st;
3297 char *s = get_to_st (eh); 3318 char *s = get_to_st (st);
3298 3319
3299 if (s) 3320 if (s)
3300 { 3321 {
3301 process_xterm_seq (arg, s, eh); 3322 process_xterm_seq (arg, s, st);
3302 free (s); 3323 free (s);
3303 } 3324 }
3304 } 3325 }
3305} 3326}
3306 3327
3330 b &= 0xff; 3351 b &= 0xff;
3331 a &= 0xff; 3352 a &= 0xff;
3332 3353
3333 uint32_t color = (a << 24) | (r << 16) | (g << 8) | b; 3354 uint32_t color = (a << 24) | (r << 16) | (g << 8) | b;
3334 3355
3335 unsigned int idx_r = r * (Red_levels - 1) / 0xff;
3336 unsigned int idx_g = g * (Green_levels - 1) / 0xff;
3337 unsigned int idx_b = b * (Blue_levels - 1) / 0xff;
3338 unsigned int idx = colorcube_index (idx_r, idx_g, idx_b);
3339
3340 /* we allow one of the 6 directly neighbouring colours */ 3356 /* we allow one of the 6 closest neighbouring colours */
3341 /* to replace the current color, if they not used recently */ 3357 /* to replace the current color, if they not used recently */
3358 #if 0
3342 static const signed char dxyz[][3] = { 3359 static const unsigned char dxyz[][3] = {
3343 0, 0, 0, 3360 0, 0, 0,
3344 0, 0, +1, 3361 0, 0, 4,
3345 0, 0, -1, 3362 0, 4, 4,
3363 4, 4, 0,
3364 4, 0, 4,
3346 0, +1, 0, 3365 0, 4, 0,
3347 0, -1, 0,
3348 +1, 0, 0, 3366 4, 0, 0,
3349 -1, 0, 0,
3350 }; 3367 };
3368 #else
3369 // silly compressed verlapping triplets version of above
3370 static const unsigned char dxyz[] = {
3371 0, 0, 0, 4, 4, 0, 4, 0, 0,
3372 };
3373 #endif
3351 3374
3375 static const unsigned char color_level[8][32] = {
3376 // neighbour index
3377 {0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3},
3378 {0, 1, 0, 1, 1, 2, 1, 1, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4},
3379 {0, 0, 1, 2, 1, 1, 2, 3, 3, 2, 2, 3, 3, 4, 4, 3, 3, 3, 4, 4, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 5},
3380 {0, 0, 2, 1, 2, 3, 2, 2, 3, 4, 4, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6},
3381 // Red_levels/Green_levels/Blue_levels index
3382 {0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
3383 {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
3384 {0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5},
3385 {0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6},
3386 };
3387
3388 unsigned int idx;
3389
3352 for (int n = 0; n < ecb_array_length (dxyz); ++n) 3390 for (int n = 0; n < ecb_array_length (dxyz) - 2; ++n)
3353 { 3391 {
3354 int r = idx_r + dxyz[n][0]; 3392 unsigned int idx_r = color_level[ Red_levels - dxyz[n + 0]][r / 8];
3355 int g = idx_g + dxyz[n][1]; 3393 unsigned int idx_g = color_level[Green_levels - dxyz[n + 1]][g / 8];
3356 int b = idx_b + dxyz[n][2]; 3394 unsigned int idx_b = color_level[ Blue_levels - dxyz[n + 2]][b / 8];
3357
3358 if (!IN_RANGE_EXC (r, 0, Red_levels )) continue;
3359 if (!IN_RANGE_EXC (g, 0, Green_levels)) continue;
3360 if (!IN_RANGE_EXC (b, 0, Blue_levels )) continue;
3361
3362 unsigned int index = colorcube_index (r, g, b); 3395 unsigned int index = colorcube_index (idx_r, idx_g, idx_b);
3396
3397 if (n == 0)
3398 idx = index;
3363 3399
3364 if (rgb24_color[index] == color) 3400 if (rgb24_color[index] == color)
3365 { 3401 {
3366 rgb24_seqno[index] = ++rgb24_sequence; 3402 rgb24_seqno[index] = ++rgb24_sequence;
3367 return index + minTermCOLOR24; 3403 return index + minTermCOLOR24;
3373 idx = index; 3409 idx = index;
3374 goto update; 3410 goto update;
3375 } 3411 }
3376 3412
3377 // like (rgb24_seqno[idx] > rgb24_seqno[index]) 3413 // like (rgb24_seqno[idx] > rgb24_seqno[index])
3378 // but also handles wrap around values good enough 3414 // but also handles wrap around values well enough
3379 if ((uint16_t)(rgb24_seqno[idx] - rgb24_seqno[index]) < 0x7fff) 3415 if ((uint16_t)(rgb24_seqno[idx] - rgb24_seqno[index]) < 0x8000)
3380 idx = index; 3416 idx = index;
3381 } 3417 }
3382 3418
3383update: 3419update:
3384 rgb24_color[idx] = color; 3420 rgb24_color[idx] = color;
3391 3427
3392 return idx; 3428 return idx;
3393} 3429}
3394 3430
3395void 3431void
3396rxvt_term::process_color_seq (int report, int color, const char *str, char resp) 3432rxvt_term::process_color_seq (int report, int color, const char *str, string_term &st)
3397{ 3433{
3398 if (str[0] == '?' && !str[1]) 3434 if (str[0] == '?' && !str[1])
3399 { 3435 {
3400 rgba c; 3436 rgba c;
3401 pix_colors_focused[color].get (c); 3437 pix_colors_focused[color].get (c);
3438 char rgba_str[32];
3402 3439
3403#if XFT 3440#if XFT
3404 if (c.a != rgba::MAX_CC) 3441 if (c.a != rgba::MAX_CC)
3405 tt_printf ("\033]%d;rgba:%04x/%04x/%04x/%04x%c", report, c.r, c.g, c.b, c.a, resp); 3442 snprintf (rgba_str, sizeof (rgba_str), "rgba:%04x/%04x/%04x/%04x", c.r, c.g, c.b, c.a);
3406 else 3443 else
3407#endif 3444#endif
3408 tt_printf ("\033]%d;rgb:%04x/%04x/%04x%c", report, c.r, c.g, c.b, resp); 3445 snprintf (rgba_str, sizeof (rgba_str), "rgb:%04x/%04x/%04x", c.r, c.g, c.b);
3446
3447 if (IN_RANGE_INC (color, minCOLOR, maxTermCOLOR))
3448 tt_printf ("\033]%d;%d;%s%s", report, color - minCOLOR, rgba_str, st.v);
3449 else
3450 tt_printf ("\033]%d;%s%s", report, rgba_str, st.v);
3409 } 3451 }
3410 else 3452 else
3411 set_window_color (color, str); 3453 set_window_color (color, str);
3412} 3454}
3413 3455
3414/* 3456/*
3415 * XTerm escape sequences: ESC ] Ps;Pt (ST|BEL) 3457 * XTerm escape sequences: ESC ] Ps;Pt (ST|BEL)
3416 */ 3458 */
3417void 3459void
3418rxvt_term::process_xterm_seq (int op, char *str, char resp) 3460rxvt_term::process_xterm_seq (int op, char *str, string_term &st)
3419{ 3461{
3420 int color; 3462 int color;
3421 char *buf, *name; 3463 char *buf, *name;
3422 bool query = str[0] == '?' && !str[1]; 3464 bool query = str[0] == '?' && !str[1];
3423 int saveop = op; 3465 int saveop = op;
3458 &nitems, &bytes_after, &value) == Success 3500 &nitems, &bytes_after, &value) == Success
3459 && actual_type != None 3501 && actual_type != None
3460 && actual_format == 8) 3502 && actual_format == 8)
3461 str = (const char *)(value); 3503 str = (const char *)(value);
3462 3504
3463 tt_printf ("\033]%d;%s%c", op, option (Opt_insecure) ? str : "", resp); 3505 tt_printf ("\033]%d;%s%s", op, option (Opt_insecure) ? str : "", st.v);
3464 3506
3465 XFree (value); 3507 XFree (value);
3466 } 3508 }
3467 else 3509 else
3468 { 3510 {
3492 break; 3534 break;
3493 3535
3494 if ((buf = strchr (name, ';')) != NULL) 3536 if ((buf = strchr (name, ';')) != NULL)
3495 *buf++ = '\0'; 3537 *buf++ = '\0';
3496 3538
3497 process_color_seq (op, color, name, resp); 3539 process_color_seq (op, color, name, st);
3498 } 3540 }
3499 break; 3541 break;
3500 case Rxvt_restoreFG: 3542 case Rxvt_restoreFG:
3501 case XTerm_Color00: 3543 case XTerm_Color00:
3502 process_color_seq (op, Color_fg, str, resp); 3544 process_color_seq (op, Color_fg, str, st);
3503 break; 3545 break;
3504 case Rxvt_restoreBG: 3546 case Rxvt_restoreBG:
3505 case XTerm_Color01: 3547 case XTerm_Color01:
3506 process_color_seq (op, Color_bg, str, resp); 3548 process_color_seq (op, Color_bg, str, st);
3507 break; 3549 break;
3508#ifndef NO_CURSORCOLOR 3550#ifndef NO_CURSORCOLOR
3509 case XTerm_Color_cursor: 3551 case XTerm_Color_cursor:
3510 process_color_seq (op, Color_cursor, str, resp); 3552 process_color_seq (op, Color_cursor, str, st);
3511 break; 3553 break;
3512#endif 3554#endif
3513 case XTerm_Color_pointer_fg: 3555 case XTerm_Color_pointer_fg:
3514 process_color_seq (op, Color_pointer_fg, str, resp); 3556 process_color_seq (op, Color_pointer_fg, str, st);
3515 break; 3557 break;
3516 case XTerm_Color_pointer_bg: 3558 case XTerm_Color_pointer_bg:
3517 process_color_seq (op, Color_pointer_bg, str, resp); 3559 process_color_seq (op, Color_pointer_bg, str, st);
3518 break; 3560 break;
3519#ifdef OPTION_HC 3561#ifdef OPTION_HC
3520 case XTerm_Color_HC: 3562 case XTerm_Color_HC:
3521 process_color_seq (op, Color_HC, str, resp); 3563 process_color_seq (op, Color_HC, str, st);
3522 break; 3564 break;
3523 case XTerm_Color_HTC: 3565 case XTerm_Color_HTC:
3524 process_color_seq (op, Color_HTC, str, resp); 3566 process_color_seq (op, Color_HTC, str, st);
3525 break; 3567 break;
3526#endif 3568#endif
3527#ifndef NO_BOLD_UNDERLINE_REVERSE 3569#ifndef NO_BOLD_UNDERLINE_REVERSE
3528 case URxvt_Color_BD: 3570 case URxvt_Color_BD:
3529 process_color_seq (op, Color_BD, str, resp); 3571 process_color_seq (op, Color_BD, str, st);
3530 break; 3572 break;
3531 case URxvt_Color_UL: 3573 case URxvt_Color_UL:
3532 process_color_seq (op, Color_UL, str, resp); 3574 process_color_seq (op, Color_UL, str, st);
3533 break; 3575 break;
3534 case URxvt_Color_IT: 3576 case URxvt_Color_IT:
3535 process_color_seq (op, Color_IT, str, resp); 3577 process_color_seq (op, Color_IT, str, st);
3536 break; 3578 break;
3537#endif 3579#endif
3538 case URxvt_Color_border: 3580 case URxvt_Color_border:
3539 process_color_seq (op, Color_border, str, resp); 3581 process_color_seq (op, Color_border, str, st);
3540 break; 3582 break;
3541 3583
3542 case XTerm_logfile: 3584 case XTerm_logfile:
3543 // TODO, when secure mode? 3585 // TODO, when secure mode?
3544 break; 3586 break;
3562 case URxvt_boldFont: 3604 case URxvt_boldFont:
3563 case URxvt_italicFont: 3605 case URxvt_italicFont:
3564 case URxvt_boldItalicFont: 3606 case URxvt_boldItalicFont:
3565#endif 3607#endif
3566 if (query) 3608 if (query)
3567 tt_printf ("\33]%d;%-.250s%c", saveop, 3609 tt_printf ("\33]%d;%-.250s%s", saveop,
3568 option (Opt_insecure) && fontset[op - URxvt_font]->fontdesc 3610 option (Opt_insecure) && fontset[op - URxvt_font]->fontdesc
3569 ? fontset[op - URxvt_font]->fontdesc : "", 3611 ? fontset[op - URxvt_font]->fontdesc : "",
3570 resp); 3612 st.v);
3571 else 3613 else
3572 { 3614 {
3573 const char *&res = rs[Rs_font + (op - URxvt_font)]; 3615 const char *&res = rs[Rs_font + (op - URxvt_font)];
3574 3616
3575 res = strdup (str); 3617 res = strdup (str);
3578 } 3620 }
3579 break; 3621 break;
3580 3622
3581 case URxvt_version: 3623 case URxvt_version:
3582 if (query) 3624 if (query)
3583 tt_printf ("\33]%d;rxvt-unicode;%-.20s;%c;%c%c", 3625 tt_printf ("\33]%d;rxvt-unicode;%-.20s;%c;%c%s",
3584 op, 3626 op,
3585 rs[Rs_name], VERSION[0], VERSION[2], 3627 rs[Rs_name], VERSION[0], VERSION[2],
3586 resp); 3628 st.v);
3587 break; 3629 break;
3588 3630
3589#if !ENABLE_MINIMAL 3631#if !ENABLE_MINIMAL
3632 case URxvt_cellinfo:
3633 if (query)
3634 tt_printf ("\33]%d;%d;%d;%d%s", saveop,
3635 fwidth, fheight, fbase,
3636 st.v);
3637 break;
3638
3590 case URxvt_locale: 3639 case URxvt_locale:
3591 if (query) 3640 if (query)
3592 tt_printf ("\33]%d;%-.250s%c", op, option (Opt_insecure) ? locale : "", resp); 3641 tt_printf ("\33]%d;%-.250s%s", op, option (Opt_insecure) ? locale : "", st.v);
3593 else 3642 else
3594 { 3643 {
3595 set_locale (str); 3644 set_locale (str);
3596 pty->set_utf8_mode (enc_utf8); 3645 pty->set_utf8_mode (enc_utf8);
3597 init_xlocale (); 3646 init_xlocale ();
3612 break; 3661 break;
3613#endif 3662#endif
3614 3663
3615#if ENABLE_PERL 3664#if ENABLE_PERL
3616 case URxvt_perl: 3665 case URxvt_perl:
3617 HOOK_INVOKE ((this, HOOK_OSC_SEQ_PERL, DT_STR, str, DT_STR_LEN, &resp, 1, DT_END)); 3666 HOOK_INVOKE ((this, HOOK_OSC_SEQ_PERL, DT_STR, str, DT_STR, st.v, DT_END));
3618 break; 3667 break;
3619#endif 3668#endif
3620 } 3669 }
3621} 3670}
3622/*----------------------------------------------------------------------*/ 3671/*----------------------------------------------------------------------*/
3717 // 1037 send DEL for keypad delete NYI 3766 // 1037 send DEL for keypad delete NYI
3718 { 1047, PrivMode_Screen }, 3767 { 1047, PrivMode_Screen },
3719 // 1048 save and restore cursor, implemented in code 3768 // 1048 save and restore cursor, implemented in code
3720 { 1049, PrivMode_Screen }, /* xterm extension, clear screen on ti rather than te */ 3769 { 1049, PrivMode_Screen }, /* xterm extension, clear screen on ti rather than te */
3721 // 1051, 1052, 1060, 1061 keyboard emulation NYI 3770 // 1051, 1052, 1060, 1061 keyboard emulation NYI
3771#if ENABLE_FRILLS
3722 { 2004, PrivMode_BracketPaste }, 3772 { 2004, PrivMode_BracketPaste },
3773#endif
3723 }; 3774 };
3724 3775
3725 if (nargs == 0) 3776 if (nargs == 0)
3726 return; 3777 return;
3778
3779 // DECRQM
3780 if (mode == 'p')
3781 {
3782 int status = 0;
3783 if (nargs != 1)
3784 return;
3785
3786 for (j = 0; j < ecb_array_length (argtopriv); j++)
3787 if (argtopriv[j].argval == arg[0])
3788 {
3789 status = (priv_modes & argtopriv[j].bit) ? 1 : 2;
3790 break;
3791 }
3792
3793 tt_printf ("\33[?%d;%d$y", arg[0], status);
3794 return;
3795 }
3727 3796
3728 /* make lo/hi boolean */ 3797 /* make lo/hi boolean */
3729 if (mode == 'l') 3798 if (mode == 'l')
3730 mode = 0; /* reset */ 3799 mode = 0; /* reset */
3731 else if (mode == 'h') 3800 else if (mode == 'h')

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines