Giter Site home page Giter Site logo

jetbrains / compose-jb Goto Github PK

View Code? Open in Web Editor NEW
14.5K 204.0 1.0K 252.16 MB

Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.

Home Page: https://jetbrains.com/lp/compose-multiplatform

License: Apache License 2.0

Kotlin 98.21% Shell 0.69% Dockerfile 0.27% PowerShell 0.10% Groovy 0.08% HTML 0.07% JavaScript 0.28% Ruby 0.02% Swift 0.16% Java 0.11%
kotlin ui multiplatform desktop swing awt gui compose android javascript reactive declarative-ui ios wasm web webassembly

compose-jb's Introduction

official project Latest release Latest build

Compose Multiplatform

Compose Multiplatform is a declarative framework for sharing UIs across multiple platforms with Kotlin. It is based on Jetpack Compose and developed by JetBrains and open-source contributors.

You can choose the platforms across which to share your UIs using Compose Multiplatform:

For example, you can share UIs between iOS and Android or Windows and MacOS.

Shared UIs of the iOS, Android, desktop, and web apps

iOS

iOS support is in Alpha. It may change incompatibly and require manual migration in the future. We would appreciate your feedback on it in the public Slack channel #compose-ios. If you face any issues, please report them on GitHub.

Compose Multiplatform shares most of its API with Jetpack Compose, the Android UI framework developed by Google. You can use the same APIs to build user interfaces for both Android and iOS.

Since Compose is built on top of Kotlin Multiplatform, you can easily access native APIs, such as the Camera API, and embed complex native UI views, such as MKMapView.

Get started with Compose Multiplatform

Android

When Android is one of your targets, you can get the same experience for Android as if you were developing an Android app using Jetpack Compose.

Get started with Compose Multiplatform

Desktop

Compose Multiplatform targets the JVM and supports high-performance hardware-accelerated UI rendering on all major desktop platforms โ€“ macOS, Windows, and Linux.

It has desktop extensions for menus, keyboard shortcuts, window manipulation, and notification management.

Get started with Compose Multiplatform

We would appreciate your feedback on Compose Multiplatform in the public Slack channel #compose.

Web

Web support is Experimental and may be changed at any time. Use it only for evaluation purposes. We would appreciate your feedback on it in the public Slack channel #compose-web. If you face any issues, please report them on GitHub.

You can experiment with sharing your mobile or desktop UIs with the web. Compose for Web is based on Kotlin/Wasm, the newest target for Kotlin Multiplatform projects. It allows Kotlin developers to run their code in the browser with all the benefits that WebAssembly has to offer, such as good and predictable performance for your applications.

Get started with Compose for Web

Libraries

Compose HTML

Compose HTML is a library targeting Kotlin/JS that provides Composable building blocks for creating web user interfaces with HTML and CSS.

Note that Compose HTML is not a multiplatform library. It can be used only with Kotlin/JS.

Learn more

compose-jb's People

Contributors

akurasov avatar alexander-gorshenev avatar alexeytsvetkov avatar arkivanov avatar devsrsouza avatar dima-avdeev-jb avatar epabst avatar eymar avatar hfhbd avatar igordmn avatar jimgoog avatar louiscad avatar m-sasha avatar matkovivan avatar mazunin-v-jb avatar olonho avatar pjbooms avatar prepor avatar rsedaikin avatar schahen avatar sebastianaigner avatar sebkur avatar shishkin-pavel avatar skolotsky avatar spvessel avatar terrakok avatar theapache64 avatar thomas-vos avatar veselovalex avatar walingar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

compose-jb's Issues

tutorials/Window_API outdated

The tutorial isn't working anymore with version "0.1.0-build63" .

The constructors/functions of Window and AppManager changed.

Box is also missing "alignment", but that can quickly be replaced with "gravity"

compose desktop `run` task throws NullPointerException with gradle 6.6 or 6.7

Steps to recreate

  1. Open either multiplatform-template or desktop-template projects
  2. Update gradle/wrapper/gradle-wrapper.properties to gradle 6.6, 6.6.1, or 6.7
  3. Run :desktop:run

Error Log:

A problem occurred configuring project ':desktop'.
> Could not create task ':desktop:run'.
   > at index 0
* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':desktop'.
Caused by: org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':desktop:run'.
Caused by: java.lang.NullPointerException: at index 0
	at com.google.common.collect.ObjectArrays.checkElementNotNull(ObjectArrays.java:225)
	at com.google.common.collect.ObjectArrays.checkElementsNotNull(ObjectArrays.java:215)
	at com.google.common.collect.ObjectArrays.checkElementsNotNull(ObjectArrays.java:209)
	at com.google.common.collect.ImmutableList.construct(ImmutableList.java:326)
	at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:243)
	at org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection$UnresolvedItemsCollector.plus(DefaultConfigurableFileCollection.java:409)
	at org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection.from(DefaultConfigurableFileCollection.java:191)
	at org.jetbrains.compose.desktop.application.internal.ConfigureApplicationKt$configureRunTask$1.invoke(configureApplication.kt:159)
	at org.jetbrains.compose.desktop.application.internal.ConfigureApplicationKt$configureRunTask$1.invoke(configureApplication.kt)
	at org.jetbrains.compose.desktop.application.internal.ConfigureApplicationKt$composeTask$$inlined$apply$lambda$3.execute(configureApplication.kt:186)
	at org.jetbrains.compose.desktop.application.internal.ConfigureApplicationKt$composeTask$$inlined$apply$lambda$3.execute(configureApplication.kt)

Regression in Todo example app after multiple Compose updates

There are two issues currently.

Originally the Todo app looked like this:
1

0.1.0-m1-build62 update (3b58367) broke some colors and styles:
2

And the most important is 0.1.0-build113 update (aa2a874). Navigation now does not work, when you click on an item - nothing happens. I tried to debug and found that when the Router applies the new state (with the new child), the view receives old state (with old child).

How to debug the second bug:

  1. Put first breakpoint here
  2. Put second breakpoint here
  3. Click on an item
  4. The first breakpoint will fire and you can observe the new state (it.activeChild ~ Edit)
  5. Continue execution
  6. The second breakpoint will fire and you can observe the old state (state.activeChild ~ Main)

Please let me know if I can help anyhow.

Conflict with kotlinx.serialization

Adding kotlinx.serialization breaks compiler. I've extended app-template sample with the following:

build.gradle.kts:

import org.jetbrains.compose.compose

plugins {
    kotlin("jvm") version "1.4.10"
    kotlin("plugin.serialization") version "1.4.10"
    id("org.jetbrains.compose") version "0.1.0-m1-build57"
    application
}

repositories {
    jcenter()
    maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}

dependencies {
    implementation(compose.desktop.all)
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.0")
}

application {
    mainClassName = "MainKt"
}

Test.kt:

import kotlinx.serialization.Serializable

@Serializable
data class Test(val a: Int)

Compiler fails with an exception:

java.lang.IllegalStateException: Backend Internal error: Exception during code generation
File being compiled: /home/kropp/work/compose/app-template/src/main/kotlin/Test.kt
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:50)
	at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:239)
	at org.jetbrains.kotlin.backend.jvm.JvmBackendFacade.doGenerateFilesInternal$backend_jvm(JvmBackendFacade.kt:142)
	at org.jetbrains.kotlin.backend.jvm.JvmBackendFacade.doGenerateFilesInternal$backend_jvm$default(JvmBackendFacade.kt:108)
	at org.jetbrains.kotlin.backend.jvm.JvmBackendFacade.doGenerateFiles(JvmBackendFacade.kt:95)
	at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.generateModule(JvmIrCodegenFactory.kt:40)
	at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:35)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.generate(KotlinToJVMBytecodeCompiler.kt:616)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:203)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:164)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:51)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:86)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:346)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:102)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:240)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:90)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:601)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:93)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1633)
	at jdk.internal.reflect.GeneratedMethodAccessor189.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.RuntimeException: Exception while generating code for:
CONSTRUCTOR visibility:public <> (seen1:kotlin.Int, a:kotlin.Int, serializationConstructorMarker:kotlinx.serialization.internal.SerializationConstructorMarker?) returnType:<root>.Test
  annotations:
    Deprecated(message = 'This synthesized declaration should not be used directly', replaceWith = ReplaceWith(expression = '', imports = []), level = GET_ENUM 'ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB name:HIDDEN' type=kotlin.DeprecationLevel)
  VALUE_PARAMETER name:seen1 index:0 type:kotlin.Int
  VALUE_PARAMETER name:a index:1 type:kotlin.Int
  VALUE_PARAMETER name:serializationConstructorMarker index:2 type:kotlinx.serialization.internal.SerializationConstructorMarker?

	at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:50)
	at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generateMethodNode(ClassCodegen.kt:268)
	at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generateMethod(ClassCodegen.kt:285)
	at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generate(ClassCodegen.kt:123)
	at org.jetbrains.kotlin.backend.jvm.JvmBackendFacade.doGenerateFilesInternal$backend_jvm(JvmBackendFacade.kt:139)
	... 34 more
