Пример #1
0
// same as above, but moveresize instead of just move at the first step,
// then resize to the provided w/h instead of a snapshotted one
// this implementation differs from Move in that it makes no effort to be end-synchronous
// This function waits only on the window's inner geometry resizing, not on actual movement occuring
func MoveResize(win *xwindow.Window, x, y, width, height int) error {
	// snapshot window dimensions
	base, err := win.Geometry()
	if err != nil {
		return err
	}

	// move window then wait...
	err = win.WMMoveResize(x, y, width, height)
	if err != nil {
		return err
	}
	err = PollFor(win, GeometryDiffers(base))
	if err != nil {
		return err
	}

	// check that the new geometry is what we requested
	// this may be inadvisable: what about window hints?
	geom, err := win.Geometry()
	if err != nil {
		return err
	}
	if geom.Width() != width || geom.Height() != height {
		// something derped! resize to make it right!
		// if window hints constrained us, this won't upset them
		log.Println("MoveResize: resizing again after incorrect new dimensions")
		err = win.WMResize(width, height)
		if err != nil {
			return err
		}
	}

	return nil
}