diff options
| author | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-08-03 18:46:22 +0000 |
|---|---|---|
| committer | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-08-03 18:46:22 +0000 |
| commit | b5723cbd822b2359850c121ca69e682a607d91bd (patch) | |
| tree | c731a5c07d6188b1bdce6e90b5ac02e35800716d /src/client/keyboardBuffer.c | |
| parent | 00c9cebac684c42741e924d11038d5591e87dacd (diff) | |
- pridany kapov patch na klavesy
- widget na nastavovanie klaves sa rozsvieti, ked je aktivny
git-svn-id: http://opensvn.csie.org/tuxanci_ng@189 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/client/keyboardBuffer.c')
| -rw-r--r-- | src/client/keyboardBuffer.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/client/keyboardBuffer.c b/src/client/keyboardBuffer.c new file mode 100644 index 0000000..29cd9d4 --- /dev/null +++ b/src/client/keyboardBuffer.c @@ -0,0 +1,138 @@ +/* + * keyboardBuffer.c + * + * Created on: 1.8.2008 + * Author: Karel Podvolecky + * + * Jednoducha fronta stisknutych klaves. + * + */ + +#include <stdio.h> +#include <assert.h> +#include <SDL.h> + +#include "keyboardBuffer.h" + +static keyboardBuffer_t *keyboardBuffer=NULL; + +static SDL_keysym emptyKey; + +/* + * Inicializuje klavesovy buffer. Parametr udava pocet klaves. + */ +void initKeyboardBuffer(uint32_t size){ + assert(size>0); + assert(keyboardBuffer==NULL); + + keyboardBuffer = malloc(sizeof(keyboardBuffer_t)); + assert(keyboardBuffer!=NULL); + memset(keyboardBuffer, 0, sizeof(keyboardBuffer_t)); + + keyboardBuffer->buff = malloc(size * sizeof(SDL_keysym)); + assert(keyboardBuffer->buff!=NULL); + memset(keyboardBuffer->buff, 0, size * sizeof(SDL_keysym)); + + keyboardBuffer->begin=0; + keyboardBuffer->end=0; + keyboardBuffer->count=0; + keyboardBuffer->size=size; + + emptyKey.sym = SDLK_UNKNOWN; +} + +/* + * Vyprazdni buffer. + */ +void clearKeyboardBuffer(){ + assert(keyboardBuffer!=NULL); + + keyboardBuffer->begin=0; + keyboardBuffer->end=0; + keyboardBuffer->count=0; + memset(keyboardBuffer->buff, 0, keyboardBuffer->size * sizeof(SDL_keysym)); +} + +/* + * Prida klavesu na konec bufferu. Pokud je buffer preplnen, + * vypise chybu na chybovy vystup a klavesu zahodi. + */ +bool_t pushKeyToKeyboardBuffer(SDL_keysym key){ + assert(keyboardBuffer!=NULL); + + if (keyboardBuffer->count >= keyboardBuffer->size){ + fprintf(stderr, "Preteceni klavesoveho bufferu! Zahazuji klavesu: %02x\n", key.sym); + return FALSE; + } + + keyboardBuffer->buff[keyboardBuffer->end] = key; + + keyboardBuffer->end++; + if (keyboardBuffer->end>=keyboardBuffer->size) + keyboardBuffer->end=0; + + keyboardBuffer->count++; + + return TRUE; +} + +/* + * Vyjme prvni klavesu z bufferu a vrati ji. Pokud je buffer prazdny, + * vypise chybu na chybovy vystup a vrati SDLK_UNKNOWN + */ +SDL_keysym popKeyFromKeyboardBuffer(){ + assert(keyboardBuffer!=NULL); + + if (keyboardBuffer->count <= 0){ + fprintf(stderr, "Podteceni klavesoveho bufferu!\n"); + return emptyKey; + } + + SDL_keysym key = keyboardBuffer->buff[keyboardBuffer->begin]; + keyboardBuffer->buff[keyboardBuffer->begin]=emptyKey; + + keyboardBuffer->begin++; + if (keyboardBuffer->begin>=keyboardBuffer->size) + keyboardBuffer->begin=0; + + keyboardBuffer->count--; + + return key; +} + +/* + * Velikost bufferu. + */ +uint32_t getKeyboardBufferSize(){ + assert(keyboardBuffer!=NULL); + return keyboardBuffer->size; +} + +/* + * Pocet klaves v bufferu. + */ +uint32_t KeyboardBufferCount(){ + assert(keyboardBuffer!=NULL); + return keyboardBuffer->count; +} + + +bool_t isAnyKeyInKeyboardBuffer(){ + return KeyboardBufferCount()>0 ? TRUE : FALSE; +} + +/* + * Uvolni buffer. Pokud neni prazdny, vypise predtim + * info o zaplneni na chybovy vystup. + */ +void quitKeyboardBuffer(){ + assert(keyboardBuffer!=NULL); + + if (keyboardBuffer->count>0){ + fprintf(stderr, "Klavesovy buffer neni prazdny!\n"); + } + + free(keyboardBuffer->buff); + free(keyboardBuffer); + keyboardBuffer=NULL; +} |