// moveToProperHead is used to make sure a newly managed client is placed on // the correct monitor. // // Before adding the client into our data structures, we should first // make sure it's located on the right head. We do this by finding where // it *is* placed and convert it into the coordinate space of where it // *should* be placed. // // Note that presumedWorkspace MUST be visible. func (c *Client) moveToProperHead(presumedWorkspace workspace.Workspacer) { if c.PrimaryType() != TypeNormal { return } if _, ok := presumedWorkspace.(*workspace.Sticky); ok { return } if !presumedWorkspace.IsVisible() { return } oughtHeadGeom := presumedWorkspace.HeadGeom() cgeom := c.frame.Geom() if wrk := wm.Heads.FindMostOverlap(cgeom); wrk != nil { if wrk != presumedWorkspace { isHeadGeom := wrk.HeadGeom() ngeom := heads.Convert(cgeom, isHeadGeom, oughtHeadGeom) c.MoveResizeValid( ngeom.X(), ngeom.Y(), ngeom.Width(), ngeom.Height()) } } else { // If we're here, that means the client *ought* to belong to a visible // workspace but it could not be found to overlap with *any* visible // workspace. Therefore, just use a hammer and move it to the root // coordinates of the presumed workspace. geom := presumedWorkspace.Geom() c.Move(geom.X(), geom.Y()) } }