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

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
 
La libreria '''X11''' ci consente anche di individuare il numero identificativo (''ID'') ed il nome della finestra attualmente attiva.
 
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''"
+
Sarà necessario richiamare la libreria del sistema X11: "''libX11.so.6.4.0'' ".
  
  
Riga 7: Riga 7:
 
  Private Const MAX_PROPERTY_VALUE_LEN As Integer = 4096
 
  Private Const MAX_PROPERTY_VALUE_LEN As Integer = 4096
 
   
 
   
  Library "libX11:6.3.0"
+
 +
  Library "libX11:6.4.0"
 
   
 
   
 
  Private Const XA_WINDOW As Integer = 33
 
  Private Const XA_WINDOW As Integer = 33
Riga 13: Riga 14:
 
  <FONT Color=gray>' ''Display *XOpenDisplay(char *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_name As Pointer) As Pointer
 
   
 
   
 
  <FONT Color=gray>' ''XCloseDisplay (Display *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(display As Pointer)
 
   
 
   
 
  <FONT Color=gray>' ''Window XDefaultRootWindow(Display *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(display As Pointer) As Integer
 
   
 
   
 
  <FONT Color=gray>' ''Atom XInternAtom(Display *display, char *atom_name, Bool 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(display As Pointer, atom_name As String, only_if_exists As Boolean) As Integer
 
   
 
   
 
  <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)''
 
  <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, 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
+
  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
 
   
 
   
 
  <FONT Color=gray>' ''Status XGetWMName(Display *display, Window w, XTextProperty *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 Long, text_prop_return As Pointer) As Integer
+
  Private Extern XGetWMName(display As Pointer, w As Long, text_prop_return As Pointer) As Integer
 
   
 
   
 
   
 
   
Riga 44: Riga 45:
 
   Dim st As Stream
 
   Dim st As Stream
 
    
 
    
  disp = XOpenDisplay(Null)
+
  disp = XOpenDisplay(0)
  If IsNull(disp) Then Error.Raise("Impossibile aprire lo schermo !")
+
  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(32)
+
  rootW = XDefaultRootWindow(disp)
   
+
 
  st = Memory dati For Read
+
  x_num_Atom = XInternAtom(disp, "_NET_ACTIVE_WINDOW", False)
+
    
   Read #st, i
+
  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))
  XGetWMName(disp, i, p)
+
  If err <> 0 Then Error.Raise("Impossibile ottenere dati dalla funzione 'XGetWindowProperty' !")
  Print Hex(i), Null, String@(Pointer@(p))
+
 
 +
  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))
 
      
 
      
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
  st.Close
+
  st.Close
  Free(p)
+
  Free(p)
  XCloseDisplay(disp)
+
  XCloseDisplay(disp)
+
 
 
  '''End'''
 
  '''End'''

Versione attuale delle 16:04, 1 mag 2023

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