Differenze tra le versioni di "Individuare l'ID ed il nome di una finestra nonché il PID del programma mediante le funzioni del API di X11"

Da Gambas-it.org - Wikipedia.
Riga 12: Riga 12:
 
  Private Const XA_WINDOW As Integer = 33
 
  Private Const XA_WINDOW As Integer = 33
 
   
 
   
  <FONT Color=gray>' ''Display *XOpenDisplay(display_name)''
+
  <FONT Color=gray>' ''Display *XOpenDisplay(char *display_name)''
 
  ' ''Opens a connection to the X server that controls a display.''</font>
 
  ' ''Opens a connection to the X server that controls a display.''</font>
 
  Private Extern XOpenDisplay(display$ As String) As Pointer
 
  Private Extern XOpenDisplay(display$ As String) As Pointer
 
   
 
   
  <FONT Color=gray>' ''XCloseDisplay (display)''
+
  <FONT Color=gray>' ''XCloseDisplay (Display *display)''
 
  ' ''Closes a display or disconnect from the X server.''</font>
 
  ' ''Closes a display or disconnect from the X server.''</font>
 
  Private Extern XCloseDisplay(displayP As Pointer)
 
  Private Extern XCloseDisplay(displayP As Pointer)
 
   
 
   
  <FONT Color=gray>' ''Window XDefaultRootWindow(display)''
+
  <FONT Color=gray>' ''Window XDefaultRootWindow(Display *display)''
 
  ' ''Return the root window for the default screen.''</font>
 
  ' ''Return the root window for the default screen.''</font>
 
  Private Extern XDefaultRootWindow(displayP As Pointer) As Integer
 
  Private Extern XDefaultRootWindow(displayP As Pointer) As Integer
 
   
 
   
  <FONT Color=gray>' ''Atom XInternAtom(display, atom_name, only_if_exists)''
+
  <FONT Color=gray>' ''Atom XInternAtom(Display *display, char *atom_name, Bool only_if_exists)''
 
  ' ''Returns the atom identifier associated with the specified atom_name string.''</font>
 
  ' ''Returns the atom identifier associated with the specified atom_name string.''</font>
 
  Private Extern XInternAtom(displayP As Pointer, atom_name As String, only_if_exists As Boolean) As Integer
 
  Private Extern XInternAtom(displayP As Pointer, atom_name As String, only_if_exists As Boolean) As Integer
 
   
 
   
  <FONT Color=gray>' ''int XGetWindowProperty(display, w, property, long_offset, long_length, delete, req_type, actual_type_return, actual_format_return, nitems_return, bytes_after_return, prop_return)''
+
  <FONT Color=gray>' ''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.''</font>
 
  ' ''Returns the actual type of the property; the actual format of the property.''</font>
 
  Private Extern XGetWindowProperty(displayP As Pointer, wI As Integer, 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
 
  Private Extern XGetWindowProperty(displayP As Pointer, wI As Integer, 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
 
   
 
   
  <FONT Color=gray>' ''XGetWMName(display, w, text_prop_return)''
+
  <FONT Color=gray>' ''Status XGetWMName(Display *display, Window w, XTextProperty *text_prop_return)''
 
  ' Calls XGetTextProperty() to obtain the WM_NAME property.''</font>
 
  ' Calls XGetTextProperty() to obtain the WM_NAME property.''</font>
 
  Private Extern XGetWMName(displayP As Pointer, w As Integer, text_prop_return As Pointer) As Integer
 
  Private Extern XGetWMName(displayP As Pointer, w As Integer, text_prop_return As Pointer) As Integer

Versione delle 08:49, 24 nov 2014

La libreria X11 ci consente anche di individuare il numero identificativo (Id) ed il nome di una qualsiasi finestra, nonché il PID del programma al quale quella finestra appartiene.

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_CARDINAL As Integer = 6
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, wI As Integer, 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 Integer, text_prop_return As Pointer) As Integer


Public Sub Main()

 Dim disp, datID, p, datPID As Pointer
 Dim x_num_Atom, rootW, tipo, formato As Integer
 Dim err, n_fin, bytes_succ, i, pid As Integer
 Dim stId, stPid As Stream
 Dim b As Byte
 Dim id As String

  disp = XOpenDisplay(Null)
  If IsNull(disp) Then Error.Raise("Impossibile aprire lo schermo !")
   
  rootW = XDefaultRootWindow(disp)
   
  x_num_Atom = XInternAtom(disp, "_NET_CLIENT_LIST", 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(datID))
  If err <> 0 Then Error.Raise("Impossibile ottenere dati dalla funzione 'XGetWindowProperty' !")
   
  If XA_WINDOW <> tipo Then Error.Raise("Tipo invalido di proprietà '_NET_CLIENT_LIST' !")
   
  Print "Id", Null, "PID", "Nome finestra\n"
   
  p = Alloc(32)
   
  stId = Memory datID For Read

  For b = 1 To n_fin * 2

    Read #stId, i

    If i > 0 Then
      XGetWMName(disp, i, p)
      id = Hex(i)
   
      x_num_Atom = XInternAtom(disp, "_NET_WM_PID", False)
      err = XGetWindowProperty(disp, i, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_CARDINAL, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(datPID))
      If err <> 0 Then Error.Raise("Impossibile ottenere dati dalla funzione 'XGetWindowProperty' !")

      If IsNull(datPID) = False Then
        stPid = Memory datPID For Read
        Read #stPid, pid
      Endif
      Print id, Null, pid, String@(Pointer@(p))
    Endif
 
  Next
   
   
' Va in chiusura:
  stPid.Close
  stId.Close
  Free(p)
  XCloseDisplay(disp)

End