in braille/braille_console.c [264:339]
static int vt_notifier_call(struct notifier_block *blk,
unsigned long code, void *_param)
{
struct vt_notifier_param *param = _param;
struct vc_data *vc = param->vc;
switch (code) {
case VT_ALLOCATE:
break;
case VT_DEALLOCATE:
break;
case VT_WRITE:
{
unsigned char c = param->c;
if (vc->vc_num != fg_console)
break;
switch (c) {
case '\b':
case 127:
if (console_cursor > 0) {
console_cursor--;
console_buf[console_cursor] = ' ';
}
break;
case '\n':
case '\v':
case '\f':
case '\r':
console_newline = 1;
break;
case '\t':
c = ' ';
fallthrough;
default:
if (c < 32)
/* Ignore other control sequences */
break;
if (console_newline) {
memset(console_buf, 0, sizeof(console_buf));
console_cursor = 0;
console_newline = 0;
}
if (console_cursor == WIDTH)
memmove(console_buf, &console_buf[1],
(WIDTH-1) * sizeof(*console_buf));
else
console_cursor++;
console_buf[console_cursor-1] = c;
break;
}
if (console_show)
braille_write(console_buf);
else {
vc_maybe_cursor_moved(vc);
vc_refresh(vc);
}
break;
}
case VT_UPDATE:
/* Maybe a VT switch, flush */
if (console_show) {
if (vc->vc_num != lastVC) {
lastVC = vc->vc_num;
memset(console_buf, 0, sizeof(console_buf));
console_cursor = 0;
braille_write(console_buf);
}
} else {
vc_maybe_cursor_moved(vc);
vc_refresh(vc);
}
break;
}
return NOTIFY_OK;
}