diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 56b3b2795..29e33326e 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2004-11 Ben Fry and Casey Reas + Copyright (c) 2004-12 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology This library is free software; you can redistribute it and/or @@ -37,6 +37,7 @@ import java.util.zip.*; import javax.imageio.ImageIO; import javax.swing.JFileChooser; +//import javax.swing.JFrame; import javax.swing.SwingUtilities; @@ -48,6 +49,10 @@ import javax.swing.SwingUtilities; * problems with redraw of components drawn above it. If you'd like to * integrate other Java components, see below. *
+ * The + * Window Size and Full Screen page on the Wiki has useful information + * about sizing, multiple displays, full screen, etc. + * * As of release 0145, Processing uses active mode rendering in all cases. * All animation tasks happen on the "Processing Animation Thread". The * setup() and draw() methods are handled by that thread, and events (like @@ -59,11 +64,10 @@ import javax.swing.SwingUtilities; * animation thread. Use of a callback function or the registerXxx() methods * in PApplet can help ensure that your code doesn't do something naughty. * - * As of release 0136 of Processing, we have discontinued support for versions - * of Java prior to 1.5. We don't have enough people to support it, and for a - * project of our size, we should be focusing on the future, rather than - * working around legacy Java code. In addition, Java 1.5 gives us access to - * better timing facilities which will improve the steadiness of animation. + * As of Processing 2.0, we have discontinued support for versions of Java + * prior to 1.6. We don't have enough people to support it, and for a + * project of our (tiny) size, we should be focusing on the future, rather + * than working around legacy Java code. * * This class extends Applet instead of JApplet because 1) historically, * we supported Java 1.1, which does not include Swing (without an @@ -74,28 +78,22 @@ import javax.swing.SwingUtilities; * Similarly, Processing runs in a Frame and not a JFrame. However, there's * nothing to prevent you from embedding a PApplet into a JFrame, it's just * that the base version uses a regular AWT frame because there's simply - * no need for swing in that context. If people want to use Swing, they can + * no need for Swing in that context. If people want to use Swing, they can * embed themselves as they wish. * * It is possible to use PApplet, along with core.jar in other projects. - * In addition to enabling you to use Java 1.5+ features with your sketch, - * this also allows you to embed a Processing drawing area into another Java + * This also allows you to embed a Processing drawing area into another Java * application. This means you can use standard GUI controls with a Processing * sketch. Because AWT and Swing GUI components cannot be used on top of a * PApplet, you can instead embed the PApplet inside another GUI the way you * would any other Component. * - * It is also possible to resize the Processing window by including - * frame.setResizable(true) inside your setup() method. - * Note that the Java method frame.setSize() will not work unless - * you first set the frame to be resizable. - * * Because the default animation thread will run at 60 frames per second, - * an embedded PApplet can make the parent sluggish. You can use frameRate() - * to make it update less often, or you can use noLoop() and loop() to disable - * and then re-enable looping. If you want to only update the sketch - * intermittently, use noLoop() inside setup(), and redraw() whenever - * the screen needs to be updated once (or loop() to re-enable the animation + * an embedded PApplet can make the parent application sluggish. You can use + * frameRate() to make it update less often, or you can use noLoop() and loop() + * to disable and then re-enable looping. If you want to only update the sketch + * intermittently, use noLoop() inside setup(), and redraw() whenever the + * screen needs to be updated once (or loop() to re-enable the animation * thread). The following example embeds a sketch and also uses the noLoop() * and redraw() methods. You need not use noLoop() and redraw() when embedding * if you want your application to animate continuously. @@ -138,25 +136,6 @@ import javax.swing.SwingUtilities; * } * } * - * - *I was asked about Processing with multiple displays, and for lack of a - * better place to document it, things will go here.
- *You can address both screens by making a window the width of both, - * and the height of the maximum of both screens. In this case, do not use - * present mode, because that's exclusive to one screen. Basically it'll - * give you a PApplet that spans both screens. If using one half to control - * and the other half for graphics, you'd just have to put the 'live' stuff - * on one half of the canvas, the control stuff on the other. This works - * better in windows because on the mac we can't get rid of the menu bar - * unless it's running in present mode.
- *For more control, you need to write straight java code that uses p5. - * You can create two windows, that are shown on two separate screens, - * that have their own PApplet. this is just one of the tradeoffs of one of - * the things that we don't support in p5 from within the environment - * itself (we must draw the line somewhere), because of how messy it would - * get to start talking about multiple screens. It's also not that tough to - * do by hand w/ some Java code.
* @usage Web & Application */ public class PApplet extends Applet @@ -252,7 +231,16 @@ public class PApplet extends Applet /** The frame containing this applet (if any) */ public Frame frame; +// public JFrame frame; + /** + * Usually just 0, but with multiple displays, the X and Y coordinates of + * the screen will depend on the current screen's position relative to + * the other displays. + */ + public int screenX; + public int screenY; + /** * ( begin auto-generated from screenWidth.xml ) * @@ -813,9 +801,9 @@ public class PApplet extends Applet public void init() { // println("init() called " + Integer.toHexString(hashCode())); // using a local version here since the class variable is deprecated - Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - screenWidth = screen.width; - screenHeight = screen.height; +// Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); +// screenWidth = screen.width; +// screenHeight = screen.height; // send tab keys through to the PApplet setFocusTraversalKeysEnabled(false); @@ -1902,6 +1890,13 @@ public class PApplet extends Applet long now = System.nanoTime(); if (frameCount == 0) { + GraphicsDevice displayDevice = + getGraphicsConfiguration().getDevice(); + Rectangle screenRect = + displayDevice.getDefaultConfiguration().getBounds(); + screenWidth = screenRect.width; + screenHeight = screenRect.height; + try { //println("Calling setup()"); setup(); @@ -9156,9 +9151,6 @@ public class PApplet extends Applet } else if (param.equals(ARGS_DISPLAY)) { int deviceIndex = Integer.parseInt(value) - 1; - //DisplayMode dm = device.getDisplayMode(); - //if ((dm.getWidth() == 1024) && (dm.getHeight() == 768)) { - GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice devices[] = environment.getScreenDevices(); @@ -9220,6 +9212,7 @@ public class PApplet extends Applet } Frame frame = new Frame(displayDevice.getDefaultConfiguration()); +// JFrame frame = new JFrame(displayDevice.getDefaultConfiguration()); /* Frame frame = null; if (displayDevice != null) { @@ -9268,13 +9261,15 @@ public class PApplet extends Applet // Need to save the window bounds at full screen, // because pack() will cause the bounds to go to zero. // http://dev.processing.org/bugs/show_bug.cgi?id=923 - Rectangle fullScreenRect = null; - DisplayMode mode = displayDevice.getDisplayMode(); - fullScreenRect = new Rectangle(0, 0, mode.getWidth(), mode.getHeight()); + Rectangle screenRect = + displayDevice.getDefaultConfiguration().getBounds(); + // DisplayMode doesn't work here, because we can't get the upper-left + // corner of the display, which is important for multi-display setups. + // Sketch has already requested to be the same as the screen's // width and height, so let's roll with full screen mode. - if (mode.getWidth() == applet.sketchWidth() && - mode.getHeight() == applet.sketchHeight()) { + if (screenRect.width == applet.sketchWidth() && + screenRect.height == applet.sketchHeight()) { present = true; } @@ -9300,7 +9295,7 @@ public class PApplet extends Applet // //frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); // fullScreenRect = frame.getBounds(); // } else { - frame.setBounds(fullScreenRect); + frame.setBounds(screenRect); frame.setVisible(true); // } } @@ -9338,9 +9333,9 @@ public class PApplet extends Applet if (present) { // After the pack(), the screen bounds are gonna be 0s - frame.setBounds(fullScreenRect); - applet.setBounds((fullScreenRect.width - applet.width) / 2, - (fullScreenRect.height - applet.height) / 2, + frame.setBounds(screenRect); + applet.setBounds((screenRect.width - applet.width) / 2, + (screenRect.height - applet.height) / 2, applet.width, applet.height); if (!hideStop) { @@ -9358,7 +9353,7 @@ public class PApplet extends Applet //System.out.println("label width is " + labelSize.width); labelSize = new Dimension(100, labelSize.height); label.setSize(labelSize); - label.setLocation(20, fullScreenRect.height - labelSize.height - 20); + label.setLocation(20, screenRect.height - labelSize.height - 20); } // not always running externally when in present mode @@ -9380,7 +9375,7 @@ public class PApplet extends Applet frame.setSize(windowW, windowH); if (location != null) { - // a specific location was received from PdeRuntime + // a specific location was received from the Runner // (applet has been run more than once, user placed window) frame.setLocation(location[0], location[1]); @@ -9408,8 +9403,10 @@ public class PApplet extends Applet frame.setLocation(locationX, locationY); } } else { // just center on screen - frame.setLocation((applet.screenWidth - applet.width) / 2, - (applet.screenHeight - applet.height) / 2); + // Can't use frame.setLocationRelativeTo(null) because it sends the + // frame to the main display, which undermines the --display setting. + frame.setLocation(screenRect.x + (screenRect.width - applet.width) / 2, + screenRect.y + (screenRect.height - applet.height) / 2); } Point frameLoc = frame.getLocation(); if (frameLoc.y < 0) { diff --git a/core/todo.txt b/core/todo.txt index 2fa4f9813..8ca2bcf4f 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -2,6 +2,8 @@ sort out full screen issues +X make screenWidth and screenHeight work properly with multiple screens +X also set screenX and screenY X boolean sketchFullscreen() ? X for more options, just integrate the fs library? _ let hansi know when it's integrated so he can update his library @@ -44,6 +46,36 @@ _ just too problematic and buggy to get this to work perfectly _ default is that full screen app doesn't cover multiple displays _ this is fine since opengl can't usually go across both _ but include an example for how to use full in gl +http://wiki.processing.org/index.php?title=Window_Size_and_Full_Screen&action=edit&redlink=1 + +_ look into using BufferStrategy again to improve performance +_ there are more improvements to be made ala issue #729 + + * It is also possible to resize the Processing window by including + * frame.setResizable(true) inside your setup() method. + * Note that the Java method frame.setSize() will not work unless + * you first set the frame to be resizable. + * + + *I was asked about Processing with multiple displays, and for lack of a + * better place to document it, things will go here.
+ *You can address both screens by making a window the width of both, + * and the height of the maximum of both screens. In this case, do not use + * present mode, because that's exclusive to one screen. Basically it'll + * give you a PApplet that spans both screens. If using one half to control + * and the other half for graphics, you'd just have to put the 'live' stuff + * on one half of the canvas, the control stuff on the other. This works + * better in windows because on the mac we can't get rid of the menu bar + * unless it's running in present mode.
+ *For more control, you need to write straight java code that uses p5. + * You can create two windows, that are shown on two separate screens, + * that have their own PApplet. this is just one of the tradeoffs of one of + * the things that we don't support in p5 from within the environment + * itself (we must draw the line somewhere), because of how messy it would + * get to start talking about multiple screens. It's also not that tough to + * do by hand w/ some Java code.
+ _ static mode sketches seem to break ESC... noLoop() problem? @@ -52,8 +84,7 @@ _ and merge it in statically via the methods code _ make sure rendering is happening on the EDT _ (hopefully fixes flicker issues) -_ look into using BufferStrategy again to improve performance -_ there are more improvements to be made ala issue #729 +_ change PApplet.java javadoc to reflect the change _ memory leak when many createGraphics(..., JAVA2D) calls are used _ http://code.google.com/p/processing/issues/detail?id=507 diff --git a/todo.txt b/todo.txt index b0d6aaa1a..b055e411a 100644 --- a/todo.txt +++ b/todo.txt @@ -8,6 +8,16 @@ X add EditorState class, device-aware placement X get rid of restore sketch feature _ remove pref for restoring sketches _ implement recent sketches menu +_ casey: recent sketches is a yes, window menu could go either way +window menu: +http://code.google.com/p/processing/issues/detail?id=545 +recent sketches: +http://code.google.com/p/processing/issues/detail?id=188 +_ multiple sketch windows.. having a windows menu? +_ examples button on toolbar? open / recent / sketchbook? +_ add "recent files" list to open menu? +o http://dev.processing.org/bugs/show_bug.cgi?id=1335 + _ find in reference for copy() (on image) tries to open PVector.copy() _ might need disambiguation pages? @@ -23,12 +33,6 @@ _ http://code.google.com/p/processing/issues/detail?id=776 _ undo seems to not be going to the right location (now with example) _ http://code.google.com/p/processing/issues/detail?id=668 -_ casey: recent sketches is a yes, window menu could go either way -window menu: -http://code.google.com/p/processing/issues/detail?id=545 -recent sketches: -http://code.google.com/p/processing/issues/detail?id=188 - _ move Movie Maker out to its own separate tool package (with separate build) _ http://code.google.com/p/processing/issues/detail?id=837 @@ -220,8 +224,6 @@ _ blockCaret always false.. remove it? _ EditorToolbar, two TODO items for open menu handling blob of mess -_ multiple sketch windows.. having a windows menu? -_ examples button on toolbar? open / recent / sketchbook? _ modes have their own methods for digging through sketch & libraries folders _ therefore it need only check the sketch.txt file to see if it's ok _ (between android and java) @@ -1067,8 +1069,6 @@ _ dragging title bar while sketch running causes strange selection behavior _ http://dev.processing.org/bugs/show_bug.cgi?id=504 _ convert tabs to spaces when pasting text _ http://dev.processing.org/bugs/show_bug.cgi?id=506 -_ add "recent files" list to open menu? -_ http://dev.processing.org/bugs/show_bug.cgi?id=1335 _ unchecking 'use external editor' sketch should not set modified _ dangerous if a version that hasn't been re-loaded has possibility _ to overwrite. i.e. make a change and save in external editor,