return -1; if (grub_keyboard_isr (key, is_break)) return -1; if (is_break) return -1; return key; } /* If there is a character pending, return it; otherwise return GRUB_TERM_NO_KEY. */ static int grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused))) { int code; code = grub_keyboard_getkey (); if (code == -1) return GRUB_TERM_NO_KEY; #ifdef DEBUG_AT_KEYBOARD grub_dprintf ("atkeyb", "Detected key 0x%x\n", key); #endif switch (code) { case GRUB_KEYBOARD_KEY_CAPS_LOCK: at_keyboard_status ^= GRUB_TERM_STATUS_CAPS; led_status ^= KEYBOARD_LED_CAPS; keyboard_controller_led (led_status); #ifdef DEBUG_AT_KEYBOARD grub_dprintf ("atkeyb", "caps_lock = %d\n", !!(at_keyboard_status & KEYBOARD_STATUS_CAPS_LOCK)); #endif
/* If there is a character pending, return it; otherwise return -1. */ static int grub_at_keyboard_getkey_noblock (void) { int code, key; code = grub_keyboard_getkey (); if (code == -1) return -1; #ifdef DEBUG_AT_KEYBOARD grub_dprintf ("atkeyb", "Detected key 0x%x\n", key); #endif switch (code) { case CAPS_LOCK: /* Caps lock sends scan code twice. Get the second one and discard it. */ while (grub_keyboard_getkey () == -1); at_keyboard_status ^= KEYBOARD_STATUS_CAPS_LOCK; led_status ^= KEYBOARD_LED_CAPS; keyboard_controller_led (led_status); #ifdef DEBUG_AT_KEYBOARD grub_dprintf ("atkeyb", "caps_lock = %d\n", !!(at_keyboard_status & KEYBOARD_STATUS_CAPS_LOCK)); #endif key = -1; break; case NUM_LOCK: /* Num lock sends scan code twice. Get the second one and discard it. */ while (grub_keyboard_getkey () == -1); at_keyboard_status ^= KEYBOARD_STATUS_NUM_LOCK; led_status ^= KEYBOARD_LED_NUM; keyboard_controller_led (led_status); #ifdef DEBUG_AT_KEYBOARD grub_dprintf ("atkeyb", "num_lock = %d\n", !!(at_keyboard_status & KEYBOARD_STATUS_NUM_LOCK)); #endif key = -1; break; case SCROLL_LOCK: /* For scroll lock we don't keep track of status. Only update its led. */ led_status ^= KEYBOARD_LED_SCROLL; keyboard_controller_led (led_status); key = -1; break; default: if (at_keyboard_status & (KEYBOARD_STATUS_CTRL_L | KEYBOARD_STATUS_CTRL_R)) key = keyboard_map[code] - 'a' + 1; else if ((at_keyboard_status & (KEYBOARD_STATUS_SHIFT_L | KEYBOARD_STATUS_SHIFT_R)) && keyboard_map_shift[code]) key = keyboard_map_shift[code]; else key = keyboard_map[code]; if (key == 0) grub_dprintf ("atkeyb", "Unknown key 0x%x detected\n", code); if (at_keyboard_status & KEYBOARD_STATUS_CAPS_LOCK) { if ((key >= 'a') && (key <= 'z')) key += 'A' - 'a'; else if ((key >= 'A') && (key <= 'Z')) key += 'a' - 'A'; } } return key; }