Individuare l'ID ed il nome della finestra attiva mediante le funzioni del API di X11

Da Gambas-it.org - Wikipedia.

La libreria X11 ci consente anche di individuare il numero identificativo (ID) ed il nome della finestra attualmente attiva.

Sarà necessario richiamare la libreria del sistema X11: "libX11.so.6.4.0 ".


Mostriamo di seguito un possibile breve codice al riguardo:

Private Const MAX_PROPERTY_VALUE_LEN As Integer = 4096


Library "libX11:6.4.0"

Private Const XA_WINDOW As Integer = 33

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

' XCloseDisplay (Display *display)
' Closes a display or disconnect from the X server.
Private Extern XCloseDisplay(display As Pointer)

' Window XDefaultRootWindow(Display *display)
' Return the root window for the default screen.
Private Extern XDefaultRootWindow(display As Pointer) As Integer

' Atom XInternAtom(Display *display, char *atom_name, Bool only_if_exists)
' Returns the atom identifier associated with the specified atom_name string.
Private Extern XInternAtom(display As Pointer, atom_name As String, only_if_exists As Boolean) As Integer

' int XGetWindowProperty(Display *display, Window w, Atom property, long long_offset, long long_length, Bool delete, Atom req_type, Atom *actual_type_return, int *actual_format_return, unsigned long *nitems_return, unsigned long *bytes_after_return, unsigned char **prop_return)
' Returns the actual type of the property; the actual format of the property.
Private Extern XGetWindowProperty(display As Pointer, w As Long, property_ As Integer, long_offset As Long, long_length As Long, delete As Boolean, req_type As Integer, actual_type_return As Pointer, actual_format_return As Pointer, nitems_return As Pointer, bytes_after_return As Pointer, prop_return As Pointer) As Integer

' Status XGetWMName(Display *display, Window w, XTextProperty *text_prop_return)
' Calls XGetTextProperty() to obtain the WM_NAME property.
Private Extern XGetWMName(display As Pointer, w As Long, text_prop_return As Pointer) As Integer


Public Sub Main()

 Dim disp, dati, p As Pointer
 Dim x_num_Atom, tipo, formato As Integer
 Dim err, n_fin, bytes_succ, i As Integer
 Dim rootW As Long
 Dim st As Stream
 
 disp = XOpenDisplay(0)
 If disp == 0 Then Error.Raise("Impossibile aprire lo schermo !")
   
 rootW = XDefaultRootWindow(disp)
  
 x_num_Atom = XInternAtom(disp, "_NET_ACTIVE_WINDOW", False)
  
 err = XGetWindowProperty(disp, rootW, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_WINDOW, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(dati))
 If err <> 0 Then Error.Raise("Impossibile ottenere dati dalla funzione 'XGetWindowProperty' !")
  
 If XA_WINDOW <> tipo Then Error.Raise("Tipo invalido di proprietà '_NET_ACTIVE_WINDOW' !")
   
 Print "Id", Null, "Nome della finestra attiva\n"
  
 p = Alloc(SizeOf(gb.Byte), 32)
  
 st = Memory dati For Read
 Read #st, i
 XGetWMName(disp, i, p)
 Print Hex(i), Null, String@(Pointer@(p))
   
' Va in chiusura:
 st.Close
 Free(p)
 XCloseDisplay(disp)
End