summaryrefslogtreecommitdiff
path: root/skey.c
diff options
context:
space:
mode:
Diffstat (limited to 'skey.c')
-rw-r--r--skey.c39
1 files changed, 22 insertions, 17 deletions
diff --git a/skey.c b/skey.c
index 0440c19..3212504 100644
--- a/skey.c
+++ b/skey.c
@@ -128,6 +128,16 @@ void clearkeystate(void) {
return;
}
/*
+ * Updates KEYSTATE_PHYS
+ */
+void update_phys(int row, int column, int state) {
+ if (state) {
+ keystate[row][column] = KEYSTATE_PHYS | keystate[row][column];
+ } else {
+ keystate[row][column] = (~KEYSTATE_PHYS) & keystate[row][column];
+ }
+}
+/*
* The keystates are processed as following, the current read value is compared with the
* previous one stored in KEYSTATE_PHYS to detect a rising or falling edge. for regular keys,
* the corresponding keycode from skey_keymap is sent, with the current_keymap. if stickymode
@@ -197,16 +207,19 @@ int processkey(int row, int column, int state) {
case KEY_ALPHAMAP:
if(DEBUGMODE){printk(KERN_DEBUG "skey: changing to keymap ALPHA\n");}
current_keymap = 0;
+ update_phys(row, column, state);
return 0;
break;
case KEY_NUMBERMAP:
if(DEBUGMODE){printk(KERN_DEBUG "skey: changing to keymap NUM\n");}
current_keymap = 1;
+ update_phys(row, column, state);
return 0;
break;
case KEY_SPECIALMAP:
if(DEBUGMODE){printk(KERN_DEBUG "skey: changing to keymap SPECIAL\n");}
current_keymap = 2;
+ update_phys(row, column, state);
return 0;
break;
case KEY_STICKYMAP:
@@ -216,6 +229,7 @@ int processkey(int row, int column, int state) {
clearkeystate();
if(DEBUGMODE){printk(KERN_DEBUG "skey: cleaned stickmode states\n");}
}
+ update_phys(row, column, state);
return 0;
break;
case KEY_MS_2ND:
@@ -225,48 +239,43 @@ int processkey(int row, int column, int state) {
} else if (current_keymap == 3) {
current_keymap = 2;
}
+ update_phys(row, column, state);
return 0;
break;
case MS_UP:
input_event(skey_dev, EV_REL, REL_Y, -MOUSE_DIST);
input_sync(skey_dev);
- input_event(skey_dev, EV_REL, REL_Y, 0);
- input_sync(skey_dev);
+ update_phys(row, column, state);
return 0;
break;
case MS_DOWN:
input_event(skey_dev, EV_REL, REL_Y, +MOUSE_DIST);
input_sync(skey_dev);
- input_event(skey_dev, EV_REL, REL_Y, 0);
- input_sync(skey_dev);
+ update_phys(row, column, state);
return 0;
break;
case MS_LEFT:
input_event(skey_dev, EV_REL, REL_X, -MOUSE_DIST);
input_sync(skey_dev);
- input_event(skey_dev, EV_REL, REL_X, 0);
- input_sync(skey_dev);
+ update_phys(row, column, state);
return 0;
break;
case MS_RIGHT:
input_event(skey_dev, EV_REL, REL_X, +MOUSE_DIST);
input_sync(skey_dev);
- input_event(skey_dev, EV_REL, REL_X, 0);
- input_sync(skey_dev);
+ update_phys(row, column, state);
return 0;
break;
case MS_SCRL_UP:
input_event(skey_dev, EV_REL, REL_WHEEL, +WHEEL_DIST);
input_sync(skey_dev);
- input_event(skey_dev, EV_REL, REL_WHEEL, 0);
- input_sync(skey_dev);
+ update_phys(row, column, state);
return 0;
break;
case MS_SCRL_DOWN:
input_event(skey_dev, EV_REL, REL_WHEEL, -WHEEL_DIST);
input_sync(skey_dev);
- input_event(skey_dev, EV_REL, REL_WHEEL, 0);
- input_sync(skey_dev);
+ update_phys(row, column, state);
return 0;
break;
}
@@ -296,11 +305,7 @@ int processkey(int row, int column, int state) {
}
}
//after the previous keystate is checked, it is updated
- if (state) {
- keystate[row][column] = KEYSTATE_PHYS | keystate[row][column];
- } else {
- keystate[row][column] = (~KEYSTATE_PHYS) & keystate[row][column];
- }
+ update_phys(row, column, state);
return 0;
}