You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.1 KiB
83 lines
2.1 KiB
package org.jetbrains.compose.desktop.browser |
|
|
|
import androidx.compose.desktop.AppManager |
|
import androidx.compose.desktop.AppFrame |
|
import androidx.compose.runtime.Composable |
|
import androidx.compose.runtime.remember |
|
import androidx.compose.runtime.mutableStateOf |
|
import androidx.compose.runtime.MutableState |
|
import org.jetbrains.skija.Bitmap |
|
import org.jetbrains.skiko.HardwareLayer |
|
import javax.swing.JFrame |
|
import org.cef.CefApp |
|
|
|
class BrowserState { |
|
private val url = mutableStateOf("") |
|
private val isReady = mutableStateOf(false) |
|
private lateinit var browser: CefBrowserWrapper |
|
|
|
fun isReady(): Boolean { |
|
return isReady.value |
|
} |
|
|
|
fun loadURL(url: String) { |
|
if (!this::browser.isInitialized) { |
|
val frame = AppManager.focusedWindow |
|
if (frame != null) { |
|
onActive(frame, url) |
|
} |
|
return |
|
} |
|
isReady.value = false |
|
browser.loadURL(url) |
|
isReady.value = true |
|
} |
|
|
|
fun getBitmap(): Bitmap { |
|
return browser.getBitmap() |
|
} |
|
|
|
fun onLayout(x: Int, y: Int, width: Int, height: Int) { |
|
browser.onLayout(x, y, width, height) |
|
} |
|
|
|
fun onActive(frame: AppFrame, url: String) { |
|
val window = frame.window |
|
if (!window.isVisible()) { |
|
return |
|
} |
|
var layer = getHardwareLayer(window) |
|
if (layer == null) { |
|
throw Error("Browser initialization failed!") |
|
} |
|
browser = CefBrowserWrapper( |
|
startURL = url, |
|
layer = layer |
|
) |
|
browser.onActive() |
|
|
|
isReady.value = true |
|
} |
|
|
|
fun onDismiss() { |
|
browser.onDismiss() |
|
} |
|
|
|
fun setFocused(value: Boolean) { |
|
browser.setFocused(value) |
|
} |
|
|
|
fun onInvalidate(onInvalidate: (() -> Unit)?) { |
|
browser.onInvalidate = onInvalidate |
|
} |
|
|
|
private fun getHardwareLayer(window: JFrame): HardwareLayer? { |
|
val components = window.getContentPane().getComponents() |
|
for (component in components) { |
|
if (component is HardwareLayer) { |
|
return component |
|
} |
|
} |
|
return null |
|
} |
|
}
|
|
|