Replicate LED status from virtual keyboards to physical keyboards

Fix keyboard attribute cloning
This commit closes Bug 561
pull/2/head
Timothy Pearson 12 years ago
parent f05f9dc753
commit 8468d9bd5c

@ -139,12 +139,13 @@ static void copy_features(int devin, int devout)
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;
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);
}
}
}
}
int find_keyboards() {
int i, j;
@ -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\")");
}
@ -484,6 +486,14 @@ int main (int argc, char *argv[])
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;
if (value != ' ' && ev[1].value == 0 && ev[1].type == 1){ // Read the key release event
@ -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);

Loading…
Cancel
Save