static void promcon_bmove(struct vc_data *conp, int sy, int sx, int dy, int dx, int height, int width) { char buf[256], *b = buf; if (console_blanked) return; b += promcon_start(conp, b); if (sy == dy && height == 1) { if (dx > sx && dx + width == conp->vc_cols) b += sprintf(b, "\033[%d;%dH\033[%d@\033[%d;%dH", sy + 1, sx + 1, dx - sx, py + 1, px + 1); else if (dx < sx && sx + width == conp->vc_cols) b += sprintf(b, "\033[%d;%dH\033[%dP\033[%d;%dH", dy + 1, dx + 1, sx - dx, py + 1, px + 1); b += promcon_end(conp, b); promcon_puts(buf, b - buf); return; } /* * FIXME: What to do here??? * Current console.c should not call it like that ever. */ prom_printf("\033[7mFIXME: bmove not handled\033[m\n"); }
static int promcon_scroll(struct vc_data *conp, int t, int b, int dir, int count) { unsigned char buf[256], *p = buf; unsigned short *s; int i; if (console_blanked) return 0; p += promcon_start(conp, p); switch (dir) { case SM_UP: if (b == ph + 1) { p += sprintf(p, "\033[%dH\033[%dM", t + 1, count); px = 0; py = t; p += promcon_end(conp, p); promcon_puts(buf, p - buf); break; } s = (unsigned short *)(conp->vc_origin + (t + count) * conp->vc_size_row); p += sprintf(p, "\033[%dH", t + 1); for (i = t; i < b - count; i++) s = promcon_repaint_line(s, buf, &p); for (; i < b - 1; i++) { strcpy(p, "\033[K\n"); p += 4; if (p - buf >= 224) { promcon_puts(buf, p - buf); p = buf; } } strcpy(p, "\033[K"); p += 3; p += promcon_end(conp, p); promcon_puts(buf, p - buf); break; case SM_DOWN: if (b == ph + 1) { p += sprintf(p, "\033[%dH\033[%dL", t + 1, count); px = 0; py = t; p += promcon_end(conp, p); promcon_puts(buf, p - buf); break; } s = (unsigned short *)(conp->vc_origin + t * conp->vc_size_row); p += sprintf(p, "\033[%dH", t + 1); for (i = t; i < t + count; i++) { strcpy(p, "\033[K\n"); p += 4; if (p - buf >= 224) { promcon_puts(buf, p - buf); p = buf; } } for (; i < b; i++) s = promcon_repaint_line(s, buf, &p); p += promcon_end(conp, p); promcon_puts(buf, p - buf); break; } return 0; }
static void promcon_clear(struct vc_data *conp, int sy, int sx, int height, int width) { unsigned char buf[256], *b = buf; int i, j; if (console_blanked) return; b += promcon_start(conp, b); if (!sx && width == pw + 1) { if (!sy && height == ph + 1) { strcpy(b, "\033[H\033[J"); b += 6; b += promcon_end(conp, b); promcon_puts(buf, b - buf); return; } else if (sy + height == ph + 1) { b += sprintf(b, "\033[%dH\033[J", sy + 1); b += promcon_end(conp, b); promcon_puts(buf, b - buf); return; } b += sprintf(b, "\033[%dH", sy + 1); for (i = 1; i < height; i++) { strcpy(b, "\033[K\n"); b += 4; } strcpy(b, "\033[K"); b += 3; b += promcon_end(conp, b); promcon_puts(buf, b - buf); return; } else if (sx + width == pw + 1) { b += sprintf(b, "\033[%d;%dH", sy + 1, sx + 1); for (i = 1; i < height; i++) { strcpy(b, "\033[K\n"); b += 4; } strcpy(b, "\033[K"); b += 3; b += promcon_end(conp, b); promcon_puts(buf, b - buf); return; } for (i = sy + 1; i <= sy + height; i++) { b += sprintf(b, "\033[%d;%dH", i, sx + 1); for (j = 0; j < width; j++) *b++ = ' '; if (b - buf + width >= 224) { promcon_puts(buf, b - buf); b = buf; } } b += promcon_end(conp, b); promcon_puts(buf, b - buf); }
static void promcon_putcs(struct vc_data *conp, const unsigned short *s, int count, int y, int x) { unsigned char buf[256], *b = buf; unsigned short attr = scr_readw(s); unsigned char save; int i, last = 0; if (console_blanked) return; if (count <= 0) return; b += promcon_start(conp, b); if (x + count >= pw + 1) { if (count == 1) { x -= 1; save = scr_readw((unsigned short *)(conp->vc_origin + y * conp->vc_size_row + (x << 1))); if (px != x || py != y) { b += sprintf(b, "\033[%d;%dH", y + 1, x + 1); px = x; py = y; } if (inverted(attr)) b += sprintf(b, "\033[7m%c\033[m", scr_readw(s++)); else b += sprintf(b, "%c", scr_readw(s++)); strcpy(b, "\b\033[@"); b += 4; if (inverted(save)) b += sprintf(b, "\033[7m%c\033[m", save); else b += sprintf(b, "%c", save); px++; b += promcon_end(conp, b); promcon_puts(buf, b - buf); return; } else { last = 1; count = pw - x - 1; } } if (inverted(attr)) { strcpy(b, "\033[7m"); b += 4; } if (px != x || py != y) { b += sprintf(b, "\033[%d;%dH", y + 1, x + 1); px = x; py = y; } for (i = 0; i < count; i++) { if (b - buf >= 224) { promcon_puts(buf, b - buf); b = buf; } *b++ = scr_readw(s++); } px += count; if (last) { save = scr_readw(s++); b += sprintf(b, "%c\b\033[@%c", scr_readw(s++), save); px++; } if (inverted(attr)) { strcpy(b, "\033[m"); b += 3; } b += promcon_end(conp, b); promcon_puts(buf, b - buf); }