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.
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 | + | Sarà necessario richiamare la libreria del sistema X11: "''libX11.so.6.3.0'' ". |
Mostriamo di seguito un possibile breve codice al riguardo: | Mostriamo di seguito un possibile breve codice al riguardo: | ||
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.3.0" | ||
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( | + | 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( | + | 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( | + | 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( | + | 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( | + | 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( | + | 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(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)) | ||
<FONT Color=gray>' ''Va in chiusura:''</font> | <FONT Color=gray>' ''Va in chiusura:''</font> | ||
− | + | st.Close | |
− | + | Free(p) | |
− | + | XCloseDisplay(disp) | |
− | + | ||
'''End''' | '''End''' |
Versione delle 11:48, 15 dic 2021
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.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_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