summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSascha Hlusiak <saschahlusiak@arcor.de>2007-08-11 22:22:49 +0200
committerSascha Hlusiak <saschahlusiak@arcor.de>2007-08-11 22:22:49 +0200
commitdd396931b76c682f03323566f28b248afb1cb79d (patch)
treec5ab49b864c4b7b79ae99bdc6fe1ef0b252503e5 /src
parentb685505f1411ffa5f326aa3ba9e5cd5e172e5c5e (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.c6
-rw-r--r--src/jstk.h15
-rw-r--r--src/jstk_axis.c125
-rw-r--r--src/jstk_options.c8
4 files changed, 82 insertions, 72 deletions
diff --git a/src/jstk.c b/src/jstk.c
index 4ec8204..e4209d0 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -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;
}
diff --git a/src/jstk.h b/src/jstk.h
index 1505c80..7a9293c 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -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)