func changeWorkspaceIfNeeded(xid xproto.Window) error { desktopNum, err := xprop.PropValNum(xprop.GetProperty(XU, xid, "_NET_WM_DESKTOP")) if err != nil { return fmt.Errorf("Get _NET_WM_DESKTOP failed: %s", err) } currentDesktop, err := ewmh.CurrentDesktopGet(XU) if err != nil { return fmt.Errorf("Get _NET_CURRENT_DESKTOP failed: %v", err) } if currentDesktop == desktopNum { return fmt.Errorf("No need to change workspace, the current desktop is already %v", currentDesktop) } timeStamp, err := ewmh.WmUserTimeGet(XU, xid) if err != nil { logger.Warningf("Get timestamp of 0x%x failed: %v", uint32(xid), err) } err = ewmh.ClientEvent(XU, XU.RootWin(), "_NET_CURRENT_DESKTOP", int(desktopNum), int(timeStamp)) if err != nil { return fmt.Errorf("Send ClientMessage Failed: %v", err) } return nil }
func main() { logger := log.NewLogger("dde-daemon/desktop-toggle") logger.BeginTracing() defer logger.EndTracing() X, err := xgbutil.NewConn() if err != nil { logger.Error("New xgbutil connection failed: ", err) panic(err) } if ret, err := ewmh.ShowingDesktopGet(X); err == nil { // !!! NOT using ewmh.ShowingDesktopReq // because ewmh.ShowingDesktopReq passes a uint argument, // and int is used on xevent.NewClientMessage. logger.Info("Show Desktop Status: ", ret) var showInt int if ret { showInt = 0 } else { showInt = 1 } ewmh.ClientEvent(X, X.RootWin(), "_NET_SHOWING_DESKTOP", showInt) } X.Sync() }
// sendClientMessages is a goroutine that sends client messages to the root // window. We then listen to them later as a demonstration of responding to // X events. (They are sent with SubstructureNotify and SubstructureRedirect // masks set. So in order to receive them, we'll have to explicitly listen // to events of that type on the root window.) func xSource(X *xgbutil.XUtil) { i := 1 for { ewmh.ClientEvent(X, X.RootWin(), "NOOP", i) i++ time.Sleep(200 * time.Millisecond) } }
func iconifyWindow(xid xproto.Window) { ewmh.ClientEvent(XU, xid, "WM_CHANGE_STATE", icccm.StateIconic) }
func main() { X, err := xgbutil.Dial("") if err != nil { logger.Error.Println(err) logger.Error.Println("Error connecting to X, quitting...") return } defer X.Conn().Close() // Get command from arguments flag.Parse() if flag.NArg() < 1 { fmt.Fprintln(os.Stderr, "Usage: wingo-cmd CommandName [CommandArgs]") return } commandPieces := flag.Args() cmdName := commandPieces[0] cmdFull := strings.Join(commandPieces, " ") // make sure we start with failure cmdusage.StatusSet(X, false) success := false // Set the command before sending request to run command. err = cmdusage.CmdSet(X, cmdFull) if err != nil { logger.Error.Printf("Could not set command: %s", err) return } // Issue the command! ewmh.ClientEvent(X, X.RootWin(), "_WINGO_CMD") // Now let's set up a handler to detect when the status changes xevent.PropertyNotifyFun( func(X *xgbutil.XUtil, ev xevent.PropertyNotifyEvent) { name, err := xprop.AtomName(X, ev.Atom) if err != nil { logger.Warning.Println( "Could not get property atom name for", ev.Atom) return } if name == "_WINGO_CMD_STATUS" { success = cmdusage.StatusGet(X) if success { os.Exit(0) } else { logger.Warning.Printf("Error running '%s'", cmdFull) cmdusage.ShowUsage(cmdName) os.Exit(1) } } }).Connect(X, X.RootWin()) // Listen to Root property change events xwindow.Listen(X, X.RootWin(), xproto.EventMaskPropertyChange) go xevent.Main(X) time.Sleep(time.Second * 5) logger.Error.Println( "Timed out while trying to issue command to Wingo. " + "Are you sure Wingo is running?") os.Exit(1) }