Skip to content

Commit bb8b464

Browse files
committed
Added left and right hotkeys.
closes #20 #22
1 parent 5bc5d16 commit bb8b464

File tree

3 files changed

+71
-27
lines changed

3 files changed

+71
-27
lines changed

src/com/esotericsoftware/clippy/Clippy.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,17 +173,23 @@ public void uncaughtException (Thread thread, Throwable ex) {
173173
final KeyStroke toggleHotkey = KeyStroke.getKeyStroke(config.toggleHotkey);
174174
final KeyStroke popupHotkey = KeyStroke.getKeyStroke(config.popupHotkey);
175175
final KeyStroke uploadHotkey = KeyStroke.getKeyStroke(config.uploadHotkey);
176+
176177
final KeyStroke screenshotHotkey = KeyStroke.getKeyStroke(config.screenshotHotkey);
177178
final KeyStroke screenshotAppHotkey = KeyStroke.getKeyStroke(config.screenshotAppHotkey);
178179
final KeyStroke screenshotRegionHotkey = KeyStroke.getKeyStroke(config.screenshotRegionHotkey);
179180
final KeyStroke screenshotLastRegionHotkey = KeyStroke.getKeyStroke(config.screenshotLastRegionHotkey);
181+
180182
final KeyStroke tobiiClickHotkey = config.tobiiEnabled ? KeyStroke.getKeyStroke(config.tobiiClickHotkey) : null;
181183
final KeyStroke tobiiClickHotkey2 = tobiiClickHotkey != null && tobiiClickHotkey.getKeyCode() == KeyEvent.VK_CAPS_LOCK
182184
? KeyStroke.getKeyStroke("ctrl CAPS_LOCK")
183185
: null; // Enables ctrl + click.
184186
final KeyStroke tobiiMoveHotkey = config.tobiiEnabled ? KeyStroke.getKeyStroke(config.tobiiMoveHotkey) : null;
187+
final KeyStroke tobiiRightClickHotkey = config.tobiiEnabled ? KeyStroke.getKeyStroke(config.tobiiRightClickHotkey) : null;
188+
final KeyStroke tobiiLeftClickHotkey = config.tobiiEnabled ? KeyStroke.getKeyStroke(config.tobiiLeftClickHotkey) : null;
189+
185190
List<KeyStroke> keys = Arrays.asList(toggleHotkey, popupHotkey, uploadHotkey, screenshotHotkey, screenshotAppHotkey,
186-
screenshotRegionHotkey, screenshotLastRegionHotkey, tobiiClickHotkey, tobiiClickHotkey2, tobiiMoveHotkey);
191+
screenshotRegionHotkey, screenshotLastRegionHotkey, tobiiClickHotkey, tobiiClickHotkey2, tobiiMoveHotkey,
192+
tobiiRightClickHotkey, tobiiLeftClickHotkey);
187193
keyboard = new Keyboard() {
188194
protected void hotkey (KeyStroke keyStroke) {
189195
if (keyStroke.equals(toggleHotkey)) {
@@ -200,10 +206,16 @@ else if (keyStroke.equals(screenshotRegionHotkey)) //
200206
screenshot.region();
201207
else if (keyStroke.equals(screenshotLastRegionHotkey)) //
202208
screenshot.lastRegion();
203-
else if (keyStroke.equals(tobiiClickHotkey) || keyStroke.equals(tobiiClickHotkey2)) //
204-
tobii.hotkeyPressed(tobiiClickHotkey.getKeyCode(), true);
205-
else if (keyStroke.equals(tobiiMoveHotkey)) //
206-
tobii.hotkeyPressed(tobiiMoveHotkey.getKeyCode(), false);
209+
else if (tobii.connected) {
210+
if (keyStroke.equals(tobiiClickHotkey) || keyStroke.equals(tobiiClickHotkey2)) //
211+
tobii.hotkeyPressed(tobiiClickHotkey.getKeyCode(), true);
212+
else if (keyStroke.equals(tobiiMoveHotkey)) //
213+
tobii.hotkeyPressed(tobiiMoveHotkey.getKeyCode(), false);
214+
else if (keyStroke.equals(tobiiLeftClickHotkey)) //
215+
tobii.hotkeyLeftClick();
216+
else if (keyStroke.equals(tobiiRightClickHotkey)) //
217+
tobii.hotkeyRightClick();
218+
}
207219
}
208220
};
209221
for (KeyStroke key : keys) {

src/com/esotericsoftware/clippy/Config.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@
2323
import static com.esotericsoftware.clippy.util.Util.*;
2424
import static com.esotericsoftware.minlog.Log.*;
2525

26+
import java.io.File;
27+
import java.io.IOException;
28+
import java.text.SimpleDateFormat;
29+
import java.util.ArrayList;
30+
import java.util.Calendar;
31+
import java.util.Date;
32+
import java.util.HashMap;
33+
import java.util.Map.Entry;
34+
2635
import com.esotericsoftware.clippy.PhilipsHue.PhilipsHueTimeline;
2736
import com.esotericsoftware.clippy.util.ColorTimeline;
2837
import com.esotericsoftware.clippy.util.Sun;
@@ -33,15 +42,6 @@
3342
import com.esotericsoftware.jsonbeans.JsonWriter;
3443
import com.esotericsoftware.minlog.Log;
3544

36-
import java.io.File;
37-
import java.io.IOException;
38-
import java.text.SimpleDateFormat;
39-
import java.util.ArrayList;
40-
import java.util.Calendar;
41-
import java.util.Date;
42-
import java.util.HashMap;
43-
import java.util.Map.Entry;
44-
4545
/** @author Nathan Sweet */
4646
public class Config {
4747
static public final Clippy clippy = Clippy.instance;
@@ -108,8 +108,10 @@ public class Config {
108108
public ArrayList<PhilipsHueLights> philipsHue;
109109

110110
public boolean tobiiEnabled;
111-
public String tobiiMoveHotkey;
112111
public String tobiiClickHotkey = "CAPS_LOCK";
112+
public String tobiiMoveHotkey;
113+
public String tobiiLeftClickHotkey;
114+
public String tobiiRightClickHotkey;
113115
public float tobiiHeadSensitivityX = 6;
114116
public float tobiiHeadSensitivityY = 8;
115117

src/com/esotericsoftware/clippy/Tobii.java

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
import static com.esotericsoftware.clippy.util.Util.*;
55
import static com.esotericsoftware.minlog.Log.*;
66

7+
import com.esotericsoftware.clippy.tobii.EyeX;
8+
import com.esotericsoftware.clippy.util.SharedLibraryLoader;
9+
710
import java.awt.Dimension;
811
import java.awt.Point;
912
import java.awt.Toolkit;
1013
import java.awt.event.InputEvent;
1114
import java.awt.event.KeyEvent;
1215

13-
import com.esotericsoftware.clippy.tobii.EyeX;
14-
import com.esotericsoftware.clippy.util.SharedLibraryLoader;
15-
1616
public class Tobii {
1717
static private final int mouseAnimationMillis = 100; // Zero disables animating mouse movement.
1818
static private final int screenLeft = 10, screenTop = 10; // Margins to keep mouse on screen, useful for bottom and right.
@@ -34,7 +34,7 @@ public class Tobii {
3434
final Clippy clippy = Clippy.instance;
3535
EyeX eyeX;
3636
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
37-
boolean connected, hotkeyPressed, mouseControl, storeHeadAdjustment, ignoreNextHotkey;
37+
boolean connected, hotkeyPressed, hotkeyLeftClick, hotkeyRightClick, mouseControl, storeHeadAdjustment, ignoreNextHotkey;
3838

3939
double gazeX, gazeY, gazeStartX, gazeStartY, gazeSnappedX, gazeSnappedY;
4040
final Buffer gazeJumpSamples = new Buffer(gazeJumpSampleCount * 2);
@@ -44,7 +44,7 @@ public class Tobii {
4444
int headSamplesSkipped;
4545

4646
final Point mouse = new Point();
47-
int mouseLastX, mouseLastY, mouseStartX, mouseStartY, mouseEndX, mouseEndY;
47+
int mouseLastX, mouseLastY, mouseStartX, mouseStartY, mouseEndX, mouseEndY, mouseButtonPressed;
4848
long mouseMoveLastTime, mouseDownTime;
4949
double mouseMoveTime;
5050
boolean mouseDrag;
@@ -174,15 +174,19 @@ public synchronized void hotkeyPressed (final int vk, final boolean clickOnRelea
174174

175175
hotkeyPressed = true;
176176
mouseControl = true;
177+
hotkeyLeftClick = false;
178+
hotkeyRightClick = false;
177179
storeHeadAdjustment = true;
178180
screen = Toolkit.getDefaultToolkit().getScreenSize();
179181

180182
mouseDrag = mouseDownTime > 0;
181183
mouseDownTime = 0;
182184
if (mouseDrag)
183185
setMousePosition(hotkeyReleaseX, hotkeyReleaseY, false);
184-
else
186+
else {
187+
mouseButtonPressed = 0;
185188
setMouseToGaze();
189+
}
186190

187191
threadPool.submit(new Runnable() {
188192
public void run () {
@@ -201,8 +205,8 @@ synchronized boolean hotkeyPressedTick (int vk, boolean clickOnRelease) {
201205
// Shift aborts without clicking.
202206
if (clippy.keyboard.isKeyDown(KeyEvent.VK_SHIFT)) return false;
203207

204-
// Click when hotkey is released.
205-
if (!clippy.keyboard.isKeyDown(vk)) {
208+
// Click when hotkey is released or aborted.
209+
if (!hotkeyPressed || !clippy.keyboard.isKeyDown(vk)) {
206210
if (clickOnRelease && System.currentTimeMillis() - hotkeyReleaseTime < doubleClickTime) {
207211
// If a double click, use the same position as the mouse down.
208212
setMousePosition(hotkeyReleaseX, hotkeyReleaseY, false);
@@ -226,8 +230,11 @@ synchronized boolean hotkeyPressedTick (int vk, boolean clickOnRelease) {
226230
}
227231
setGridOffset(gazeStartX, gazeStartY, mouse.x - gazeStartX, mouse.y - gazeStartY);
228232
}
229-
if (clickOnRelease) {
230-
robot.mousePress(InputEvent.BUTTON1_MASK);
233+
if (clickOnRelease || hotkeyLeftClick || hotkeyRightClick) {
234+
if (hotkeyRightClick)
235+
robot.mousePress(mouseButtonPressed = InputEvent.BUTTON3_DOWN_MASK);
236+
else
237+
robot.mousePress(mouseButtonPressed = InputEvent.BUTTON1_DOWN_MASK);
231238
mouseDownTime = System.currentTimeMillis();
232239
}
233240
}
@@ -259,7 +266,7 @@ void hotkeyReleased (int vk) {
259266
// Stop mouse control.
260267
boolean mouseDown;
261268
synchronized (this) {
262-
if (mouseDrag) robot.mouseRelease(InputEvent.BUTTON1_MASK);
269+
if (mouseDrag) robot.mouseRelease(mouseButtonPressed);
263270
mouseDown = mouseDownTime > 0;
264271
mouseControl = false;
265272
}
@@ -292,13 +299,36 @@ void hotkeyReleased (int vk) {
292299
sleep(Math.max(0, doubleTapDragTime - (System.currentTimeMillis() - mouseDownTime)));
293300
synchronized (this) {
294301
if (mouseDownTime > 0) {
302+
robot.mouseRelease(mouseButtonPressed);
295303
mouseDownTime = 0;
296-
robot.mouseRelease(InputEvent.BUTTON1_MASK);
304+
mouseButtonPressed = 0;
297305
}
298306
}
299307
}
300308
}
301309

310+
synchronized void hotkeyLeftClick () {
311+
if (!connected) return;
312+
if (hotkeyPressed) {
313+
hotkeyPressed = false; // Abort existing movement.
314+
hotkeyLeftClick = true;
315+
} else {
316+
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
317+
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
318+
}
319+
}
320+
321+
synchronized void hotkeyRightClick () {
322+
if (!connected) return;
323+
if (hotkeyPressed) {
324+
hotkeyPressed = false; // Abort existing movement.
325+
hotkeyRightClick = true;
326+
} else {
327+
robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
328+
robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
329+
}
330+
}
331+
302332
void setMouseToGaze () {
303333
double x = gazeX, y = gazeY;
304334
gazeStartX = x;

0 commit comments

Comments
 (0)