TL;DR Ultimately we might need the ability to have...
# compose-desktop
t
TL;DR Ultimately we might need the ability to have the client app specify a look and feel Currently writing an article called Musings on window decorations, as I am still on my mission to get complete Dark Mode into my Compose for Desktop app. 😂 To sort of whet your appetite please look at the short clip. Yes, it's the Swing Cross Platform look and feel, because we need the ability to have Swing paint the window decorations and neither the Windows Look and Feel nor the macOS Look and feel Swing implementations allow this. I will be detailing more regarding code and maybe a thing we JB might need to change in Compose. To start with, just a few lines of code: In `main()`:
Copy code
invokeLater {
    JFrame.setDefaultLookAndFeelDecorated(true)
and later in a composable:
Copy code
val window = AppManager.windows.first().window
getDefaults()["activeCaption"] =
        ColorUIResource(colors.background.toArgb())
getDefaults()["activeCaptionText"] =
        ColorUIResource(colors.primary.toArgb())
window.rootPane.windowDecorationStyle = JRootPane.FRAME
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
SwingUtilities.updateComponentTreeUI(window.rootPane)
Please note that I need to set the look and feel, because deep inside Compose (
org.jetbrains.skiko.Library
) it apparently (decompiled code) is initialized as:
Copy code
private final void miscSystemInit() {
   System.setProperty("sun.awt.noerasebackground", "true");
   System.setProperty("skija.staticLoad", "false");

   try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      System.setProperty("apple.laf.useScreenMenuBar", "true");
   } catch (UnsupportedOperationException var2) {
   }

}
The best thing would be to have a Swing Look and Feel that fits the Material Design look alike, at least for window decoration and menubars inside a window. And we might need the ability to have the client app specify a look and feel and pass it there...
💯 2
❤️ 2
If someone is interested, here is the article I have been referring to. https://dev.to/tkuenneth/musings-about-window-decorations-2fe
k
Longer term I plan to provide support in Aurora to play nice with Radiance for Swing components for seamless look across the two UI toolkits.
❤️ 1
And of course they definitely need to provide a way to set a custom look and feel. They'll need it themselves if they want to use Compose widgets alongside their existing UI in IDEA products that are skinned with their own Darcula laf.
👍 1
b
Any plans on Linux/Gnome support for aurora?
k
Aurora should work everywhere where Compose Desktop is available. Are you seeing any issues?
b
Misphrased myself. I've meant to ask if aurora will support gnome look and feel
k
No plans at all to support the "native" platform look on any platform in Aurora.
t
@Kirill Grouchnikov Thanks for the awesome work you are doing with Aurora. Regarding a laf provided by JB you are definitely right in terms of Darcula. Though my personal wish would be a laf that picks up Material Design to make the apps look really consistent. Still, not too sure if this will happen. 😀
k
Assuming that longer term JB is planning to start using Compose "things" inside their line of IDEs, their primary focus in the interop area will probably be on making a set of components that seamlessly integrate with their existing Swing components - which are a mix of a custom Darcula look-and-feel on top of the core Swing widgets and custom Swing components written from scratch. For that they would definitely need to provide a complete support for keyboard based interaction (focus traversal, key accelerators, etc). So I'm pretty optimistic in that area.
👍 1
Which, specifically for me with Aurora, means that I'm probably getting most of that for "free" from the underlying Compose Desktop layer of modifiers
👍 1
As for "native" look-and-feels on Windows, Mac and Linux platforms, I'm quite certain that's not going to happen unless somebody picks up that kind of integration with native / platform specific rendering APIs (instead of going through Skija). In the olden days, Sun did that switch on Windows, and Apple provided that for Mac. But then it was semi-abandoned, and it's quite a sad state of affairs in general for the "system" Swing LAF.
And as the explosion of web based interfaces has shown, native "fidelity" does not matter as much as some developers think
t
Agreed. Exciting times ahead of us. Frankly, wouldn't have expected this. 😀 Regarding native fidelity. I would hope that we can distill the benefits of the platform as much as we do on mobile.
What I mean by this is for example drag and drop crossing app boundaries. Besides tablets not important on mobile but IMHO vital on the desktop.
k
Definitely. We need the right integration points, like the system level menu on mac, window-level gestures and tiling, full drag and drop support, using native fonts, etc.
❤️ 1
It gets tricky, like who is in charge of providing the right platform-consistent keyboard shortcuts for text areas, for example. See https://github.com/openjdk/jdk/blob/master/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java which defines the Aqua / macOS bindings. And these are different on Windows and Linux flavors. I wouldn't want each design "system" (Material, Aurora, Darcula, etc) to define their own key bindings. That should be somehow provided by the underlying layers.
I've been struggling with these integration points in Radiance for a while now since Swing has effectively been sunset in the last 10-ish years. I think it's the same for JB and their own JBR fixes. Which is why I'm pretty hopeful about them doing the right thing for Compose Desktop in this area, as they absolutely need it if they are planning to start using Compose in their own IDEs.
👍 1
t
Excellent point. As you said, this is where the hard work will be. I sincerely hope we get past "I can do desktop, too".
👍 1
k
https://github.com/atarw/material-ui-swing might be of interest. Not sure how closely it implements the spec
❤️ 1
t
Awesome, didn't know this. Thanks. 👍