nuclear@0: /* nuclear@7: gbasys - a gameboy advance hardware abstraction library nuclear@7: Copyright (C) 2004-2014 John Tsiombikas nuclear@0: nuclear@7: This program is free software: you can redistribute it and/or modify nuclear@0: it under the terms of the GNU General Public License as published by nuclear@7: the Free Software Foundation, either version 3 of the License, or nuclear@0: (at your option) any later version. nuclear@0: nuclear@0: This program is distributed in the hope that it will be useful, nuclear@0: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@0: GNU General Public License for more details. nuclear@0: nuclear@0: You should have received a copy of the GNU General Public License nuclear@7: along with this program. If not, see . nuclear@0: */ nuclear@0: #include nuclear@0: #include "term.h" nuclear@0: #include "input.h" nuclear@0: #include "signal.h" nuclear@0: #include "intr.h" nuclear@0: nuclear@0: static struct key_node *key_queue, *key_queue_tail; nuclear@0: nuclear@0: static void key_handler(void); nuclear@0: nuclear@0: void term_init(void) { nuclear@0: mask(INTR_KEY); nuclear@0: interrupt(INTR_KEY, key_handler); nuclear@0: unmask(INTR_KEY); nuclear@0: nuclear@0: key_queue = malloc(sizeof *key_queue); nuclear@0: key_queue->next = 0; nuclear@0: key_queue_tail = key_queue; nuclear@0: } nuclear@0: nuclear@0: static void noop(int sig) {} nuclear@0: nuclear@0: int gba_getc(FILE *fp) { nuclear@0: struct key_node *tmp; nuclear@0: int c; nuclear@0: nuclear@0: if(fp != stdin) panic("getc: only stdin valid"); nuclear@2: nuclear@3: save_signal(SIGTTIN); nuclear@3: signal(SIGTTIN, noop); nuclear@0: while(!key_queue->next) pause(); nuclear@3: restore_signal(SIGTTIN); nuclear@0: nuclear@0: tmp = key_queue; nuclear@0: key_queue = key_queue->next; nuclear@0: free(tmp); nuclear@0: return key_queue->key; nuclear@0: } nuclear@0: nuclear@0: static void key_handler(void) { nuclear@0: int i, state; nuclear@0: static unsigned long prev; nuclear@0: unsigned long time; nuclear@0: nuclear@0: time = get_millisec(); nuclear@0: if(time - prev < 100) return; nuclear@0: prev = time; nuclear@0: nuclear@0: state = get_key_state(KEY_ALL); nuclear@0: for(i=0; ikey = bit; nuclear@0: key->next = 0; nuclear@0: key_queue_tail->next = key; nuclear@0: key_queue_tail = key; nuclear@0: } nuclear@0: } nuclear@3: raise(SIGTTIN); nuclear@0: }