|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Target-independent support for parsing hotkey sequences ! 5: * ! 6: * Copyright 2004 Richard Drummond ! 7: * ! 8: * Based on the hotkey handling previously found ! 9: * in x11win.c and sdlgfx.c ! 10: */ ! 11: ! 12: #include "sysconfig.h" ! 13: #include "sysdeps.h" ! 14: #include "options.h" ! 15: #include "inputdevice.h" ! 16: #include "hotkeys.h" ! 17: ! 18: ! 19: static struct uae_hotkeyseq *hotkey_table; ! 20: ! 21: ! 22: void set_default_hotkeys (struct uae_hotkeyseq *keys) ! 23: { ! 24: hotkey_table = keys; ! 25: reset_hotkeys (); ! 26: } ! 27: ! 28: void reset_hotkeys (void) { ! 29: struct uae_hotkeyseq *seq = hotkey_table; ! 30: int i; ! 31: ! 32: if (!seq) ! 33: return; ! 34: ! 35: while (seq->event) { ! 36: for (i=0; i < HOTKEYSEQ_MAXKEYS; i++) ! 37: seq->key_pressed[i] = 0; ! 38: seq->complete = 0; ! 39: seq++; ! 40: } ! 41: } ! 42: ! 43: int match_hotkey_sequence (int key, int state) ! 44: { ! 45: struct uae_hotkeyseq *seq = hotkey_table; ! 46: int event = 0; ! 47: ! 48: if (!seq) ! 49: return 0; ! 50: ! 51: if (state) { ! 52: /* Key down */ ! 53: while (seq->event != 0) { ! 54: int i; ! 55: /* Check whether key is the next key in this sequence */ ! 56: if (key == seq->keyseq[0]) ! 57: seq->key_pressed[0] = 1; ! 58: for (i=1; i < HOTKEYSEQ_MAXKEYS; i++) { ! 59: if ((seq->key_pressed[i-1] == 1) && (key == seq->keyseq[i])) { ! 60: seq->key_pressed[i] = 1; ! 61: /* Was it the final key in this sequence ? */ ! 62: if ((i+1 == HOTKEYSEQ_MAXKEYS) || (seq->keyseq[i+1] == (uae_u16)-1)) { ! 63: /* Yes. Return the event */ ! 64: event = seq->event; ! 65: seq->complete = 1; ! 66: break; ! 67: } ! 68: } ! 69: } ! 70: seq++; ! 71: } ! 72: } else { ! 73: /* key up */ ! 74: while (seq->event != 0) { ! 75: int i, j; ! 76: for (i = 0; i < HOTKEYSEQ_MAXKEYS; i++) { ! 77: if ((key == seq->keyseq[i]) && (seq->key_pressed[i] == 1)) { ! 78: /* letting up a key - cancels any keys following it ! 79: * in the sequence that are pressed */ ! 80: for (j=i; j < HOTKEYSEQ_MAXKEYS; j++) ! 81: seq->key_pressed[j] = 0; ! 82: /* if it was previously complete generate return the event ! 83: * (so that it can be used as a key-up event */ ! 84: if (seq->complete) { ! 85: seq->complete = 0; ! 86: event = seq->event; ! 87: } ! 88: } ! 89: } ! 90: seq++; ! 91: } ! 92: } ! 93: return event; ! 94: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.