From f4a07c8a90271a8d27d834e4491d29c6dbf1634e Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 16 May 2015 23:12:43 -0400 Subject: [PATCH] iron out the key and mouse handling (incomplete) --- core/src/processing/core/PSurfaceFX.java | 234 ++++++++++++----------- core/todo.txt | 3 + 2 files changed, 128 insertions(+), 109 deletions(-) diff --git a/core/src/processing/core/PSurfaceFX.java b/core/src/processing/core/PSurfaceFX.java index 27dcff4b8..35b8d60d9 100644 --- a/core/src/processing/core/PSurfaceFX.java +++ b/core/src/processing/core/PSurfaceFX.java @@ -30,14 +30,19 @@ package processing.core; //import java.awt.event.MouseWheelEvent; //import java.awt.event.MouseWheelListener; +import java.util.HashMap; +import java.util.Map; + import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; +import javafx.event.EventType; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; +import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.input.ScrollEvent; @@ -45,9 +50,6 @@ import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; -//import processing.event.KeyEvent; -//import processing.event.MouseEvent; - public class PSurfaceFX implements PSurface { PApplet sketch; @@ -553,135 +555,149 @@ public class PSurfaceFX implements PSurface { */ - protected void fxMouseEvent(javafx.scene.input.MouseEvent nativeEvent) { + static Map, Integer> mouseMap = + new HashMap, Integer>(); + static { + mouseMap.put(MouseEvent.MOUSE_PRESSED, processing.event.MouseEvent.PRESS); + mouseMap.put(MouseEvent.MOUSE_RELEASED, processing.event.MouseEvent.RELEASE); + mouseMap.put(MouseEvent.MOUSE_CLICKED, processing.event.MouseEvent.CLICK); + mouseMap.put(MouseEvent.MOUSE_DRAGGED, processing.event.MouseEvent.DRAG); + mouseMap.put(MouseEvent.MOUSE_MOVED, processing.event.MouseEvent.MOVE); + mouseMap.put(MouseEvent.MOUSE_ENTERED, processing.event.MouseEvent.ENTER); + mouseMap.put(MouseEvent.MOUSE_EXITED, processing.event.MouseEvent.EXIT); + } + + protected void fxMouseEvent(MouseEvent nativeEvent) { // the 'amount' is the number of button clicks for a click event, // or the number of steps/clicks on the wheel for a mouse wheel event. int peCount = nativeEvent.getClickCount(); - int peAction = 0; - switch (nativeEvent.getID()) { - case java.awt.event.MouseEvent.MOUSE_PRESSED: - peAction = MouseEvent.PRESS; - break; - case java.awt.event.MouseEvent.MOUSE_RELEASED: - peAction = MouseEvent.RELEASE; - break; - case java.awt.event.MouseEvent.MOUSE_CLICKED: - peAction = MouseEvent.CLICK; - break; - case java.awt.event.MouseEvent.MOUSE_DRAGGED: - peAction = MouseEvent.DRAG; - break; - case java.awt.event.MouseEvent.MOUSE_MOVED: - peAction = MouseEvent.MOVE; - break; - case java.awt.event.MouseEvent.MOUSE_ENTERED: - peAction = MouseEvent.ENTER; - break; - case java.awt.event.MouseEvent.MOUSE_EXITED: - peAction = MouseEvent.EXIT; - break; - //case java.awt.event.MouseWheelEvent.WHEEL_UNIT_SCROLL: - case java.awt.event.MouseEvent.MOUSE_WHEEL: - peAction = MouseEvent.WHEEL; - /* - if (preciseWheelMethod != null) { - try { - peAmount = ((Double) preciseWheelMethod.invoke(nativeEvent, (Object[]) null)).floatValue(); - } catch (Exception e) { - preciseWheelMethod = null; - } - } - */ - peCount = ((MouseWheelEvent) nativeEvent).getWheelRotation(); - break; + //EventType et = nativeEvent.getEventType(); + int peAction = mouseMap.get(nativeEvent.getEventType()); +// if (et == MouseEvent.MOUSE_PRESSED) { +// peAction = processing.event.MouseEvent.PRESS; +// } else if (et == MouseEvent.MOUSE_RELEASED) { +// peAction = processing.event.MouseEvent.RELEASE; +// +// case java.awt.event.MouseEvent.MOUSE_CLICKED: +// peAction = MouseEvent.CLICK; +// break; +// case java.awt.event.MouseEvent.MOUSE_DRAGGED: +// peAction = MouseEvent.DRAG; +// break; +// case java.awt.event.MouseEvent.MOUSE_MOVED: +// peAction = MouseEvent.MOVE; +// break; +// case java.awt.event.MouseEvent.MOUSE_ENTERED: +// peAction = MouseEvent.ENTER; +// break; +// case java.awt.event.MouseEvent.MOUSE_EXITED: +// peAction = MouseEvent.EXIT; +// break; + + int peModifiers = 0; + if (nativeEvent.isShiftDown()) { + peModifiers |= processing.event.Event.SHIFT; + } + if (nativeEvent.isControlDown()) { + peModifiers |= processing.event.Event.CTRL; + } + if (nativeEvent.isMetaDown()) { + peModifiers |= processing.event.Event.META; + } + if (nativeEvent.isAltDown()) { + peModifiers |= processing.event.Event.ALT; } - //System.out.println(nativeEvent); - //int modifiers = nativeEvent.getModifiersEx(); - // If using getModifiersEx(), the regular modifiers don't set properly. - int modifiers = nativeEvent.getModifiers(); - - int peModifiers = modifiers & - (InputEvent.SHIFT_MASK | - InputEvent.CTRL_MASK | - InputEvent.META_MASK | - InputEvent.ALT_MASK); - - // Windows and OS X seem to disagree on how to handle this. Windows only - // sets BUTTON1_DOWN_MASK, while OS X seems to set BUTTON1_MASK. - // This is an issue in particular with mouse release events: - // http://code.google.com/p/processing/issues/detail?id=1294 - // The fix for which led to a regression (fixed here by checking both): - // http://code.google.com/p/processing/issues/detail?id=1332 int peButton = 0; -// if ((modifiers & InputEvent.BUTTON1_MASK) != 0 || -// (modifiers & InputEvent.BUTTON1_DOWN_MASK) != 0) { -// peButton = LEFT; -// } else if ((modifiers & InputEvent.BUTTON2_MASK) != 0 || -// (modifiers & InputEvent.BUTTON2_DOWN_MASK) != 0) { -// peButton = CENTER; -// } else if ((modifiers & InputEvent.BUTTON3_MASK) != 0 || -// (modifiers & InputEvent.BUTTON3_DOWN_MASK) != 0) { -// peButton = RIGHT; -// } - if ((modifiers & InputEvent.BUTTON1_MASK) != 0) { + if (nativeEvent.isPrimaryButtonDown()) { peButton = PConstants.LEFT; - } else if ((modifiers & InputEvent.BUTTON2_MASK) != 0) { - peButton = PConstants.CENTER; - } else if ((modifiers & InputEvent.BUTTON3_MASK) != 0) { + } else if (nativeEvent.isSecondaryButtonDown()) { peButton = PConstants.RIGHT; + } else if (nativeEvent.isMiddleButtonDown()) { + peButton = PConstants.CENTER; } - // If running on Mac OS, allow ctrl-click as right mouse. Prior to 0215, - // this used isPopupTrigger() on the native event, but that doesn't work - // for mouseClicked and mouseReleased (or others). - if (PApplet.platform == PConstants.MACOSX) { - //if (nativeEvent.isPopupTrigger()) { - if ((modifiers & InputEvent.CTRL_MASK) != 0) { - peButton = PConstants.RIGHT; - } + // If running on Mac OS, allow ctrl-click as right mouse. + // TODO see if this is necessary for JavaFX + if (PApplet.platform == PConstants.MACOSX && + nativeEvent.isControlDown() && + peButton == PConstants.LEFT) { + peButton = PConstants.RIGHT; } //if (canvas.getBoundsInLocal().contains(me.getX(), me.getY())) { //System.out.println(me.getSceneX() + " " + me.getSceneY()); //} - sketch.postEvent(new MouseEvent(nativeEvent, nativeEvent.getWhen(), - peAction, peModifiers, - nativeEvent.getX(), nativeEvent.getY(), - peButton, - peCount)); + //long when = nativeEvent.getWhen(); // from AWT + long when = System.currentTimeMillis(); + int x = (int) nativeEvent.getX(); // getSceneX()? + int y = (int) nativeEvent.getY(); + + sketch.postEvent(new processing.event.MouseEvent(nativeEvent, when, + peAction, peModifiers, + x, y, + peButton, + peCount)); } - protected void fxKeyEvent(javafx.scene.input.KeyEvent event) { + // https://docs.oracle.com/javafx/2/api/javafx/scene/input/ScrollEvent.html + protected void fxScrollEvent(ScrollEvent event) { +// //case java.awt.event.MouseWheelEvent.WHEEL_UNIT_SCROLL: +// case java.awt.event.MouseEvent.MOUSE_WHEEL: +// peAction = MouseEvent.WHEEL; +// /* +// if (preciseWheelMethod != null) { +// try { +// peAmount = ((Double) preciseWheelMethod.invoke(nativeEvent, (Object[]) null)).floatValue(); +// } catch (Exception e) { +// preciseWheelMethod = null; +// } +// } +// */ +// peCount = ((MouseWheelEvent) nativeEvent).getWheelRotation(); +// break; + } + + + @SuppressWarnings("deprecation") + protected void fxKeyEvent(javafx.scene.input.KeyEvent nativeEvent) { int peAction = 0; - switch (event.getID()) { - case java.awt.event.KeyEvent.KEY_PRESSED: - peAction = KeyEvent.PRESS; - break; - case java.awt.event.KeyEvent.KEY_RELEASED: - peAction = KeyEvent.RELEASE; - break; - case java.awt.event.KeyEvent.KEY_TYPED: - peAction = KeyEvent.TYPE; - break; + EventType et = nativeEvent.getEventType(); + if (et == KeyEvent.KEY_PRESSED) { + peAction = processing.event.KeyEvent.PRESS; + } else if (et == KeyEvent.KEY_RELEASED) { + peAction = processing.event.KeyEvent.RELEASE; + } else if (et == KeyEvent.KEY_TYPED) { + peAction = processing.event.KeyEvent.TYPE; } -// int peModifiers = event.getModifiersEx() & -// (InputEvent.SHIFT_DOWN_MASK | -// InputEvent.CTRL_DOWN_MASK | -// InputEvent.META_DOWN_MASK | -// InputEvent.ALT_DOWN_MASK); - int peModifiers = event.getModifiers() & - (InputEvent.SHIFT_MASK | - InputEvent.CTRL_MASK | - InputEvent.META_MASK | - InputEvent.ALT_MASK); + int peModifiers = 0; + if (nativeEvent.isShiftDown()) { + peModifiers |= processing.event.Event.SHIFT; + } + if (nativeEvent.isControlDown()) { + peModifiers |= processing.event.Event.CTRL; + } + if (nativeEvent.isMetaDown()) { + peModifiers |= processing.event.Event.META; + } + if (nativeEvent.isAltDown()) { + peModifiers |= processing.event.Event.ALT; + } - sketch.postEvent(new KeyEvent(event, event.getWhen(), - peAction, peModifiers, - event.getKeyChar(), event.getKeyCode())); + long when = System.currentTimeMillis(); + KeyCode kc = nativeEvent.getCode(); + // Are the f*ing serious? + char key = kc.impl_getChar().charAt(0); + int keyCode = kc.impl_getCode(); + sketch.postEvent(new processing.event.KeyEvent(nativeEvent, when, + peAction, peModifiers, + key, keyCode)); } + + + } \ No newline at end of file diff --git a/core/todo.txt b/core/todo.txt index 5ae1a8515..1e16ebcf3 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -55,7 +55,10 @@ _ at least with the Java2D renderer javafx _ key events +_ keyChar and keyCode are super wonky +_ what's the way to do this after the deprecation? _ mouse events +_ is it necessary to handle ctrl-click differently on OS X? _ displayWidth, displayHeight, full screen, display number _ present mode (stage in the center, clear the rest of the screen) _ createGraphics() should probably create PGraphicsJava2D