Caused by: java.lang.NullPointerException
	at org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen.generate(ExpressionCodegen.kt:199)
	at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.doGenerate(FunctionCodegen.kt:105)
	at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:48)
	... 38 more

TaskBar icon scaling poorly

When setting the icon on the window, the image is scaled very poorly, producing an extremely low resolution taskbar icon.

example:

image

note both the taskbar and the decorator icons are poorly scaled

The actual image file is a 1,000 x 1,000 png.
image

Material AlertDialog is not implemented.

Using the following code throws the NotImplementedError.

AlertDialog(
            onDismissRequest = {
                showDialog.value = false
            },
            confirmButton = {
                Button(onClick = {
                    showDialog.value = false
                }) {
                    Text(text = "OK")
                }
            },
            dismissButton = {
                Button(onClick = {
                    showDialog.value = false
                }) {
                    Text(text = "Cancel")
                }
            },
            title = {
                Text(text = "Alert Dialog")
            },
            text = {
                Text(text = "Compose Desktop")
            },
            shape = RoundedCornerShape(5.dp),
            backgroundColor = MaterialTheme.colors.onPrimary,
        )
kotlin.NotImplementedError: An operation is not implemented: not implemented
	at androidx.compose.ui.window.DesktopDialogKt.ActualDialog(DesktopDialog.kt:28)
	at androidx.compose.ui.window.DialogKt.Dialog(Dialog.kt:42)
	at androidx.compose.material.AlertDialogKt.AlertDialog-ubiPcs4(AlertDialog.kt:144)
	at androidx.compose.material.AlertDialogKt.AlertDialog-E7Yi3bI(AlertDialog.kt:81)

Implement "actual fun ActualDialog" and "actual fun ActualPopup"

We can move already implemented Dialog/Popup from desktop to ui module

from:
support\compose\desktop\desktop\src\jvmMain\kotlin\androidx\compose\ui\window\AppDialog.kt
to:
support\compose\ui\ui\src\desktopMain\kotlin\androidx\compose\ui\window\DesktopDialog.kt

from:
support\compose\desktop\desktop\src\jvmMain\kotlin\androidx\compose\ui\window\Popup.kt
to:
support\compose\ui\ui\src\desktopMain\kotlin\androidx\compose\ui\window\DesktopPopup.kt

(DesktopPopup is in ui module, so we can't use Box, we have to use Layout (as in support\compose\ui\ui\src\androidMain\kotlin\androidx\compose\ui\window\AndroidPopup.kt)

Text input doesn't support Option-Left/Right

On the Mac, the Option key with Left/Right doesn't traverse between words, and Option-Shift with Left/Right doesn't select words. This can be seen in the Todo sample and makes text input feel non-native and cumbersome. (Other than that, impressive work!)

Letter spacing doesn't work with Text

Text("MARCH", style = MaterialTheme.typography.subtitle2)

// MaterialTheme.typography.subtitle2:
subtitle2 = TextStyle(
    letterSpacing = 2.sp,
    fontSize = 14.sp,
    fontFamily = JosefinSans
)

This looks like:
march

I'm on windows, not sure if this is the case for other platforms too.

Setting cursor for window does not always behave as expected

Consider the following snippet:

fun main() = Window(title = "JFrame properties") {
    var crosshairCursor by remember { mutableStateOf(false) }
    onCommit(crosshairCursor) {
        val jFrame = AppManager.focusedWindow?.window
        jFrame?.let {
            it.cursor =
                if (crosshairCursor) Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR) else Cursor.getDefaultCursor()
        }
    }
    MaterialTheme {
        Button(onClick = { crosshairCursor = !crosshairCursor }) {
            Text("Toggle crosshair cursor")
        }
    }
}

  • Toggling the cursor via button press works fine
  • Defocusing the window resets the cursor to the default cursor when re-entering the window.
  • Refocusing the window via the dock icon uses the correct custom cursor again.

Untitled

Button deformation

When I want to change the corner raduis with a raduis big than 20dp, the button looks like this
alt text

(question) Raspberry Pi support

Will raspberry pi be ever supported?
This might be gamechanger, since flutter is possible but dart is much worse than kotlin and rpi is primary platform for many iot projects

TextField doesn't react on mouse click.

Hello, i've updated to 0.1.0-m1-build57 from 97 version and my AuthView's Textfields stop reacting to mouse clicking.

