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.592 by root, Thu Jun 17 00:49:20 2021 UTC

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
2352 } 2352 }
2353} 2353}
2354 2354
2355// read the next character 2355// read the next character
2356wchar_t ecb_hot 2356wchar_t ecb_hot
2357rxvt_term::next_char () NOTHROW 2357rxvt_term::next_char () noexcept
2358{ 2358{
2359 while (cmdbuf_ptr < cmdbuf_endp) 2359 while (cmdbuf_ptr < cmdbuf_endp)
2360 { 2360 {
2361 // assume 7-bit to be ascii ALWAYS (always true in POSIX) 2361 // assume 7-bit to be ascii ALWAYS (always true in POSIX)
2362 if (ecb_likely ((unsigned char)*cmdbuf_ptr <= 0x7f)) 2362 if (ecb_likely ((unsigned char)*cmdbuf_ptr <= 0x7f))
2388 return NOCHAR; 2388 return NOCHAR;
2389} 2389}
2390 2390
2391// read the next octet 2391// read the next octet
2392uint32_t ecb_hot 2392uint32_t ecb_hot
2393rxvt_term::next_octet () NOTHROW 2393rxvt_term::next_octet () noexcept
2394{ 2394{
2395 return cmdbuf_ptr < cmdbuf_endp 2395 return cmdbuf_ptr < cmdbuf_endp
2396 ? (unsigned char)*cmdbuf_ptr++ 2396 ? (unsigned char)*cmdbuf_ptr++
2397 : NOCHAR; 2397 : NOCHAR;
2398} 2398}
2399 2399
2400static class out_of_input out_of_input; 2400static class out_of_input out_of_input;
2401 2401
2402wchar_t ecb_hot 2402wchar_t ecb_hot
2403rxvt_term::cmd_getc () THROW ((class out_of_input)) 2403rxvt_term::cmd_getc ()
2404{ 2404{
2405 wchar_t c = next_char (); 2405 wchar_t c = next_char ();
2406 2406
2407 if (c == NOCHAR) 2407 if (c == NOCHAR)
2408 throw out_of_input; 2408 throw out_of_input;
2409 2409
2410 return c; 2410 return c;
2411} 2411}
2412 2412
2413uint32_t ecb_hot 2413uint32_t ecb_hot
2414rxvt_term::cmd_get8 () THROW ((class out_of_input)) 2414rxvt_term::cmd_get8 ()
2415{ 2415{
2416 uint32_t c = next_octet (); 2416 uint32_t c = next_octet ();
2417 2417
2418 if (c == NOCHAR) 2418 if (c == NOCHAR)
2419 throw out_of_input; 2419 throw out_of_input;
2866 } 2866 }
2867 break; 2867 break;
2868 2868
2869 case '?': 2869 case '?':
2870 if (ch == 'h' || ch == 'l' || ch == 'r' || ch == 's' || ch == 't') 2870 if (ch == 'h' || ch == 'l' || ch == 'r' || ch == 's' || ch == 't')
2871 process_terminal_mode (ch, priv, nargs, arg);
2872 if (prev_ch == '$' && ch == 'p')
2871 process_terminal_mode (ch, priv, nargs, arg); 2873 process_terminal_mode (ch, priv, nargs, arg);
2872 break; 2874 break;
2873 2875
2874 case '!': 2876 case '!':
2875 if (ch == CSI_70) 2877 if (ch == CSI_70)
3330 b &= 0xff; 3332 b &= 0xff;
3331 a &= 0xff; 3333 a &= 0xff;
3332 3334
3333 uint32_t color = (a << 24) | (r << 16) | (g << 8) | b; 3335 uint32_t color = (a << 24) | (r << 16) | (g << 8) | b;
3334 3336
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 */ 3337 /* we allow one of the 6 closest neighbouring colours */
3341 /* to replace the current color, if they not used recently */ 3338 /* to replace the current color, if they not used recently */
3342 static const signed char dxyz[][3] = { 3339 static const signed char dxyz[][3] = {
3343 0, 0, 0, 3340 0, 0, 0,
3344 0, 0, +1, 3341 0, 0, 4,
3345 0, 0, -1,
3346 0, +1, 0, 3342 0, 4, 0,
3347 0, -1, 0,
3348 +1, 0, 0, 3343 4, 0, 0,
3349 -1, 0, 0, 3344 0, 4, 4,
3345 4, 4, 0,
3346 4, 0, 4,
3350 }; 3347 };
3351 3348
3349 static const unsigned char color_level[8][32] = {
3350 // neighbour index
3351 {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},
3352 {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},
3353 {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},
3354 {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},
3355 // Red_levels/Green_levels/Blue_levels index
3356 {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},
3357 {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},
3358 {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},
3359 {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},
3360 };
3361
3362 unsigned int idx;
3363
3352 for (int n = 0; n < ecb_array_length (dxyz); ++n) 3364 for (int n = 0; n < ecb_array_length (dxyz); ++n)
3353 { 3365 {
3354 int r = idx_r + dxyz[n][0]; 3366 unsigned int idx_r = color_level[ Red_levels - dxyz[n][0]][r / 8];
3355 int g = idx_g + dxyz[n][1]; 3367 unsigned int idx_g = color_level[Green_levels - dxyz[n][1]][g / 8];
3356 int b = idx_b + dxyz[n][2]; 3368 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); 3369 unsigned int index = colorcube_index (idx_r, idx_g, idx_b);
3370
3371 if (n == 0)
3372 idx = index;
3363 3373
3364 if (rgb24_color[index] == color) 3374 if (rgb24_color[index] == color)
3365 { 3375 {
3366 rgb24_seqno[index] = ++rgb24_sequence; 3376 rgb24_seqno[index] = ++rgb24_sequence;
3367 return index + minTermCOLOR24; 3377 return index + minTermCOLOR24;
3395void 3405void
3396rxvt_term::process_color_seq (int report, int color, const char *str, char resp) 3406rxvt_term::process_color_seq (int report, int color, const char *str, char resp)
3397{ 3407{
3398 if (str[0] == '?' && !str[1]) 3408 if (str[0] == '?' && !str[1])
3399 { 3409 {
3410 if (!IN_RANGE_INC (color, minCOLOR, maxTermCOLOR))
3411 return;
3412
3400 rgba c; 3413 rgba c;
3401 pix_colors_focused[color].get (c); 3414 pix_colors_focused[color].get (c);
3415 color -= minCOLOR;
3402 3416
3403#if XFT 3417#if XFT
3404 if (c.a != rgba::MAX_CC) 3418 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); 3419 tt_printf ("\033]%d;%d;rgba:%04x/%04x/%04x/%04x%c", report, color, c.r, c.g, c.b, c.a, resp);
3406 else 3420 else
3407#endif 3421#endif
3408 tt_printf ("\033]%d;rgb:%04x/%04x/%04x%c", report, c.r, c.g, c.b, resp); 3422 tt_printf ("\033]%d;%d;rgb:%04x/%04x/%04x%c", report, color, c.r, c.g, c.b, resp);
3409 } 3423 }
3410 else 3424 else
3411 set_window_color (color, str); 3425 set_window_color (color, str);
3412} 3426}
3413 3427
3722 { 2004, PrivMode_BracketPaste }, 3736 { 2004, PrivMode_BracketPaste },
3723 }; 3737 };
3724 3738
3725 if (nargs == 0) 3739 if (nargs == 0)
3726 return; 3740 return;
3741
3742 // DECRQM
3743 if (mode == 'p')
3744 {
3745 int status = 0;
3746 if (nargs != 1)
3747 return;
3748
3749 for (j = 0; j < ecb_array_length (argtopriv); j++)
3750 if (argtopriv[j].argval == arg[0])
3751 {
3752 status = (priv_modes & argtopriv[j].bit) ? 1 : 2;
3753 break;
3754 }
3755
3756 tt_printf ("\33[?%d;%d$y", arg[0], status);
3757 return;
3758 }
3727 3759
3728 /* make lo/hi boolean */ 3760 /* make lo/hi boolean */
3729 if (mode == 'l') 3761 if (mode == 'l')
3730 mode = 0; /* reset */ 3762 mode = 0; /* reset */
3731 else if (mode == 'h') 3763 else if (mode == 'h')

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines