summaryrefslogtreecommitdiff
path: root/src/client/keyboardBuffer.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-08-03 18:46:22 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-08-03 18:46:22 +0000
commitb5723cbd822b2359850c121ca69e682a607d91bd (patch)
treec731a5c07d6188b1bdce6e90b5ac02e35800716d /src/client/keyboardBuffer.c
parent00c9cebac684c42741e924d11038d5591e87dacd (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.c138
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;
+}