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 X (nella sua attuale versione): "libX11.so.6.3.0"


Mostriamo di seguito un possibile breve codice al riguardo:

Private Const MAX_PROPERTY_VALUE_LEN As Integer = 4096

Library "libX11:6.3.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$ As String) As Pointer

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

' Window XDefaultRootWindow(Display *display)
' Return the root window for the default screen.
Private Extern XDefaultRootWindow(displayP 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(displayP 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(displayP As Pointer, w As Long, py As Integer, lo As Long, ll As Long, d As Boolean, rt As Integer, at As Pointer, af As Pointer, ni As Pointer, ba As Pointer, pr 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(displayP 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, rootW, tipo, formato As Integer
 Dim err, n_fin, bytes_succ, i As Integer
 Dim st As Stream
 
  disp = XOpenDisplay(Null)
  If IsNull(disp) 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(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