package com.badlogic.gdx.tests.lwjgl3; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.Graphics.DisplayMode; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3WindowAdapter; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3WindowConfiguration; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Pixmap.Blending; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.tests.NoncontinuousRenderingTest; import com.badlogic.gdx.tests.UITest; import com.badlogic.gdx.tests.g3d.Basic3DSceneTest; import com.badlogic.gdx.tests.g3d.ShaderCollectionTest; import com.badlogic.gdx.utils.GdxRuntimeException; public class MultiWindowTest { static Texture sharedTexture; static SpriteBatch sharedSpriteBatch; public static class MainWindow extends ApplicationAdapter { Class[] childWindowClasses = { NoncontinuousRenderingTest.class, ShaderCollectionTest.class, Basic3DSceneTest.class, UITest.class }; Lwjgl3Window latestWindow; int index; @Override public void create () { sharedSpriteBatch = new SpriteBatch(); sharedTexture = new Texture("data/badlogic.jpg"); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); sharedSpriteBatch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); sharedSpriteBatch.begin(); sharedSpriteBatch.draw(sharedTexture, Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY() - 1); sharedSpriteBatch.end(); if(Gdx.input.justTouched()) { Lwjgl3Application app = (Lwjgl3Application)Gdx.app; Lwjgl3WindowConfiguration config = new Lwjgl3WindowConfiguration(); DisplayMode mode = Gdx.graphics.getDisplayMode(); config.setWindowPosition(MathUtils.random(0, mode.width - 640), MathUtils.random(0, mode.height - 480)); config.setTitle("Child window"); config.setWindowListener(new Lwjgl3WindowAdapter() { @Override public void created(Lwjgl3Window window) { latestWindow = window; } }); Class clazz = childWindowClasses[index++ % childWindowClasses.length]; ApplicationListener listener = createChildWindowClass(clazz); app.newWindow(listener, config); } if (Gdx.input.isKeyJustPressed(Input.Keys.SPACE) && latestWindow != null){ latestWindow.setTitle("Retitled window"); int size = 48; Pixmap icon = new Pixmap(size, size, Pixmap.Format.RGBA8888); icon.setBlending(Blending.None); icon.setColor(Color.BLUE); icon.fill(); icon.setColor(Color.CLEAR); for (int i = 0; i < size; i += 3) for (int j = 0; j < size; j += 3) icon.drawPixel(i, j); latestWindow.setIcon(icon); icon.dispose(); } } public ApplicationListener createChildWindowClass(Class clazz) { try { return (ApplicationListener) clazz.newInstance(); } catch(Throwable t) { throw new GdxRuntimeException("Couldn't instantiate app listener", t); } } } public static void main(String[] argv) { Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); config.setTitle("Multi-window test"); new Lwjgl3Application(new MainWindow(), config); } }