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 +}