Skip to content

Commit ca38531

Browse files
committed
fix: Fix an issue where the shortcut key failed after the switch window was pinned to the top
1 parent a8b1a63 commit ca38531

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

composeApp/src/commonMain/kotlin/com/jankinwu/fntv/client/data/network/impl/ReportingService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class ReportingService(private val context: Context) {
9696
contentType(ContentType.Application.Json)
9797
setBody(sortedBody + ("signature" to signature))
9898
}
99-
logger.i("Reporting request body: $sortedBody, signature=$signature")
99+
logger.i("Reporting request body: $sortedBody")
100100
if (response.status.isSuccess()) {
101101
settings[lastReportInfoKey] = currentReportInfo
102102
logger.i { "Successfully reported launch for version $currentVersion on $today" }

composeApp/src/commonMain/kotlin/com/jankinwu/fntv/client/ui/screen/PlayerScreen.kt

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,11 @@ data class PlayerState(
192192

193193
class PlayerManager {
194194
var playerState: PlayerState by mutableStateOf(PlayerState())
195+
var keyFocusRequestSerial: Int by mutableIntStateOf(0)
196+
197+
fun requestKeyFocus() {
198+
keyFocusRequestSerial++
199+
}
195200

196201
fun showPlayer(
197202
itemGuid: String,
@@ -892,17 +897,30 @@ fun PlayerOverlay(
892897
var surfaceRecreateKey by remember { mutableIntStateOf(0) }
893898
var lastMinimized by remember { mutableStateOf(isMinimized) }
894899
var lastWindowFocused by remember { mutableStateOf(isWindowFocused) }
900+
val focusRequester = remember { FocusRequester() }
901+
val keyFocusRequestSerial = playerManager.keyFocusRequestSerial
895902

896903
LaunchedEffect(isMinimized, isWindowFocused) {
897904
val restoredFromMinimize = lastMinimized && !isMinimized
898905
val regainedFocus = !lastWindowFocused && isWindowFocused
899906
if (restoredFromMinimize || regainedFocus) {
900907
surfaceRecreateKey++
908+
if (isWindowFocused) {
909+
focusRequester.requestFocus()
910+
delay(50)
911+
focusRequester.requestFocus()
912+
}
901913
}
902914
lastMinimized = isMinimized
903915
lastWindowFocused = isWindowFocused
904916
}
905917

918+
LaunchedEffect(keyFocusRequestSerial) {
919+
focusRequester.requestFocus()
920+
delay(50)
921+
focusRequester.requestFocus()
922+
}
923+
906924
// region Window Resize Logic
907925
var isProgrammaticResize by remember { mutableStateOf(true) }
908926

@@ -998,10 +1016,10 @@ fun PlayerOverlay(
9981016
}
9991017
}
10001018
// endregion
1001-
1002-
val focusRequester = remember { FocusRequester() }
1003-
LaunchedEffect(Unit, windowState.placement) {
1004-
focusRequester.requestFocus()
1019+
LaunchedEffect(windowState.placement, isWindowFocused) {
1020+
if (isWindowFocused) {
1021+
focusRequester.requestFocus()
1022+
}
10051023
}
10061024

10071025
CompositionLocalProvider(

composeApp/src/jvmMain/kotlin/com/jankinwu/fntv/client/window/WindowFrame.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.ui.window.FrameWindowScope
1414
import androidx.compose.ui.window.WindowState
1515
import com.jankinwu.fntv.client.AppTheme
1616
import com.jankinwu.fntv.client.RefreshManager
17+
import com.jankinwu.fntv.client.ui.providable.LocalPlayerManager
1718
import com.jankinwu.fntv.client.ui.providable.LocalStore
1819
import io.github.composefluent.component.NavigationDisplayMode
1920
import io.github.composefluent.gallery.jna.windows.structure.isWindows10OrLater
@@ -37,15 +38,18 @@ fun FrameWindowScope.WindowFrame(
3738
var isRefreshing by remember { mutableStateOf(false) }
3839
var isAlwaysOnTop by remember { mutableStateOf(false) }
3940

40-
LaunchedEffect(isAlwaysOnTop) {
41+
LaunchedEffect(isAlwaysOnTop) {
4142
window.isAlwaysOnTop = isAlwaysOnTop
43+
window.requestFocus()
44+
window.rootPane.requestFocusInWindow()
4245
}
4346

4447
AppTheme(
4548
!supportBackdrop,
4649
state,
4750
refreshManager
4851
) {
52+
val playerManager = LocalPlayerManager.current
4953
val isCollapsed = LocalStore.current.navigationDisplayMode == NavigationDisplayMode.LeftCollapsed
5054
when {
5155
hostOs.isWindows && isWindows10OrLater() -> {
@@ -60,7 +64,12 @@ fun FrameWindowScope.WindowFrame(
6064
backButtonEnabled = backButtonEnabled,
6165
backButtonClick = backButtonClick,
6266
isAlwaysOnTop = isAlwaysOnTop,
63-
onToggleAlwaysOnTop = { isAlwaysOnTop = !isAlwaysOnTop },
67+
onToggleAlwaysOnTop = {
68+
isAlwaysOnTop = !isAlwaysOnTop
69+
if (playerManager.playerState.isVisible) {
70+
playerManager.requestKeyFocus()
71+
}
72+
},
6473
onRefreshClick = {
6574
// 执行刷新操作
6675
refreshManager.requestRefresh {
@@ -89,7 +98,12 @@ fun FrameWindowScope.WindowFrame(
8998
title = if (isCollapsed) "" else title,
9099
state = state,
91100
isAlwaysOnTop = isAlwaysOnTop,
92-
onToggleAlwaysOnTop = { isAlwaysOnTop = !isAlwaysOnTop },
101+
onToggleAlwaysOnTop = {
102+
isAlwaysOnTop = !isAlwaysOnTop
103+
if (playerManager.playerState.isVisible) {
104+
playerManager.requestKeyFocus()
105+
}
106+
},
93107
onRefreshClick = {
94108
// 执行刷新操作
95109
refreshManager.requestRefresh {
@@ -105,4 +119,4 @@ fun FrameWindowScope.WindowFrame(
105119
}
106120
}
107121
}
108-
}
122+
}

0 commit comments

Comments
 (0)