summaryrefslogtreecommitdiffstats
path: root/tsak
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-28 21:17:59 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-28 21:17:59 -0600
commit3b20716d4754d2e854ba707857063b8329c2f46c (patch)
tree74dbd8093206663aff91060da435eefe8be1bf28 /tsak
parent196d2d16c202a3b0965bab6e9a73e4a645fa77e3 (diff)
downloadtdebase-3b20716d4754d2e854ba707857063b8329c2f46c.tar.gz
tdebase-3b20716d4754d2e854ba707857063b8329c2f46c.zip
Fix tsak failure on repeated keyboard hotplug/remove
Diffstat (limited to 'tsak')
-rw-r--r--tsak/main.cpp48
1 files changed, 28 insertions, 20 deletions
diff --git a/tsak/main.cpp b/tsak/main.cpp
index 646a9d45..65246685 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;
}