rewriting event queue setup, changing default imports, general havoc

This commit is contained in:
benfry
2012-11-13 17:26:06 +00:00
parent 4b33f00ecd
commit b415db23e1
12 changed files with 266 additions and 104 deletions

View File

@@ -25,6 +25,7 @@ package processing.core;
import processing.data.*;
import processing.event.*;
import processing.event.Event;
import processing.opengl.*;
import java.applet.*;
@@ -2136,8 +2137,9 @@ public class PApplet extends Applet
// drawing commands can be run inside them. it can't
// be before, since a call to background() would wipe
// out anything that had been drawn so far.
dequeueMouseEvents();
dequeueKeyEvents();
dequeueEvents();
// dequeueMouseEvents();
// dequeueKeyEvents();
handleMethods("draw");
@@ -2353,20 +2355,106 @@ public class PApplet extends Applet
//////////////////////////////////////////////////////////////
// TODO this needs lots of cleaning
// protected Event eventQueue[] = new Event[10];
// protected int eventCount;
class InternalEventQueue {
protected Event queue[] = new Event[10];
protected int offset;
protected int count;
synchronized void add(Event e) {
if (count == queue.length) {
queue = (Event[]) expand(queue);
}
queue[count++] = e;
}
synchronized Event remove() {
if (offset == count) {
throw new RuntimeException("Nothing left on the event queue.");
}
Event outgoing = queue[offset++];
if (offset == count) {
// All done, time to reset
offset = 0;
count = 0;
}
return outgoing;
}
synchronized boolean available() {
return count != 0;
}
}
InternalEventQueue eventQueue = new InternalEventQueue();
/**
* Add an event to the internal event queue, or process it immediately if
* the sketch is not currently looping.
*/
public void postEvent(processing.event.Event pe) {
if (pe instanceof MouseEvent) {
if (looping) {
enqueueMouseEvent((MouseEvent) pe);
} else {
handleMouseEvent((MouseEvent) pe);
}
} else if (pe instanceof KeyEvent) {
if (looping) {
enqueueKeyEvent((KeyEvent) pe);
} else {
handleKeyEvent((KeyEvent) pe);
// if (pe instanceof MouseEvent) {
//// switch (pe.getFlavor()) {
//// case Event.MOUSE:
// if (looping) {
// enqueueMouseEvent((MouseEvent) pe);
// } else {
// handleMouseEvent((MouseEvent) pe);
// enqueueEvent(pe);
// }
// } else if (pe instanceof KeyEvent) {
// if (looping) {
// enqueueKeyEvent((KeyEvent) pe);
// } else {
// handleKeyEvent((KeyEvent) pe);
// }
// }
// synchronized (eventQueue) {
// if (eventCount == eventQueue.length) {
// eventQueue = (Event[]) expand(eventQueue);
// }
// eventQueue[eventCount++] = pe;
// }
eventQueue.add(pe);
if (!looping) {
dequeueEvents();
}
}
// protected void enqueueEvent(Event e) {
// synchronized (eventQueue) {
// if (eventCount == eventQueue.length) {
// eventQueue = (Event[]) expand(eventQueue);
// }
// eventQueue[eventCount++] = e;
// }
// }
protected void dequeueEvents() {
// can't do this.. thread lock
// synchronized (eventQueue) {
// for (int i = 0; i < eventCount; i++) {
// Event e = eventQueue[i];
while (eventQueue.available()) {
Event e = eventQueue.remove();
switch (e.getFlavor()) {
case Event.MOUSE:
handleMouseEvent((MouseEvent) e);
break;
case Event.KEY:
handleKeyEvent((KeyEvent) e);
break;
}
// }
// eventCount = 0;
}
}
@@ -2374,28 +2462,28 @@ public class PApplet extends Applet
//////////////////////////////////////////////////////////////
MouseEvent mouseEventQueue[] = new MouseEvent[10];
int mouseEventCount;
protected void enqueueMouseEvent(MouseEvent e) {
synchronized (mouseEventQueue) {
if (mouseEventCount == mouseEventQueue.length) {
MouseEvent temp[] = new MouseEvent[mouseEventCount << 1];
System.arraycopy(mouseEventQueue, 0, temp, 0, mouseEventCount);
mouseEventQueue = temp;
}
mouseEventQueue[mouseEventCount++] = e;
}
}
protected void dequeueMouseEvents() {
synchronized (mouseEventQueue) {
for (int i = 0; i < mouseEventCount; i++) {
handleMouseEvent(mouseEventQueue[i]);
}
mouseEventCount = 0;
}
}
// MouseEvent mouseEventQueue[] = new MouseEvent[10];
// int mouseEventCount;
//
// protected void enqueueMouseEvent(MouseEvent e) {
// synchronized (mouseEventQueue) {
// if (mouseEventCount == mouseEventQueue.length) {
// MouseEvent temp[] = new MouseEvent[mouseEventCount << 1];
// System.arraycopy(mouseEventQueue, 0, temp, 0, mouseEventCount);
// mouseEventQueue = temp;
// }
// mouseEventQueue[mouseEventCount++] = e;
// }
// }
//
// protected void dequeueMouseEvents() {
// synchronized (mouseEventQueue) {
// for (int i = 0; i < mouseEventCount; i++) {
// handleMouseEvent(mouseEventQueue[i]);
// }
// mouseEventCount = 0;
// }
// }
/**
@@ -2529,10 +2617,10 @@ public class PApplet extends Applet
int modifiers = nativeEvent.getModifiers();
int peModifiers = modifiers &
(InputEvent.SHIFT_DOWN_MASK |
InputEvent.CTRL_DOWN_MASK |
InputEvent.META_DOWN_MASK |
InputEvent.ALT_DOWN_MASK);
(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.
@@ -2569,12 +2657,11 @@ public class PApplet extends Applet
}
}
MouseEvent pe = new MouseEvent(nativeEvent, nativeEvent.getWhen(),
peAction, peModifiers,
nativeEvent.getX(), nativeEvent.getY(),
peButton,
nativeEvent.getClickCount());
postEvent(pe);
postEvent(new MouseEvent(nativeEvent, nativeEvent.getWhen(),
peAction, peModifiers,
nativeEvent.getX(), nativeEvent.getY(),
peButton,
nativeEvent.getClickCount()));
}
@@ -2589,6 +2676,7 @@ public class PApplet extends Applet
nativeMouseEvent(e);
}
/**
* @nowebref
*/
@@ -2596,6 +2684,7 @@ public class PApplet extends Applet
nativeMouseEvent(e);
}
/**
* @nowebref
*/
@@ -2603,14 +2692,23 @@ public class PApplet extends Applet
nativeMouseEvent(e);
}
/**
* @nowebref
*/
public void mouseEntered(java.awt.event.MouseEvent e) {
nativeMouseEvent(e);
}
/**
* @nowebref
*/
public void mouseExited(java.awt.event.MouseEvent e) {
nativeMouseEvent(e);
}
/**
* @nowebref
*/
@@ -2618,6 +2716,7 @@ public class PApplet extends Applet
nativeMouseEvent(e);
}
/**
* @nowebref
*/
@@ -2653,6 +2752,7 @@ public class PApplet extends Applet
*/
public void mousePressed() { }
/**
* ( begin auto-generated from mouseReleased.xml )
*
@@ -2693,6 +2793,7 @@ public class PApplet extends Applet
*/
public void mouseClicked() { }
/**
* ( begin auto-generated from mouseDragged.xml )
*
@@ -2710,6 +2811,7 @@ public class PApplet extends Applet
*/
public void mouseDragged() { }
/**
* ( begin auto-generated from mouseMoved.xml )
*
@@ -2727,8 +2829,10 @@ public class PApplet extends Applet
*/
public void mouseMoved() { }
public void mouseEntered() { }
public void mouseExited() { }
@@ -2736,29 +2840,29 @@ public class PApplet extends Applet
//////////////////////////////////////////////////////////////
KeyEvent keyEventQueue[] = new KeyEvent[10];
int keyEventCount;
protected void enqueueKeyEvent(KeyEvent e) {
synchronized (keyEventQueue) {
if (keyEventCount == keyEventQueue.length) {
KeyEvent temp[] = new KeyEvent[keyEventCount << 1];
System.arraycopy(keyEventQueue, 0, temp, 0, keyEventCount);
keyEventQueue = temp;
}
keyEventQueue[keyEventCount++] = e;
}
}
protected void dequeueKeyEvents() {
synchronized (keyEventQueue) {
for (int i = 0; i < keyEventCount; i++) {
keyEvent = keyEventQueue[i];
handleKeyEvent(keyEvent);
}
keyEventCount = 0;
}
}
// KeyEvent keyEventQueue[] = new KeyEvent[10];
// int keyEventCount;
//
// protected void enqueueKeyEvent(KeyEvent e) {
// synchronized (keyEventQueue) {
// if (keyEventCount == keyEventQueue.length) {
// KeyEvent temp[] = new KeyEvent[keyEventCount << 1];
// System.arraycopy(keyEventQueue, 0, temp, 0, keyEventCount);
// keyEventQueue = temp;
// }
// keyEventQueue[keyEventCount++] = e;
// }
// }
//
// protected void dequeueKeyEvents() {
// synchronized (keyEventQueue) {
// for (int i = 0; i < keyEventCount; i++) {
// keyEvent = keyEventQueue[i];
// handleKeyEvent(keyEvent);
// }
// keyEventCount = 0;
// }
// }
// protected void handleKeyEvent(java.awt.event.KeyEvent event) {
@@ -2836,13 +2940,18 @@ public class PApplet extends Applet
exit();
}
// When running tethered to the Processing application, respond to
// Ctrl-W (or Cmd-W) events by closing the sketch. Disable this behavior
// when running independently, because this sketch may be one component
// Ctrl-W (or Cmd-W) events by closing the sketch. Not enabled when
// running independently, because this sketch may be one component
// embedded inside an application that has its own close behavior.
if (external && event.getNative() instanceof java.awt.event.KeyEvent &&
((java.awt.event.KeyEvent) event.getNative()).getModifiers() ==
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() &&
event.getKeyCode() == 'W') {
if (external &&
event.getKeyCode() == 'W' &&
((event.isMetaDown() && platform == MACOSX) ||
(event.isControlDown() && platform != MACOSX))) {
// Can't use this native stuff b/c the native event might be NEWT
// if (external && event.getNative() instanceof java.awt.event.KeyEvent &&
// ((java.awt.event.KeyEvent) event.getNative()).getModifiers() ==
// Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() &&
// event.getKeyCode() == 'W') {
exit();
}
}
@@ -2863,15 +2972,19 @@ public class PApplet extends Applet
break;
}
int peModifiers = event.getModifiersEx() &
(InputEvent.SHIFT_DOWN_MASK |
InputEvent.CTRL_DOWN_MASK |
InputEvent.META_DOWN_MASK |
InputEvent.ALT_DOWN_MASK);
// 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);
KeyEvent ke = new KeyEvent(event, event.getWhen(), peAction, peModifiers,
event.getKeyChar(), event.getKeyCode());
postEvent(ke);
postEvent(new KeyEvent(event, event.getWhen(), peAction, peModifiers,
event.getKeyChar(), event.getKeyCode()));
}
@@ -2884,17 +2997,25 @@ public class PApplet extends Applet
*
* @nowebref
*/
public void keyPressed(java.awt.event.KeyEvent e) { nativeKeyEvent(e); }
public void keyPressed(java.awt.event.KeyEvent e) {
nativeKeyEvent(e);
}
/**
* @nowebref
*/
public void keyReleased(java.awt.event.KeyEvent e) { nativeKeyEvent(e); }
public void keyReleased(java.awt.event.KeyEvent e) {
nativeKeyEvent(e);
}
/**
* @nowebref
*/
public void keyTyped(java.awt.event.KeyEvent e) { nativeKeyEvent(e); }
public void keyTyped(java.awt.event.KeyEvent e) {
nativeKeyEvent(e);
}
/**

View File

@@ -29,12 +29,20 @@ public class Event {
protected long millis;
protected int action;
static public final int SHIFT_MASK = 1 << 6;
static public final int CTRL_MASK = 1 << 7;
static public final int META_MASK = 1 << 8;
static public final int ALT_MASK = 1 << 9;
// These correspond to the java.awt.Event modifiers (not to be confused with
// the newer getModifiersEx), though they're not guaranteed to in the future.
static public final int SHIFT = 1 << 0;
static public final int CTRL = 1 << 1;
static public final int META = 1 << 2;
static public final int ALT = 1 << 3;
protected int modifiers;
// Types of events. As with all constants in Processing, brevity's preferred.
static public final int KEY = 1;
static public final int MOUSE = 2;
static public final int TOUCH = 3;
protected int flavor;
public Event(Object nativeObject, long millis, int action, int modifiers) {
this.nativeObject = nativeObject;
@@ -44,6 +52,18 @@ public class Event {
}
public int getFlavor() {
return flavor;
}
/**
* Get the platform-native event object. This might be the java.awt event
* on the desktop, though if you're using OpenGL on the desktop it'll be a
* NEWT event that JOGL uses. Android events are something else altogether.
* Bottom line, use this only if you know what you're doing, and don't make
* assumptions about the class type.
*/
public Object getNative() {
return nativeObject;
}
@@ -85,21 +105,21 @@ public class Event {
public boolean isShiftDown() {
return (modifiers & SHIFT_MASK) != 0;
return (modifiers & SHIFT) != 0;
}
public boolean isControlDown() {
return (modifiers & CTRL_MASK) != 0;
return (modifiers & CTRL) != 0;
}
public boolean isMetaDown() {
return (modifiers & META_MASK) != 0;
return (modifiers & META) != 0;
}
public boolean isAltDown() {
return (modifiers & ALT_MASK) != 0;
return (modifiers & ALT) != 0;
}
}

View File

@@ -36,6 +36,7 @@ public class KeyEvent extends Event {
long millis, int action, int modifiers,
char key, int keyCode) {
super(nativeObject, millis, action, modifiers);
this.flavor = KEY;
this.key = key;
this.keyCode = keyCode;
}

View File

@@ -50,6 +50,7 @@ public class MouseEvent extends Event {
long millis, int action, int modifiers,
int x, int y, int button, int clickCount) {
super(nativeObject, millis, action, modifiers);
this.flavor = MOUSE;
this.x = x;
this.y = y;
this.button = button;

View File

@@ -41,5 +41,6 @@ public class TouchEvent extends Event {
public TouchEvent(Object nativeObject, long millis, int action, int modifiers) {
super(nativeObject, millis, action, modifiers);
this.flavor = TOUCH;
}
}