From 297e58bbcad84343c79b8737a8d73593ce8d1b0d Mon Sep 17 00:00:00 2001 From: mcmartin Date: Thu, 20 Apr 2006 05:47:13 +0000 Subject: [PATCH] Better programmatic representation of gestures git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2313 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/src/sc2code/libs/input/sdl/vcontrol.c | 43 +++++++++++------------ sc2/src/sc2code/libs/input/sdl/vcontrol.h | 29 +++++++++++++-- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/sc2/src/sc2code/libs/input/sdl/vcontrol.c b/sc2/src/sc2code/libs/input/sdl/vcontrol.c index 68e8f443f..2c288784a 100644 --- a/sc2/src/sc2code/libs/input/sdl/vcontrol.c +++ b/sc2/src/sc2code/libs/input/sdl/vcontrol.c @@ -941,9 +941,9 @@ VControl_StartIterByName (char *targetname) } int -VControl_NextBindingName (char *buffer) +VControl_NextBinding (VCONTROL_GESTURE *gesture) { - if ((buffer == NULL) || (iter_target == NULL) + if ((gesture == NULL) || (iter_target == NULL) || iter_device >= (joycount * 3)) return 0; while (iter_device < (joycount * 3)) @@ -956,8 +956,8 @@ VControl_NextBindingName (char *buffer) { if (kb->target == iter_target) { - strncpy (buffer, VControl_code2name (iter_index), 40); - buffer[39] = 0; + gesture->type = VCONTROL_KEY; + gesture->gesture.key = iter_index; done = 1; } kb = kb->next; @@ -999,13 +999,10 @@ VControl_NextBindingName (char *buffer) if (kb->target == iter_target) { done = 1; - switch (iter_index) { - case 0: sprintf (buffer, "Joy%d left", i); break; - case 1: sprintf (buffer, "Joy%d right", i); break; - case 2: sprintf (buffer, "Joy%d up", i); break; - case 3: sprintf (buffer, "Joy%d down", i); break; - default: sprintf (buffer, "Joy%d A%d %s", i, axis, dir ? "high" : "low"); break; - } + gesture->type = VCONTROL_JOYAXIS; + gesture->gesture.axis.port = i; + gesture->gesture.axis.index = axis; + gesture->gesture.axis.polarity = (dir) ? 1 : -1; } kb = kb->next; } @@ -1026,8 +1023,10 @@ VControl_NextBindingName (char *buffer) { if (kb->target == iter_target) { + gesture->type = VCONTROL_JOYBUTTON; + gesture->gesture.button.port = i; + gesture->gesture.button.index = iter_index; done = 1; - sprintf (buffer, "Joy%d B%d", i, iter_index); } kb = kb->next; } @@ -1046,25 +1045,23 @@ VControl_NextBindingName (char *buffer) else { keybinding *kb; + Uint8 targetdir; switch (hatd) { - case 0: kb = joysticks[i].hats[hat].left; break; - case 1: kb = joysticks[i].hats[hat].right; break; - case 2: kb = joysticks[i].hats[hat].up; break; - default: kb = joysticks[i].hats[hat].down; break; + case 0: kb = joysticks[i].hats[hat].left; targetdir = SDL_HAT_LEFT; break; + case 1: kb = joysticks[i].hats[hat].right; targetdir = SDL_HAT_RIGHT; break; + case 2: kb = joysticks[i].hats[hat].up; targetdir = SDL_HAT_UP; break; + default: kb = joysticks[i].hats[hat].down; targetdir = SDL_HAT_DOWN; break; } while (kb != NULL) { if (kb->target == iter_target) { done = 1; - switch (hatd) - { - case 0: sprintf (buffer, "Joy%d hat%d left", i, hat); break; - case 1: sprintf (buffer, "Joy%d hat%d right", i, hat); break; - case 2: sprintf (buffer, "Joy%d hat%d up", i, hat); break; - default: sprintf (buffer, "Joy%d hat%d down", i, hat); break; - } + gesture->type = VCONTROL_JOYHAT; + gesture->gesture.hat.port = i; + gesture->gesture.hat.index = hat; + gesture->gesture.hat.dir = targetdir; } kb = kb->next; } diff --git a/sc2/src/sc2code/libs/input/sdl/vcontrol.h b/sc2/src/sc2code/libs/input/sdl/vcontrol.h index 11f831484..ac3e136d0 100644 --- a/sc2/src/sc2code/libs/input/sdl/vcontrol.h +++ b/sc2/src/sc2code/libs/input/sdl/vcontrol.h @@ -9,6 +9,27 @@ void VControl_Init (void); void VControl_Uninit (void); +/* Structures for representing actual VControl Inputs. Returned by + iterators and used to construct bindings. */ + +typedef enum { + VCONTROL_KEY, + VCONTROL_JOYAXIS, + VCONTROL_JOYBUTTON, + VCONTROL_JOYHAT, + NUM_VCONTROL_GESTURES +} VCONTROL_GESTURE_TYPE; + +typedef struct { + VCONTROL_GESTURE_TYPE type; + union { + SDLKey key; + struct { int port, index, polarity; } axis; + struct { int port, index; } button; + struct { int port, index; Uint8 dir; } hat; + } gesture; +} VCONTROL_GESTURE; + /* Control of bindings */ int VControl_AddKeyBinding (SDLKey symbol, int *target); void VControl_RemoveKeyBinding (SDLKey symbol, int *target); @@ -55,18 +76,20 @@ void VControl_SetConfigFileVersion (int v); /* Dump a configuration file corresponding to the current bindings and names. */ void VControl_Dump (FILE *out); + /* Read a configuration file. Returns number of errors encountered. */ int VControl_ReadConfiguration (uio_Stream *in); int VControl_GetErrorCount (void); int VControl_GetValidCount (void); + /* Iterator control. Start an iteration with StartIter or - StartIterByName; then call NextBindingName with a char array of at - least 40 bytes in size until it returns 0. Produces names. */ + StartIterByName; then call NextBindingName until it returns 0. + Produces gestures. */ void VControl_StartIter (int *target); void VControl_StartIterByName (char *targetname); -int VControl_NextBindingName (char *buffer); +int VControl_NextBinding (VCONTROL_GESTURE *gesture); /* Tracking the "last interesting event." Used to poll to find new control keys. */