diff --git a/deploy/META-INF/native-image/io.github.humbleui.jwm/jni-config.json b/deploy/META-INF/native-image/io.github.humbleui.jwm/jni-config.json new file mode 100644 index 00000000..e1f7d2c6 --- /dev/null +++ b/deploy/META-INF/native-image/io.github.humbleui.jwm/jni-config.json @@ -0,0 +1,128 @@ +[ +{ + "name":"io.github.humbleui.jwm.Clipboard", + "methods":[{"name":"_registerPredefinedFormat","parameterTypes":["java.lang.String"] }]} +, +{ + "name":"io.github.humbleui.jwm.ClipboardEntry", + "fields":[ + {"name":"_data"}, + {"name":"_format"} + ], + "methods":[{"name":"make","parameterTypes":["io.github.humbleui.jwm.ClipboardFormat","byte[]"] }]} +, +{ + "name":"io.github.humbleui.jwm.ClipboardFormat", + "fields":[{"name":"_formatId"}]} +, +{ + "name":"io.github.humbleui.jwm.EventFrame", + "fields":[{"name":"INSTANCE"}]} +, +{ + "name":"io.github.humbleui.jwm.EventKey", + "methods":[{"name":"","parameterTypes":["int","boolean","int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventMouseButton", + "methods":[{"name":"","parameterTypes":["int","boolean","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventMouseMove", + "methods":[{"name":"","parameterTypes":["int","int","int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventMouseScroll", + "methods":[{"name":"","parameterTypes":["float","float","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventTextInput", + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventTextInputMarked", + "methods":[{"name":"","parameterTypes":["java.lang.String","int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowCloseRequest", + "fields":[{"name":"INSTANCE"}]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowMaximize", + "fields":[{"name":"INSTANCE"}]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowMinimize", + "fields":[{"name":"INSTANCE"}]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowMove", + "methods":[{"name":"","parameterTypes":["int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowResize", + "methods":[{"name":"","parameterTypes":["int","int","int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowRestore", + "fields":[{"name":"INSTANCE"}]} +, +{ + "name":"io.github.humbleui.jwm.EventWindowScreenChange", + "fields":[{"name":"INSTANCE"}]} +, +{ + "name":"io.github.humbleui.jwm.LayerNotSupportedException"} +, +{ + "name":"io.github.humbleui.jwm.Screen", + "methods":[{"name":"","parameterTypes":["long","boolean","io.github.humbleui.jwm.UIRect","io.github.humbleui.jwm.UIRect","float"] }]} +, +{ + "name":"io.github.humbleui.jwm.TextInputClient", + "methods":[{"name":"getRectForMarkedRange","parameterTypes":["int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.UIRect", + "fields":[ + {"name":"_bottom"}, + {"name":"_left"}, + {"name":"_right"}, + {"name":"_top"} + ], + "methods":[{"name":"","parameterTypes":["int","int","int","int"] }]} +, +{ + "name":"io.github.humbleui.jwm.impl.Native", + "fields":[{"name":"_ptr"}]} +, +{ + "name":"java.lang.ClassLoader", + "methods":[ + {"name":"getPlatformClassLoader","parameterTypes":[] }, + {"name":"loadClass","parameterTypes":["java.lang.String"] } + ]} +, +{ + "name":"java.lang.Runnable", + "methods":[{"name":"run","parameterTypes":[] }]} +, +{ + "name":"java.lang.RuntimeException"} +, +{ + "name":"java.lang.Throwable", + "methods":[{"name":"printStackTrace","parameterTypes":[] }]} +, +{ + "name":"java.util.function.Consumer", + "methods":[{"name":"accept","parameterTypes":["java.lang.Object"] }]} +, +{ + "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"} +, +{ + "name":"org.graalvm.nativebridge.jni.JNIExceptionWrapperEntryPoints", + "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }]} + +] diff --git a/deploy/META-INF/native-image/io.github.humbleui.jwm/resource-config.json b/deploy/META-INF/native-image/io.github.humbleui.jwm/resource-config.json new file mode 100644 index 00000000..fb58f969 --- /dev/null +++ b/deploy/META-INF/native-image/io.github.humbleui.jwm/resource-config.json @@ -0,0 +1,8 @@ +{ + "resources":{ + "includes":[ + {"pattern":"\\Qjwm.version\\E"}, + {"pattern":"\\Qjwm_x64.dll\\E"} + ]}, + "bundles":[] +} diff --git a/examples/java/Example.java b/examples/java/Example.java index 482ee9f6..bf8ae3d8 100644 --- a/examples/java/Example.java +++ b/examples/java/Example.java @@ -1,205 +1,74 @@ package io.github.humbleui.jwm.examples; -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -import java.util.*; -import java.util.concurrent.*; -import java.util.function.*; -import java.util.stream.*; -import java.io.File; - -public class Example implements Consumer { - public static int PADDING = 10; - public static int COLS = 4, ROWS = 3; - public static final KeyModifier MODIFIER = Platform.CURRENT == Platform.MACOS ? KeyModifier.MAC_COMMAND : KeyModifier.CONTROL; - public static Font FONT12 = new Font(FontMgr.getDefault().matchFamilyStyleCharacter(null, FontStyle.NORMAL, null, "↑".codePointAt(0)), 12); - public static Font FONT24 = new Font(FontMgr.getDefault().matchFamilyStyle(null, FontStyle.NORMAL), 24); - public static Font FONT48 = new Font(FontMgr.getDefault().matchFamilyStyle(null, FontStyle.BOLD), 48); - - public float lastScale = 1f; - public PanelTextInput panelTextInput; - public PanelScreens panelScreens; - public PanelLegend panelLegend; - public PanelMouse panelMouse; - public PanelAnimation panelAnimation; - public PanelMouseCursors panelMouseCursors; - public PanelRendering panelRendering; - public PanelEvents panelEvents; - - public Window window; - - public boolean paused = true; - public boolean closed = false; - - public Example() { - window = App.makeWindow(); - window.setEventListener(this); - - panelTextInput = new PanelTextInput(window); - panelScreens = new PanelScreens(window); - panelLegend = new PanelLegend(window); - panelMouse = new PanelMouse(window); - panelAnimation = new PanelAnimation(window); - panelMouseCursors = new PanelMouseCursors(window); - panelRendering = new PanelRendering(window); - panelEvents = new PanelEvents(window); +import java.util.function.Consumer; + +import io.github.humbleui.jwm.App; +import io.github.humbleui.jwm.Event; +import io.github.humbleui.jwm.EventFrame; +import io.github.humbleui.jwm.EventWindowCloseRequest; +import io.github.humbleui.jwm.EventWindowResize; +import io.github.humbleui.jwm.EventWindowScreenChange; +import io.github.humbleui.jwm.LayerGL; +import io.github.humbleui.jwm.UIRect; +import io.github.humbleui.jwm.Window; +import io.github.humbleui.jwm.WindowWin32; +public class Example { + public static void main(String[] args) { + App.init(); - var scale = window.getScreen().getScale(); - int count = App._windows.size() - 1; - Screen screen = App.getScreens()[(count / 5) % App.getScreens().length]; - UIRect bounds = screen.getWorkArea(); + // Using the generic window seems to cause: + // Exception in thread "main" java.lang.NoSuchMethodException: io.github.humbleui.jwm.WindowWin32.() + // at java.lang.Class.getConstructor0(DynamicHub.java:3585) + // at java.lang.Class.getDeclaredConstructor(DynamicHub.java:2754) + // at io.github.humbleui.jwm.App.makeWindow(App.java:50) + // at io.github.humbleui.jwm.examples.Example.main(Example.java:18) - window.setWindowSize(bounds.getWidth() / 2, bounds.getHeight() / 2); - switch (count % 5) { - case 0 -> window.setWindowPosition(bounds.getLeft() + bounds.getWidth() / 4, bounds.getTop() + bounds.getHeight() / 4); - case 1 -> window.setWindowPosition(bounds.getLeft(), bounds.getTop()); - case 2 -> window.setWindowPosition(bounds.getLeft() + bounds.getWidth() / 2, bounds.getTop()); - case 3 -> window.setWindowPosition(bounds.getLeft(), bounds.getTop() + bounds.getHeight() / 2); - case 4 -> window.setWindowPosition(bounds.getLeft() + bounds.getWidth() / 2, bounds.getTop() + bounds.getHeight() / 2); - } - window.setTitle("JWM Window #" + count); + // Maybe because the underlying constructor isn't directly invoked, so Graal doesn't statically analyze it? + // Potential solution: Hard-code "if OS == WINDOWS { new WindowWin32() }" etc? - switch (Platform.CURRENT) { - case WINDOWS -> { - window.setIcon(new File("examples/resources/windows.ico")); - } - case MACOS -> { - window.setIcon(new File("examples/resources/macos.icns")); - } - } + // Window window = App.makeWindow(); + WindowWin32 window = new WindowWin32(); + window.setEventListener(new EventHandler(window)); window.setVisible(true); window.requestFrame(); + App.start(); } +} - public void paint(String reason) { - if (closed) - return; - - UIRect contentRect = window.getContentRect(); - - // If content area empty no rendering must happen - if (contentRect.getWidth() <= 0 || contentRect.getHeight() <= 0) - return; - - float scale = window.getScreen().getScale(); - PADDING = (int) (10 * scale); - int panelWidth = (contentRect.getWidth() - (COLS + 1) * PADDING) / COLS; - int panelHeight = (contentRect.getHeight() - (ROWS + 1) * PADDING) / ROWS; - if (panelWidth <= 0 || panelHeight <= 0) - return; - - if (lastScale != scale) { - FONT12.setSize(12 * scale); - FONT24.setSize(24 * scale); - FONT48.setSize(48 * scale); - } - - var canvas = panelRendering.layer.beforePaint(); - canvas.clear(0xFF264653); - int canvasCount = canvas.save(); - - // First row - panelTextInput.paint (canvas, PADDING + (panelWidth + PADDING) * 0, PADDING + (panelHeight + PADDING) * 0, panelWidth, panelHeight, scale); - panelMouse.paint (canvas, PADDING + (panelWidth + PADDING) * 1, PADDING + (panelHeight + PADDING) * 0, panelWidth, panelHeight, scale); - panelMouseCursors.paint (canvas, PADDING + (panelWidth + PADDING) * 2, PADDING + (panelHeight + PADDING) * 0, panelWidth, panelHeight, scale); - panelLegend.paint (canvas, PADDING + (panelWidth + PADDING) * 3, PADDING + (panelHeight + PADDING) * 0, panelWidth, panelHeight * 3 + PADDING * 2, scale); - - // Second row - panelScreens.paint (canvas, PADDING + (panelWidth + PADDING) * 0, PADDING + (panelHeight + PADDING) * 1, panelWidth, panelHeight, scale); - panelAnimation.paint (canvas, PADDING + (panelWidth + PADDING) * 1, PADDING + (panelHeight + PADDING) * 1, panelWidth, panelHeight, scale); - panelRendering.bumpCounter(reason); - panelRendering.paint (canvas, PADDING + (panelWidth + PADDING) * 2, PADDING + (panelHeight + PADDING) * 1, panelWidth, panelHeight, scale); - - // Third row - panelEvents.paint (canvas, PADDING + (panelWidth + PADDING) * 0, PADDING + (panelHeight + PADDING) * 2, panelWidth * 3 + PADDING * 2, panelHeight, scale); - - // Colored bars - try (var paint = new Paint()) { - int width = contentRect.getWidth(); - int height = contentRect.getHeight(); - var barSize = 3 * scale; - - // left - paint.setColor(0xFFe76f51); - canvas.drawRect(Rect.makeXYWH(0, 0, barSize, 100 * scale), paint); - canvas.drawRect(Rect.makeXYWH(0, height / 2 - 50 * scale, barSize, 100 * scale), paint); - canvas.drawRect(Rect.makeXYWH(0, height - 100 * scale, barSize, 100 * scale), paint); - - // top - paint.setColor(0xFF2a9d8f); - canvas.drawRect(Rect.makeXYWH(0, 0, 100 * scale, barSize), paint); - canvas.drawRect(Rect.makeXYWH(width / 2 - 50 * scale, 0, 100 * scale, barSize), paint); - canvas.drawRect(Rect.makeXYWH(width - 100 * scale, 0, 100 * scale, barSize), paint); - - // right - paint.setColor(0xFFe9c46a); - canvas.drawRect(Rect.makeXYWH(width - barSize, 0, barSize, 100 * scale), paint); - canvas.drawRect(Rect.makeXYWH(width - barSize, height / 2 - 50 * scale, barSize, 100 * scale), paint); - canvas.drawRect(Rect.makeXYWH(width - barSize, height - 100 * scale, barSize, 100 * scale), paint); - - // bottom - paint.setColor(0xFFFFFFFF); - canvas.drawRect(Rect.makeXYWH(0, height - barSize, 100 * scale, barSize), paint); - canvas.drawRect(Rect.makeXYWH(width / 2 - 50 * scale, height - barSize, 100 * scale, barSize), paint); - canvas.drawRect(Rect.makeXYWH(width - 100 * scale, height - barSize, 100 * scale, barSize), paint); - } - canvas.restoreToCount(canvasCount); +class EventHandler implements Consumer { + public final Window window; + public final LayerGL layer; - panelRendering.layer.afterPaint(); + public EventHandler(Window window) { + this.window = window; + layer = new LayerGL(); + layer.attach(window); } @Override public void accept(Event e) { - panelTextInput.accept(e); - panelScreens.accept(e); - panelMouse.accept(e); - panelMouseCursors.accept(e); - panelRendering.accept(e); - panelEvents.accept(e); + System.out.println(e); - float scale = window.getScreen().getScale(); - if (e instanceof EventKey eventKey) { - if (eventKey.isPressed() == true && eventKey.isModifierDown(MODIFIER)) { - switch (eventKey.getKey()) { - case P -> { - paused = !paused; - if (!paused) - window.requestFrame(); - } - case N -> - new Example(); - case H -> - window.setVisible(false); - case W -> - accept(EventWindowCloseRequest.INSTANCE); - case O -> - window.setOpacity(window.getOpacity() == 1f ? 0.5f : 1f); - case UP -> - window.maximize(); - case DOWN -> - window.restore(); - case M -> - window.minimize(); - } - } + if (e instanceof EventWindowCloseRequest) { + window.close(); + App.terminate(); + } else if (e instanceof EventWindowScreenChange) { + layer.reconfigure(); + UIRect contentRect = window.getContentRect(); + layer.resize(contentRect.getWidth(), contentRect.getHeight()); + paint(); } else if (e instanceof EventWindowResize ee) { - paint("Resize"); + layer.resize(ee.getContentWidth(), ee.getContentHeight()); + paint(); } else if (e instanceof EventFrame) { - paint("Frame"); - if (!paused) - window.requestFrame(); - } else if (e instanceof EventWindowCloseRequest) { - closed = true; - window.close(); - if (App._windows.size() == 0) - App.terminate(); + paint(); + window.requestFrame(); } } - public static void main(String[] args) { - App.init(); - new Example(); - App.start(); + public void paint() { + layer.makeCurrent(); + // do the drawing + layer.swapBuffers(); } } diff --git a/examples/java/Panel.java b/examples/java/Panel.java deleted file mode 100644 index 9b7cb0c2..00000000 --- a/examples/java/Panel.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.function.*; -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public abstract class Panel implements Consumer { - public final Window window; - public int lastWidth = 0, lastHeight = 0, lastX = 0, lastY = 0; - public float lastScale = 1f; - public boolean drawBG = true; - - public Panel(Window window) { - this.window = window; - } - - public abstract void paintImpl(Canvas canvas, int width, int height, float scale); - - @Override - public void accept(Event e) {} - - public void paint(Canvas canvas, int x, int y, int width, int height, float scale) { - int count = canvas.save(); - canvas.translate(x, y); - canvas.clipRect(Rect.makeXYWH(0, 0, width, height)); - if (drawBG) { - try (var paint = new Paint()) { - paint.setColor(0x20000000); - canvas.drawRRect(RRect.makeXYWH(0, 0, width, height, 4 * scale), paint); - } - } - paintImpl(canvas, width, height, scale); - canvas.restoreToCount(count); - - lastWidth = width; - lastHeight = height; - lastX = x; - lastY = y; - lastScale = scale; - } - - public boolean contains(int x, int y) { - return UIRect.makeXYWH(lastX, lastY, lastWidth, lastHeight).contains(x, y); - } - - public String capitalize(String s) { - return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase(); - } -} \ No newline at end of file diff --git a/examples/java/PanelAnimation.java b/examples/java/PanelAnimation.java deleted file mode 100644 index 12c4eab3..00000000 --- a/examples/java/PanelAnimation.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelAnimation extends Panel { - public int angle = 0; - - public PanelAnimation(Window window) { - super(window); - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - var radius = Math.max(0, Math.min(width / 2 - Example.PADDING, height / 2 - Example.PADDING)); - - try (var paint = new Paint()) { - canvas.save(); - canvas.translate(width / 2, height / 2); - paint.setColor(0xFFFFFFFF); - canvas.drawCircle(0, 0, radius, paint); - canvas.rotate(angle); - paint.setColor(0xFF264653); - canvas.drawRect(Rect.makeXYWH(-7, -radius, 14, radius * 2), paint); - canvas.restore(); - } - - angle = (angle + 3) % 360; - } -} \ No newline at end of file diff --git a/examples/java/PanelEvents.java b/examples/java/PanelEvents.java deleted file mode 100644 index 2856fe1f..00000000 --- a/examples/java/PanelEvents.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.*; -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelEvents extends Panel { - public List events = new ArrayList<>(); - - public PanelEvents(Window window) { - super(window); - } - - @Override - public void accept(Event e) { - while (events.size() > 19) - events.remove(0); - if (!(e instanceof EventFrame)) { - events.add(e); - window.requestFrame(); - } - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - try (var paint = new Paint();) { - paint.setColor(0xFFFFFFFF); - var metrics = Example.FONT12.getMetrics(); - canvas.save(); - canvas.translate(Example.PADDING, height - Example.PADDING - metrics.getDescent()); - for (int i = events.size() - 1; i >= 0; --i) { - var event = events.get(i); - canvas.drawString(event.toString(), 0, 0, Example.FONT12, paint); - canvas.translate(0, -metrics.getCapHeight() - 8 * scale); - } - canvas.restore(); - } - } -} \ No newline at end of file diff --git a/examples/java/PanelLegend.java b/examples/java/PanelLegend.java deleted file mode 100644 index 49345b43..00000000 --- a/examples/java/PanelLegend.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.*; -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelLegend extends Panel { - public Map shortcuts = new TreeMap<>(); - - public PanelLegend(Window window) { - super(window); - shortcuts.put("L", "Toggle Layer"); - shortcuts.put("P", "Pause"); - shortcuts.put("N", "New Window"); - shortcuts.put("W", "Close Window"); - shortcuts.put("F", "Clipboard formats"); - shortcuts.put("O", "Opacity"); - shortcuts.put("1", "Minimize"); - shortcuts.put("2", "Maximize"); - shortcuts.put("3", "Restore"); - shortcuts.put("4", "Hide"); - shortcuts.put("5", "Set position"); - shortcuts.put("6", "Set size"); - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - var modifier = Platform.CURRENT == Platform.MACOS ? "⌘ " : "Ctrl "; - var padding = (int) 8 * scale; - - try (var bg = new Paint().setColor(0x40000000); - var fg = new Paint().setColor(0xFFFFFFFF);) - { - var metrics = Example.FONT12.getMetrics(); - var capHeight = metrics.getCapHeight(); - float bgWidth = 0; - try (var line = TextLine.make(modifier + "W", Example.FONT12);) { - bgWidth = line.getWidth() + 2 * padding; - } - float bgHeight = capHeight + padding * 2; - float x = Example.PADDING; - float y = Example.PADDING; - - for (var key: shortcuts.keySet()) { - try (var line = TextLine.make(modifier + key, Example.FONT12);) { - canvas.drawRRect(RRect.makeXYWH(x, y, bgWidth, bgHeight, 4 * scale), bg); - canvas.drawTextLine(line, x + (bgWidth - line.getWidth()) / 2, y + padding + capHeight, fg); - } - - var value = shortcuts.get(key); - try (var line = TextLine.make(value, Example.FONT12);) { - canvas.drawTextLine(line, x + bgWidth + padding, y + padding + capHeight, fg); - } - - y += padding * 2 + capHeight + 1 * scale; - } - } - } -} \ No newline at end of file diff --git a/examples/java/PanelMouse.java b/examples/java/PanelMouse.java deleted file mode 100644 index 01b14875..00000000 --- a/examples/java/PanelMouse.java +++ /dev/null @@ -1,115 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelMouse extends Panel { - public EventMouseMove lastMouseMove = null; - public Point scroll = new Point(0, 0); - public List buttons = Collections.synchronizedList(new ArrayList()); - public boolean lastInside = false; - - public PanelMouse(Window window) { - super(window); - } - - @Override - public void accept(Event e) { - if (e instanceof EventMouseMove ee) { - lastMouseMove = ee; - var inside = contains(ee.getX(), ee.getY()); - if (inside || lastInside) { - lastInside = inside; - window.requestFrame(); - } - } else if (e instanceof EventMouseScroll ee) { - scroll = scroll.offset(ee.getDeltaX() * lastScale, ee.getDeltaY() * lastScale); - window.requestFrame(); - } else if (e instanceof EventMouseButton ee) { - var button = ee.getButton(); - if (ee.isPressed() == true) { - if (!buttons.contains(button)) - buttons.add(button); - } else - buttons.remove(button); - window.requestFrame(); - } - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - var capHeight = Example.FONT12.getMetrics().getCapHeight(); - - // position - if (lastInside && lastMouseMove != null) { - try (var paint = new Paint().setColor(0x40FFFFFF)) { - var x = lastMouseMove.getX() - lastX; - var y = lastMouseMove.getY() - lastY; - canvas.drawRect(Rect.makeXYWH(0, y - 1 * scale, width, 2 * scale), paint); - canvas.drawRect(Rect.makeXYWH(x - 1 * scale, 0, 2 * scale, height), paint); - - canvas.save(); - canvas.translate(x + 3 * scale, y - 5 * scale); - canvas.drawString(x + ", " + y, 0, 0, Example.FONT12, paint); - canvas.translate(0, 10 * scale + capHeight); - for (var button: MouseButton.values()) - if (lastMouseMove.isButtonDown(button)) { - canvas.drawString(capitalize(button.toString()), 0, 0, Example.FONT12, paint); - canvas.translate(0, 2 * capHeight); - } - for (var modifier: KeyModifier.values()) - if (lastMouseMove.isModifierDown(modifier)) { - canvas.drawString(capitalize(modifier.toString()), 0, 0, Example.FONT12, paint); - canvas.translate(0, 2 * capHeight); - } - canvas.restore(); - } - } - - // scroll - int halfWidth = width / 2; - int halfHeight = height / 2; - int step = (int) (25 * scale); - int halfStep = step / 2; - - try (var paint = new Paint().setMode(PaintMode.STROKE).setStrokeWidth(2 * scale).setColor(0x40FFFFFF)) { - for (int x = (int) Math.ceil(-scroll.getX() / step - 1) * step; x + scroll.getX() < width; x += step) { - canvas.drawLine(scroll.getX() + x, 0, scroll.getX() + x, 5 * scale, paint); - canvas.drawLine(scroll.getX() + x + halfStep, 0, scroll.getX() + x + halfStep, 8 * scale, paint); - } - - for (int y = (int) Math.ceil(-scroll.getY() / step - 1) * step; y + scroll.getY() < height; y += step) { - canvas.drawLine(0, scroll.getY() + y, 5 * scale, scroll.getY() + y, paint); - canvas.drawLine(0, scroll.getY() + y + halfStep, 8 * scale, scroll.getY() + y + halfStep, paint); - } - } - - // buttons - - var lines = Arrays.stream(MouseButton._values).map((button) -> TextLine.make(capitalize(button.toString()), Example.FONT12)).collect(Collectors.toList()); - try (var paint = new Paint();) { - - - var padding = (int) 8 * scale; - int y = Example.PADDING; - for (var button: MouseButton._values) { - try (var line = TextLine.make(capitalize(button.toString()), Example.FONT12); ) { - var pressed = buttons.contains(button); - if (pressed) { - paint.setColor(0x40000000); - canvas.drawRRect(RRect.makeXYWH(Example.PADDING, y, line.getWidth() + 2 * padding, capHeight + 2 * padding, 4 * scale), paint); - } - - paint.setColor(pressed ? 0xFFFFFFFF : 0x40FFFFFF); - canvas.drawTextLine(line, Example.PADDING + padding, y + capHeight + padding, paint); - - y += capHeight + 2 * padding + 1 * scale; - } - } - } - } -} diff --git a/examples/java/PanelMouseCursors.java b/examples/java/PanelMouseCursors.java deleted file mode 100644 index 9960b5af..00000000 --- a/examples/java/PanelMouseCursors.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelMouseCursors extends Panel { - public EventMouseMove lastMove = new EventMouseMove(0, 0, 0, 0); - public Map rects = new HashMap<>(); - public boolean lastInside = false; - - public PanelMouseCursors(Window window) { - super(window); - } - - @Override - public void accept(Event e) { - if (e instanceof EventMouseMove ee) { - lastMove = ee; - var inside = contains(ee.getX(), ee.getY()); - if (inside || lastInside) { - lastInside = inside; - var relX = lastMove.getX() - lastX; - var relY = lastMove.getY() - lastY; - - for (var rect: rects.keySet()) { - if (rect.contains(relX, relY)) { - var cursor = rects.get(rect); - if (window._lastCursor != cursor) - window.requestFrame(); - window.setMouseCursor(cursor); - return; - } - } - if (window._lastCursor != MouseCursor.ARROW) - window.requestFrame(); - window.setMouseCursor(MouseCursor.ARROW); - } - } - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - try (var fg = new Paint().setColor(0x40FFFFFF); - var hl = new Paint().setColor(0xFFFFFFFF); - var bg = new Paint().setColor(0x40000000);) - { - var capHeight = (int) Example.FONT12.getMetrics().getCapHeight(); - var padding = (int) (8 * scale); - var x = Example.PADDING; - var y = Example.PADDING; - rects.clear(); - for (var cursor: MouseCursor._values) { - try (var line = TextLine.make(capitalize(cursor.toString()), Example.FONT12);) { - if (y + capHeight + 2 * padding > height - Example.PADDING) { - x += width / 2 - Example.PADDING / 2; - y = Example.PADDING; - } - var relX = lastMove.getX() - lastX; - var relY = lastMove.getY() - lastY; - var bounds = UIRect.makeXYWH(x, y, (int) line.getWidth() + 2 * padding, capHeight + 2 * padding); - rects.put(bounds, cursor); - if (bounds.contains(relX, relY)) { - canvas.drawRRect(RRect.makeLTRB(bounds.getLeft(), bounds.getTop(), bounds.getRight(), bounds.getBottom(), 4 * scale), bg); - canvas.drawTextLine(line, x + padding, y + padding + capHeight, hl); - } else { - canvas.drawTextLine(line, x + padding, y + padding + capHeight, fg); - } - - y += capHeight + 2 * padding + 1; - } - } - } - } -} diff --git a/examples/java/PanelRendering.java b/examples/java/PanelRendering.java deleted file mode 100644 index 39e50402..00000000 --- a/examples/java/PanelRendering.java +++ /dev/null @@ -1,214 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.*; -import java.util.concurrent.*; -import java.util.function.*; -import java.util.stream.*; - -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelRendering extends Panel { - public boolean vsyncColor = false; - public Map counters = new ConcurrentHashMap<>(); - - public long t0 = System.nanoTime(); - public double[] times = new double[180]; - public int timesIdx = 0; - - public Map layersStatus = new HashMap<>(); - public String[] layers; - public int layerIdx = 0; - public SkijaLayer layer; - - // Layer status displayed on the right side from the layer name - public static final String CHECKED = "+"; - public static final String FAILED = "x"; - public static final String UNKNOWN = "?"; - - public PanelRendering(Window window) { - super(window); - - if (Platform.CURRENT == Platform.MACOS) - layers = new String[] { "SkijaLayerGL", "macos.SkijaLayerMetal" }; - else if (Platform.CURRENT == Platform.WINDOWS) - layers = new String[] { "SkijaLayerGL", "SkijaLayerRaster", "windows.SkijaLayerD3D12" }; - else - layers = new String[] { "SkijaLayerGL", "SkijaLayerRaster" }; - - for (var layerName: layers) - layersStatus.put(layerName, UNKNOWN); - - changeLayer(); - } - - public void bumpCounter(String reason) { - counters.merge(reason, 1, Integer::sum); - } - - public void changeLayer() { - if (layer != null) { - layer.close(); - layer = null; - } - - int attemptsCount = layers.length; - - while (layer == null && attemptsCount > 0) { - attemptsCount -= 1; - String layerName = layers[layerIdx]; - String className = "io.github.humbleui.jwm.examples." + layerName; - - try { - layer = (SkijaLayer) Example.class.forName(className).getDeclaredConstructor().newInstance(); - layer.attach(window); - } catch (Exception e) { - System.err.println("Failed to create layer " + className); - e.printStackTrace(); - layer = null; - layersStatus.put(layerName, FAILED); // Update layer status - nextLayerIdx(); - } - } - - if (layer == null) - throw new RuntimeException("No available layer to create"); - - layersStatus.put(layers[layerIdx], CHECKED); // Mark layer as checked - layer.reconfigure(); - layer.resize(window.getContentRect().getWidth(), window.getContentRect().getHeight()); - } - - @Override - public void accept(Event e) { - if (e instanceof EventWindowScreenChange) { - layer.reconfigure(); - accept(new EventWindowResize(window.getWindowRect().getWidth(), - window.getWindowRect().getHeight(), - window.getContentRect().getWidth(), - window.getContentRect().getHeight())); - } else if (e instanceof EventWindowResize ee) { - layer.resize(ee.getContentWidth(), ee.getContentHeight()); - } else if (e instanceof EventKey ee && ee.isPressed()) { - Key key = ee.getKey(); - boolean modifier = ee.isModifierDown(Example.MODIFIER); - if (Key.L == key && modifier) { - nextLayerIdx(); - changeLayer(); - } - } else if (e instanceof EventWindowCloseRequest) { - layer.close(); - } - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - try (var paint = new Paint();) { - paint.setColor(0xFFFFFFFF); - var metrics = Example.FONT12.getMetrics(); - - // FPS graph - canvas.save(); - canvas.translate(Example.PADDING, height - Example.PADDING - 32 * scale); - - paint.setColor(0x4033cc33); - canvas.drawRRect(RRect.makeXYWH(0, 0, width - Example.PADDING * 2, 32 * scale, 4 * scale, 4 * scale, 0, 0), paint); - paint.setColor(0xFF33CC33); - for (int i = 0; i < times.length; ++i) { - var idx = (timesIdx + i) % times.length; - canvas.drawRect(Rect.makeXYWH(i * scale, - Math.min(height, (32 - (float) times[idx]) * scale), - 1 * scale, - (float) (times[idx] * scale)), - paint); - } - - paint.setColor(0x20000000); - canvas.drawRect(Rect.makeXYWH(0, (32 - 17) * scale, times.length * scale, 1 * scale), paint); - canvas.drawRect(Rect.makeXYWH(0, (32 - 8) * scale, times.length * scale, 1 * scale), paint); - canvas.restore(); - - canvas.save(); - paint.setColor(0xFFFFFFFF); - - // Layers (also paint layer status on the right side) - try (var shevron = TextLine.make("> ", Example.FONT12);) { - - canvas.translate(Example.PADDING, Example.PADDING - metrics.getAscent()); - for (int i = 0; i < layers.length; ++i) { - if (i == layerIdx) - canvas.drawTextLine(shevron, 0, 0, paint); - - String status = layersStatus.get(layers[i]); - String displayString = layers[i] + " " + layersStatus.get(layers[i]); - - switch (status) { - case FAILED -> - paint.setColor(0xFFFF5252); - case UNKNOWN -> - paint.setColor(0xFFFEC942); - default -> - paint.setColor(0xFF74DD1B); - } - - canvas.drawString(displayString, shevron.getWidth(), 0, Example.FONT12, paint); - canvas.translate(0, metrics.getHeight()); - } - } - - paint.setColor(0xFFFFFFFF); - - // Paint counters - for (var entry: counters.entrySet()) { - canvas.drawString(entry.getKey() + ": " + entry.getValue(), 0, 0, Example.FONT12, paint); - canvas.translate(0, metrics.getHeight()); - } - - int len = (int) ((width - Example.PADDING * 2) / scale); - if (len > 0 && times.length != len) { - times = new double[len]; - timesIdx = 0; - } - - long t1 = System.nanoTime(); - times[timesIdx] = (t1 - t0) / 1000000.0; - t0 = t1; - timesIdx = (timesIdx + 1) % times.length; - int frames = 0; - double time = 0; - for (int i = 0; i < times.length; ++i) { - var idx = (timesIdx - i + times.length) % times.length; - if (times[idx] > 0) { - time += times[idx]; - frames++; - } - if (time > 1000) - break; - } - String fps = String.format("%.01f", (frames / time * 1000)); - canvas.drawString("FPS: " + fps, 0, 0, Example.FONT12, paint); - - // VSync - try (var line = TextLine.make("VSYNC", Example.FONT24); ) { - var capHeight = Example.FONT24.getMetrics().getCapHeight(); - paint.setColor(0xFFE0E0E0); - canvas.drawRRect(RRect.makeXYWH(width - line.getWidth() - 3 * Example.PADDING, - Example.PADDING, - line.getWidth() + 2 * Example.PADDING, - capHeight + 2 * Example.PADDING, - 4 * scale), paint); - - paint.setColor(vsyncColor ? 0xFFEF8784 : 0xFFA1FCFE); - canvas.drawTextLine(line, width - line.getWidth() - 2 * Example.PADDING, capHeight + 2 * Example.PADDING, paint); - vsyncColor = !vsyncColor; - } - - canvas.restore(); - } - } - - private int nextLayerIdx() { - layerIdx = (layerIdx + 1) % layers.length; - return layerIdx; - } -} diff --git a/examples/java/PanelScreens.java b/examples/java/PanelScreens.java deleted file mode 100644 index d36c50d2..00000000 --- a/examples/java/PanelScreens.java +++ /dev/null @@ -1,109 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.function.*; -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelScreens extends Panel { - public EventWindowResize lastResize = new EventWindowResize(0, 0, 0, 0); - public EventWindowMove lastMove = new EventWindowMove(0, 0); - public Paint stroke = new Paint().setMode(PaintMode.STROKE).setColor(0x80FFFFFF); - public Paint fill = new Paint().setColor(0x20FFFFFF); - public Paint white = new Paint().setColor(0xFFFFFFFF); - public int idx = 0; - - public PanelScreens(Window window) { - super(window); - } - - @Override - public void accept(Event e) { - float scale = window.getScreen().getScale(); - if (e instanceof EventKey eventKey) { - if (eventKey.isPressed() == true && eventKey.isModifierDown(Example.MODIFIER)) { - switch (eventKey.getKey()) { - case DIGIT1 -> - window.minimize(); - case DIGIT2 -> - window.maximize(); - case DIGIT3 -> - window.restore(); - case DIGIT4 -> { - window.setVisible(false); - } - case DIGIT5 -> { - Screen[] screens = App.getScreens(); - idx = (idx + 1) % (screens.length * 5); - UIRect bounds = screens[idx / 5].getWorkArea(); - switch (idx % 5) { - case 0 -> window.setWindowPosition(bounds.getLeft() + bounds.getWidth() / 4, bounds.getTop() + bounds.getHeight() / 4); - case 1 -> window.setWindowPosition(bounds.getLeft(), bounds.getTop()); - case 2 -> window.setWindowPosition(bounds.getLeft() + bounds.getWidth() / 2, bounds.getTop()); - case 3 -> window.setWindowPosition(bounds.getLeft(), bounds.getTop() + bounds.getHeight() / 2); - case 4 -> window.setWindowPosition(bounds.getLeft() + bounds.getWidth() / 2, bounds.getTop() + bounds.getHeight() / 2); - } - } - case DIGIT6 -> { - UIRect bounds = window.getScreen().getWorkArea(); - int width = (int) (((int) ((bounds.getWidth() / 2) / scale)) * scale); - int height = (int) (((int) ((bounds.getHeight() / 2) / scale)) * scale); - if (window.getWindowRect().getWidth() != width || window.getWindowRect().getHeight() != height) { - window.setWindowSize(width, height); - } else { - window.setContentSize(width, height); - } - } - } - } - } if (e instanceof EventWindowResize ee) { - lastResize = ee; - window.requestFrame(); - } else if (e instanceof EventWindowMove ee) { - lastMove = ee; - window.requestFrame(); - } - } - - public void drawRect(Canvas canvas, UIRect rect) { - canvas.drawRect(Rect.makeXYWH(rect.getLeft(), rect.getTop(), rect.getWidth(), rect.getHeight()), fill); - canvas.drawRect(Rect.makeXYWH(rect.getLeft(), rect.getTop(), rect.getWidth(), rect.getHeight()), stroke); - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - float minX = 0, minY = 0, maxX = 0, maxY = 0; - for (var screen: App.getScreens()) { - var bounds = screen.getBounds(); - minX = Math.min(minX, bounds.getLeft()); - minY = Math.min(minY, bounds.getTop()); - maxX = Math.max(maxX, bounds.getRight()); - maxY = Math.max(maxY, bounds.getBottom()); - } - - canvas.save(); - float scale2 = Math.min((width - Example.PADDING * 2) / (maxX - minX), - (height - Example.PADDING * 2) / (maxY - minY)); - canvas.translate(Example.PADDING, Example.PADDING); - canvas.scale(scale2, scale2); - canvas.translate(-minX, -minY); - stroke.setStrokeWidth(1 * scale / scale2); - for (var screen: App.getScreens()) { - stroke.setColor(screen.isPrimary() ? 0x80CC3333 : 0x80FFFFFF); - drawRect(canvas, screen.getBounds()); - drawRect(canvas, screen.getWorkArea()); - } - UIRect windowRect = window.getWindowRect(); - drawRect(canvas, windowRect); - drawRect(canvas, window.getContentRectAbsolute()); - stroke.setColor(0x80CC3333); - drawRect(canvas, UIRect.makeXYWH(lastMove.getWindowLeft(), lastMove.getWindowTop(), lastResize.getWindowWidth(), lastResize.getWindowHeight())); - canvas.restore(); - - var contentRect = window.getContentRect(); - var capHeight = Example.FONT12.getMetrics().getCapHeight(); - var padding = (int) 8 * scale; - canvas.drawString("Position: " + windowRect.getLeft() + ", " + windowRect.getTop(), Example.PADDING, Example.PADDING + capHeight, Example.FONT12, white); - canvas.drawString("Window size: " + windowRect.getWidth() + ", " + windowRect.getHeight(), Example.PADDING, Example.PADDING + capHeight * 2 + padding, Example.FONT12, white); - canvas.drawString("Content size: " + contentRect.getWidth() + ", " + contentRect.getHeight(), Example.PADDING, Example.PADDING + capHeight * 3 + padding * 2, Example.FONT12, white); - } -} \ No newline at end of file diff --git a/examples/java/PanelTextInput.java b/examples/java/PanelTextInput.java deleted file mode 100644 index a46be590..00000000 --- a/examples/java/PanelTextInput.java +++ /dev/null @@ -1,200 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import java.util.*; -import java.util.function.*; -import io.github.humbleui.jwm.*; -import org.jetbrains.skija.*; - -public class PanelTextInput extends Panel implements TextInputClient { - public List keys = Collections.synchronizedList(new ArrayList()); - - public String text = ""; - public EventTextInputMarked lastMarked = null; - public int lastInputHeight = 0; - public boolean cursorDraw = true; - public TimerTask timerTask; - public static Timer timer = new Timer(true); - public boolean _wasInside = false; - - public PanelTextInput(Window window) { - super(window); - this.drawBG = false; - window.setTextInputEnabled(true); - window.setTextInputClient(this); - timerTask = new TimerTask() { - public void run() { - cursorDraw = !cursorDraw; - App.runOnUIThread(() -> { if (!window._closed) window.requestFrame(); }); - } - }; - timer.schedule(timerTask, 0, 500); - } - - @Override - public void accept(Event e) { - if (e instanceof EventTextInput ee) { - text += ee.getText(); - lastMarked = null; - window.requestFrame(); - } else if (e instanceof EventTextInputMarked ee) { - lastMarked = ee; - window.requestFrame(); - } else if (e instanceof EventMouseButton ee) { - window.unmarkText(); - window.requestFrame(); - } else if (e instanceof EventMouseMove ee) { - boolean isInside = contains(ee.getX(), ee.getY()); - if (!_wasInside && isInside) - window.setMouseCursor(MouseCursor.IBEAM); - if (_wasInside && !isInside) - window.setMouseCursor(MouseCursor.ARROW); - _wasInside = isInside; - } else if (e instanceof EventKey ee) { - Key key = ee.getKey(); - KeyLocation loc = ee.getLocation(); - - var keyText = loc == KeyLocation.DEFAULT ? key.getName() : capitalize(loc.toString()) + " " + key.getName(); - if (ee.isPressed() && !keys.contains(keyText)) - keys.add(keyText); - else if (!ee.isPressed()) - keys.remove(keyText); - - if (ee.isPressed()) { - switch (key) { - case ENTER -> text += "\n"; - case BACKSPACE -> { - if (lastMarked == null && text.length() > 0) { - try (var iter = BreakIterator.makeCharacterInstance();) { - iter.setText(text); - text = text.substring(0, iter.preceding(text.length())); - } - } - } - } - - if (ee.isModifierDown(Example.MODIFIER)) { - switch (key) { - case C -> - Clipboard.set(ClipboardEntry.makePlainText(text)); - case V -> { - window.unmarkText(); - ClipboardEntry entry = Clipboard.get(ClipboardFormat.TEXT); - if (entry != null) - text = entry.getString(); - } - case F -> { - ClipboardFormat[] formats = Clipboard.getFormats(); - if (formats != null) - for (ClipboardFormat format: formats) - System.out.println(format.getFormatId()); - } - } - } - } - window.requestFrame(); - } - } - - @Override - public void paintImpl(Canvas canvas, int width, int height, float scale) { - var capHeight = Example.FONT12.getMetrics().getCapHeight(); - var padding = (int) 8 * scale; - lastInputHeight = (int) (height - capHeight - 3 * padding); - - // keys - try (var bg = new Paint().setColor(0x40000000); - var fg = new Paint().setColor(0xFFFFFFFF); ) - { - var x = 0; - var y = lastInputHeight + padding; - for (var key: keys) { - try (var line = TextLine.make(key, Example.FONT12); ) { - canvas.drawRRect(RRect.makeXYWH(x, y, line.getWidth() + 2 * padding, capHeight + 2 * padding, 4 * scale), bg); - canvas.drawTextLine(line, x + padding, y + capHeight + padding, fg); - x += line.getWidth() + 3 * padding; - } - } - } - - // text input - try (var paint = new Paint(); ) { - canvas.save(); - paint.setColor(0xFFFFFFFF); - canvas.drawRRect(RRect.makeXYWH(0, 0, width, lastInputHeight, 4 * scale), paint); - - Font font = Example.FONT24; - FontMetrics metrics = font.getMetrics(); - - var y = lastInputHeight - Example.PADDING - metrics.getDescent(); - var lines = text.split("\n", -1); - var i = lines.length - 1; - - // Last line - try (var line = TextLine.make(lines[i], font)) { - canvas.save(); - canvas.translate(Example.PADDING, y); - paint.setColor(0xFF000000); - canvas.drawTextLine(line, 0, 0, paint); - canvas.translate(line.getWidth(), 0); - - // marked text - paint.setColor(0xFF0087D8); - if (lastMarked != null) { - - try (var marked = TextLine.make(lastMarked.getText(), font)) { - canvas.drawTextLine(marked, 0, 0, paint); - var start = marked.getCoordAtOffset(lastMarked.getSelectionStart()); - var end = marked.getCoordAtOffset(lastMarked.getSelectionEnd()); - if (0 < start - 1 * scale) - canvas.drawRect(Rect.makeLTRB(0, 2 * scale, start - 1 * scale, 4 * scale), paint); - if (start + 1 * scale < end - 1 * scale) - canvas.drawRect(Rect.makeLTRB(start + 1 * scale, 2 * scale, end - 1 * scale, 6 * scale), paint); - if (end + 1 * scale < marked.getWidth()) - canvas.drawRect(Rect.makeLTRB(end + 1 * scale, 2 * scale, marked.getWidth(), 4 * scale), paint); - - canvas.translate(marked.getWidth(), 0); - } - } - - // cursor (cursorDraw used for blink animation) - if (cursorDraw) - canvas.drawRect(Rect.makeXYWH(0, metrics.getAscent(), 2 * scale, metrics.getHeight()), paint); - - canvas.restore(); - } - - paint.setColor(0xFF000000); - for (i = lines.length - 2; i >= 0; i--) { - y -= metrics.getHeight(); - try (var line = TextLine.make(lines[i], font)) { - canvas.drawTextLine(line, Example.PADDING, y, paint); - } - } - canvas.restore(); - } - } - - @Override - public UIRect getRectForMarkedRange(int selectionStart, int selectionEnd) { - Font font = Example.FONT24; - FontMetrics metrics = font.getMetrics(); - - var lines = text.split("\n", -1); - try (var line = TextLine.make(lines[lines.length - 1], font);) { - var left = lastX + Example.PADDING + line.getWidth(); - var top = lastY + lastInputHeight - Example.PADDING - metrics.getHeight(); - - if (lastMarked != null) { - try (var marked = TextLine.make(lastMarked.getText(), font)) { - var start = marked.getCoordAtOffset(selectionStart); - var end = marked.getCoordAtOffset(selectionEnd); - return UIRect.makeXYWH((int) (left + start), - (int) top, - (int) (end - start), - (int) metrics.getHeight()); - } - } else - return UIRect.makeXYWH((int) left, (int) top, 0, (int) metrics.getHeight()); - } - } -} \ No newline at end of file diff --git a/examples/java/SkijaLayer.java b/examples/java/SkijaLayer.java deleted file mode 100644 index 38a2a801..00000000 --- a/examples/java/SkijaLayer.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import io.github.humbleui.jwm.Layer; -import org.jetbrains.skija.Canvas; - -public interface SkijaLayer extends Layer { - Canvas beforePaint(); - void afterPaint(); -} \ No newline at end of file diff --git a/examples/java/SkijaLayerGL.java b/examples/java/SkijaLayerGL.java deleted file mode 100644 index f737e363..00000000 --- a/examples/java/SkijaLayerGL.java +++ /dev/null @@ -1,86 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import io.github.humbleui.jwm.LayerGL; -import org.jetbrains.skija.*; - -public class SkijaLayerGL extends LayerGL implements SkijaLayer { - public DirectContext _directContext; - public BackendRenderTarget _renderTarget; - public Surface _surface; - - @Override - public Canvas beforePaint() { - makeCurrent(); - - if (_directContext == null) - _directContext = DirectContext.makeGL(); - - if (_renderTarget == null) - _renderTarget = BackendRenderTarget.makeGL( - getWidth(), - getHeight(), - /*samples*/0, - /*stencil*/8, - /*fbId*/0, - FramebufferFormat.GR_GL_RGBA8); - - if (_surface == null) - _surface = Surface.makeFromBackendRenderTarget( - _directContext, - _renderTarget, - SurfaceOrigin.BOTTOM_LEFT, - SurfaceColorFormat.RGBA_8888, - ColorSpace.getSRGB(), // TODO load monitor profile - new SurfaceProps(PixelGeometry.RGB_H)); - - return _surface.getCanvas(); - } - - @Override - public void afterPaint() { - _surface.flushAndSubmit(); - swapBuffers(); - } - - @Override - public void resize(int width, int height) { - super.resize(width, height); - - if (_surface != null) { - _surface.close(); - _surface = null; - } - - if (_renderTarget != null) { - _renderTarget.close(); - _renderTarget = null; - } - - if (_directContext != null) { - _directContext.abandon(); - _directContext.close(); - _directContext = null; - } - } - - @Override - public void close() { - if (_directContext != null) { - _directContext.abandon(); - _directContext.close(); - _directContext = null; - } - - if (_surface != null) { - _surface.close(); - _surface = null; - } - - if (_renderTarget != null) { - _renderTarget.close(); - _renderTarget = null; - } - - super.close(); - } -} \ No newline at end of file diff --git a/examples/java/SkijaLayerRaster.java b/examples/java/SkijaLayerRaster.java deleted file mode 100644 index a17a5651..00000000 --- a/examples/java/SkijaLayerRaster.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.github.humbleui.jwm.examples; - -import io.github.humbleui.jwm.LayerRaster; -import org.jetbrains.skija.*; - -public class SkijaLayerRaster extends LayerRaster implements SkijaLayer { - public Surface _surface; - - @Override - public Canvas beforePaint() { - if (_surface == null) { - ImageInfo imageInfo = ImageInfo.makeN32Premul(getWidth(), getHeight()); - _surface = Surface.makeRasterDirect(imageInfo, getPixelsPtr(), getRowBytes()); - } - - return _surface.getCanvas(); - } - - @Override - public void afterPaint() { - swapBuffers(); - } - - @Override - public void resize(int width, int height) { - if (_surface != null) { - _surface.close(); - _surface = null; - } - - super.resize(width, height); - } - - @Override - public void close() { - if (_surface != null) { - _surface.close(); - _surface = null; - } - - super.close(); - } -} \ No newline at end of file diff --git a/script/build.py b/script/build.py index f045d2fc..9118de07 100755 --- a/script/build.py +++ b/script/build.py @@ -7,6 +7,7 @@ def build_native(): print('Building ' + target_native + '...') + print(common.system) subprocess.check_call([ "cmake", "-DCMAKE_BUILD_TYPE=Release", @@ -22,17 +23,19 @@ def build_java(): sources = glob.glob('linux/java/**/*.java', recursive=True) + \ glob.glob('macos/java/**/*.java', recursive=True) + \ glob.glob('shared/java/**/*.java', recursive=True) + \ - glob.glob('windows/java/**/*.java', recursive=True) + glob.glob('windows/java/**/*.java', recursive=True) + \ + glob.glob('examples/java/*.java', recursive=True) print('Building java classes...') common.javac(common.deps(), sources, 'target/classes') if __name__ == '__main__': parser = argparse.ArgumentParser() - parser.add_argument('--only', choices = ['native', 'java']) + parser.add_argument('--only', choices = ['native', 'java', 'examples']) (args, _) = parser.parse_known_args() if None == args.only or 'native' == args.only: build_native() if None == args.only or 'java' == args.only: build_java() + sys.exit(0) diff --git a/script/common.py b/script/common.py index bd1809b6..3b71ec97 100755 --- a/script/common.py +++ b/script/common.py @@ -30,7 +30,7 @@ def deps(): fetch_maven('org.jetbrains', 'annotations', '20.1.0'), ] -def javac(classpath, sources, target, release='11', opts=[]): +def javac(classpath, sources, target, release='16', opts=[]): classes = {path.stem: path.stat().st_mtime for path in pathlib.Path(target).rglob('*.class') if '$' not in path.stem} newer = lambda path: path.stem not in classes or path.stat().st_mtime > classes.get(path.stem) new_sources = [path for path in sources if newer(pathlib.Path(path))] diff --git a/script/native_image.py b/script/native_image.py index e8736b09..e49eae3a 100755 --- a/script/native_image.py +++ b/script/native_image.py @@ -9,22 +9,20 @@ def main(): "--create", "--file", "target/jwm.jar", "--main-class", "io.github.humbleui.jwm.examples.Example", - "-C", "macos/target/classes", ".", - "-C", "shared/target/classes", ".", - "-C", "examples/target/classes", ".", - "-C", "/Users/prokopov/ws/skija/shared/target/classes", ".",]) - shutil.copy('macos/build/libjwm_x64.dylib', 'target') - shutil.copy('/Users/prokopov/ws/skija/native/build/libskija_x64.dylib', 'target') + "-C", "target/classes", ".", + # Copy native-image config to JAR: + # https://www.graalvm.org/reference-manual/native-image/BuildConfiguration/#embedding-a-configuration-file + "-C", "deploy", "."]) + shutil.copy('windows/build/jwm_x64.dll', 'target') + #shutil.copy('/Users/prokopov/ws/skija/native/build/libskija_x64.dylib', 'target') os.chdir('target') # https://github.com/cubuspl42/JavaFX-Graal-HelloWorld # https://github.com/maxum2610/HelloJFX-GraalSVM subprocess.check_call([ - '/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/bin/native-image', - '--server-shutdown-all', + 'C:\\GraalVM\\graalvm-ce-java17-21.3.0-dev\\bin\\native-image.cmd', '--no-fallback', '--report-unsupported-elements-at-runtime', - '--enable-all-security-services', '--allow-incomplete-classpath', '-H:+JNI', '-jar', 'jwm.jar'