diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-28 21:17:59 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-28 21:17:59 -0600 |
commit | 3b20716d4754d2e854ba707857063b8329c2f46c (patch) | |
tree | 74dbd8093206663aff91060da435eefe8be1bf28 /tsak | |
parent | 196d2d16c202a3b0965bab6e9a73e4a645fa77e3 (diff) | |
download | tdebase-3b20716d4754d2e854ba707857063b8329c2f46c.tar.gz tdebase-3b20716d4754d2e854ba707857063b8329c2f46c.zip |
Fix tsak failure on repeated keyboard hotplug/remove
Diffstat (limited to 'tsak')
-rw-r--r-- | tsak/main.cpp | 48 |
1 files changed, 28 insertions, 20 deletions
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; } |