From 8e5b7387cb3bdd86a3ddd9576df68f30611dcfda Mon Sep 17 00:00:00 2001 From: Marcin Radoszewski Date: Sun, 20 Aug 2023 20:58:43 +0200 Subject: [PATCH 1/2] Use SetWindowPlacement instead of SetWindowPosition --- .../tiler/config/internal/SimpleConfig.kt | 4 +-- .../gh/marad/tiler/os/internal/WindowsOs.kt | 33 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt b/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt index 75dee39..01f250d 100644 --- a/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt +++ b/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt @@ -65,8 +65,8 @@ class SimpleConfig : ConfigFacade { Hotkey("S-A-C-K", MoveWindowUp), // Layout - Hotkey("S-A-L", LayoutIncrease(0.03f)), - Hotkey("S-A-H", LayoutDecrease(0.03f)) + Hotkey("S-A-L", LayoutIncrease(0.05f)), + Hotkey("S-A-H", LayoutDecrease(0.05f)) ) } diff --git a/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt b/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt index feaf289..17957b2 100644 --- a/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt +++ b/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt @@ -3,6 +3,8 @@ package gh.marad.tiler.os.internal import com.sun.jna.Native import com.sun.jna.platform.win32.User32 import com.sun.jna.platform.win32.WinDef +import com.sun.jna.platform.win32.WinDef.RECT +import com.sun.jna.platform.win32.WinUser.WINDOWPLACEMENT import com.sun.jna.win32.W32APIOptions import gh.marad.tiler.common.* import gh.marad.tiler.common.Window @@ -53,9 +55,17 @@ class WindowsOs : OsFacade { // correct the window size to account for the invisible // border of the window val pos = command.position.addInvisibleBorders(windowBorders(hwnd)) - User32.INSTANCE.SetWindowPos(hwnd, null, - pos.x, pos.y, pos.width, pos.height, - User32.SWP_ASYNCWINDOWPOS and User32.SWP_NOACTIVATE and User32.SWP_NOZORDER and User32.SWP_SHOWWINDOW) + val placement = WINDOWPLACEMENT() + placement.length = placement.size() + placement.flags = WINDOWPLACEMENT.WPF_ASYNCWINDOWPLACEMENT + placement.showCmd = User32.SW_SHOWNOACTIVATE and User32.SWP_NOZORDER + val r = RECT() + r.left = pos.x + r.top = pos.y + r.right = pos.x + pos.width + r.bottom = pos.y + pos.height + placement.rcNormalPosition = r + User32.INSTANCE.SetWindowPlacement(hwnd, placement) } is MinimizeWindow -> { @@ -82,15 +92,16 @@ class WindowsOs : OsFacade { override fun execute(commands: List) { var deferStruct = myU32.BeginDeferWindowPos(commands.count { it is SetWindowPosition }) commands.forEach { - if (it is SetWindowPosition) { - val hwnd = (it.windowId as WID).handle - val pos = it.position.addInvisibleBorders(windowBorders(hwnd)) - deferStruct = myU32.DeferWindowPos(deferStruct, hwnd, null, - pos.x, pos.y, pos.width, pos.height, - User32.SWP_ASYNCWINDOWPOS and User32.SWP_NOACTIVATE and User32.SWP_NOZORDER and User32.SWP_SHOWWINDOW) - } else { +// if (it is SetWindowPosition) { +// val hwnd = (it.windowId as WID).handle +// val pos = it.position.addInvisibleBorders(windowBorders(hwnd)) +// deferStruct = myU32.DeferWindowPos(deferStruct, hwnd, null, +// pos.x, pos.y, pos.width, pos.height, +// User32.SWP_ASYNCWINDOWPOS and User32.SWP_NOACTIVATE and User32.SWP_NOZORDER and User32.SWP_SHOWWINDOW +// ) +// } else { execute(it) - } +// } } Thread.sleep(50) myU32.EndDeferWindowPos(deferStruct) From 4232102cac473aa1c7507a9d6bd52044cf933d14 Mon Sep 17 00:00:00 2001 From: Marcin Radoszewski Date: Sun, 20 Aug 2023 20:59:53 +0200 Subject: [PATCH 2/2] Code analysis fixes --- .../gh/marad/tiler/config/internal/SimpleConfig.kt | 3 +-- .../kotlin/gh/marad/tiler/os/internal/WindowsOs.kt | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt b/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt index 01f250d..e45458a 100644 --- a/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt +++ b/src/main/kotlin/gh/marad/tiler/config/internal/SimpleConfig.kt @@ -7,7 +7,6 @@ import gh.marad.tiler.common.filteringrules.FilteringRules import gh.marad.tiler.common.filteringrules.Rule import gh.marad.tiler.common.layout.GapLayoutDecorator import gh.marad.tiler.common.layout.Layout -import gh.marad.tiler.common.layout.MinWindowSizeLayoutDecorator import gh.marad.tiler.common.layout.TwoColumnLayout import gh.marad.tiler.config.ConfigFacade import gh.marad.tiler.config.Hotkey @@ -36,7 +35,7 @@ class SimpleConfig : ConfigFacade { override fun reload() { } override fun createLayout(): Layout { - var layout = TwoColumnLayout(0.55f) + val layout = TwoColumnLayout(0.55f) // layout = MinWindowSizeLayoutDecorator(1500, 800, twoColumnLayout) return GapLayoutDecorator(20, layout) } diff --git a/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt b/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt index 17957b2..439e5fe 100644 --- a/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt +++ b/src/main/kotlin/gh/marad/tiler/os/internal/WindowsOs.kt @@ -1,11 +1,9 @@ package gh.marad.tiler.os.internal -import com.sun.jna.Native import com.sun.jna.platform.win32.User32 import com.sun.jna.platform.win32.WinDef import com.sun.jna.platform.win32.WinDef.RECT import com.sun.jna.platform.win32.WinUser.WINDOWPLACEMENT -import com.sun.jna.win32.W32APIOptions import gh.marad.tiler.common.* import gh.marad.tiler.common.Window import gh.marad.tiler.os.OsFacade @@ -15,7 +13,7 @@ import gh.marad.tiler.os.internal.winapi.Window as OsWindow class WindowsOs : OsFacade { private val hotkeys = Hotkeys() - private val myU32 = Native.load("user32", MyUser32::class.java, W32APIOptions.DEFAULT_OPTIONS) +// private val myU32 = Native.load("user32", MyUser32::class.java, W32APIOptions.DEFAULT_OPTIONS) override fun getDesktopState(): DesktopState { val monitors = Monitors.list().map { Monitor(it.workArea.toLayoutSpace(), it.isPrimary) } @@ -90,7 +88,7 @@ class WindowsOs : OsFacade { } override fun execute(commands: List) { - var deferStruct = myU32.BeginDeferWindowPos(commands.count { it is SetWindowPosition }) +// var deferStruct = myU32.BeginDeferWindowPos(commands.count { it is SetWindowPosition }) commands.forEach { // if (it is SetWindowPosition) { // val hwnd = (it.windowId as WID).handle @@ -103,8 +101,8 @@ class WindowsOs : OsFacade { execute(it) // } } - Thread.sleep(50) - myU32.EndDeferWindowPos(deferStruct) +// Thread.sleep(50) +// myU32.EndDeferWindowPos(deferStruct) } override fun startEventHandling(handler: WindowEventHandler) {