diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-01-20 02:58:09 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-01-20 02:58:09 -0600 |
commit | 8468d9bd5c66fe402acbc06f728b12ea996848de (patch) | |
tree | d1d257c01b8f923de0a790f606a343f8596efb51 /tsak | |
parent | f05f9dc7532ea41c49b3e9385165d942dfab5d0e (diff) | |
download | tdebase-8468d9bd5c66fe402acbc06f728b12ea996848de.tar.gz tdebase-8468d9bd5c66fe402acbc06f728b12ea996848de.zip |
Replicate LED status from virtual keyboards to physical keyboards
Fix keyboard attribute cloning
This commit closes Bug 561
Diffstat (limited to 'tsak')
-rw-r--r-- | tsak/main.cpp | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/tsak/main.cpp b/tsak/main.cpp index df485a0e0..26aad0041 100644 --- a/tsak/main.cpp +++ b/tsak/main.cpp @@ -126,22 +126,23 @@ static void copy_features(int devin, int devout) for(i=0;i<EV_MAX;++i) { if (bit_set(i, evtypes)) { switch(i) { - case EV_KEY: op = UI_SET_KEYBIT; break; - case EV_REL: op = UI_SET_RELBIT; break; - case EV_ABS: op = UI_SET_ABSBIT; break; - case EV_MSC: op = UI_SET_MSCBIT; break; - case EV_LED: op = UI_SET_LEDBIT; break; - case EV_SND: op = UI_SET_SNDBIT; break; - case EV_SW: op = UI_SET_SWBIT; break; - default: op = -1; + case EV_KEY: op = UI_SET_KEYBIT; break; + case EV_REL: op = UI_SET_RELBIT; break; + case EV_ABS: op = UI_SET_ABSBIT; break; + case EV_MSC: op = UI_SET_MSCBIT; break; + case EV_LED: op = UI_SET_LEDBIT; break; + case EV_SND: op = UI_SET_SNDBIT; break; + case EV_SW: op = UI_SET_SWBIT; break; + default: op = -1; + } } - } - if (op == -1) continue; - ioctl(devout, UI_SET_EVBIT, i); - memset(codes,0,sizeof(codes)); - if (ioctl(devin, EVIOCGBIT(i, sizeof(codes)), codes) < 0) return; - for(code=0;code<KEY_MAX;code++) { - if (bit_set(code, codes)) ioctl(devout, op, code); + if (op == -1) continue; + ioctl(devout, UI_SET_EVBIT, i); + memset(codes,0,sizeof(codes)); + if (ioctl(devin, EVIOCGBIT(i, sizeof(codes)), codes) >= 0) { + for(code=0;code<KEY_MAX;code++) { + if (bit_set(code, codes)) ioctl(devout, op, code); + } } } } @@ -342,6 +343,7 @@ int main (int argc, char *argv[]) { struct input_event ev[64]; struct input_event event; + struct input_event revev; struct uinput_user_dev devinfo={0}; int devout[MAX_KEYBOARDS], rd, i, value, size = sizeof (struct input_event); char name[256] = "Unknown"; @@ -416,9 +418,9 @@ int main (int argc, char *argv[]) fprintf(stderr, "Reading from keyboard: (%s)\n", name); // Create filtered virtual output device - devout[current_keyboard]=open("/dev/misc/uinput",O_WRONLY|O_NONBLOCK); + devout[current_keyboard]=open("/dev/misc/uinput",O_RDWR|O_NONBLOCK); if (devout[current_keyboard]<0) { - devout[current_keyboard]=open("/dev/uinput",O_WRONLY|O_NONBLOCK); + devout[current_keyboard]=open("/dev/uinput",O_RDWR|O_NONBLOCK); if (devout[current_keyboard]<0) { perror("open(\"/dev/misc/uinput\")"); } @@ -483,6 +485,14 @@ int main (int argc, char *argv[]) fprintf(stderr, "Read failed.\n"); break; } + + // Replicate LED events from the virtual keyboard to the physical keyboard + int rrd = read(devout[current_keyboard], &revev, size); + if (rrd >= size) { + if (revev.type == EV_LED) { + write(keyboard_fds[current_keyboard], &revev, sizeof(revev)); + } + } value = ev[0].value; @@ -506,7 +516,7 @@ int main (int argc, char *argv[]) } } - if (hide_event == false) { + if ((hide_event == false) && (ev[0].type != EV_LED) && (ev[1].type != EV_LED)) { // Pass the event on... event = ev[0]; write(devout[current_keyboard], &event, sizeof event); |