TextField(
                        emailState.value,
                        backgroundColor = Color.Transparent,
                        label = { Text("Email") },
                        placeholder = {
                            Text("ะ’ะฒะตะดะธั‚ะต ะฒะฐัˆ email")
                        },
                        activeColor = Color(Palette.primaryColor),
                        modifier = Modifier.padding(top = 24.dp).then(Modifier.fillMaxWidth()),
                        onValueChange = {
                            emailState.value = it
                            authViewModel.obtainEvent(AuthEvents.EmailChanged(newValue = it.text))
                        }
                )

TextField Code applied.

OS: Windows 10
IDE: IntelliJ Idea

java.lang.NoSuchMethodError when updated to 0.1.0-dev87

Exception in thread "main" java.lang.NoSuchMethodError: 'void androidx.compose.desktop.AppWindowKt.Window-RCQARxQ$default(java.lang.String, long, long, boolean, java.awt.image.BufferedImage, boolean, androidx.compose.desktop.WindowEvents, kotlin.jvm.functions.Function0, kotlin.jvm.functions.Function2, int, java.lang.Object)'
	at io.github.commandertvis.calc.AppKt.main(App.kt:20)
	at io.github.commandertvis.calc.AppKt.main(App.kt)

Process finished with exit code 1

Support OS font scale

Font size can be changed on Windows 10 in Settings - Ease of Access - Make text bigger:
image

On Ubuntu in Settings - Universal Access - Large Text:
image

On macOS there is no such setting

See FrameSkiaLayer.detectCurrentDensity

Exception when clicking Go! on CEF example

I am VERY excited to see CEF support added to compose-jb, but I have been unable to get the project to load a url on linux or mac. Which platforms are currently supported?

This is the exception I get when pressing the Go! button on Ubuntu 20.10

Gtk-Message: 09:39:14.437: Failed to load module "canberra-gtk-module"
initialize on Thread[AWT-EventQueue-0,6,main] with library path third_party/java-cef
Exception in thread "AWT-EventQueue-0" [1106/093918.996012:ERROR:sandbox_linux.cc(374)] InitializeSandbox() called with multiple threads in process gpu-process.
[1106/093919.005690:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.005897:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006035:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006148:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006294:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006416:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006529:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006640:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006748:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006858:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.006969:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007096:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007210:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007292:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007352:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007412:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007470:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007520:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007565:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007612:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007658:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007702:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007750:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007799:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007853:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007910:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.007966:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.008020:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.008075:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.008131:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.008185:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)
[1106/093919.008236:ERROR:gbm_wrapper.cc(272)] Failed to export buffer to dma_buf: No such file or directory (2)

Compose desktop not compatible with macOS 10.14.6

I tried to run the demo app provided here: #61 (comment) with the changes proposed down here #61 (comment) but after a successful build it crashed immediately at runtime on my Mac with macOS 10.14.6. The crash report indicates that this only seems to work with macOS 10.15+. Is this intended and documented somewhere?

