From a33f319656ecdcd22a870e2b7f71ae0cac52de7f Mon Sep 17 00:00:00 2001 From: fuleyi Date: Tue, 11 Mar 2025 17:01:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=89=E6=8C=87=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=EF=BC=8C=E6=9C=80=E5=A4=A7=E5=8C=96=E5=92=8C=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E5=88=86=E5=BC=80=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 最大化和恢复窗口,窗管是一个接口,使用x11重写这块逻辑,目前存在问题:左右分屏,不能恢复窗管 Log: 三指滑动,最大化和恢复窗口分开设置 pms: BUG-302527 --- clipboard1/manager.go | 4 +++- gesture1/gesture_action.go | 10 ++++++++-- gesture1/utils.go | 40 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/clipboard1/manager.go b/clipboard1/manager.go index 26b8c6d5a..eb4ffcf6f 100644 --- a/clipboard1/manager.go +++ b/clipboard1/manager.go @@ -7,6 +7,7 @@ package clipboard import ( "bytes" "errors" + "flag" "fmt" "strings" "sync" @@ -770,7 +771,8 @@ func (m *Manager) finishSelectionRequest(ev *x.SelectionRequestEvent, success bo logger.Warning(err) } - if logger.GetLogLevel() == log.LevelDebug { + // debug环境中,单元测试不执行下面的逻辑 + if logger.GetLogLevel() == log.LevelDebug && flag.Lookup("test.v") == nil { successStr := "success" if !success { successStr = "fail" diff --git a/gesture1/gesture_action.go b/gesture1/gesture_action.go index d8b49bf59..6b324c4df 100644 --- a/gesture1/gesture_action.go +++ b/gesture1/gesture_action.go @@ -36,7 +36,7 @@ const ( func (m *Manager) initActions() { actions = []*actionInfo{ {"MaximizeWindow", gettext.Tr("Maximize Window"), m.doToggleMaximize}, - {"RestoreWindow", gettext.Tr("Restore Window"), m.doToggleMaximize}, + {"RestoreWindow", gettext.Tr("Restore Window"), m.doToggleRestore}, {"SplitWindowLeft", gettext.Tr("Current Window Left Split"), m.doTileActiveWindowLeft}, {"SplitWindowRight", gettext.Tr("Current Window Right Split"), m.doTileActiveWindowRight}, {"ShowMultiTask", gettext.Tr("Show multitasking view"), m.doShowMultiTasking}, @@ -108,7 +108,13 @@ func (m *Manager) doHandle4Or5FingersSwipeDown() error { } func (m *Manager) doToggleMaximize() error { - return m.wm.PerformAction(0, wmActionToggleMaximize) + setActiveWindowMaxMin(true) + return nil +} + +func (m *Manager) doToggleRestore() error { + setActiveWindowMaxMin(false) + return nil } func (m *Manager) doMinimize() error { diff --git a/gesture1/utils.go b/gesture1/utils.go index 0f8deda7c..58cd8c681 100644 --- a/gesture1/utils.go +++ b/gesture1/utils.go @@ -126,3 +126,43 @@ func isInWindowBlacklist(cmd string, list []string) bool { } return false } + +func setActiveWindowMaxMin(max bool) { + if xconn == nil { + return + } + focus, err := x.GetInputFocus(xconn).Reply(xconn) + if err != nil { + logger.Warning("Failed to get current focus window:", err) + return + } + win := focus.Focus + states, err := ewmh.GetWMState(xconn, win).Reply(xconn) + if err != nil { + logger.Warning("Failed to get current window state:", err) + return + } + // 当前焦点 + focusAtom, _ := xconn.GetAtom("_NET_WM_STATE_FOCUSED") + // 水平垂直最大属性 + vertAtom, _ := xconn.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT") + horzAtom, _ := xconn.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ") + for _, state := range states { + // 如果焦点在当前窗口 + if state == focusAtom { + var action ewmh.WMStateAction + if max { + action = ewmh.WMStateAdd + } else { + action = ewmh.WMStateRemove + } + err = ewmh.RequestChangeWMState(xconn, win, action, horzAtom, vertAtom, 0).Check(xconn) + if err != nil { + logger.Warning("Failed to set active window:", err) + } + return + } + } + logger.Warningf("window %v does not focused", win) + return +}