diff options
author | Xerxes Rånby <[email protected]> | 2013-01-31 00:18:33 +0100 |
---|---|---|
committer | Xerxes Rånby <[email protected]> | 2013-01-31 00:18:33 +0100 |
commit | ff39f9e5a37020d72af3d4f1ea8fe0b6b6714016 (patch) | |
tree | 980a4192ff60896ed3118c4391efd32812796553 | |
parent | 8d6438eb6b03013012e3a357d92aa3cd40ee55c0 (diff) |
LinuxEventDeviceTracker: gracefully manage hot-swap of USB devices.
Signed-off-by: Xerxes Rånby <[email protected]>
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/linux/LinuxEventDeviceTracker.java | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/src/newt/classes/jogamp/newt/driver/linux/LinuxEventDeviceTracker.java b/src/newt/classes/jogamp/newt/driver/linux/LinuxEventDeviceTracker.java index 4746c90bf..96000b401 100644 --- a/src/newt/classes/jogamp/newt/driver/linux/LinuxEventDeviceTracker.java +++ b/src/newt/classes/jogamp/newt/driver/linux/LinuxEventDeviceTracker.java @@ -133,31 +133,36 @@ public class LinuxEventDeviceTracker implements WindowListener { public void windowRepaint(WindowUpdateEvent e) { } class EventDeviceManager implements Runnable { + + private volatile boolean stop = false; + @Override public void run() { File f = new File("/dev/input/"); int number; - for(String path:f.list()){ - if(path.startsWith("event")) { - String stringNumber = path.substring(5); - number = Integer.parseInt(stringNumber); - if(number<32&&number>=0) { - if(eventDevicePollers[number]==null){ - eventDevicePollers[number] = new EventDevicePoller(number); - Thread t = new Thread(eventDevicePollers[number], "NEWT-LinuxEventDeviceTracker-event"+number); - t.setDaemon(true); - t.start(); - } else if(eventDevicePollers[number].stop) { - eventDevicePollers[number]=null; + while(!stop){ + for(String path:f.list()){ + if(path.startsWith("event")) { + String stringNumber = path.substring(5); + number = Integer.parseInt(stringNumber); + if(number<32&&number>=0) { + if(eventDevicePollers[number]==null){ + eventDevicePollers[number] = new EventDevicePoller(number); + Thread t = new Thread(eventDevicePollers[number], "NEWT-LinuxEventDeviceTracker-event"+number); + t.setDaemon(true); + t.start(); + } else if(eventDevicePollers[number].stop) { + eventDevicePollers[number]=null; + } } } } - } - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } } @@ -193,8 +198,7 @@ public class LinuxEventDeviceTracker implements WindowListener { try { fis = new FileInputStream(f); } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + stop=true; return; } @@ -209,6 +213,7 @@ public class LinuxEventDeviceTracker implements WindowListener { int eventType=0; int modifiers=0; + loop: while(!stop) { int remaining=16; while(remaining>0) { @@ -216,11 +221,12 @@ public class LinuxEventDeviceTracker implements WindowListener { try { read = fis.read(b, 0, remaining); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + stop = true; + break loop; } if(read<0) { stop = true; // EOF of event device file !? + break loop; } else { remaining -= read; } @@ -298,10 +304,9 @@ public class LinuxEventDeviceTracker implements WindowListener { try { fis.close(); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); } } + stop=true; } private char LinuxEVKey2Unicode(short EVKey) { |