Dyld Error Message:
  Symbol not found: _objc_opt_new
  Referenced from: /Users/USER/*/libskiko.dylib (which was built for Mac OS X 10.15)
  Expected in: /usr/lib/libobjc.A.dylib

The test was done on OpenJDK 15.

androidx.compose.ui.window.Notifier

The Tray_Notifications_MenuBar mentions shows a "Notifier" class, but I can't find any references to it anywhere to actually make it work. Am I missing something?

Modifier.drawLayer(alpha=), optimization of drawing top-level transparent layers

Now we draw every transparent layer into intermediate buffer using saveLayer (see SkijaLayer, performDrawLayer).

Think if we can don't use intermediate buffer for top-level transparent layers. Maybe we can use PaintFilterCanvas for that:

https://github.com/JetBrains/skija/blob/fc1757bd0d31cf02481da1671a17ba51d9451fa0/examples/lwjgl/src/main/java/org/jetbrains/skija/examples/lwjgl/PictureRecorderScene.java#L134

https://cs.android.com/android/_/android/platform/frameworks/base/+/613e6e3e9a0001b29af363318b6c123505d898c7:libs/hwui/pipeline/skia/RenderNodeDrawable.cpp;l=184;drc=fe2dcf1877b0666e0395619a7de0353babbb1aee

But keep in mind that for nested transparent layers we can't use such optimization. Because nested layers should apply alpha to nested layer background to which alpha has not yet been applied:

Example:

Box(Modifier.drawLayer(alpha=0.5).background(Color.Red)) {
  Box(Modifier.drawLayer(alpha=0.5).background(Color.Blue))
}

We can't draw both layers without intermideate buffer, because nested layer will be drawn with wrong color.

System trays/menus do not work on Ubuntu 18.04 w/ Gnome 3.28.2

Expected
Tutorials would work out of the box

Actual

When running the Tray_Notifications_MenuBar tutorials on Ubuntu 18.04, the applications launch but do not function as expected.

There is the standard icon (with an exit option), but none of the application-specified menus. The notifier similarly does not present.

In the same manner, the Windows Attributes tutorial fails, as there are no menu options to click.

When I run this, it confirms that the SystemTray is no longer supported.

        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
        }

I tried TopIconsPlus Gnome shell extension ( as per the Gnome Release notes ) and got the Tray example to work, but not the others. TBH, UI was not great either.

I also tried AppIndicator Gnome shell extension (as per the documentation on https://github.com/dorkbox/SystemTray ). That didn't work for any of the tutorials.

Suggestions

  • Ideal would be for the Menus, Trays, Notifiers, etc to work out of the box cross-platform. This one is especially the ideal if you are distributing your app.
  • Secondary would be if we checked SystemTray.isSupported() under the hood and directed the user/dev to a wiki on how to fix it. I have not yet managed to fix it myself, so do not have a suggestion on what that option would look like.

Couldn't run desktop template

when running desktop-template, the following exception is thrown:

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedClassVersionError: org/jetbrains/skiko/Library has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
	at androidx.compose.desktop.ComposeInit.<clinit>(ComposeInit.kt:45)
	at androidx.compose.desktop.ComposeInitKt.initCompose(ComposeInit.kt:40)
	at androidx.compose.desktop.ComposeWindow.<clinit>(ComposeWindow.kt:39)
	at androidx.compose.desktop.AppWindow.<init>(AppWindow.kt:77)
	at androidx.compose.desktop.AppWindow.<init>(AppWindow.kt)
	at androidx.compose.desktop.AppWindowKt$Window$1.run(AppWindow.kt:53)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
	at java.awt.EventQueue.access$500(EventQueue.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:715)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

run in Android Studio.

Add support for hover/rollover modifier or interaction

There is no Interaction.rollover which is an integral part of desktop experience that is driven by mouse. There's Modifier.mouseScrollFilter but no matching modifier to get notified on the mouse entering and leaving the composable bounds.

IllegalArgumentException when selecting text

  1. Run ./gradlew compose:desktop:desktop:desktop-samples:run1

  2. Select text in code block and in the block above (starting from code block)

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Start(0) or End(34) is out of range [0..9), or start > end!
	at androidx.compose.ui.text.MultiParagraph.getPathForRange(MultiParagraph.kt:251)
	at androidx.compose.ui.text.TextDelegate$Companion.paintBackground(TextDelegate.kt:264)
	at androidx.compose.foundation.text.TextController$modifiers$1.invoke(CoreText.kt:209)
	at androidx.compose.foundation.text.TextController$modifiers$1.invoke(CoreText.kt)
	at androidx.compose.ui.DrawBackgroundModifier.draw(DrawModifier.kt:64)
	at androidx.compose.ui.node.ModifiedDrawNode.draw(ModifiedDrawNode.kt:76)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt:170)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt:226)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:133)
	at androidx.compose.ui.platform.DesktopOwner.observeDrawModelReads(DesktopOwner.kt:210)
	at androidx.compose.ui.platform.DesktopOwner.access$observeDrawModelReads(DesktopOwner.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt:225)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt)
	at androidx.compose.ui.platform.SkijaLayer.performDrawLayer(SkijaLayer.kt:164)
	at androidx.compose.ui.platform.SkijaLayer.drawLayer(SkijaLayer.kt:130)
	at androidx.compose.ui.node.LayerWrapper.draw(LayerWrapper.kt:78)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.ModifiedLayoutNode.draw(ModifiedLayoutNode.kt:81)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt:170)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt:226)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:133)
	at androidx.compose.ui.platform.DesktopOwner.observeDrawModelReads(DesktopOwner.kt:210)
	at androidx.compose.ui.platform.DesktopOwner.access$observeDrawModelReads(DesktopOwner.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt:225)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt)
	at androidx.compose.ui.platform.SkijaLayer.performDrawLayer(SkijaLayer.kt:164)
	at androidx.compose.ui.platform.SkijaLayer.drawLayer(SkijaLayer.kt:130)
	at androidx.compose.ui.node.LayerWrapper.draw(LayerWrapper.kt:78)
	at androidx.compose.ui.node.ModifiedLayoutNode.draw(ModifiedLayoutNode.kt:81)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt:170)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt:226)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:133)
	at androidx.compose.ui.platform.DesktopOwner.observeDrawModelReads(DesktopOwner.kt:210)
	at androidx.compose.ui.platform.DesktopOwner.access$observeDrawModelReads(DesktopOwner.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt:225)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt)
	at androidx.compose.ui.platform.SkijaLayer.performDrawLayer(SkijaLayer.kt:164)
	at androidx.compose.ui.platform.SkijaLayer.drawLayer(SkijaLayer.kt:130)
	at androidx.compose.ui.node.LayerWrapper.draw(LayerWrapper.kt:78)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.ModifiedLayoutNode.draw(ModifiedLayoutNode.kt:81)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.ModifiedLayoutNode.draw(ModifiedLayoutNode.kt:81)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.ModifiedLayoutNode.draw(ModifiedLayoutNode.kt:81)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt:170)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt:226)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:133)
	at androidx.compose.ui.platform.DesktopOwner.observeDrawModelReads(DesktopOwner.kt:210)
	at androidx.compose.ui.platform.DesktopOwner.access$observeDrawModelReads(DesktopOwner.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt:225)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt)
	at androidx.compose.ui.platform.SkijaLayer.performDrawLayer(SkijaLayer.kt:164)
	at androidx.compose.ui.platform.SkijaLayer.drawLayer(SkijaLayer.kt:130)
	at androidx.compose.ui.node.LayerWrapper.draw(LayerWrapper.kt:78)
	at androidx.compose.ui.node.LayoutNodeDrawScope.drawContent(LayoutNode.kt:1435)
	at androidx.compose.foundation.Background.draw(Background.kt:104)
	at androidx.compose.ui.node.ModifiedDrawNode.draw(ModifiedDrawNode.kt:76)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt:170)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt:226)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:133)
	at androidx.compose.ui.platform.DesktopOwner.observeDrawModelReads(DesktopOwner.kt:210)
	at androidx.compose.ui.platform.DesktopOwner.access$observeDrawModelReads(DesktopOwner.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt:225)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt)
	at androidx.compose.ui.platform.SkijaLayer.performDrawLayer(SkijaLayer.kt:164)
	at androidx.compose.ui.platform.SkijaLayer.drawLayer(SkijaLayer.kt:130)
	at androidx.compose.ui.node.LayerWrapper.draw(LayerWrapper.kt:78)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.node.InnerPlaceable.draw(InnerPlaceable.kt:134)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.draw(DelegatingLayoutNodeWrapper.kt:72)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt:170)
	at androidx.compose.ui.node.LayerWrapper.invoke(LayerWrapper.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt:226)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2$1.invoke(DesktopOwner.kt)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1721)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:128)
	at androidx.compose.ui.platform.DesktopOwner.observeDrawModelReads(DesktopOwner.kt:210)
	at androidx.compose.ui.platform.DesktopOwner.access$observeDrawModelReads(DesktopOwner.kt)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt:225)
	at androidx.compose.ui.platform.DesktopOwner$createLayer$2.invoke(DesktopOwner.kt)
	at androidx.compose.ui.platform.SkijaLayer.performDrawLayer(SkijaLayer.kt:164)
	at androidx.compose.ui.platform.SkijaLayer.drawLayer(SkijaLayer.kt:130)
	at androidx.compose.ui.node.LayerWrapper.draw(LayerWrapper.kt:78)
	at androidx.compose.ui.node.LayoutNode.draw(LayoutNode.kt:837)
	at androidx.compose.ui.platform.DesktopOwner.draw(DesktopOwner.kt:241)
	at androidx.compose.ui.platform.DesktopOwners.onFrame(DesktopOwners.kt:92)
	at androidx.compose.ui.platform.DesktopOwners$onFrame$1.invokeSuspend(DesktopOwners.kt)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Material Icons not implemented

It seems material icon is not implemented on this release.

     Row {
                    Text(
                        text = "Help",
                        fontSize = 12.sp,
                        modifier = Modifier.padding(start=16.dp))
                    Icon(asset = Icons.Outlined.MoreVert)
                }

Got this error: here

Wrong shadow for complex Path

If we use a hand-maded Path for drawing shadow then the shadow will not match actual Path (we can see a white fragment outside the box).

Example (under the floating button):

image

Scaffold(
    floatingActionButton = {
        ExtendedFloatingActionButton(
            text = { Text("BUTTON") },
            onClick = {
                println("Floating button clicked")
            }
        )
    },
    isFloatingActionButtonDocked = true,
    bottomBar = {
        BottomAppBar(cutoutShape = CircleShape) {
            IconButton(
                onClick = {}
            ) {
                Icon(Icons.Filled.Menu, Modifier.size(ButtonConstants.DefaultIconSize))
            }
        }
    },
    bodyContent = {}
)

Snippet to reproduce:

import androidx.compose.desktop.AppWindow
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.ui.Modifier
import androidx.compose.ui.drawLayer
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp

fun main() {
    AppWindow("Test", IntSize(1224, 850)).show {
//        val shape = RectangleShape
        val shape = object : Shape {
            override fun createOutline(size: Size, density: Density): Outline {
                val path = Path().apply {
                    moveTo(0f, 0f)
                    lineTo(size.width * 0.97f, 0f)
                    lineTo(size.width, size.height / 2f)
                    lineTo(size.width, size.height)
                    lineTo(0f, size.height)
                }
                return Outline.Generic(path)
            }
        }
        Box(
            Modifier
                .fillMaxWidth(0.9f)
                .height(200.dp)
                .drawLayer(shadowElevation = 45f, shape = shape)
                .background(color = Color.Blue.copy(alpha = 0.5f), shape = shape)
        ) {}
    }
}

image

Crash when mixing with JavaFx coroutines

I'm migrating existing JavaFx app to current Compose version. Found an issue when trying to render Text():

Log fragment
---------------  T H R E A D  ---------------

Current thread (0x00007fd358873800): JavaThread "JavaFX Application Thread" [_thread_in_native, id=4109, stack(0x00007fd2c9b45000,0x00007fd2c9c46000)]

Stack: [0x00007fd2c9b45000,0x00007fd2c9c46000], sp=0x00007fd2c9c3d868, free space=994k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libfreetype.so.6+0x8a053]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j org.jetbrains.skija.paragraph.Paragraph._nLayout(JF)V+0
j org.jetbrains.skija.paragraph.Paragraph.layout(F)Lorg/jetbrains/skija/paragraph/Paragraph;+8
j androidx.compose.ui.text.platform.DesktopParagraphIntrinsics.(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/Font$ResourceLoader;)V+104
j androidx.compose.ui.text.platform.DesktopParagraphIntrinsicsKt.ActualParagraphIntrinsics(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/Font$ResourceLoader;)Landroidx/compose/ui/text/ParagraphIntrinsics;+50
j androidx.compose.ui.text.ParagraphIntrinsicsKt.ParagraphIntrinsics(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/Font$ResourceLoader;)Landroidx/compose/ui/text/ParagraphIntrinsics;+46
j androidx.compose.ui.text.MultiParagraphIntrinsics.(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/Font$ResourceLoader;)V+268
j androidx.compose.ui.text.TextDelegate.layoutIntrinsics(Landroidx/compose/ui/unit/LayoutDirection;)V+72
j androidx.compose.ui.text.TextDelegate.layoutText(FFLandroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/MultiParagraph;+2
j androidx.compose.ui.text.TextDelegate.layout-BAnaFRY(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/text/TextLayoutResult;)Landroidx/compose/ui/text/TextLayoutResult;+206
j androidx.compose.foundation.text.CoreTextKt$CoreText$10.invoke(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+31
j androidx.compose.foundation.text.CoreTextKt$CoreText$10.invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+16
j androidx.compose.ui.LayoutKt$measureBlocksOf$1.measure-2MWCACw(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+22
j androidx.compose.ui.node.InnerPlaceable.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+22
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayerWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+2
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()V+11
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()Ljava/lang/Object;+1
j androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V+149
j androidx.compose.ui.platform.DesktopOwner.observeMeasureModelReads(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V+27
j androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(J)Z+218
j androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+115
j androidx.compose.ui.node.LayoutNode.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.foundation.layout.BoxKt$Box$1$1.invoke(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+223
j androidx.compose.foundation.layout.BoxKt$Box$1$1.invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+16
j androidx.compose.ui.LayoutKt$MeasuringIntrinsicsMeasureBlocks$1.measure-2MWCACw(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+22
j androidx.compose.ui.node.InnerPlaceable.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+22
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()V+11
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()Ljava/lang/Object;+1
j androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V+149
j androidx.compose.ui.platform.DesktopOwner.observeMeasureModelReads(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V+27
j androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(J)Z+218
j androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+115
j androidx.compose.ui.node.LayoutNode.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.platform.DesktopSelectionKt$Wrap$1$1.invoke(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+92
j androidx.compose.ui.platform.DesktopSelectionKt$Wrap$1$1.invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+16
j androidx.compose.ui.LayoutKt$MeasuringIntrinsicsMeasureBlocks$1.measure-2MWCACw(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+22
j androidx.compose.ui.node.InnerPlaceable.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+22
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()V+11
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()Ljava/lang/Object;+1
j androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V+149
j androidx.compose.ui.platform.DesktopOwner.observeMeasureModelReads(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V+27
j androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(J)Z+218
j androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+115
j androidx.compose.ui.node.LayoutNode.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.RootMeasureBlocks.measure-2MWCACw(Landroidx/compose/ui/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/MeasureScope$MeasureResult;+60
j androidx.compose.ui.node.InnerPlaceable.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+22
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+5
j androidx.compose.ui.node.LayerWrapper.performMeasure-BRTryo0(J)Landroidx/compose/ui/Placeable;+2
j androidx.compose.ui.node.LayoutNodeWrapper.measure-BRTryo0(J)Landroidx/compose/ui/Placeable;+7
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()V+11
j androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke()Ljava/lang/Object;+1
j androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;+110
j androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V+123
j androidx.compose.ui.platform.DesktopOwner.observeMeasureModelReads(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V+27
j androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(J)Z+218
j androidx.compose.ui.node.LayoutNode.remeasure-BRTryo0$ui(J)Z+5
j androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure(Landroidx/compose/ui/node/LayoutNode;)Z+13
j androidx.compose.ui.node.MeasureAndLayoutDelegate.access$doRemeasure(Landroidx/compose/ui/node/MeasureAndLayoutDelegate;Landroidx/compose/ui/node/LayoutNode;)Z+2
j androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout()Z+186
j androidx.compose.ui.platform.DesktopOwner.draw(Lorg/jetbrains/skija/Canvas;)V+11
j androidx.compose.ui.platform.DesktopOwners.onRender(Lorg/jetbrains/skija/Canvas;IIJ)V+56
j androidx.compose.desktop.OwnersRenderer.onRender(Lorg/jetbrains/skija/Canvas;IIJ)V+16
j androidx.compose.desktop.FrameSkiaLayer.preparePicture(J)V+70
j androidx.compose.desktop.FrameSkiaLayer.access$preparePicture(Landroidx/compose/desktop/FrameSkiaLayer;J)V+2
j androidx.compose.desktop.FrameSkiaLayer$wrapped$1.redrawLayer()V+11
j androidx.compose.desktop.FrameSkiaLayer.onFrame(J)V+9
j androidx.compose.desktop.FrameSkiaLayer.access$onFrame(Landroidx/compose/desktop/FrameSkiaLayer;J)V+2
j androidx.compose.desktop.FrameSkiaLayer$frameDispatcher$1.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;+40
j androidx.compose.desktop.FrameSkiaLayer$frameDispatcher$1.invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+15
j androidx.compose.desktop.FrameDispatcher$job$1.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;+135
j kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Ljava/lang/Object;)V+46
j kotlinx.coroutines.DispatchedTask.run()V+334
j com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Ljava/lang/Runnable;)Ljava/lang/Void;+1
j com.sun.javafx.application.PlatformImpl$$Lambda$192.run()Ljava/lang/Object;+4
v ~StubRoutines::call_stub
j java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+0 [email protected]
j com.sun.javafx.application.PlatformImpl.lambda$runLater$11(Ljava/lang/Runnable;Ljava/security/AccessControlContext;)V+7
j com.sun.javafx.application.PlatformImpl$$Lambda$191.run()V+8
j com.sun.glass.ui.InvokeLaterDispatcher$Future.run()V+4
v ~StubRoutines::call_stub
j com.sun.glass.ui.gtk.GtkApplication._runLoop(Ljava/lang/Runnable;Z)V+0
j com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(Ljava/lang/Runnable;Z)V+7
j com.sun.glass.ui.gtk.GtkApplication$$Lambda$179.run()V+12
j java.lang.Thread.run()V+11 [email protected]
v ~StubRoutines::call_stub

siginfo: si_signo: 11 (SIGSEGV), si_code: 2 (SEGV_ACCERR), si_addr: 0x00007fd321298053

This happens only when Text() is present in hierarchy AND javafx coroutines are included as a dependency.

Here is MRS (open it in IDEA and run MainKt - app will crash almost instantly).

compose-issue.zip

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.