diff options
Diffstat (limited to 'src/classes/com/sun/javafx')
-rwxr-xr-x | src/classes/com/sun/javafx/newt/Display.java | 2 | ||||
-rwxr-xr-x | src/classes/com/sun/javafx/newt/Screen.java | 2 | ||||
-rwxr-xr-x | src/classes/com/sun/javafx/newt/Window.java | 58 | ||||
-rw-r--r-- | src/classes/com/sun/javafx/newt/awt/AWTDisplay.java | 46 | ||||
-rw-r--r-- | src/classes/com/sun/javafx/newt/awt/AWTScreen.java | 46 | ||||
-rw-r--r-- | src/classes/com/sun/javafx/newt/awt/AWTWindow.java | 274 | ||||
-rwxr-xr-x | src/classes/com/sun/javafx/newt/windows/WindowsWindow.java | 2 | ||||
-rwxr-xr-x | src/classes/com/sun/javafx/newt/x11/X11Window.java | 2 |
8 files changed, 412 insertions, 20 deletions
diff --git a/src/classes/com/sun/javafx/newt/Display.java b/src/classes/com/sun/javafx/newt/Display.java index 2aa55246f..cd3aa75d0 100755 --- a/src/classes/com/sun/javafx/newt/Display.java +++ b/src/classes/com/sun/javafx/newt/Display.java @@ -46,7 +46,7 @@ public abstract class Display { } else if (NewtFactory.X11.equals(type)) { displayClass = Class.forName("com.sun.javafx.newt.x11.X11Display"); } else if (NewtFactory.MACOSX.equals(type)) { - displayClass = Class.forName("com.sun.javafx.newt.macosx.MacOSXDisplay"); + displayClass = Class.forName("com.sun.javafx.newt.awt.AWTDisplay"); } else { throw new RuntimeException("Unknown display type \"" + type + "\""); } diff --git a/src/classes/com/sun/javafx/newt/Screen.java b/src/classes/com/sun/javafx/newt/Screen.java index 38669b9e0..67322b97f 100755 --- a/src/classes/com/sun/javafx/newt/Screen.java +++ b/src/classes/com/sun/javafx/newt/Screen.java @@ -46,7 +46,7 @@ public abstract class Screen { } else if (NewtFactory.X11.equals(type)) { screenClass = Class.forName("com.sun.javafx.newt.x11.X11Screen"); } else if (NewtFactory.MACOSX.equals(type)) { - screenClass = Class.forName("com.sun.javafx.newt.macosx.MacOSXScreen"); + screenClass = Class.forName("com.sun.javafx.newt.awt.AWTScreen"); } else { throw new RuntimeException("Unknown window type \"" + type + "\""); } diff --git a/src/classes/com/sun/javafx/newt/Window.java b/src/classes/com/sun/javafx/newt/Window.java index 8b6688c3b..faf98d3d0 100755 --- a/src/classes/com/sun/javafx/newt/Window.java +++ b/src/classes/com/sun/javafx/newt/Window.java @@ -56,7 +56,11 @@ public abstract class Window implements NativeWindow } else if (NewtFactory.X11.equals(type)) { windowClass = Class.forName("com.sun.javafx.newt.x11.X11Window"); } else if (NewtFactory.MACOSX.equals(type)) { - windowClass = Class.forName("com.sun.javafx.newt.macosx.MacOSXWindow"); + // For the time being, use the AWT on Mac OS X since + // there's no advantage to avoiding its usage -- this + // would change if we were running on the iPhone and + // didn't have an AWT + windowClass = Class.forName("com.sun.javafx.newt.awt.AWTWindow"); } else { throw new RuntimeException("Unknown window type \"" + type + "\""); } @@ -135,7 +139,7 @@ public abstract class Window implements NativeWindow pumpMessages(em); } - public abstract void dispatchMessages(int eventMask); + protected abstract void dispatchMessages(int eventMask); public String toString() { return "Window[handle "+windowHandle+ @@ -254,6 +258,10 @@ public abstract class Window implements NativeWindow public abstract void setPosition(int x, int y); public abstract boolean setFullscreen(boolean fullscreen); + public Object getWrappedWindow() { + return null; + } + // // MouseListener Support // @@ -262,14 +270,18 @@ public abstract class Window implements NativeWindow if(l == null) { return; } - mouseListener.add(l); + ArrayList newMouseListeners = (ArrayList) mouseListener.clone(); + newMouseListeners.add(l); + mouseListener = newMouseListeners; } public synchronized void removeMouseListener(MouseListener l) { if (l == null) { return; } - mouseListener.remove(l); + ArrayList newMouseListeners = (ArrayList) mouseListener.clone(); + newMouseListeners.remove(l); + mouseListener = newMouseListeners; } public synchronized MouseListener[] getMouseListeners() { @@ -320,6 +332,8 @@ public abstract class Window implements NativeWindow e = new MouseEvent(true, eventType, this, when, modifiers, x, y, 0, button); } + } else { + e = new MouseEvent(true, eventType, this, when, modifiers, x, y, 0, button); } if(DEBUG_MOUSE_EVENT) { @@ -329,30 +343,39 @@ public abstract class Window implements NativeWindow } } - for(Iterator i = mouseListener.iterator(); i.hasNext(); ) { + ArrayList listeners = null; + synchronized(this) { + listeners = mouseListener; + } + for(Iterator i = listeners.iterator(); i.hasNext(); ) { + MouseListener l = (MouseListener) i.next(); switch(e.getEventType()) { + case MouseEvent.EVENT_MOUSE_CLICKED: + l.mouseClicked(e); + break; case MouseEvent.EVENT_MOUSE_ENTERED: - ((MouseListener)i.next()).mouseEntered(e); + l.mouseEntered(e); break; case MouseEvent.EVENT_MOUSE_EXITED: - ((MouseListener)i.next()).mouseExited(e); + l.mouseExited(e); break; case MouseEvent.EVENT_MOUSE_PRESSED: - ((MouseListener)i.next()).mousePressed(e); + l.mousePressed(e); break; case MouseEvent.EVENT_MOUSE_RELEASED: - MouseListener ml = (MouseListener)i.next(); - ml.mouseReleased(e); + l.mouseReleased(e); if(null!=eClicked) { - ml.mouseClicked(eClicked); + l.mouseClicked(eClicked); } break; case MouseEvent.EVENT_MOUSE_MOVED: - ((MouseListener)i.next()).mouseMoved(e); + l.mouseMoved(e); break; case MouseEvent.EVENT_MOUSE_DRAGGED: - ((MouseListener)i.next()).mouseDragged(e); + l.mouseDragged(e); break; + default: + throw new RuntimeException("Unexpected mouse event type " + e.getEventType()); } } } @@ -388,16 +411,19 @@ public abstract class Window implements NativeWindow System.out.println("sendKeyEvent: "+e); } for(Iterator i = keyListener.iterator(); i.hasNext(); ) { + KeyListener l = (KeyListener) i.next(); switch(eventType) { case KeyEvent.EVENT_KEY_PRESSED: - ((KeyListener)i.next()).keyPressed(e); + l.keyPressed(e); break; case KeyEvent.EVENT_KEY_RELEASED: - ((KeyListener)i.next()).keyReleased(e); + l.keyReleased(e); break; case KeyEvent.EVENT_KEY_TYPED: - ((KeyListener)i.next()).keyTyped(e); + l.keyTyped(e); break; + default: + throw new RuntimeException("Unexpected key event type " + e.getEventType()); } } } diff --git a/src/classes/com/sun/javafx/newt/awt/AWTDisplay.java b/src/classes/com/sun/javafx/newt/awt/AWTDisplay.java new file mode 100644 index 000000000..37d1af2ed --- /dev/null +++ b/src/classes/com/sun/javafx/newt/awt/AWTDisplay.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + */ + +package com.sun.javafx.newt.awt; + +import com.sun.javafx.newt.*; +import com.sun.opengl.impl.*; + +public class AWTDisplay extends Display { + public AWTDisplay() { + } + + protected void createNative() { + handle = 0; + } +} diff --git a/src/classes/com/sun/javafx/newt/awt/AWTScreen.java b/src/classes/com/sun/javafx/newt/awt/AWTScreen.java new file mode 100644 index 000000000..4d8cfe776 --- /dev/null +++ b/src/classes/com/sun/javafx/newt/awt/AWTScreen.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + */ + +package com.sun.javafx.newt.awt; + +import com.sun.javafx.newt.*; +import com.sun.opengl.impl.*; + +public class AWTScreen extends Screen { + public AWTScreen() { + } + + protected void createNative() { + handle = 0; + } +} diff --git a/src/classes/com/sun/javafx/newt/awt/AWTWindow.java b/src/classes/com/sun/javafx/newt/awt/AWTWindow.java new file mode 100644 index 000000000..b7ac5c5d6 --- /dev/null +++ b/src/classes/com/sun/javafx/newt/awt/AWTWindow.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + */ + +package com.sun.javafx.newt.awt; + +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.awt.DisplayMode; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.event.*; +import java.util.*; + +import com.sun.javafx.newt.Window; + +/** An implementation of the Newt Window class built using the + AWT. This is provided for convenience of porting to platforms + supporting Java SE. */ + +public class AWTWindow extends Window { + private Frame frame; + private Canvas canvas; + private LinkedList/*<AWTEventWrapper>*/ events = new LinkedList(); + private boolean gotDisplaySize; + private int displayWidth; + private int displayHeight; + + protected void createNative() { + runOnEDT(new Runnable() { + public void run() { + frame = new Frame("AWT NewtWindow"); + frame.setLayout(new BorderLayout()); + canvas = new Canvas(); + Listener listener = new Listener(); + canvas.addMouseListener(listener); + canvas.addMouseMotionListener(listener); + canvas.addKeyListener(listener); + frame.add(canvas, BorderLayout.CENTER); + frame.setSize(width, height); + frame.setLocation(x, y); + } + }); + } + + protected void closeNative() { + runOnEDT(new Runnable() { + public void run() { + frame.dispose(); + frame = null; + } + }); + } + + public int getDisplayWidth() { + getDisplaySize(); + return displayWidth; + } + + public int getDisplayHeight() { + getDisplaySize(); + return displayHeight; + } + + private void getDisplaySize() { + if (!gotDisplaySize) { + DisplayMode mode = + GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode(); + displayWidth = mode.getWidth(); + displayHeight = mode.getHeight(); + gotDisplaySize = true; + } + } + + public void setVisible(final boolean visible) { + runOnEDT(new Runnable() { + public void run() { + frame.setVisible(visible); + } + }); + } + + public void setSize(final int width, final int height) { + this.width = width; + this.height = height; + runOnEDT(new Runnable() { + public void run() { + frame.setSize(width, height); + } + }); + } + + public void setPosition(final int x, final int y) { + runOnEDT(new Runnable() { + public void run() { + frame.setLocation(x, y); + } + }); + } + + public boolean setFullscreen(boolean fullscreen) { + // Ignore for now + return false; + } + + public Object getWrappedWindow() { + return canvas; + } + + public void dispatchMessages(int eventMask) { + AWTEventWrapper w; + do { + synchronized(this) { + if (!events.isEmpty()) { + w = (AWTEventWrapper) events.removeFirst(); + } else { + w = null; + } + } + if (w != null) { + if (w.isMouseEvent()) { + if ((eventMask & com.sun.javafx.newt.EventListener.MOUSE) != 0) { + MouseEvent e = (MouseEvent) w.getEvent(); + sendMouseEvent(w.getType(), convertModifiers(e), + e.getX(), e.getY(), convertButton(e)); + } + } else { + if ((eventMask & com.sun.javafx.newt.EventListener.KEY) != 0) { + KeyEvent e = (KeyEvent) w.getEvent(); + sendKeyEvent(w.getType(), convertModifiers(e), + e.getKeyCode(), e.getKeyChar()); + } + } + } + } while (w != null); + } + + private static int convertModifiers(InputEvent e) { + int newtMods = 0; + int mods = e.getModifiers(); + if ((mods & InputEvent.SHIFT_MASK) != 0) newtMods |= com.sun.javafx.newt.InputEvent.SHIFT_MASK; + if ((mods & InputEvent.CTRL_MASK) != 0) newtMods |= com.sun.javafx.newt.InputEvent.CTRL_MASK; + if ((mods & InputEvent.META_MASK) != 0) newtMods |= com.sun.javafx.newt.InputEvent.META_MASK; + if ((mods & InputEvent.ALT_MASK) != 0) newtMods |= com.sun.javafx.newt.InputEvent.ALT_MASK; + if ((mods & InputEvent.ALT_GRAPH_MASK) != 0) newtMods |= com.sun.javafx.newt.InputEvent.ALT_GRAPH_MASK; + return newtMods; + } + + private static int convertButton(MouseEvent e) { + switch (e.getButton()) { + case MouseEvent.BUTTON1: return com.sun.javafx.newt.MouseEvent.BUTTON1; + case MouseEvent.BUTTON2: return com.sun.javafx.newt.MouseEvent.BUTTON2; + case MouseEvent.BUTTON3: return com.sun.javafx.newt.MouseEvent.BUTTON3; + } + return 0; + } + + private static void runOnEDT(Runnable r) { + if (EventQueue.isDispatchThread()) { + r.run(); + } else { + try { + EventQueue.invokeAndWait(r); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + private void enqueueEvent(boolean isMouseEvent, int type, InputEvent e) { + AWTEventWrapper wrapper = new AWTEventWrapper(isMouseEvent,type, e); + synchronized(this) { + events.add(wrapper); + } + } + + static class AWTEventWrapper { + boolean isMouseEvent; + int type; + InputEvent e; + + AWTEventWrapper(boolean isMouseEvent, int type, InputEvent e) { + this.isMouseEvent = isMouseEvent; + this.type = type; + this.e = e; + } + + public boolean isMouseEvent() { + return isMouseEvent; + } + + public int getType() { + return type; + } + + public InputEvent getEvent() { + return e; + } + } + + class Listener implements MouseListener, MouseMotionListener, KeyListener { + public void mouseClicked(MouseEvent e) { + // We ignore these as we synthesize them ourselves out of + // mouse pressed and released events + } + + public void mouseEntered(MouseEvent e) { + enqueueEvent(true, com.sun.javafx.newt.MouseEvent.EVENT_MOUSE_ENTERED, e); + } + + public void mouseExited(MouseEvent e) { + enqueueEvent(true, com.sun.javafx.newt.MouseEvent.EVENT_MOUSE_EXITED, e); + } + + public void mousePressed(MouseEvent e) { + enqueueEvent(true, com.sun.javafx.newt.MouseEvent.EVENT_MOUSE_PRESSED, e); + } + + public void mouseReleased(MouseEvent e) { + enqueueEvent(true, com.sun.javafx.newt.MouseEvent.EVENT_MOUSE_RELEASED, e); + } + + public void mouseMoved(MouseEvent e) { + enqueueEvent(true, com.sun.javafx.newt.MouseEvent.EVENT_MOUSE_MOVED, e); + } + + public void mouseDragged(MouseEvent e) { + enqueueEvent(true, com.sun.javafx.newt.MouseEvent.EVENT_MOUSE_DRAGGED, e); + } + + public void keyPressed(KeyEvent e) { + enqueueEvent(false, com.sun.javafx.newt.KeyEvent.EVENT_KEY_PRESSED, e); + } + + public void keyReleased(KeyEvent e) { + enqueueEvent(false, com.sun.javafx.newt.KeyEvent.EVENT_KEY_RELEASED, e); + } + + public void keyTyped(KeyEvent e) { + enqueueEvent(false, com.sun.javafx.newt.KeyEvent.EVENT_KEY_TYPED, e); + } + } +} diff --git a/src/classes/com/sun/javafx/newt/windows/WindowsWindow.java b/src/classes/com/sun/javafx/newt/windows/WindowsWindow.java index 47dd15add..3ee6dbb0f 100755 --- a/src/classes/com/sun/javafx/newt/windows/WindowsWindow.java +++ b/src/classes/com/sun/javafx/newt/windows/WindowsWindow.java @@ -105,7 +105,7 @@ public class WindowsWindow extends Window { return 480; // FIXME } - public void dispatchMessages(int eventMask) { + protected void dispatchMessages(int eventMask) { DispatchMessages(windowHandle, eventMask); } diff --git a/src/classes/com/sun/javafx/newt/x11/X11Window.java b/src/classes/com/sun/javafx/newt/x11/X11Window.java index 10fd1acd5..101ee813b 100755 --- a/src/classes/com/sun/javafx/newt/x11/X11Window.java +++ b/src/classes/com/sun/javafx/newt/x11/X11Window.java @@ -108,7 +108,7 @@ public class X11Window extends Window { return getDisplayHeight0(getDisplayHandle(), getScreenIndex()); } - public void dispatchMessages(int eventMask) { + protected void dispatchMessages(int eventMask) { DispatchMessages(getDisplayHandle(), windowHandle, eventMask); } |