Ottenere informazioni sugli schermi disponibili mediante le funzioni del API di X11

Da Gambas-it.org - Wikipedia.

La libreria Xlib dello X Window System Standard, versione 11, consente - fra l'altro - anche di ottenere alcune informazioni in ordine agli schermi disponibili.

Si richiamerà l'attuale libreria condivisa di X11: "libX11.so.6.3.0".


Mostriamo di seguito un breve codice esemplificativo:

Library "libX11:6.3.0"

' Display *XOpenDisplay(display_name)
' opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer

' int XDefaultScreen (display)
' returns the default screen number referenced by the XOpenDisplay function.
Private Extern XDefaultScreen(displayP As Pointer) As Integer

' int XDefaultDepth (display, screen_number)
' returns the depth (number of planes) of the default root window for the specified screen.
Private Extern XDefaultDepth(displayP As Pointer, screen_number As Integer) As Integer

' int XConnectionNumber(display)
' returns a connection number for the specified display.
Private Extern XConnectionNumber(displayP As Pointer) As Integer

' char *XDisplayName(string)
' returns the name of the display that XOpenDisplay would attempt to use.
Private Extern XDisplayName(disp_string$ As Pointer) As Pointer

' int XDisplayWidth (display, screen_number)
' Returns the width of the screen in pixels.
Private Extern XDisplayWidth(displayP As Pointer, screen_number As Integer) As Integer

' int XDisplayHeight(display, screen_number)
' Returns an integer that describes the height of the screen in pixels.
Private Extern XDisplayHeight(displayP As Pointer, screen_number As Integer) As Integer

' int XDisplayWidthMM (display, screen_number)
' returns the width of the specified screen in millimeters.
Private Extern XDisplayWidthMM(displayP As Pointer, screen_number As Integer) As Integer

' unsigned long XBlackPixel (display, screen_number)
' returns the black pixel value for the specified screen.
Private Extern XBlackPixel(displayP As Pointer, screen_number As Integer) As Long

' unsigned long XWhitePixel (display, screen_number)
' returns the white pixel value for the specified screen.
Private Extern XWhitePixel(displayP As Pointer, screen_number As Integer) As Long

' int *XListDepths(display, screen_number, count_return)
' returns the array of depths that are available on the specified screen.
Private Extern XListDepths(displayP As Pointer, screen_number As Integer, count_return As Pointer) As Pointer

' int XScreenCount(display)
' returns the number of available screens.
Private Extern XScreenCount(displayP As Pointer) As Integer

' XCloseDisplay (display)
' closes a display or disconnect from the X server.
Private Extern XCloseDisplay(displayP As Pointer)


Public Sub Main()

 Dim display_name, lista, lista_prof As Pointer
 Dim depth, screen, connection As Integer
 Dim listrm As Stream
 Dim j, b As Byte


' Apertura dello schermo ed impostazione di default:
   display_name = XOpenDisplay(Null)

   screen = XDefaultScreen(display_name)

   depth = XDefaultDepth(display_name, screen)
   If depth = 1 Then
     Print "E' evidente che hai uno schermo preistorico !"
   Else
     Print "Stai utilizzando uno schermo a colori con profondità: " & depth
   Endif
     
   connection = XConnectionNumber(display_name)
   Print "Il numero di connessione è "; connection

' Mostra le informazioni relative allo schermo:
   Print "Lo schermo è: " & String@(XDisplayName(display_name))
   
   Print "La larghezza dello schermo è: "; XDisplayWidth(display_name, screen)
   Print "L'altezza dello schermo è: "; XDisplayHeight(display_name, screen)  
   Print "La larghezza dello schermo è di " & XDisplayWidthMM(display_name, screen) & " millimetri"

   Print "Valore dei pixel neri dello schermo: " & XBlackPixel(display_name, screen)
   Print "Valore dei pixel bianchi dello schermo: " & XWhitePixel(display_name, screen)
   
   
   lista = Alloc(SizeOf(gb.Integer))
   lista_prof = XListDepths(display_name, screen, lista)
   Print "Numero di valori disponibili della profondità dello schermo: "; Int@(lista)
' Dereferenziamo la variabile di tipo "puntatore" mediante i "Memory-Stream":
   listrm = Memory lista_prof For Read
   For j = 0 To (Int@(lista) - 1) * 4 Step 4
     Seek #listrm, j
     Read #listrm, b
     Print "Valore profondità disponibile: "; b
   Next
 
   Print "Schermi disponibili = "; XScreenCount(display_name)
   

' Chiude la libreria:
   XCloseDisplay(display_name)
       
' Libera la memoria allocata:
   Free(lista)

End