This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
|
||||
"github.com/BurntSushi/xgb"
|
||||
"github.com/BurntSushi/xgb/xproto"
|
||||
)
|
||||
|
||||
const (
|
||||
width = 1920
|
||||
height = 1080
|
||||
)
|
||||
|
||||
func main() {
|
||||
conn, err := xgb.NewConn()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
screen := xproto.Setup(conn).DefaultScreen(conn)
|
||||
window, err := xproto.NewWindowId(conn)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
values := uint32(xproto.CwBackPixel | xproto.CwEventMask)
|
||||
xproto.CreateWindow(conn, screen.RootDepth, window, screen.Root, 0, 0, width, height, 0,
|
||||
xproto.WindowClassInputOutput, screen.RootVisual, values,
|
||||
[]uint32{screen.BlackPixel, xproto.EventMaskExposure})
|
||||
xproto.MapWindow(conn, window)
|
||||
conn.Sync()
|
||||
|
||||
// XFCE owns the actual fullscreen policy; use its existing wmctrl helper.
|
||||
_ = exec.Command("wmctrl", "-i", "-r", fmt.Sprintf("0x%08x", window), "-b", "add,fullscreen").Run()
|
||||
|
||||
gc, err := xproto.NewGcontextId(conn)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
xproto.CreateGC(conn, gc, xproto.Drawable(window), xproto.GcForeground|xproto.GcBackground,
|
||||
[]uint32{screen.WhitePixel, screen.BlackPixel})
|
||||
font := xproto.Font(window)
|
||||
xproto.OpenFont(conn, font, uint16(len("fixed")), "fixed")
|
||||
xproto.ChangeGC(conn, gc, xproto.GcFont, []uint32{uint32(font)})
|
||||
|
||||
draw := func() {
|
||||
xproto.ClearArea(conn, false, window, 0, 0, width, height)
|
||||
message := "Brak polaczenia WFB"
|
||||
xproto.ImageText8(conn, byte(len(message)), xproto.Drawable(window), gc, 32, 56, message)
|
||||
conn.Sync()
|
||||
}
|
||||
draw()
|
||||
|
||||
for {
|
||||
event, err := conn.WaitForEvent()
|
||||
if err != nil {
|
||||
if os.IsTimeout(err) {
|
||||
continue
|
||||
}
|
||||
return
|
||||
}
|
||||
if _, ok := event.(xproto.ExposeEvent); ok {
|
||||
draw()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
@@ -37,6 +38,15 @@ func main() {
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
if display, err := startDisplay(); err != nil {
|
||||
log.Printf("display start deferred: %v", err)
|
||||
} else {
|
||||
defer func() {
|
||||
_ = display.Process.Signal(os.Interrupt)
|
||||
_ = display.Wait()
|
||||
}()
|
||||
}
|
||||
|
||||
var video *videoController
|
||||
if cfg.Video.Enabled {
|
||||
video = newVideoController(cfg.Video.Command)
|
||||
@@ -70,6 +80,16 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
func startDisplay() (*exec.Cmd, error) {
|
||||
cmd := exec.Command("runuser", "-u", "orangepi", "--", "env",
|
||||
"DISPLAY=:0", "XAUTHORITY=/home/orangepi/.Xauthority", "groundstation-display")
|
||||
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
|
||||
if err := cmd.Start(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func setupLogger(cfg config.Config) (*log.Logger, func(), error) {
|
||||
writers := []io.Writer{os.Stdout}
|
||||
closeLog := func() {}
|
||||
|
||||
Reference in New Issue
Block a user