import com.badlogic.gdx.Net;\r
import com.badlogic.gdx.Preferences;\r
import com.badlogic.gdx.backends.openal.OpenALAudio;\r
+import com.badlogic.gdx.graphics.GL10;\r
import com.badlogic.gdx.utils.Clipboard;\r
import com.badlogic.gdx.utils.GdxRuntimeException;\r
\r
* call {@link #stop()} or a Swing application may deadlock on System.exit due to how LWJGL and/or Swing deal with shutdown hooks.\r
* @author Nathan Sweet */\r
public class LwjglCanvas implements Application {\r
- final LwjglGraphics graphics;\r
+ LwjglGraphics graphics;\r
OpenALAudio audio;\r
- final LwjglFiles files;\r
- final LwjglInput input;\r
- final LwjglNet net;\r
- final ApplicationListener listener;\r
- final Canvas canvas;\r
+ LwjglFiles files;\r
+ LwjglInput input;\r
+ LwjglNet net;\r
+ ApplicationListener listener;\r
+ Canvas canvas;\r
final List<Runnable> runnables = new ArrayList();\r
final List<Runnable> executedRunnables = new ArrayList();\r
boolean running = true;\r
Cursor cursor;\r
\r
public LwjglCanvas (ApplicationListener listener, boolean useGL2) {\r
+ LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();\r
+ config.useGL20 = true;\r
+ initialize(listener, config);\r
+ }\r
+\r
+ public LwjglCanvas (ApplicationListener listener, LwjglApplicationConfiguration config) {\r
+ initialize(listener, config);\r
+ }\r
+\r
+ private void initialize (ApplicationListener listener, LwjglApplicationConfiguration config) {\r
LwjglNativesLoader.load();\r
\r
canvas = new Canvas() {\r
\r
public final void addNotify () {\r
super.addNotify();\r
- EventQueue.invokeLater(new Runnable() {\r
- public void run () {\r
- create();\r
- }\r
- });\r
+ create();\r
}\r
\r
public final void removeNotify () {\r
};\r
canvas.setIgnoreRepaint(true);\r
\r
- graphics = new LwjglGraphics(canvas, useGL2) {\r
+ graphics = new LwjglGraphics(canvas, config) {\r
public void setTitle (String title) {\r
super.setTitle(title);\r
LwjglCanvas.this.setTitle(title);\r
return true;\r
}\r
};\r
- graphics.setVSync(true);\r
+ graphics.setVSync(config.vSyncEnabled);\r
if (!LwjglApplicationConfiguration.disableAudio) audio = new OpenALAudio();\r
files = new LwjglFiles();\r
input = new LwjglInput();\r
import com.badlogic.gdx.ApplicationListener;\r
\r
import java.awt.Dimension;\r
+import java.awt.EventQueue;\r
import java.awt.Point;\r
\r
import javax.swing.JFrame;\r
\r
/** Wraps an {@link LwjglCanvas} in a resizable {@link JFrame}. */\r
public class LwjglFrame extends JFrame {\r
- final LwjglCanvas lwjglCanvas;\r
+ LwjglCanvas lwjglCanvas;\r
\r
public LwjglFrame (ApplicationListener listener, String title, int width, int height, boolean useGL2) {\r
super(title);\r
+ LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();\r
+ config.title = title;\r
+ config.width = width;\r
+ config.height = height;\r
+ config.useGL20 = useGL2;\r
+ construct(listener, config);\r
+ }\r
+\r
+ public LwjglFrame (ApplicationListener listener, LwjglApplicationConfiguration config) {\r
+ super(config.title);\r
+ construct(listener, config);\r
+ }\r
\r
- lwjglCanvas = new LwjglCanvas(listener, useGL2) {\r
+ private void construct (ApplicationListener listener, LwjglApplicationConfiguration config) {\r
+ lwjglCanvas = new LwjglCanvas(listener, config) {\r
protected void stopped () {\r
LwjglFrame.this.dispose();\r
}\r
LwjglFrame.this.exception(t);\r
}\r
};\r
- getContentPane().add(lwjglCanvas.getCanvas());\r
\r
Runtime.getRuntime().addShutdownHook(new Thread() {\r
public void run () {\r
});\r
\r
setDefaultCloseOperation(EXIT_ON_CLOSE);\r
- getContentPane().setPreferredSize(new Dimension(width, height));\r
+ getContentPane().setPreferredSize(new Dimension(config.width, config.height));\r
+\r
initialize();\r
- Dimension size = getSize();\r
- if (size.width == 0 && size.height == 0) pack();\r
+ pack();\r
Point location = getLocation();\r
if (location.x == 0 && location.y == 0) setLocationRelativeTo(null);\r
- setVisible(true); // Has to happen on OSX before display is created.\r
- lwjglCanvas.getCanvas().requestFocus();\r
+ lwjglCanvas.getCanvas().setSize(getSize());\r
+\r
+ // Finish with invokeLater so any LwjglFrame super constructor has a chance to initialize.\r
+ EventQueue.invokeLater(new Runnable() {\r
+ public void run () {\r
+ addCanvas();\r
+ setVisible(true);\r
+ lwjglCanvas.getCanvas().requestFocus();\r
+ }\r
+ });\r
}\r
\r
protected void exception (Throwable ex) {\r
lwjglCanvas.stop();\r
}\r
\r
- /** Called before the JFrame is shown. */\r
+ /** Called before the JFrame is made displayable. */\r
protected void initialize () {\r
}\r
\r
+ /** Adds the canvas to the content pane. This triggers addNotify and starts the canvas' game loop. */\r
+ protected void addCanvas () {\r
+ getContentPane().add(lwjglCanvas.getCanvas());\r
+ }\r
+\r
/** Called after {@link ApplicationListener} create and resize, but before the game loop iteration. */\r
protected void start () {\r
}\r