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  }