mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-11-13 12:23:38 +01:00
A ghost was a live thumbnail of its window, so it showed whatever the window painted: the stretched old frame, then the blank frame a window paints while it lays itself out again (Explorer shows its toolbar and nothing else for a few hundred milliseconds), then the new layout, replacing the picture all at once after the animation was over, and it stayed on screen about 300ms past the end of the move while it waited for that. Every ghost also had a host window of its own that was moved with SetWindowPos on every frame through a channel to a thread that polls for commands every 8ms. Take a picture of the window with PrintWindow before anything is done to it (cropped to the visible frame, with the corners rounded) and show it through a cloaked window of our own that DWM can take a thumbnail of and scale on the GPU. All ghosts are composed onto one layered, click-through host window that covers the virtual screen, and is only above other windows while a ghost is alive so that it does not get in the way of the taskbar's auto-hide: animating a ghost is one DwmUpdateThumbnailProperties call on the animating thread, which has no thread affinity. The number of registered thumbnails is counted and traced so that a leak of compositor handles can be seen. The real window is cloaked and resized at the start of the animation, on a thread of its own, and asked to paint itself at its new size straight away (taking a picture of it makes it render synchronously) while the ghost is on screen, so that it has the whole animation to lay itself out unseen. At 55% of the way through, the window is shown again under the ghost (with the one pixel size change that windows which render through a swap chain need for their compositor to rebuild its render target) and the ghost fades out over it while still moving, so the picture dissolves into the window instead of being replaced after. A window that is slow to take its new size is not waited for: it is shown once it is ready, or, if the animation ends first, waited for with the ghost over it and then faded out over a few frames. Windows that are minimized or gone are not ghosted.
91 lines
2.1 KiB
TOML
91 lines
2.1 KiB
TOML
[workspace]
|
|
|
|
resolver = "2"
|
|
members = [
|
|
"komorebi",
|
|
"komorebi-client",
|
|
"komorebi-gui",
|
|
"komorebi-layouts",
|
|
"komorebi-scrolling",
|
|
"komorebic",
|
|
"komorebic-no-console",
|
|
"komorebi-bar",
|
|
"komorebi-themes",
|
|
"komorebi-shortcuts",
|
|
]
|
|
|
|
[workspace.dependencies]
|
|
clap = { version = "4", features = ["derive", "wrap_help"] }
|
|
chrono-tz = "0.10"
|
|
chrono = "0.4"
|
|
crossbeam-channel = "0.5"
|
|
crossbeam-utils = "0.8"
|
|
color-eyre = "0.6"
|
|
eframe = "0.33"
|
|
egui_extras = "0.33"
|
|
dirs = "6"
|
|
dunce = "1"
|
|
hotwatch = "0.5"
|
|
schemars = "1.1"
|
|
lazy_static = "1"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = { package = "serde_json_lenient", version = "0.2" }
|
|
serde_yaml = "0.9"
|
|
strum = { version = "0.28", features = ["derive"] }
|
|
tracing = "0.1"
|
|
tracing-appender = "0.2"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
parking_lot = "0.12"
|
|
paste = "1"
|
|
sysinfo = "0.39"
|
|
uds_windows = "1"
|
|
win32-display-data = { git = "https://github.com/LGUG2Z/win32-display-data", rev = "8c42d8db257d30fe95bc98c2e5cd8f75da861021" }
|
|
windows-numerics = { version = "0.3" }
|
|
windows-implement = { version = "0.60" }
|
|
windows-interface = { version = "0.59" }
|
|
windows-core = { version = "0.62" }
|
|
shadow-rs = "2"
|
|
which = "8"
|
|
|
|
[workspace.dependencies.windows]
|
|
version = "0.62"
|
|
features = [
|
|
"Foundation_Numerics",
|
|
"Win32_Devices",
|
|
"Win32_Devices_Display",
|
|
"Win32_System_Com",
|
|
"Win32_UI_Shell_Common", # for IObjectArray
|
|
"Win32_Foundation",
|
|
"Win32_Globalization",
|
|
"Win32_Graphics_Dwm",
|
|
"Win32_Graphics_Gdi",
|
|
"Win32_Storage_Xps",
|
|
"Win32_Graphics_Direct2D",
|
|
"Win32_Graphics_Direct2D_Common",
|
|
"Win32_Graphics_Dxgi_Common",
|
|
"Win32_System_LibraryLoader",
|
|
"Win32_System_Power",
|
|
"Win32_System_RemoteDesktop",
|
|
"Win32_System_Threading",
|
|
"Win32_UI_Accessibility",
|
|
"Win32_UI_HiDpi",
|
|
"Win32_UI_Input_KeyboardAndMouse",
|
|
"Win32_UI_Shell",
|
|
"Win32_UI_Shell_Common",
|
|
"Win32_UI_WindowsAndMessaging",
|
|
"Win32_System_SystemServices",
|
|
"Win32_System_WindowsProgramming",
|
|
"Media",
|
|
"Media_Control",
|
|
]
|
|
|
|
[profile.release-opt]
|
|
inherits = "release"
|
|
lto = true
|
|
panic = "abort"
|
|
codegen-units = 1
|
|
strip = true
|
|
|
|
[workspace.metadata.crane]
|
|
name = "komorebi-workspace"
|