@@ -13,8 +13,6 @@ import androidx.compose.ui.draw.alpha
1313import androidx.compose.ui.graphics.Color
1414import androidx.compose.ui.graphics.painter.Painter
1515import androidx.compose.ui.graphics.vector.ImageVector
16- import org.jetbrains.compose.resources.DrawableResource
17- import org.jetbrains.compose.resources.painterResource
1816import androidx.compose.ui.unit.DpSize
1917import androidx.compose.ui.unit.dp
2018import androidx.compose.ui.window.ApplicationScope
@@ -27,15 +25,19 @@ import com.kdroid.composetray.lib.mac.MacOutsideClickWatcher
2725import com.kdroid.composetray.lib.windows.WindowsOutsideClickWatcher
2826import com.kdroid.composetray.menu.api.TrayMenuBuilder
2927import com.kdroid.composetray.utils.*
28+ import io.github.kdroidfilter.platformtools.LinuxDesktopEnvironment
3029import io.github.kdroidfilter.platformtools.OperatingSystem
3130import io.github.kdroidfilter.platformtools.OperatingSystem.MACOS
3231import io.github.kdroidfilter.platformtools.OperatingSystem.WINDOWS
32+ import io.github.kdroidfilter.platformtools.detectLinuxDesktopEnvironment
3333import io.github.kdroidfilter.platformtools.getOperatingSystem
3434import kotlinx.coroutines.CoroutineScope
3535import kotlinx.coroutines.Dispatchers
3636import kotlinx.coroutines.delay
3737import kotlinx.coroutines.flow.collectLatest
3838import kotlinx.coroutines.launch
39+ import org.jetbrains.compose.resources.DrawableResource
40+ import org.jetbrains.compose.resources.painterResource
3941import java.awt.EventQueue.invokeLater
4042import java.awt.event.WindowEvent
4143import java.awt.event.WindowFocusListener
@@ -378,17 +380,27 @@ fun ApplicationScope.TrayApp(
378380 val now = System .currentTimeMillis()
379381 if (now - lastPrimaryActionAt >= toggleDebounceMs) {
380382 lastPrimaryActionAt = now
381-
382383 if (isVisible) {
383- // Explicit hide (works both in AUTO and MANUAL)
384384 requestHideExplicit()
385385 } else {
386386 if (now - lastHiddenAt >= minHiddenDurationMs) {
387387 if (os == WINDOWS && (now - lastFocusLostAt) < 300 ) {
388- // Ignore immediate re-show after focus loss on Windows
388+ // Ignore
389389 } else {
390+ if (detectLinuxDesktopEnvironment() == LinuxDesktopEnvironment .KDE ) {
391+ // Pré-calculer la position AVANT de montrer
392+ val widthPx = currentWindowSize.width.value.toInt()
393+ val heightPx = currentWindowSize.height.value.toInt()
394+ val newPosition = getTrayWindowPositionForInstance(
395+ tray.instanceKey(), widthPx, heightPx
396+ )
397+
398+ // Mettre à jour immédiatement
399+ if (newPosition !is WindowPosition .PlatformDefault ) {
400+ dialogState.position = newPosition
401+ }
402+ }
390403 trayAppState.show()
391- // `lastShownAt` will be set in LaunchedEffect(isVisible)
392404 }
393405 }
394406 }
0 commit comments