|
Lines 1-8
Link Here
|
| 1 |
/* $XTermId: graphics_regis.c,v 1.130 2022/05/16 23:31:18 tom Exp $ */ |
1 |
/* $XTermId: graphics_regis.c,v 1.139 2023/03/08 01:06:03 tom Exp $ */ |
| 2 |
|
2 |
|
| 3 |
/* |
3 |
/* |
| 4 |
* Copyright 2014-2021,2022 by Ross Combs |
4 |
* Copyright 2014-2022,2023 by Ross Combs |
| 5 |
* Copyright 2014-2021,2022 by Thomas E. Dickey |
5 |
* Copyright 2014-2022,2023 by Thomas E. Dickey |
| 6 |
* |
6 |
* |
| 7 |
* All Rights Reserved |
7 |
* All Rights Reserved |
| 8 |
* |
8 |
* |
|
Lines 119-124
typedef struct RegisTextControls {
Link Here
|
| 119 |
int slant; /* for italic/oblique */ |
119 |
int slant; /* for italic/oblique */ |
| 120 |
} RegisTextControls; |
120 |
} RegisTextControls; |
| 121 |
|
121 |
|
|
|
122 |
#define S_QUOTE '\'' |
| 123 |
#define D_QUOTE '"' |
| 124 |
|
| 125 |
#define isQuote(ch) ((ch) == S_QUOTE || (ch) == D_QUOTE) |
| 126 |
#define PickQuote(ch) ((ch) == S_QUOTE ? D_QUOTE : S_QUOTE) |
| 127 |
|
| 128 |
#define isName(c) ((c) == '_' || isalnum(CharOf(c))) |
| 129 |
|
| 122 |
#define FixedCopy(dst, src, len) strncpy(dst, src, len - 1)[len - 1] = '\0' |
130 |
#define FixedCopy(dst, src, len) strncpy(dst, src, len - 1)[len - 1] = '\0' |
| 123 |
#define CopyFontname(dst, src) FixedCopy(dst, src, (size_t) REGIS_FONTNAME_LEN) |
131 |
#define CopyFontname(dst, src) FixedCopy(dst, src, (size_t) REGIS_FONTNAME_LEN) |
| 124 |
|
132 |
|
|
Lines 538-545
draw_or_save_patterned_pixel(RegisGraphicsContext *context, int x, int y)
Link Here
|
| 538 |
static int |
546 |
static int |
| 539 |
sort_points(void const *l, void const *r) |
547 |
sort_points(void const *l, void const *r) |
| 540 |
{ |
548 |
{ |
| 541 |
RegisPoint const *const lp = (RegisPoint const *)l; |
549 |
RegisPoint const *const lp = (RegisPoint const *) l; |
| 542 |
RegisPoint const *const rp = (RegisPoint const *)r; |
550 |
RegisPoint const *const rp = (RegisPoint const *) r; |
| 543 |
|
551 |
|
| 544 |
if (lp->y < rp->y) |
552 |
if (lp->y < rp->y) |
| 545 |
return -1; |
553 |
return -1; |
|
Lines 3151-3156
extract_regis_command(RegisDataFragment *input, char *command)
Link Here
|
| 3151 |
return 1; |
3159 |
return 1; |
| 3152 |
} |
3160 |
} |
| 3153 |
|
3161 |
|
|
|
3162 |
/* |
| 3163 |
* Check a ReGIS alphabet name before reporting it, to pick an appropriate |
| 3164 |
* delimiter. If the string is empty, or contains nonreportable characters, |
| 3165 |
* just return NUL. |
| 3166 |
*/ |
| 3167 |
static int |
| 3168 |
pick_quote(const char *value) |
| 3169 |
{ |
| 3170 |
Bool s_quote = False; |
| 3171 |
Bool d_quote = False; |
| 3172 |
|
| 3173 |
if (*value != '\0') { |
| 3174 |
while (*value != '\0') { |
| 3175 |
int ch = CharOf(*value++); |
| 3176 |
if (ch == D_QUOTE) |
| 3177 |
d_quote = True; |
| 3178 |
else if (ch == S_QUOTE) |
| 3179 |
s_quote = True; |
| 3180 |
else if (!isName(ch)) |
| 3181 |
s_quote = d_quote = True; |
| 3182 |
} |
| 3183 |
} else { |
| 3184 |
s_quote = d_quote = True; |
| 3185 |
} |
| 3186 |
return ((s_quote && d_quote) |
| 3187 |
? 0 |
| 3188 |
: (s_quote |
| 3189 |
? D_QUOTE |
| 3190 |
: S_QUOTE)); |
| 3191 |
} |
| 3192 |
|
| 3154 |
static int |
3193 |
static int |
| 3155 |
extract_regis_string(RegisDataFragment *input, char *out, unsigned maxlen) |
3194 |
extract_regis_string(RegisDataFragment *input, char *out, unsigned maxlen) |
| 3156 |
{ |
3195 |
{ |
|
Lines 3166-3172
extract_regis_string(RegisDataFragment *input, char *out, unsigned maxlen)
Link Here
|
| 3166 |
return 0; |
3205 |
return 0; |
| 3167 |
|
3206 |
|
| 3168 |
ch = peek_fragment(input); |
3207 |
ch = peek_fragment(input); |
| 3169 |
if (ch != '\'' && ch != '"') |
3208 |
if (!isQuote(ch)) |
| 3170 |
return 0; |
3209 |
return 0; |
| 3171 |
open_quote_ch = ch; |
3210 |
open_quote_ch = ch; |
| 3172 |
outlen = 0U; |
3211 |
outlen = 0U; |
|
Lines 3246-3252
extract_regis_parenthesized_data(RegisDataFragment *input,
Link Here
|
| 3246 |
for (; input->pos < input->len; input->pos++, output->len++) { |
3285 |
for (; input->pos < input->len; input->pos++, output->len++) { |
| 3247 |
char prev_ch = ch; |
3286 |
char prev_ch = ch; |
| 3248 |
ch = input->start[input->pos]; |
3287 |
ch = input->start[input->pos]; |
| 3249 |
if (ch == '\'' || ch == '"') { |
3288 |
if (isQuote(ch)) { |
| 3250 |
if (open_quote_ch == '\0') { |
3289 |
if (open_quote_ch == '\0') { |
| 3251 |
open_quote_ch = ch; |
3290 |
open_quote_ch = ch; |
| 3252 |
} else { |
3291 |
} else { |
|
Lines 3314-3320
extract_regis_option(RegisDataFragment *input,
Link Here
|
| 3314 |
if (ch == ';' || ch == ',' || |
3353 |
if (ch == ';' || ch == ',' || |
| 3315 |
ch == '(' || ch == ')' || |
3354 |
ch == '(' || ch == ')' || |
| 3316 |
ch == '[' || ch == ']' || |
3355 |
ch == '[' || ch == ']' || |
| 3317 |
ch == '"' || ch == '\'' || |
3356 |
isQuote(ch) || |
| 3318 |
isdigit(CharOf(ch))) { |
3357 |
isdigit(CharOf(ch))) { |
| 3319 |
return 0; |
3358 |
return 0; |
| 3320 |
} |
3359 |
} |
|
Lines 3330-3336
extract_regis_option(RegisDataFragment *input,
Link Here
|
| 3330 |
TRACE(("looking at char '%c' in option '%c'\n", ch, *option)); |
3369 |
TRACE(("looking at char '%c' in option '%c'\n", ch, *option)); |
| 3331 |
/* FIXME: any special rules for commas? */ |
3370 |
/* FIXME: any special rules for commas? */ |
| 3332 |
/* FIXME: handle escaped quotes */ |
3371 |
/* FIXME: handle escaped quotes */ |
| 3333 |
if (ch == '\'' || ch == '"') { |
3372 |
if (isQuote(ch)) { |
| 3334 |
if (open_quote_ch == ch) { |
3373 |
if (open_quote_ch == ch) { |
| 3335 |
open_quote_ch = '\0'; |
3374 |
open_quote_ch = '\0'; |
| 3336 |
} else { |
3375 |
} else { |
|
Lines 5008-5013
parse_regis_command(RegisParseState *state)
Link Here
|
| 5008 |
static int |
5047 |
static int |
| 5009 |
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context) |
5048 |
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context) |
| 5010 |
{ |
5049 |
{ |
|
|
5050 |
XtermWidget xw = context->display_graphic->xw; |
| 5011 |
RegisDataFragment optionarg; |
5051 |
RegisDataFragment optionarg; |
| 5012 |
|
5052 |
|
| 5013 |
if (!extract_regis_option(&state->input, &state->option, &optionarg)) |
5053 |
if (!extract_regis_option(&state->input, &state->option, &optionarg)) |
|
Lines 5586-5598
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context)
Link Here
|
| 5586 |
state->option, fragment_to_tempstr(&optionarg))); |
5626 |
state->option, fragment_to_tempstr(&optionarg))); |
| 5587 |
break; |
5627 |
break; |
| 5588 |
} { |
5628 |
} { |
| 5589 |
char reply[64]; |
5629 |
unsigned err_code = 0U; |
|
|
5630 |
unsigned err_char = 0U; |
| 5590 |
|
5631 |
|
| 5591 |
TRACE(("got report last error condition\n")); |
5632 |
TRACE(("got report last error condition\n")); |
| 5592 |
/* FIXME: implement after adding error tracking */ |
5633 |
/* FIXME: implement after adding error tracking */ |
| 5593 |
sprintf(reply, "\"%u,%u\"\r", 0U, 0U); |
5634 |
unparseputc(xw, D_QUOTE); |
| 5594 |
unparseputs(context->display_graphic->xw, reply); |
5635 |
unparseputn(xw, err_code); |
| 5595 |
unparse_end(context->display_graphic->xw); |
5636 |
unparseputc(xw, ','); |
|
|
5637 |
unparseputn(xw, err_char); |
| 5638 |
unparseputc(xw, D_QUOTE); |
| 5639 |
unparseputc(xw, '\r'); |
| 5640 |
unparse_end(xw); |
| 5596 |
} |
5641 |
} |
| 5597 |
break; |
5642 |
break; |
| 5598 |
case 'I': |
5643 |
case 'I': |
|
Lines 5639-5646
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context)
Link Here
|
| 5639 |
/* FIXME: implement arrow key movement */ |
5684 |
/* FIXME: implement arrow key movement */ |
| 5640 |
/* FIXME: implement button/key collection */ |
5685 |
/* FIXME: implement button/key collection */ |
| 5641 |
|
5686 |
|
| 5642 |
unparseputs(context->display_graphic->xw, "\r"); |
5687 |
unparseputc(xw, '\r'); |
| 5643 |
unparse_end(context->display_graphic->xw); |
5688 |
unparse_end(xw); |
| 5644 |
|
5689 |
|
| 5645 |
skip_regis_whitespace(&optionarg); |
5690 |
skip_regis_whitespace(&optionarg); |
| 5646 |
if (!fragment_consumed(&optionarg)) { |
5691 |
if (!fragment_consumed(&optionarg)) { |
|
Lines 5657-5681
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context)
Link Here
|
| 5657 |
if (!fragment_consumed(&optionarg)) { |
5702 |
if (!fragment_consumed(&optionarg)) { |
| 5658 |
TRACE(("DATA_ERROR: unexpected arguments to ReGIS report command option '%c' arg \"%s\"\n", |
5703 |
TRACE(("DATA_ERROR: unexpected arguments to ReGIS report command option '%c' arg \"%s\"\n", |
| 5659 |
state->option, fragment_to_tempstr(&optionarg))); |
5704 |
state->option, fragment_to_tempstr(&optionarg))); |
| 5660 |
break; |
5705 |
} else if (state->load_index == MAX_REGIS_ALPHABETS) { |
| 5661 |
} { |
5706 |
/* If this happens something went wrong elsewhere. */ |
| 5662 |
char buffer[32]; |
5707 |
TRACE(("DATA_ERROR: unable to report current load alphabet\n")); |
| 5663 |
|
5708 |
unparseputs(xw, "A0\"\"\r"); |
| 5664 |
if (state->load_index == MAX_REGIS_ALPHABETS) { |
5709 |
unparse_end(xw); |
| 5665 |
/* If this happens something went wrong elsewhere. */ |
5710 |
} else { |
| 5666 |
TRACE(("DATA_ERROR: unable to report current load alphabet\n")); |
5711 |
int delim = pick_quote(state->load_name); |
| 5667 |
unparseputs(context->display_graphic->xw, "A0\"\"\r"); |
5712 |
if (delim != '\0') { |
| 5668 |
unparse_end(context->display_graphic->xw); |
5713 |
unparseputs(xw, "A"); |
| 5669 |
break; |
5714 |
unparseputn(xw, state->load_alphabet); |
|
|
5715 |
unparseputc(xw, delim); |
| 5716 |
unparseputs(xw, state->load_name); |
| 5717 |
unparseputc(xw, delim); |
| 5670 |
} |
5718 |
} |
| 5671 |
|
5719 |
unparseputc(xw, '\r'); |
| 5672 |
unparseputs(context->display_graphic->xw, "A"); |
5720 |
unparse_end(xw); |
| 5673 |
sprintf(buffer, "%u", state->load_alphabet); |
|
|
| 5674 |
unparseputs(context->display_graphic->xw, buffer); |
| 5675 |
unparseputs(context->display_graphic->xw, "\""); |
| 5676 |
unparseputs(context->display_graphic->xw, state->load_name); |
| 5677 |
unparseputs(context->display_graphic->xw, "\"\r"); |
| 5678 |
unparse_end(context->display_graphic->xw); |
| 5679 |
} |
5721 |
} |
| 5680 |
break; |
5722 |
break; |
| 5681 |
case 'M': |
5723 |
case 'M': |
|
Lines 5717-5743
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context)
Link Here
|
| 5717 |
} |
5759 |
} |
| 5718 |
|
5760 |
|
| 5719 |
if (name == '=') { |
5761 |
if (name == '=') { |
| 5720 |
char reply[64]; |
5762 |
unsigned max_available = 1000U; |
|
|
5763 |
unsigned cur_available = max_available; |
| 5721 |
|
5764 |
|
| 5722 |
TRACE(("got report macrograph storage request\n")); |
5765 |
TRACE(("got report macrograph storage request\n")); |
| 5723 |
/* FIXME: Implement when macrographs are supported. */ |
5766 |
/* FIXME: Implement when macrographs are supported. */ |
| 5724 |
sprintf(reply, "\"%u,%u\"\r", 1000U, 1000U); |
5767 |
unparseputc(xw, D_QUOTE); |
| 5725 |
unparseputs(context->display_graphic->xw, reply); |
5768 |
unparseputn(xw, cur_available); |
| 5726 |
unparse_end(context->display_graphic->xw); |
5769 |
unparseputc(xw, ','); |
|
|
5770 |
unparseputn(xw, max_available); |
| 5771 |
unparseputc(xw, D_QUOTE); |
| 5772 |
unparseputc(xw, '\r'); |
| 5773 |
unparse_end(xw); |
| 5727 |
} else if (name < 'A' || name > 'Z') { |
5774 |
} else if (name < 'A' || name > 'Z') { |
| 5728 |
TRACE(("DATA_ERROR: invalid macrograph name: \"%c\"\n", name)); |
5775 |
TRACE(("DATA_ERROR: invalid macrograph name: \"%c\"\n", name)); |
| 5729 |
/* FIXME: what should happen? */ |
5776 |
/* FIXME: what should happen? */ |
| 5730 |
break; |
5777 |
break; |
| 5731 |
} else { |
5778 |
} else { |
| 5732 |
char temp[8]; |
|
|
| 5733 |
|
| 5734 |
TRACE(("got report macrograph request for name '%c'\n", name)); |
5779 |
TRACE(("got report macrograph request for name '%c'\n", name)); |
| 5735 |
sprintf(temp, "@=%c", name); |
5780 |
unparseputs(xw, "@="); |
| 5736 |
unparseputs(context->display_graphic->xw, temp); |
5781 |
unparseputc(xw, name); |
| 5737 |
/* FIXME: Allow this to be disabled for security reasons. */ |
5782 |
/* FIXME: Allow this to be disabled for security reasons. */ |
| 5738 |
/* FIXME: implement when macrographs are supported. */ |
5783 |
/* FIXME: implement when macrographs are supported. */ |
| 5739 |
unparseputs(context->display_graphic->xw, "@;\r"); |
5784 |
unparseputs(xw, "@;"); |
| 5740 |
unparse_end(context->display_graphic->xw); |
5785 |
unparseputc(xw, '\r'); |
|
|
5786 |
unparse_end(xw); |
| 5741 |
} |
5787 |
} |
| 5742 |
} |
5788 |
} |
| 5743 |
break; |
5789 |
break; |
|
Lines 5785-5862
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context)
Link Here
|
| 5785 |
TRACE(("got report cursor position (output=%d)\n", output)); |
5831 |
TRACE(("got report cursor position (output=%d)\n", output)); |
| 5786 |
|
5832 |
|
| 5787 |
/* FIXME: look into supporting ANSI locator reports (DECLRP) */ |
5833 |
/* FIXME: look into supporting ANSI locator reports (DECLRP) */ |
|
|
5834 |
unparseputc(xw, L_BLOK); |
| 5788 |
if (output == 1) { |
5835 |
if (output == 1) { |
| 5789 |
char reply[64]; |
5836 |
/* FIXME: verify in absolute, not user, coordinates */ |
|
|
5837 |
unparseputn(xw, (unsigned) context->graphics_output_cursor_x); |
| 5838 |
unparseputc(xw, ','); |
| 5839 |
unparseputn(xw, (unsigned) context->graphics_output_cursor_y); |
| 5840 |
} else if (context->multi_input_mode) { |
| 5841 |
/* FIXME: track input coordinates */ |
| 5842 |
unsigned x = 0, y = 0; /* placeholders */ |
| 5790 |
|
5843 |
|
|
|
5844 |
/* send CSI240~[x,y]\r with current input cursor location */ |
| 5845 |
|
| 5846 |
/* FIXME: verify no leading char or button sequence */ |
| 5847 |
/* FIXME: should we ever send an eight-bit CSI? */ |
| 5791 |
/* FIXME: verify in absolute, not user, coordinates */ |
5848 |
/* FIXME: verify in absolute, not user, coordinates */ |
| 5792 |
sprintf(reply, "[%d,%d]\r", |
5849 |
TRACE(("sending multi-mode input report at %u,%u\n", x, y)); |
| 5793 |
context->graphics_output_cursor_x, |
5850 |
unparseputn(xw, x); |
| 5794 |
context->graphics_output_cursor_y); |
5851 |
unparseputc(xw, ','); |
| 5795 |
unparseputs(context->display_graphic->xw, reply); |
5852 |
unparseputn(xw, y); |
| 5796 |
unparse_end(context->display_graphic->xw); |
|
|
| 5797 |
} else { |
5853 |
} else { |
| 5798 |
char reply[64]; |
5854 |
char ch = ' '; /* placeholder */ |
| 5799 |
int x, y; |
5855 |
unsigned x = 0, y = 0; /* placeholders */ |
| 5800 |
|
5856 |
|
| 5801 |
if (context->multi_input_mode) { |
5857 |
/* FIXME: wait for first non-arrow keypress or mouse click, and don't update graphics while waiting */ |
| 5802 |
/* FIXME: track input coordinates */ |
5858 |
/* send <key or button>[x,y]\r to report input cursor location */ |
| 5803 |
x = y = 0; /* placeholders */ |
5859 |
|
| 5804 |
|
5860 |
/* null button: CSI240~ */ |
| 5805 |
/* send CSI240~[x,y]\r with current input cursor location */ |
5861 |
/* left button: CSI241~ */ |
| 5806 |
|
5862 |
/* middle button: CSI243~ */ |
| 5807 |
/* FIXME: verify no leading char or button sequence */ |
5863 |
/* right button: CSI245~ */ |
| 5808 |
/* FIXME: should we ever send an eight-bit CSI? */ |
5864 |
/* extra button: CSI247~ */ |
| 5809 |
/* FIXME: verify in absolute, not user, coordinates */ |
5865 |
/* FIXME: support DECLBD to change button assignments */ |
| 5810 |
TRACE(("sending multi-mode input report at %d,%d\n", |
5866 |
/* FIXME: verify no leading char or button sequence */ |
| 5811 |
x, y)); |
5867 |
TRACE(("sending one-shot input report with %c at %u,%u\n", |
| 5812 |
sprintf(reply, "[%d,%d]\r", x, y); |
5868 |
ch, x, y)); |
| 5813 |
unparseputs(context->display_graphic->xw, reply); |
5869 |
if (ch != '\177') { |
| 5814 |
unparse_end(context->display_graphic->xw); |
5870 |
unparseputn(xw, x); |
| 5815 |
break; |
5871 |
unparseputc(xw, ','); |
| 5816 |
} else { |
5872 |
unparseputn(xw, y); |
| 5817 |
char ch; |
|
|
| 5818 |
|
| 5819 |
/* FIXME: wait for first non-arrow keypress or mouse click, and don't update graphics while waiting */ |
| 5820 |
ch = ' '; /* placeholder */ |
| 5821 |
x = y = 0; /* placeholders */ |
| 5822 |
|
| 5823 |
/* send <key or button>[x,y]\r to report input cursor location */ |
| 5824 |
|
| 5825 |
/* null button: CSI240~ */ |
| 5826 |
/* left button: CSI241~ */ |
| 5827 |
/* middle button: CSI243~ */ |
| 5828 |
/* right button: CSI245~ */ |
| 5829 |
/* extra button: CSI247~ */ |
| 5830 |
/* FIXME: support DECLBD to change button assignments */ |
| 5831 |
/* FIXME: verify no leading char or button sequence */ |
| 5832 |
TRACE(("sending one-shot input report with %c at %d,%d\n", |
| 5833 |
ch, x, y)); |
| 5834 |
#if 0 /* FIXME - dead code */ |
| 5835 |
if (ch == '\r') { |
| 5836 |
/* Return only reports the location. */ |
| 5837 |
sprintf(reply, "[%d,%d]\r", x, y); |
| 5838 |
} else if (ch == '\177') { |
| 5839 |
/* DEL exits locator mode reporting nothing. */ |
| 5840 |
sprintf(reply, "\r"); |
| 5841 |
} else |
| 5842 |
#endif |
| 5843 |
{ |
| 5844 |
sprintf(reply, "%c[%d,%d]\r", ch, x, y); |
| 5845 |
} |
| 5846 |
unparseputs(context->display_graphic->xw, reply); |
| 5847 |
unparse_end(context->display_graphic->xw); |
| 5848 |
/* FIXME: exit one-shot mode and disable input cursor */ |
| 5849 |
break; |
| 5850 |
} |
5873 |
} |
|
|
5874 |
/* FIXME: exit one-shot mode and disable input cursor */ |
| 5851 |
} |
5875 |
} |
|
|
5876 |
unparseputc(xw, R_BLOK); |
| 5877 |
unparseputc(xw, '\r'); |
| 5878 |
unparse_end(xw); |
| 5852 |
} |
5879 |
} |
| 5853 |
break; |
5880 |
break; |
| 5854 |
default: |
5881 |
default: |
| 5855 |
TRACE(("DATA_ERROR: sending empty report for unknown ReGIS report command option '%c' arg \"%s\"\n", |
5882 |
TRACE(("DATA_ERROR: sending empty report for unknown ReGIS report command option '%c' arg \"%s\"\n", |
| 5856 |
state->option, fragment_to_tempstr(&optionarg))); |
5883 |
state->option, fragment_to_tempstr(&optionarg))); |
| 5857 |
/* Unknown report request types must receive empty reports. */ |
5884 |
/* Unknown report request types must receive empty reports. */ |
| 5858 |
unparseputs(context->display_graphic->xw, "\r"); |
5885 |
unparseputs(xw, "\r"); |
| 5859 |
unparse_end(context->display_graphic->xw); |
5886 |
unparse_end(xw); |
| 5860 |
break; |
5887 |
break; |
| 5861 |
} |
5888 |
} |
| 5862 |
break; |
5889 |
break; |
|
Lines 6154-6160
parse_regis_option(RegisParseState *state, RegisGraphicsContext *context)
Link Here
|
| 6154 |
|
6181 |
|
| 6155 |
TRACE(("using display page number: %d\n", page)); |
6182 |
TRACE(("using display page number: %d\n", page)); |
| 6156 |
context->display_page = (unsigned) page; |
6183 |
context->display_page = (unsigned) page; |
| 6157 |
map_regis_graphics_pages(context->display_graphic->xw, context); |
6184 |
map_regis_graphics_pages(xw, context); |
| 6158 |
} |
6185 |
} |
| 6159 |
break; |
6186 |
break; |
| 6160 |
case 'T': |
6187 |
case 'T': |