static int lookup_colour(const VTermState *state, int palette, const long args[], int argcount, VTermColor *col, int *index) { switch(palette) { case 2: // RGB mode - 3 args contain colour values directly if(argcount < 3) return argcount; col->red = CSI_ARG(args[0]); col->green = CSI_ARG(args[1]); col->blue = CSI_ARG(args[2]); return 3; case 5: // XTerm 256-colour mode if(index) *index = CSI_ARG_OR(args[0], -1); lookup_colour_palette(state, argcount ? CSI_ARG_OR(args[0], -1) : -1, col); return argcount ? 1 : 0; default: DEBUG_LOG("Unrecognised colour palette %d\n", palette); return 0; } }
static int parser_csi(const char *leader, const long args[], int argcount, const char *intermed, char command, void *user) { const char *name = NULL; if(!leader && !intermed && command < 0x70) name = name_csi_plain[command - 0x40]; else if(leader && streq(leader, "?") && !intermed) { /* DEC */ switch(command) { case 'h': name = "DECSM"; break; case 'l': name = "DECRM"; break; } if(name) leader = NULL; } if(!leader && !intermed && command < 0x70 && newline_csi_plain[command - 0x40]) printf("\n"); if(name) printf("%s%s", special_begin, name); else printf("%sCSI", special_begin); if(leader && leader[0]) printf(" %s", leader); for(int i = 0; i < argcount; i++) { printf(i ? "," : " "); if(args[i] == CSI_ARG_MISSING) printf("*"); else { while(CSI_ARG_HAS_MORE(args[i])) printf("%ld+", CSI_ARG(args[i++])); printf("%ld", CSI_ARG(args[i])); } } if(intermed && intermed[0]) printf(" %s", intermed); if(name) printf("%s", special_end); else printf(" %c%s", command, special_end); return 1; }
static void do_csi(VTerm *vt, char command) { #ifdef DEBUG_PARSER printf("Parsed CSI args as:\n", arglen, args); printf(" leader: %s\n", vt->parser.csi_leader); for(int argi = 0; argi < vt->parser.csi_argi; argi++) { printf(" %lu", CSI_ARG(vt->parser.csi_args[argi])); if(!CSI_ARG_HAS_MORE(vt->parser.csi_args[argi])) printf("\n"); printf(" intermed: %s\n", vt->parser.intermed); } #endif if(vt->parser.callbacks && vt->parser.callbacks->csi) if((*vt->parser.callbacks->csi)( vt->parser.csi_leaderlen ? vt->parser.csi_leader : NULL, vt->parser.csi_args, vt->parser.csi_argi, vt->parser.intermedlen ? vt->parser.intermed : NULL, command, vt->parser.cbdata)) return; DEBUG_LOG("libvterm: Unhandled CSI %c\n", command); }