diff options
author | Sascha Hlusiak <saschahlusiak@arcor.de> | 2007-08-11 22:22:49 +0200 |
---|---|---|
committer | Sascha Hlusiak <saschahlusiak@arcor.de> | 2007-08-11 22:22:49 +0200 |
commit | dd396931b76c682f03323566f28b248afb1cb79d (patch) | |
tree | c5ab49b864c4b7b79ae99bdc6fe1ef0b252503e5 /src | |
parent | b685505f1411ffa5f326aa3ba9e5cd5e172e5c5e (diff) |
Move subpixel movement from global to per axis/button.
Instead of using one global subpixel variable for all axes and buttons, the axis/button
struct for each axis/button holds it's own subpixel variable. This is neccessary to
implement mapping of relative axes to keys, which needs to save own "subpixel" values.
Diffstat (limited to 'src')
-rw-r--r-- | src/jstk.c | 6 | ||||
-rw-r--r-- | src/jstk.h | 15 | ||||
-rw-r--r-- | src/jstk_axis.c | 125 | ||||
-rw-r--r-- | src/jstk_options.c | 8 |
4 files changed, 82 insertions, 72 deletions
@@ -451,10 +451,6 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->fd = -1; priv->device = NULL; priv->devicedata = NULL; - priv->x = 0.0f; - priv->y = 0.0f; - priv->zx = 0.0f; - priv->zy = 0.0f; priv->timer = NULL; priv->timerrunning = FALSE; priv->mouse_enabled = TRUE; @@ -473,6 +469,7 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->axis[i].currentspeed = 0.0f; priv->axis[i].amplify = 1.0f; priv->axis[i].valuator = -1; + priv->axis[i].subpixel = 0.0f; for (j=0; j<MAXKEYSPERBUTTON; j++) priv->axis[i].keys_low[j] = priv->axis[i].keys_high[j] = 0; } @@ -481,6 +478,7 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->button[i].buttonnumber = 0; priv->button[i].mapping = MAPPING_NONE; priv->button[i].currentspeed = 1.0f; + priv->button[i].subpixel = 0.0f; for (j=0; j<MAXKEYSPERBUTTON; j++) priv->button[i].keys[j] = 0; } @@ -86,17 +86,19 @@ typedef struct _AXIS { float currentspeed; /* TYPE_ACCELERATED */ float previousposition; /* TYPE_ABSOLUTE */ float amplify; + float subpixel; /* Pending subpixel movement */ KEYSCANCODES keys_low, keys_high; /* MAPPING_KEY */ } AXIS; typedef struct _BUTTON { JOYSTICKMAPPING mapping; - char pressed; - int buttonnumber; /* MAPPING_BUTTON */ - float amplify; /* MAPPING_X/Y/ZX/ZY, - MAPPING_SPEED_MULTIPLY */ - float currentspeed; /* MAPPING_X/Y/ZX/ZY */ - KEYSCANCODES keys; /* MAPPING_KEY */ + char pressed; + int buttonnumber; /* MAPPING_BUTTON */ + float amplify; /* MAPPING_X/Y/ZX/ZY, + MAPPING_SPEED_MULTIPLY */ + float currentspeed; /* MAPPING_X/Y/ZX/ZY */ + float subpixel; /* Pending subpixel movement */ + KEYSCANCODES keys; /* MAPPING_KEY */ } BUTTON; typedef struct _JoystickDevRec { @@ -106,7 +108,6 @@ typedef struct _JoystickDevRec { OsTimerPtr timer; /* Timer for axis movement */ Bool timerrunning; - float x,y,zx,zy; /* Pending subpixel movements */ Bool mouse_enabled, keys_enabled; float amplify; /* Global amplifier of axis movement */ diff --git a/src/jstk_axis.c b/src/jstk_axis.c index b5ddf9e..78c4f29 100644 --- a/src/jstk_axis.c +++ b/src/jstk_axis.c @@ -58,7 +58,10 @@ jstkAxisTimer(OsTimerPtr timer, int sigstate, i; int nexttimer; + int movex,movey,movezx,movezy; + nexttimer = 0; + movex = movey = movezx = movezy = 0; sigstate = xf86BlockSIGIO(); @@ -101,20 +104,35 @@ jstkAxisTimer(OsTimerPtr timer, /* Apply movement to global amount of pixels to move */ switch (axis->mapping) { case MAPPING_X: - priv->x += p1; - break; case MAPPING_Y: - priv->y += p1; - break; - case MAPPING_ZX: - priv->zx += p2; + axis->subpixel += p1; break; + case MAPPING_ZX: case MAPPING_ZY: - priv->zy += p2; + axis->subpixel += p2; break; default: break; } + if ((int)axis->subpixel != 0) { + switch (axis->mapping) { + case MAPPING_X: + movex += (int)axis->subpixel; + break; + case MAPPING_Y: + movey += (int)axis->subpixel; + break; + case MAPPING_ZX: + movezx += (int)axis->subpixel; + break; + case MAPPING_ZY: + movezy += (int)axis->subpixel; + break; + default: + break; + } + axis->subpixel = axis->subpixel - (int)axis->subpixel; + } } for (i=0; i<MAXBUTTONS; i++) if (priv->button[i].pressed == 1) { @@ -129,74 +147,88 @@ jstkAxisTimer(OsTimerPtr timer, p1 *= priv->amplify; p2 = p1 / 8.0f; - /* Apply movement to global amount of pixels to move */ + /* Apply movement to amount of pixels to move */ switch (priv->button[i].mapping) { case MAPPING_X: - priv->x += p1; - nexttimer = NEXTTIMER; - break; case MAPPING_Y: - priv->y += p1; + priv->button[i].subpixel += p1; nexttimer = NEXTTIMER; break; case MAPPING_ZX: - priv->zx += p2; - nexttimer = NEXTTIMER; - break; case MAPPING_ZY: - priv->zy += p2; + priv->button[i].subpixel += p2; nexttimer = NEXTTIMER; break; default: break; } + if ((int)priv->button[i].subpixel != 0) { + switch (priv->button[i].mapping) { + case MAPPING_X: + movex += (int)priv->button[i].subpixel; + break; + case MAPPING_Y: + movey += (int)priv->button[i].subpixel; + break; + case MAPPING_ZX: + movezx += (int)priv->button[i].subpixel; + break; + case MAPPING_ZY: + movezy += (int)priv->button[i].subpixel; + break; + default: + break; + } + priv->button[i].subpixel -= (int)priv->button[i].subpixel; + } } /* Actually move the cursor, if there is enough movement in the buffer */ - if (((int)priv->x != 0)||((int)priv->y != 0)) { - xf86PostMotionEvent(device, 0, 0, 2, (int)priv->x, (int)priv->y); - priv->x = priv->x - (int)priv->x; - priv->y = priv->y - (int)priv->y; + if ((movex != 0)||(movey != 0)) { + xf86PostMotionEvent(device, 0, 0, 2, movex, movey); } /* Generate scrolling events */ - while (priv->zy >= 1.0f) { /* down */ + while (movezy >= 1) { /* down */ xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[1], 1, 0, 0); xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[1], 0, 0, 0); - priv->zy-=1.0f; + movezy -= 1; } - while (priv->zy <= -1.0f) { /* up */ + while (movezy <= -1) { /* up */ xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[0], 1, 0, 0); xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[0], 0, 0, 0); - priv->zy+=1.0f; + movezy += 1; } - while (priv->zx >= 1.0f) { /* right */ + while (movezx >= 1) { /* right */ xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[3], 1, 0, 0); xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[3], 0, 0, 0); - priv->zx-=1.0f; + movezx -= 1; } - while (priv->zx <= -1.0f) { /* left */ + while (movezx <= -1) { /* left */ xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[2], 1, 0, 0); xf86PostButtonEvent(device, 0, priv->buttonmap.scrollbutton[2], 0, 0, 0); - priv->zx+=1.0f; + movezx += 1; } - if (priv->mouse_enabled == FALSE) nexttimer = 0; - if (nexttimer == 0) { /* No next timer (no subpixel added), so stop */ + if ((priv->mouse_enabled == FALSE) && + (priv->keys_enabled == FALSE)) + nexttimer = 0; + + if (nexttimer == 0) { /* No next timer (no subpixel added), stop */ priv->timerrunning = FALSE; - priv->x = 0.0f; - priv->y = 0.0f; - priv->zx = 0.0f; - priv->zy = 0.0f; + + for (i=0; i<MAXBUTTONS; i++) priv->button[i].subpixel = 0.0f; + for (i=0; i<MAXAXES; i++) priv->axis[i].subpixel = 0.0f; + DBG(2, ErrorF("Stopping Axis Timer\n")); } xf86UnblockSIGIO (sigstate); @@ -224,22 +256,7 @@ jstkStartAxisTimer(LocalDevicePtr device, int number) pixel = 1; if (priv->axis[number].value < 0) pixel = -1; - switch (priv->axis[number].mapping) { - case MAPPING_X: - priv->x += pixel; - break; - case MAPPING_Y: - priv->y += pixel; - break; - case MAPPING_ZX: - priv->zx += pixel; - break; - case MAPPING_ZY: - priv->zy += pixel; - break; - default: - break; - } + priv->axis[number].subpixel += pixel; DBG(2, ErrorF("Starting Axis Timer (triggered by axis %d)\n", number)); priv->timer = TimerSet( @@ -273,16 +290,10 @@ jstkStartButtonAxisTimer(LocalDevicePtr device, int number) if (priv->button[number].amplify < 0) pixel = -1; switch (priv->button[number].mapping) { case MAPPING_X: - priv->x += pixel; - break; case MAPPING_Y: - priv->y += pixel; - break; case MAPPING_ZX: - priv->zx += pixel; - break; case MAPPING_ZY: - priv->zy += pixel; + priv->button[number].subpixel += pixel; break; default: break; diff --git a/src/jstk_options.c b/src/jstk_options.c index 3e8cb00..8991813 100644 --- a/src/jstk_options.c +++ b/src/jstk_options.c @@ -215,10 +215,10 @@ jstkParseAxisOption(const char* org, AXIS *axis, const char *name) axis->mapping = jstkGetAxisMapping(&fvalue, p, name); if ((axis->type == TYPE_ABSOLUTE) && ((fvalue <= 1.1)&&(fvalue >= -1.1))) { - if (axis->mapping == MAPPING_X) - fvalue *= (int)screenInfo.screens[0]->width; - if (axis->mapping == MAPPING_Y) - fvalue *= (int)screenInfo.screens[0]->height; + if (axis->mapping == MAPPING_X) + fvalue *= (int)screenInfo.screens[0]->width; + if (axis->mapping == MAPPING_Y) + fvalue *= (int)screenInfo.screens[0]->height; } axis->amplify = fvalue; if (axis->mapping == MAPPING_NONE) |