Simplify borderless setup to fix input handling
This commit is contained in:
parent
8053dc297a
commit
f09da5018f
74
app/app.py
74
app/app.py
|
|
@ -5,7 +5,6 @@ from __future__ import annotations
|
||||||
import ctypes
|
import ctypes
|
||||||
import platform
|
import platform
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
from ctypes import wintypes
|
|
||||||
from importlib import resources
|
from importlib import resources
|
||||||
|
|
||||||
from .gui import ColorPickerMixin, ExclusionMixin, ThemeMixin, UIBuilderMixin
|
from .gui import ColorPickerMixin, ExclusionMixin, ThemeMixin, UIBuilderMixin
|
||||||
|
|
@ -85,17 +84,16 @@ class ICRAApp(
|
||||||
default_y = (screen_height - default_height) // 4
|
default_y = (screen_height - default_height) // 4
|
||||||
self._window_geometry = f"{default_width}x{default_height}+{default_x}+{default_y}"
|
self._window_geometry = f"{default_width}x{default_height}+{default_x}+{default_y}"
|
||||||
self._is_maximized = True
|
self._is_maximized = True
|
||||||
self._use_overrideredirect = platform.system() != "Windows"
|
self._use_overrideredirect = True
|
||||||
self.root.geometry(f"{screen_width}x{screen_height}+0+0")
|
self.root.geometry(f"{screen_width}x{screen_height}+0+0")
|
||||||
self.root.configure(bg="#f2f2f7")
|
self.root.configure(bg="#f2f2f7")
|
||||||
if self._use_overrideredirect:
|
try:
|
||||||
|
self.root.overrideredirect(True)
|
||||||
|
except Exception:
|
||||||
try:
|
try:
|
||||||
self.root.overrideredirect(True)
|
self.root.attributes("-type", "splash")
|
||||||
except Exception:
|
except Exception:
|
||||||
try:
|
pass
|
||||||
self.root.attributes("-type", "splash")
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
self._window_icon_ref = None
|
self._window_icon_ref = None
|
||||||
self._apply_window_icon()
|
self._apply_window_icon()
|
||||||
self._init_window_chrome()
|
self._init_window_chrome()
|
||||||
|
|
@ -153,15 +151,9 @@ class ICRAApp(
|
||||||
def _init_window_chrome(self) -> None:
|
def _init_window_chrome(self) -> None:
|
||||||
"""Configure a borderless window while retaining a taskbar entry."""
|
"""Configure a borderless window while retaining a taskbar entry."""
|
||||||
try:
|
try:
|
||||||
if platform.system() == "Windows":
|
self.root.bind("<Map>", self._restore_borderless)
|
||||||
self.root.after(0, self._apply_windows_borderless_style)
|
self.root.after(0, self._restore_borderless)
|
||||||
self.root.after(0, self._ensure_taskbar_entry)
|
self.root.after(0, self._ensure_taskbar_entry)
|
||||||
self.root.bind("<Map>", lambda _e: self._apply_windows_borderless_style(), add="+")
|
|
||||||
self.root.bind("<Map>", lambda _e: self._ensure_taskbar_entry(), add="+")
|
|
||||||
else:
|
|
||||||
self.root.bind("<Map>", self._restore_borderless)
|
|
||||||
self.root.after(0, self._restore_borderless)
|
|
||||||
self.root.after(0, self._ensure_taskbar_entry)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -173,54 +165,6 @@ class ICRAApp(
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _apply_windows_borderless_style(self) -> None:
|
|
||||||
try:
|
|
||||||
if platform.system() != "Windows":
|
|
||||||
return
|
|
||||||
|
|
||||||
hwnd = self.root.winfo_id()
|
|
||||||
if not hwnd:
|
|
||||||
self.root.after(50, self._apply_windows_borderless_style)
|
|
||||||
return
|
|
||||||
|
|
||||||
user32 = ctypes.windll.user32 # type: ignore[attr-defined]
|
|
||||||
GWL_STYLE = -16
|
|
||||||
WS_CAPTION = 0x00C00000
|
|
||||||
WS_THICKFRAME = 0x00040000
|
|
||||||
WS_MINIMIZEBOX = 0x00020000
|
|
||||||
WS_MAXIMIZEBOX = 0x00010000
|
|
||||||
WS_SYSMENU = 0x00080000
|
|
||||||
SWP_NOSIZE = 0x0001
|
|
||||||
SWP_NOMOVE = 0x0002
|
|
||||||
SWP_NOZORDER = 0x0004
|
|
||||||
SWP_FRAMECHANGED = 0x0020
|
|
||||||
|
|
||||||
set_window_long = getattr(user32, "SetWindowLongPtrW", user32.SetWindowLongW)
|
|
||||||
get_window_long = getattr(user32, "GetWindowLongPtrW", user32.GetWindowLongW)
|
|
||||||
ptr_type = ctypes.c_longlong if ctypes.sizeof(ctypes.c_void_p) == 8 else ctypes.c_long
|
|
||||||
get_window_long.restype = ptr_type # type: ignore[attr-defined]
|
|
||||||
get_window_long.argtypes = [wintypes.HWND, ctypes.c_int] # type: ignore[attr-defined]
|
|
||||||
set_window_long.restype = ptr_type # type: ignore[attr-defined]
|
|
||||||
set_window_long.argtypes = [wintypes.HWND, ctypes.c_int, ptr_type] # type: ignore[attr-defined]
|
|
||||||
|
|
||||||
style = get_window_long(hwnd, GWL_STYLE)
|
|
||||||
new_style = style & ~(
|
|
||||||
WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU
|
|
||||||
)
|
|
||||||
if new_style != style:
|
|
||||||
set_window_long(hwnd, GWL_STYLE, ptr_type(new_style))
|
|
||||||
user32.SetWindowPos(
|
|
||||||
hwnd,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED,
|
|
||||||
)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def start_app() -> None:
|
def start_app() -> None:
|
||||||
"""Entry point used by the CLI script."""
|
"""Entry point used by the CLI script."""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue