Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
skiko
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liuqiang
skiko
Commits
168b0b51
Commit
168b0b51
authored
Apr 06, 2021
by
Roman Sedaikin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improved NSWindow search by CALayer on MacOS.
parent
544b4b76
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
97 additions
and
34 deletions
+97
-34
SwingSkia.kt
...jectSample/src/main/kotlin/SkijaInjectSample/SwingSkia.kt
+70
-23
Drawlayer.mm
skiko/src/jvmMain/objectiveC/macos/Drawlayer.mm
+27
-11
No files found.
samples/SkijaInjectSample/src/main/kotlin/SkijaInjectSample/SwingSkia.kt
View file @
168b0b51
...
...
@@ -3,17 +3,32 @@ package SkijaInjectSample
import
java.awt.BorderLayout
import
java.awt.Color
import
java.awt.Dimension
import
java.awt.event.ActionEvent
import
java.awt.event.ActionListener
import
java.awt.event.ComponentAdapter
import
java.awt.event.ComponentEvent
import
java.awt.event.MouseEvent
import
java.awt.event.MouseMotionAdapter
import
javax.swing.*
private
val
state
=
State
()
private
var
mouseX
=
0
private
var
mouseY
=
0
fun
Button
(
text
:
String
,
action
:
(()
->
Unit
)?
=
null
):
JButton
{
val
button
=
JButton
(
text
)
button
.
setToolTipText
(
"Tooltip for $text button."
)
button
.
setPreferredSize
(
Dimension
(
100
,
100
))
button
.
addActionListener
(
object
:
ActionListener
{
public
override
fun
actionPerformed
(
e
:
ActionEvent
)
{
action
?.
invoke
()
}
})
fun
Button
(
text
:
String
):
JButton
{
val
btn
=
JButton
(
text
)
btn
.
setPreferredSize
(
Dimension
(
100
,
100
))
return
btn
return
button
}
fun
SwingSkia
()
=
SwingUtilities
.
invokeLater
{
...
...
@@ -22,30 +37,66 @@ fun SwingSkia() = SwingUtilities.invokeLater {
window
.
defaultCloseOperation
=
WindowConstants
.
DISPOSE_ON_CLOSE
window
.
title
=
"SwingSkiaWindow"
val
panel
=
SkiaPanel
()
state
.
text
=
window
.
title
window
.
contentPane
.
add
(
Button
(
"North"
),
BorderLayout
.
NORTH
)
window
.
contentPane
.
add
(
Button
(
"West"
),
BorderLayout
.
WEST
)
window
.
contentPane
.
add
(
Button
(
"East"
),
BorderLayout
.
EAST
)
window
.
contentPane
.
add
(
Button
(
"South"
),
BorderLayout
.
SOUTH
)
var
panel
=
getSkiaPanel
()
window
.
contentPane
.
add
(
Button
(
text
=
"Fullscreen"
,
action
=
{
if
(
panel
!=
null
)
{
panel
.
layer
.
fullscreen
=
!
panel
.
layer
.
fullscreen
}
}
),
BorderLayout
.
NORTH
)
window
.
contentPane
.
add
(
Button
(
text
=
"Add SP"
,
action
=
{
window
.
contentPane
.
remove
(
panel
)
panel
=
getSkiaPanel
()
window
.
contentPane
.
add
(
panel
,
BorderLayout
.
CENTER
)
window
.
setSize
(
window
.
width
+
1
,
window
.
height
)
}
),
BorderLayout
.
WEST
)
window
.
contentPane
.
add
(
Button
(
text
=
"Remove SP"
,
action
=
{
window
.
contentPane
.
remove
(
panel
)
}
),
BorderLayout
.
EAST
)
window
.
contentPane
.
add
(
Button
(
text
=
"New Window"
,
action
=
{
createWindow
(
"ComposeWindow"
)
}
),
BorderLayout
.
SOUTH
)
window
.
contentPane
.
add
(
panel
,
BorderLayout
.
CENTER
)
window
.
setSize
(
800
,
600
)
window
.
setVisible
(
true
)
}
private
fun
getSkiaPanel
():
SkiaPanel
{
val
panel
=
SkiaPanel
()
val
btnPanelOK
=
JPanel
()
btnPanelOK
.
setLayout
(
BorderLayout
(
0
,
0
))
btnPanelOK
.
setBackground
(
Color
.
white
)
btnPanelOK
.
add
(
JButton
(
"OK"
))
val
btnCancel
=
JButton
(
"Cancel"
)
panel
.
add
(
btnPanelOK
)
panel
.
add
(
btnCancel
)
val
state
=
State
()
state
.
text
=
window
.
title
var
mouseX
=
0
var
mouseY
=
0
panel
.
addComponentListener
(
object
:
ComponentAdapter
()
{
override
fun
componentResized
(
e
:
ComponentEvent
)
{
btnPanelOK
.
setBounds
(
panel
.
width
-
200
,
panel
.
height
-
100
,
200
,
40
)
...
...
@@ -55,16 +106,12 @@ fun SwingSkia() = SwingUtilities.invokeLater {
panel
.
repaint
()
}
})
panel
.
layer
.
renderer
=
Renderer
(
panel
.
layer
)
{
renderer
,
w
,
h
,
nanoTime
->
displayScene
(
renderer
,
w
,
h
,
nanoTime
,
mouseX
,
mouseY
,
state
)
}
panel
.
layer
.
addMouseMotionListener
(
object
:
MouseMotionAdapter
()
{
override
fun
mouseMoved
(
event
:
MouseEvent
)
{
mouseX
=
event
.
x
mouseY
=
event
.
y
}
})
window
.
setSize
(
800
,
600
)
window
.
setVisible
(
true
)
return
panel
}
skiko/src/jvmMain/objectiveC/macos/Drawlayer.mm
View file @
168b0b51
...
...
@@ -82,6 +82,29 @@ LayerHandler * findByObject(JNIEnv *env, jobject object)
extern "C"
{
NSWindow *recoursiveSearch(NSView *rootView, CALayer *layer) {
if (rootView.subviews == nil || rootView.subviews.count == 0) {
return nil;
}
for (NSView* child in rootView.subviews) {
if (child.layer == layer) {
return rootView.window;
}
NSWindow* recOut = recoursiveSearch(child, layer);
if (recOut != nil) {
return recOut;
}
}
return nil;
}
NSWindow *findCALayerWindow(NSView *rootView, CALayer *layer) {
if (rootView.layer == layer) {
return rootView.window;
}
return recoursiveSearch(rootView, layer);
}
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeInit(JNIEnv *env, jobject canvas, jlong platformInfoPtr)
{
if (layerStorage == nil)
...
...
@@ -98,20 +121,13 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeInit(JNIEnv
[layersSet setCanvasGlobalRef: canvasGlobalRef];
NSMutableArray<NSWindow *> *windows = [NSMutableArray arrayWithArray: [[NSApplication sharedApplication] windows]];
for (LayerHandler* value in layerStorage)
{
if (layersSet.container == value.container)
{
layersSet.window = value.window;
for (NSWindow* window in windows) {
layersSet.window = findCALayerWindow(window.contentView, layersSet.container);
if (layersSet.window != nil) {
break;
}
}
if (layersSet.window == NULL)
{
layersSet.window = [windows lastObject];
}
[layerStorage addObject: layersSet];
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment