• Stars
    star
    569
  • Rank 78,314 (Top 2 %)
  • Language
    C++
  • License
    Apache License 2.0
  • Created over 3 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Cross-platform window management and OS integration library for Java

Java Window Management library

Vision

JWM is a cross-platform Java window management and OS integration library.

JWM aims to expose an interface that abstracts over window creation, input handling and OS integration. Itโ€™s planned to support all the primary desktop platforms:

  • Windows
  • macOS
  • X11
  • Wayland

Primary goals:

  • Native JVM API
  • High-quality OS integration (indistinguishable from native apps)
  • Plays well with (but does not require) Skija

Motto: โ€œElectron for JVM, without Chrome and JSโ€

Comparison to other UI/window libraries

Traditionally, Java UIs struggled with high-quality OS integration. JWM plans to bring it to modern standards by implementing those integrations from scratch in modern low-level OS-native APIs. Prior art:

AWT:

  • Bullet-proof, works everywhere
  • Event loop is two-threaded (lags in UI)
  • Dated font management, color management, dpi management
  • No vsync

JavaFX:

  • Fixed threading model
  • Performance is sometimes great, sometimes terrible
  • Even more limited fonts/color/graphics API
  • VSync is weird in multi-monitor case
  • No real extensibility

Winit:

GLFW via LWJGL, SDL2:

  • Game-oriented
  • Bad window management
  • No OS integration
  • Create one window and go full-screen is the main use-case

Electron:

Dependency

Key Value
groupId io.github.humbleui
artifactId jwm
version version

Resources

Status

Alpha. Expect API breakages.

App

Windows macOS X11
start โœ… โœ… โœ…
makeWindow โœ… #121 โœ…
getScreens โœ… โœ… โœ…
getPrimaryScreen โœ… โœ… โœ…
runOnUIThread โœ… โœ… #113
terminate โœ… โœ… โœ…
Show notification โŒ โŒ โŒ

Theme

Windows macOS X11
isHighContrast โœ… โœ… โž–
isDark โœ… โœ… โž–
isInverted #161 โœ… โž–

Window

Windows macOS X11
setEventListener โœ… โœ… โœ…
setTextInputClient โœ… โœ… โœ…
setTextInputEnabled โœ… โŒ โŒ
unmarkText โœ… โŒ โŒ
show โœ… โœ… โœ…
getWindowRect โœ… โœ… โœ…
getContentRect โœ… โœ… โœ…
setWindowPosition โœ… โœ… โœ…
setWindowSize โœ… โœ… โœ…
setContentSize โœ… โœ… โœ…
getScreen โœ… โœ… โœ…
requestFrame โœ… โœ… #113
close โœ… #107 โœ…
minimize โœ… โœ… โœ…
maximize โœ… โœ… โœ…
restore โœ… โœ… โœ…
setTitle โœ… โœ… โœ…
setIcon โœ… โœ… #95
Set system cursor โœ… โœ… #99
Customize titlebar #75 #75 #75
focus โœ… โœ… โŒ
Get ZOrder โŒ โœ… โŒ
Progress Bar โŒ โœ… โŒ
Set custom cursor โŒ โŒ โŒ
openFile โŒ โŒ โŒ
openFolder โŒ โŒ โŒ
Transparency โœ… โŒ โŒ
Toggle Fullscreen โŒ โœ… โœ…
setMinimumSize โŒ โŒ โŒ
setMaximumSize โŒ โŒ โŒ
setResizable โŒ โŒ โŒ

Events

Windows macOS X11
EventFrame โœ… โœ… โœ…
EventKey โœ… โœ… โœ…
EventMouseButton โœ… โœ… โœ…
EventMouseMove โœ… โœ… โœ…
EventMouseScroll #115 โœ… #115
EventTextInput โœ… #105 โœ…
EventTextInputMarked โœ… โœ… โœ…
EventWindowCloseRequest โœ… โœ… โœ…
EventWindowMove โœ… #116 โœ…
EventWindowResize โœ… โœ… โœ…
EventWindowMinimize โœ… โœ… #96
EventWindowMaximize โœ… โœ… #96
EventWindowRestore โœ… โœ… #96
EventWindowVisible #140 #140 #140
EventWindowScreenChange #117 #117 #117
EventWindowFocusIn โœ… โœ… โœ…
EventWindowFocusOut โœ… โœ… โœ…
EventWindowFullScreenEnter โŒ โœ… โŒ
EventWindowFullScreenExit โŒ โœ… โŒ
Drag & Drop โŒ โŒ โŒ
Touch events โŒ #249 โŒ
Theme Changed โŒ โŒ โŒ

Screen

Windows macOS X11
id โœ… โœ… โœ…
isPrimary โœ… โœ… โœ…
bounds โœ… โœ… โœ…
scale โœ… โœ… โœ…
workArea โœ… โœ… #119
colorSpace #122 #122 #122

Clipboard

Windows macOS X11
set โœ… #51 โœ…
get โœ… #51 โœ…
getFormats โœ… #51 โœ…
clear โœ… #51 โœ…
registerFormat โœ… #51 โœ…

Layers

Windows macOS X11
Raster โœ… #81 โœ…
OpenGL โœ… โœ… โœ…
DirectX 11 โŒ โž– โž–
DirectX 12 โœ… โž– โž–
Metal โž– โœ… โž–
Vulkan โŒ โž– โŒ

Packaging

Windows macOS X11
Run on GraalVM โŒ โŒ โŒ
App package โŒ โŒ โŒ

Building from source

Prerequisites:

  • Shared: Git, CMake(3.11+), Ninja, C++ compiler, JDK 11+, $JAVA_HOME, Python 3
  • Windows 10: Microsoft Visual C++ (MSVC), x64 Native Tools Command Prompt for VS
  • Ubuntu 20.04: libxcomposite-dev libxrandr-dev libgl1-mesa-dev libxi-dev libxcursor-dev

Run:

./script/build.py

Run examples:

./script/run.py

Run examples without building (use version from the table above):

./script/run.py --jwm-version <version>

Contributing

PRs & issue reports are welcome!

Please read Conventions first.

If you are looking where to start, thereโ€™s a label: Good first issue.

Issues labeled โ€œDesignโ€ and โ€œNot sureโ€ require prior discussionโ€”leave a comment with your ideas!

Contributors

Development sponsored by: