Fix tsak failure on repeated keyboard hotplug/remove

pull/2/head
Timothy Pearson 13 years ago
parent 196d2d16c2
commit 3b20716d47

@ -432,7 +432,10 @@ int main (int argc, char *argv[])
struct input_event event; struct input_event event;
struct input_event revev; struct input_event revev;
struct uinput_user_dev devinfo={{0},{0}}; struct uinput_user_dev devinfo={{0},{0}};
int devout[MAX_KEYBOARDS], rd, i, size = sizeof (struct input_event); int devout[MAX_KEYBOARDS];
int rd;
int i;
int size = sizeof (struct input_event);
char name[256] = "Unknown"; char name[256] = "Unknown";
bool ctrl_down = false; bool ctrl_down = false;
bool alt_down = false; bool alt_down = false;
@ -593,32 +596,37 @@ int main (int argc, char *argv[])
if (i<0) return 9; // fork failed if (i<0) return 9; // fork failed
if (i>0) { if (i>0) {
child_pids[current_keyboard] = i; child_pids[current_keyboard] = i;
continue;
}
setupLockingPipe(false);
}
established = true; int i=fork();
if (i<0) return 9; // fork failed
if (i>0) {
child_led_pids[current_keyboard] = i;
continue;
}
if (testrun == true) { if (testrun == true) {
return 0; return 0;
} }
int i=fork(); while (1) {
if (i<0) return 9; // fork failed // Replicate LED events from the virtual keyboard to the physical keyboard
if (i>0) { int rrd = read(devout[current_keyboard], &revev, size);
child_led_pids[current_keyboard] = i; if (rrd >= size) {
while (1) { if ((revev.type == EV_LED) || (revev.type == EV_MSC)) {
// Replicate LED events from the virtual keyboard to the physical keyboard if (write(keyboard_fds[current_keyboard], &revev, sizeof(revev)) < 0) {
int rrd = read(devout[current_keyboard], &revev, size); fprintf(stderr, "[tsak] Unable to replicate LED event\n");
if (rrd >= size) { }
if (revev.type == EV_LED) {
if (write(keyboard_fds[current_keyboard], &revev, sizeof(revev)) < 0) {
fprintf(stderr, "[tsak] Unable to replicate LED event\n");
} }
} }
} }
return 0;
} }
setupLockingPipe(false);
}
established = true;
if (testrun == true) {
return 0; return 0;
} }

Loading…
Cancel
Save