Gambas France BETA


Pas de compte ? Incription

Connaître ID, nom de la fenêtre et PID des programmes avec les fonctions externes de X11.

1
AuteurMessages
vuott#1 Posté le 2/11/2014 à 00:40:07
Ne cedere ineluctabili possimusHello,
ce code permet de connaître ID, nom de la fenêtre et PID des programmes avec les fonctions extérieures de X11.


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(display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(displayP As Pointer) As Pointer

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

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

' Atom XInternAtom(display, atom_name, 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, w, property, long_offset, long_length, delete, req_type, actual_type_return, actual_format_return, nitems_return, bytes_after_return, 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

' XGetWMName(display, w, 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, dati, p, datPID As Pointer
Dim x_num_Atom, rootW, tipo, formato As Integer
Dim err, n_fin, bytes_succ, i As Integer
Dim stId, stPid As Stream
Dim b As Byte
Dim pid As Integer
Dim id As String


disp = XOpenDisplay(0)
If IsNull(disp) Then Error.Raise("Unable open display !")

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(dati))
If err <> 0 Then Error.Raise("Unable get data from 'XGetWindowProperty' function !")

If XA_WINDOW <> tipo Then Error.Raise("Invalide type de propriété '_NET_CLIENT_LIST' !")

Print "Id", Null, "PID", "Nom de la fenêtre\n"

p = Alloc(32)

stId = Memory dati 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("Unable get data from 'XGetWindowProperty' function !")

If IsNull(datPID) = False Then
stPid = Memory datPID For Read
Read #stPid, pid
Endif
Print id, Null, pid, String@(Pointer@(p))
Endif

Next


stPid.Close
stId.Close
Free(p)
XCloseDisplay(disp)

End
« Vita non suavis esse potest, nec Mors amara. »
Redjack1964#2 Posté le 2/11/2014 à 16:07:10
Ok mais pourquoi l'avoir mis sur le forum plutôt que sur la forge? :-)
« Unix est très simple. Il faut juste être un génie pour comprendre sa simplicité »

Dennis Ritchie
1