go-tg-screenshot-bot
81 строка · 1.4 Кб
1//go:build !s390x && !ppc64le && !darwin && !windows && (linux || freebsd || openbsd || netbsd)
2
3package screenshot
4
5import (
6"github.com/jezek/xgb"
7"github.com/jezek/xgb/xinerama"
8"image"
9)
10
11// NumActiveDisplays returns the number of active displays.
12func NumActiveDisplays() (num int) {
13defer func() {
14e := recover()
15if e != nil {
16num = 0
17}
18}()
19
20c, err := xgb.NewConn()
21if err != nil {
22return 0
23}
24defer c.Close()
25
26err = xinerama.Init(c)
27if err != nil {
28return 0
29}
30
31reply, err := xinerama.QueryScreens(c).Reply()
32if err != nil {
33return 0
34}
35
36num = int(reply.Number)
37return num
38}
39
40// GetDisplayBounds returns the bounds of displayIndex'th display.
41// The main display is displayIndex = 0.
42func GetDisplayBounds(displayIndex int) (rect image.Rectangle) {
43defer func() {
44e := recover()
45if e != nil {
46rect = image.Rectangle{}
47}
48}()
49
50c, err := xgb.NewConn()
51if err != nil {
52return image.Rectangle{}
53}
54defer c.Close()
55
56err = xinerama.Init(c)
57if err != nil {
58return image.Rectangle{}
59}
60
61reply, err := xinerama.QueryScreens(c).Reply()
62if err != nil {
63return image.Rectangle{}
64}
65
66if displayIndex >= int(reply.Number) {
67return image.Rectangle{}
68}
69
70primary := reply.ScreenInfo[0]
71x0 := int(primary.XOrg)
72y0 := int(primary.YOrg)
73
74screen := reply.ScreenInfo[displayIndex]
75x := int(screen.XOrg) - x0
76y := int(screen.YOrg) - y0
77w := int(screen.Width)
78h := int(screen.Height)
79rect = image.Rect(x, y, x+w, y+h)
80return rect
81}
82