github.com/secoba/wails/v2@v2.6.4/internal/frontend/desktop/linux/screen.go (about) 1 //go:build linux 2 // +build linux 3 4 package linux 5 6 /* 7 #cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 8 #cgo CFLAGS: -w 9 #include <stdio.h> 10 #include "webkit2/webkit2.h" 11 #include "gtk/gtk.h" 12 #include "gdk/gdk.h" 13 14 typedef struct Screen { 15 int isCurrent; 16 int isPrimary; 17 int height; 18 int width; 19 int scale; 20 } Screen; 21 22 int GetNMonitors(GtkWindow *window){ 23 GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); 24 GdkDisplay *display = gdk_window_get_display(gdk_window); 25 return gdk_display_get_n_monitors(display); 26 } 27 28 Screen GetNThMonitor(int monitor_num, GtkWindow *window){ 29 GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); 30 GdkDisplay *display = gdk_window_get_display(gdk_window); 31 GdkMonitor *monitor = gdk_display_get_monitor(display,monitor_num); 32 GdkMonitor *currentMonitor = gdk_display_get_monitor_at_window(display,gdk_window); 33 Screen screen; 34 GdkRectangle geometry; 35 gdk_monitor_get_geometry(monitor,&geometry); 36 screen.isCurrent = currentMonitor==monitor; 37 screen.isPrimary = gdk_monitor_is_primary(monitor); 38 screen.height = geometry.height; 39 screen.width = geometry.width; 40 screen.scale = gdk_monitor_get_scale_factor(monitor); 41 return screen; 42 } 43 */ 44 import "C" 45 import ( 46 "sync" 47 48 "github.com/pkg/errors" 49 "github.com/secoba/wails/v2/internal/frontend" 50 ) 51 52 type Screen = frontend.Screen 53 54 func GetAllScreens(window *C.GtkWindow) ([]Screen, error) { 55 if window == nil { 56 return nil, errors.New("window is nil, cannot perform screen operations") 57 } 58 var wg sync.WaitGroup 59 var screens []Screen 60 wg.Add(1) 61 invokeOnMainThread(func() { 62 numMonitors := C.GetNMonitors(window) 63 for i := 0; i < int(numMonitors); i++ { 64 cMonitor := C.GetNThMonitor(C.int(i), window) 65 66 screen := Screen{ 67 IsCurrent: cMonitor.isCurrent == 1, 68 IsPrimary: cMonitor.isPrimary == 1, 69 Width: int(cMonitor.width), 70 Height: int(cMonitor.height), 71 72 Size: frontend.ScreenSize{ 73 Width: int(cMonitor.width), 74 Height: int(cMonitor.height), 75 }, 76 PhysicalSize: frontend.ScreenSize{ 77 Width: int(cMonitor.width * cMonitor.scale), 78 Height: int(cMonitor.height * cMonitor.scale), 79 }, 80 } 81 screens = append(screens, screen) 82 } 83 84 wg.Done() 85 }) 86 wg.Wait() 87 return screens, nil 88 }