in braille/braille_console.c [143:258]
static int keyboard_notifier_call(struct notifier_block *blk,
unsigned long code, void *_param)
{
struct keyboard_notifier_param *param = _param;
struct vc_data *vc = param->vc;
int ret = NOTIFY_OK;
if (!param->down)
return ret;
switch (code) {
case KBD_KEYCODE:
if (console_show) {
if (param->value == BRAILLE_KEY) {
console_show = 0;
beep(880);
vc_maybe_cursor_moved(vc);
vc_refresh(vc);
ret = NOTIFY_STOP;
}
} else {
ret = NOTIFY_STOP;
switch (param->value) {
case KEY_INSERT:
beep(440);
console_show = 1;
lastVC = -1;
braille_write(console_buf);
break;
case KEY_LEFT:
if (vc_x > 0) {
vc_x -= WIDTH;
if (vc_x < 0)
vc_x = 0;
} else if (vc_y >= 1) {
beep(880);
vc_y--;
vc_x = vc->vc_cols-WIDTH;
} else
beep(220);
break;
case KEY_RIGHT:
if (vc_x + WIDTH < vc->vc_cols) {
vc_x += WIDTH;
} else if (vc_y + 1 < vc->vc_rows) {
beep(880);
vc_y++;
vc_x = 0;
} else
beep(220);
break;
case KEY_DOWN:
if (vc_y + 1 < vc->vc_rows)
vc_y++;
else
beep(220);
break;
case KEY_UP:
if (vc_y >= 1)
vc_y--;
else
beep(220);
break;
case KEY_HOME:
vc_follow_cursor(vc);
break;
case KEY_PAGEUP:
vc_x = 0;
vc_y = 0;
break;
case KEY_PAGEDOWN:
vc_x = 0;
vc_y = vc->vc_rows-1;
break;
default:
ret = NOTIFY_OK;
break;
}
if (ret == NOTIFY_STOP)
vc_refresh(vc);
}
break;
case KBD_POST_KEYSYM:
{
unsigned char type = KTYP(param->value) - 0xf0;
if (type == KT_SPEC) {
unsigned char val = KVAL(param->value);
int on_off = -1;
switch (val) {
case KVAL(K_CAPS):
on_off = vt_get_leds(fg_console, VC_CAPSLOCK);
break;
case KVAL(K_NUM):
on_off = vt_get_leds(fg_console, VC_NUMLOCK);
break;
case KVAL(K_HOLD):
on_off = vt_get_leds(fg_console, VC_SCROLLOCK);
break;
}
if (on_off == 1)
beep(880);
else if (on_off == 0)
beep(440);
}
}
break;
case KBD_UNBOUND_KEYCODE:
case KBD_UNICODE:
case KBD_KEYSYM:
/* Unused */
break;
}
return ret;
}