Source to src/hotkeys.c


Enter a symbol's name here to quickly find it.

 /*
  * UAE - The Un*x Amiga Emulator
  *
  * Target-independent support for parsing hotkey sequences
  *
  * Copyright 2004 Richard Drummond
  *
  * Based on the hotkey handling previously found
  * in x11win.c and sdlgfx.c
  */

#include "sysconfig.h"
#include "sysdeps.h"
#include "options.h"
#include "inputdevice.h"
#include "hotkeys.h"


static struct uae_hotkeyseq *hotkey_table;


void set_default_hotkeys (struct uae_hotkeyseq *keys)
{
    hotkey_table = keys;
    reset_hotkeys ();
}

void reset_hotkeys (void) {
    struct uae_hotkeyseq *seq = hotkey_table;
    int i;

    if (!seq)
	return;

    while (seq->event) {
	for (i=0; i < HOTKEYSEQ_MAXKEYS; i++)
	    seq->key_pressed[i] = 0;
	seq->complete = 0;
	seq++;
    }
}

int match_hotkey_sequence (int key, int state)
{
    struct uae_hotkeyseq *seq = hotkey_table;
    int event = 0;

    if (!seq)
	return 0;

    if (state) {
	/* Key down */
	while (seq->event != 0) {
	    int i;
	    /* Check whether key is the next key in this sequence */
	    if (key == seq->keyseq[0])
		seq->key_pressed[0] = 1;
	    for (i=1; i < HOTKEYSEQ_MAXKEYS; i++) {
		if ((seq->key_pressed[i-1] == 1) && (key == seq->keyseq[i])) {
		    seq->key_pressed[i] = 1;
		    /* Was it the final key in this sequence ? */
		    if ((i+1 == HOTKEYSEQ_MAXKEYS) || (seq->keyseq[i+1] == (uae_u16)-1)) {
			/* Yes. Return the event */
			event = seq->event;
			seq->complete = 1;
			break;
		    }
		}
	    }
	    seq++;
	}
    } else {
	/* key up */
	while (seq->event != 0) {
	    int i, j;
	    for (i = 0; i < HOTKEYSEQ_MAXKEYS; i++) {
		if ((key == seq->keyseq[i]) && (seq->key_pressed[i] == 1)) {
		    /* letting up a key - cancels any keys following it
		     * in the sequence that are pressed */
		    for (j=i; j < HOTKEYSEQ_MAXKEYS; j++)
			seq->key_pressed[j] = 0;
		    /* if it was previously complete generate return the event
		     * (so that it can be used as a key-up event */
		    if (seq->complete) {
			seq->complete = 0;
			event = seq->event;
		    }
		}
	    }
	    seq++;
	}
    }
    return event;
}