From 3b20716d4754d2e854ba707857063b8329c2f46c Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Mon, 28 Jan 2013 21:17:59 -0600 Subject: Fix tsak failure on repeated keyboard hotplug/remove --- tsak/main.cpp | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) (limited to 'tsak') diff --git a/tsak/main.cpp b/tsak/main.cpp index 646a9d45d..652466852 100644 --- a/tsak/main.cpp +++ b/tsak/main.cpp @@ -432,7 +432,10 @@ int main (int argc, char *argv[]) struct input_event event; struct input_event revev; 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"; bool ctrl_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) { 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) { - return 0; - } + if (testrun == true) { + return 0; + } - int i=fork(); - if (i<0) return 9; // fork failed - if (i>0) { - child_led_pids[current_keyboard] = i; - while (1) { - // 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) { - if (write(keyboard_fds[current_keyboard], &revev, sizeof(revev)) < 0) { - fprintf(stderr, "[tsak] Unable to replicate LED event\n"); + while (1) { + // 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) || (revev.type == EV_MSC)) { + 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; } -- cgit v1.2.1