From 37cc29e4cd33da4147fc7aa46b696cbc8c32b2e5 Mon Sep 17 00:00:00 2001 From: "ki.sagidullin" Date: Fri, 21 Aug 2026 20:14:43 +0500 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=D0=BD=D0=B0=D1=82=D0=B8=D0=B2?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=D1=83?= =?UTF-8?q?=D0=BC=20=D0=BE=D0=BA=D0=BD=D0=B0=20=D1=87=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=20Win32=20(=D0=BD=D0=B0=D0=B4=20=D0=BF=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D1=8E=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/ui/desktop/maximize_windows.go | 48 +++++++++++++++++++++++++ internal/ui/desktop/window.go | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 internal/ui/desktop/maximize_windows.go diff --git a/internal/ui/desktop/maximize_windows.go b/internal/ui/desktop/maximize_windows.go new file mode 100644 index 0000000..cee9967 --- /dev/null +++ b/internal/ui/desktop/maximize_windows.go @@ -0,0 +1,48 @@ +//go:build cgo + +package desktop + +import ( + "os" + "syscall" + "unsafe" +) + +// Нативный максимум окна через Win32. +// +// Fyne (v2.6) не даёт ни Move, ни Maximize у fyne.Window, поэтому разворот на +// экран (над панелью задач) делаем напрямую через user32: находим HWND нашего +// процесса через EnumWindows и вызываем ShowWindow(SW_MAXIMIZE). +// Только Windows (платформа приложения по спеке — Windows). + +const ( + swMaximize = 9 +) + +var ( + user32 = syscall.NewLazyDLL("user32.dll") + procEnumWindows = user32.NewProc("EnumWindows") + procGetWindowThreadProcID = user32.NewProc("GetWindowThreadProcessId") + procIsWindowVisible = user32.NewProc("IsWindowVisible") + procShowWindow = user32.NewProc("ShowWindow") +) + +func maximizeWindow() { + pid := uint32(os.Getpid()) + + cb := syscall.NewCallback(func(hwnd syscall.Handle, _ uintptr) uintptr { + var winPid uint32 + procGetWindowThreadProcID.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&winPid))) + if winPid != pid { + return 1 // continue перечисление + } + visible, _, _ := procIsWindowVisible.Call(uintptr(hwnd)) + if visible == 0 { + return 1 // continue перечисление + } + procShowWindow.Call(uintptr(hwnd), swMaximize) + return 0 // остановить перечисление + }) + + procEnumWindows.Call(cb, 0) +} diff --git a/internal/ui/desktop/window.go b/internal/ui/desktop/window.go index aa2f726..84c2158 100644 --- a/internal/ui/desktop/window.go +++ b/internal/ui/desktop/window.go @@ -72,7 +72,6 @@ func New(appID string, store ui.Store) *Window { tabSession: map[*container.TabItem]*ui.Session{}, } w.win = fa.NewWindow("Ratatoskr") - w.win.SetFullScreen(true) w.build() w.win.SetCloseIntercept(func() { // Закрытие окна = сворачивание (спец 12.6): Core продолжает работать. @@ -325,6 +324,7 @@ func (w *Window) OnMessage(h chat.Handler) { w.handler = h } // Run показывает окно и запускает Fyne-цикл. Блокирует до Quit. func (w *Window) Run(ctx context.Context) error { w.win.Show() + maximizeWindow() go func() { <-ctx.Done() w.fyneApp.Quit()