82 lines
1.4 KiB
Go
82 lines
1.4 KiB
Go
//go:build !s390x && !ppc64le && !darwin && !windows && (linux || freebsd || openbsd || netbsd)
|
|
|
|
package screenshot
|
|
|
|
import (
|
|
"github.com/jezek/xgb"
|
|
"github.com/jezek/xgb/xinerama"
|
|
"image"
|
|
)
|
|
|
|
// NumActiveDisplays returns the number of active displays.
|
|
func NumActiveDisplays() (num int) {
|
|
defer func() {
|
|
e := recover()
|
|
if e != nil {
|
|
num = 0
|
|
}
|
|
}()
|
|
|
|
c, err := xgb.NewConn()
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
defer c.Close()
|
|
|
|
err = xinerama.Init(c)
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
|
|
reply, err := xinerama.QueryScreens(c).Reply()
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
|
|
num = int(reply.Number)
|
|
return num
|
|
}
|
|
|
|
// GetDisplayBounds returns the bounds of displayIndex'th display.
|
|
// The main display is displayIndex = 0.
|
|
func GetDisplayBounds(displayIndex int) (rect image.Rectangle) {
|
|
defer func() {
|
|
e := recover()
|
|
if e != nil {
|
|
rect = image.Rectangle{}
|
|
}
|
|
}()
|
|
|
|
c, err := xgb.NewConn()
|
|
if err != nil {
|
|
return image.Rectangle{}
|
|
}
|
|
defer c.Close()
|
|
|
|
err = xinerama.Init(c)
|
|
if err != nil {
|
|
return image.Rectangle{}
|
|
}
|
|
|
|
reply, err := xinerama.QueryScreens(c).Reply()
|
|
if err != nil {
|
|
return image.Rectangle{}
|
|
}
|
|
|
|
if displayIndex >= int(reply.Number) {
|
|
return image.Rectangle{}
|
|
}
|
|
|
|
primary := reply.ScreenInfo[0]
|
|
x0 := int(primary.XOrg)
|
|
y0 := int(primary.YOrg)
|
|
|
|
screen := reply.ScreenInfo[displayIndex]
|
|
x := int(screen.XOrg) - x0
|
|
y := int(screen.YOrg) - y0
|
|
w := int(screen.Width)
|
|
h := int(screen.Height)
|
|
rect = image.Rect(x, y, x+w, y+h)
|
|
return rect
|
|
}
|