mirror of
https://github.com/EnumeratedDev/stormfetch.git
synced 2026-09-15 23:46:12 +00:00
Separate monitor detection code into different program
This commit is contained in:
@@ -1,24 +1,44 @@
|
|||||||
# Installation paths
|
# Installation paths
|
||||||
PREFIX ?= /usr/local
|
PREFIX ?= /usr/local
|
||||||
BINDIR ?= $(PREFIX)/bin
|
BINDIR ?= $(PREFIX)/bin
|
||||||
|
LIBEXECDIR ?= $(PREFIX)/libexec
|
||||||
SYSCONFDIR := $(PREFIX)/etc
|
SYSCONFDIR := $(PREFIX)/etc
|
||||||
|
|
||||||
# Compilers and tools
|
# Compilers and tools
|
||||||
GO ?= go
|
GO ?= go
|
||||||
|
|
||||||
|
# Compiler flags
|
||||||
|
GOOS ?= $(shell $(GO) env | grep '^GOOS' | cut -d'=' -f2 | tr -d "'")
|
||||||
|
GOARCH ?= $(shell $(GO) env | grep '^GOARCH' | cut -d'=' -f2 | tr -d "'")
|
||||||
|
LDFLAGS ?= -w
|
||||||
|
|
||||||
# Build-time variables
|
# Build-time variables
|
||||||
VERSION ?= $(shell git describe --tags --dirty)
|
VERSION ?= $(shell git describe --tags --dirty)
|
||||||
|
|
||||||
build:
|
build: build-stormfetch build-stormfetch-monitor-detection
|
||||||
mkdir -p build
|
|
||||||
cd src; $(GO) build -ldflags "-w -X 'main.StormfetchVersion=$(VERSION)' -X 'main.SystemConfigDir=$(SYSCONFDIR)'" -o ../build/stormfetch stormfetch
|
|
||||||
|
|
||||||
install: build/stormfetch config/
|
build-stormfetch:
|
||||||
# Create directoriy
|
install -d build
|
||||||
|
cd src/stormfetch; GOOS=$(GOOS) GOARCH=$(GOARCH) $(GO) build -ldflags "$(LDFLAGS) -X 'main.StormfetchVersion=$(VERSION)' -X 'main.SystemConfigDir=$(SYSCONFDIR)' -X 'main.LibexecDir=$(LIBEXECDIR)'" -o ../../build/stormfetch
|
||||||
|
|
||||||
|
build-stormfetch-monitor-detection:
|
||||||
|
install -d build
|
||||||
|
cd src/stormfetch-monitor-detection; GOOS=$(GOOS) GOARCH=$(GOARCH) $(GO) build -ldflags "$(LDFLAGS)" -o ../../build/stormfetch-monitor-detection
|
||||||
|
|
||||||
|
install: install-stormfetch install-stormfetch-monitor-detection install-config
|
||||||
|
|
||||||
|
install-stormfetch: build/stormfetch
|
||||||
|
# Create directory
|
||||||
install -dm755 $(DESTDIR)$(BINDIR)
|
install -dm755 $(DESTDIR)$(BINDIR)
|
||||||
# Install binary
|
# Install binary
|
||||||
install -m755 build/stormfetch $(DESTDIR)$(BINDIR)/stormfetch
|
install -m755 build/stormfetch $(DESTDIR)$(BINDIR)/stormfetch
|
||||||
|
|
||||||
|
install-stormfetch-monitor-detection: build/stormfetch-monitor-detection
|
||||||
|
# Create directory
|
||||||
|
install -dm755 $(DESTDIR)$(LIBEXECDIR)
|
||||||
|
# Install binary
|
||||||
|
install -m755 build/stormfetch-monitor-detection $(DESTDIR)$(LIBEXECDIR)/stormfetch-monitor-detection
|
||||||
|
|
||||||
install-config:
|
install-config:
|
||||||
# Create directory
|
# Create directory
|
||||||
install -dm755 $(DESTDIR)$(SYSCONFDIR)
|
install -dm755 $(DESTDIR)$(SYSCONFDIR)
|
||||||
@@ -27,9 +47,10 @@ install-config:
|
|||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
-rm -f $(DESTDIR)$(BINDIR)/stormfetch
|
-rm -f $(DESTDIR)$(BINDIR)/stormfetch
|
||||||
|
-rm -f $(DESTDIR)$(LIBEXEDIR)/stormfetch-monitor-detection
|
||||||
-rm -rf $(DESTDIR)$(SYSCONFDIR)/stormfetch
|
-rm -rf $(DESTDIR)$(SYSCONFDIR)/stormfetch
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -r build/
|
rm -r build/
|
||||||
|
|
||||||
.PHONY: build install install-config uninstall clean
|
.PHONY: build build-stormfetch build-stormfetch-monitor-detection install install-config uninstall clean
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
module stormfetch-monitor-detection
|
||||||
|
|
||||||
|
go 1.24.0
|
||||||
|
|
||||||
|
require github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 h1:ddtotcEXIT7dFhSeXIWjK8YMFYl5bB2NdYQwgv6Uqjk=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/go-gl/glfw/v3.3/glfw"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
err := glfw.Init()
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, monitor := range glfw.GetMonitors() {
|
||||||
|
mode := monitor.GetVideoMode()
|
||||||
|
|
||||||
|
fmt.Print(monitor.GetName() + ",")
|
||||||
|
fmt.Print(strconv.Itoa(mode.Width) + ",")
|
||||||
|
fmt.Print(strconv.Itoa(mode.Height) + ",")
|
||||||
|
fmt.Print(strconv.Itoa(mode.RefreshRate))
|
||||||
|
fmt.Println()
|
||||||
|
}
|
||||||
|
defer glfw.Terminate()
|
||||||
|
}
|
||||||
@@ -3,7 +3,6 @@ module stormfetch
|
|||||||
go 1.24.0
|
go 1.24.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728
|
|
||||||
github.com/jackmordaunt/ghw v1.0.5
|
github.com/jackmordaunt/ghw v1.0.5
|
||||||
github.com/mitchellh/go-ps v1.0.0
|
github.com/mitchellh/go-ps v1.0.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
@@ -1,13 +1,5 @@
|
|||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0=
|
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVAvPM0/R+8g7XRwQnHatO0KAuVcwHo8q9W8=
|
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
|
|
||||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||||
github.com/jackmordaunt/ghw v1.0.4 h1:as+COFuPuXaNQC3WqzoHS/E2JYWZU7gN8ompNTUxNxs=
|
|
||||||
github.com/jackmordaunt/ghw v1.0.4/go.mod h1:4dReYvJ36CoAzIxlEx8du25Qi/YqKYvEGE9QJoRXiK8=
|
|
||||||
github.com/jackmordaunt/ghw v1.0.5 h1:3rTXwu0D9RkungV7/WlhC8HVuDlPaq0aKY8u0I51jLY=
|
github.com/jackmordaunt/ghw v1.0.5 h1:3rTXwu0D9RkungV7/WlhC8HVuDlPaq0aKY8u0I51jLY=
|
||||||
github.com/jackmordaunt/ghw v1.0.5/go.mod h1:VpFlLXnJErgoRttR3WOxun4v5EE8/xfB4cK26G5q2U0=
|
github.com/jackmordaunt/ghw v1.0.5/go.mod h1:VpFlLXnJErgoRttR3WOxun4v5EE8/xfB4cK26G5q2U0=
|
||||||
github.com/jackmordaunt/pcidb v1.0.1 h1:uLLZa6kD5P39r2cwMyJJkxmuHfH9Wq19gYQEbYcB0Z4=
|
github.com/jackmordaunt/pcidb v1.0.1 h1:uLLZa6kD5P39r2cwMyJJkxmuHfH9Wq19gYQEbYcB0Z4=
|
||||||
@@ -21,10 +13,7 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
|
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
|
||||||
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
|
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
|
|
||||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
||||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
@@ -3,11 +3,12 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path"
|
||||||
"slices"
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-gl/glfw/v3.3/glfw"
|
|
||||||
"github.com/jackmordaunt/ghw"
|
"github.com/jackmordaunt/ghw"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ type GPU struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Monitor struct {
|
type Monitor struct {
|
||||||
|
Name string
|
||||||
Width int
|
Width int
|
||||||
Height int
|
Height int
|
||||||
RefreshRate int
|
RefreshRate int
|
||||||
@@ -195,22 +197,55 @@ func GetMotherboardModel() string {
|
|||||||
|
|
||||||
func GetMonitors() []Monitor {
|
func GetMonitors() []Monitor {
|
||||||
var monitors []Monitor
|
var monitors []Monitor
|
||||||
|
|
||||||
if GetDisplayProtocol() != "" {
|
if GetDisplayProtocol() != "" {
|
||||||
err := glfw.Init()
|
// Find stormfetch-monitor-detection program
|
||||||
if err != nil {
|
execPath, _ := os.Executable()
|
||||||
panic(err)
|
possiblePaths := []string{
|
||||||
|
path.Join(path.Dir(execPath), "stormfetch-monitor-detection"),
|
||||||
|
path.Join(LibexecDir, "stormfetch-monitor-detection"),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, monitor := range glfw.GetMonitors() {
|
monitorDetectionPath := ""
|
||||||
mode := monitor.GetVideoMode()
|
for _, path := range possiblePaths {
|
||||||
|
if _, err := os.Stat(path); err == nil {
|
||||||
|
monitorDetectionPath = path
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if monitorDetectionPath == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get monitor detection program output
|
||||||
|
output, err := exec.Command(monitorDetectionPath).Output()
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse output
|
||||||
|
for line := range strings.SplitSeq(strings.TrimSpace(string(output)), "\n") {
|
||||||
|
lineSplit := strings.Split(line, ",")
|
||||||
|
if len(lineSplit) != 4 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
name := lineSplit[0]
|
||||||
|
width, err := strconv.Atoi(lineSplit[1])
|
||||||
|
height, err := strconv.Atoi(lineSplit[2])
|
||||||
|
refreshRate, err := strconv.Atoi(lineSplit[3])
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
monitors = append(monitors, Monitor{
|
monitors = append(monitors, Monitor{
|
||||||
Width: mode.Width,
|
Name: name,
|
||||||
Height: mode.Height,
|
Width: width,
|
||||||
RefreshRate: mode.RefreshRate,
|
Height: height,
|
||||||
|
RefreshRate: refreshRate,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
defer glfw.Terminate()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return monitors
|
return monitors
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
// Build-time variables
|
// Build-time variables
|
||||||
var StormfetchVersion = "dev"
|
var StormfetchVersion = "dev"
|
||||||
var SystemConfigDir = "/etc/"
|
var SystemConfigDir = "/etc/"
|
||||||
|
var LibexecDir = "/libexec/"
|
||||||
|
|
||||||
// Flag variables
|
// Flag variables
|
||||||
var ShowVersion = false
|
var ShowVersion = false
|
||||||
@@ -405,15 +405,15 @@ func initializeModuleMap() {
|
|||||||
RegisterModule(dewmModule)
|
RegisterModule(dewmModule)
|
||||||
|
|
||||||
// Monitors module
|
// Monitors module
|
||||||
monitorsModule := StormfetchModule{stormfetchModuleConfig: stormfetchModuleConfig{Name: "monitors", Format: "%3Monitor: %4${MONITOR_WIDTH}x${MONITOR_HEIGHT} ${MONITOR_REFRESH_RATE}Hz"}, Execute: func(sm StormfetchModule) string {
|
monitorsModule := StormfetchModule{stormfetchModuleConfig: stormfetchModuleConfig{Name: "monitors", Format: "%3Monitor ${MONITOR_NAME}: %4${MONITOR_WIDTH}x${MONITOR_HEIGHT} ${MONITOR_REFRESH_RATE}Hz"}, Execute: func(sm StormfetchModule) string {
|
||||||
builder := strings.Builder{}
|
builder := strings.Builder{}
|
||||||
monitors := GetMonitors()
|
monitors := GetMonitors()
|
||||||
|
|
||||||
for i, monitor := range monitors {
|
for _, monitor := range monitors {
|
||||||
expanded := os.Expand(sm.Format, func(s string) string {
|
expanded := os.Expand(sm.Format, func(s string) string {
|
||||||
switch s {
|
switch s {
|
||||||
case "MONITOR_NUM":
|
case "MONITOR_NAME":
|
||||||
return strconv.Itoa(i + 1)
|
return monitor.Name
|
||||||
case "MONITOR_WIDTH":
|
case "MONITOR_WIDTH":
|
||||||
return strconv.Itoa(monitor.Width)
|
return strconv.Itoa(monitor.Width)
|
||||||
case "MONITOR_HEIGHT":
|
case "MONITOR_HEIGHT":
|
||||||
Reference in New Issue
Block a user