Differenze tra le versioni di "Ottenere una schermata (screenshot) del desktop con le risorse del API di X11 e di Imlib2"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
 
* ''libX11.so.6.3.0''
 
* ''libX11.so.6.3.0''
* ''libImlib2.so.1.4.6''
+
* ''libImlib2.so.1.6.1''
  
  
Riga 49: Riga 49:
 
   
 
   
 
   
 
   
  Library "libImlib2:1.4.6"
+
  Library "libImlib2:1.6.1"
 
   
 
   
 
  <FONT Color=gray>' ''Imlib_Image imlib_create_image_using_data(int width, int height, DATA32 * data)''
 
  <FONT Color=gray>' ''Imlib_Image imlib_create_image_using_data(int width, int height, DATA32 * data)''
Riga 102: Riga 102:
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  
Riga 108: Riga 107:
 
=Riferimenti=
 
=Riferimenti=
 
* http://tronche.com/gui/x/xlib
 
* http://tronche.com/gui/x/xlib
* http://adesklets.sourcearchive.com/documentation/0.4.7-1/main.html
+
* https://docs.enlightenment.org/api/imlib2/html/

Versione delle 23:28, 8 nov 2021

E' possibile ottenere una schermata del desktop utilizzando alcune risorse esterne del API di X11 e di Imlib2.

Per poter fruire di tali risorse, è necessario richiamare in Gambas le librerie dinamiche e condivise:

  • libX11.so.6.3.0
  • libImlib2.so.1.6.1


Mostriamo un esempio, nel quale verrà effettuata una schermata dell'intero desktop. In fine la schermata verrà salvata in un file di formato .png:

Library "libX11:6.3.0"

Private Enum XYBitmap = 0, XYPixmap, ZPixmap

' Display *XOpenDisplay(char *display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer

' int XDefaultScreen(display)
' Returns the default screen number.
Private Extern XDefaultScreen(display As Pointer) As Integer

' Window XDefaultRootWindow(display)
' Returns the root window for the default screen.
Private Extern XDefaultRootWindow(display As Pointer) As Long

' Visual *XDefaultVisual(display, screen_number)
' Returns the default visual type for the specified screen.
Private Extern XDefaultVisual(display As Pointer, scr_num As Integer) As Pointer

' int XDisplayWidth(display, screen_number)
' Returns the width of the screen in pixels.
Private Extern XDisplayWidth(display As Pointer, scr_num As Integer) As Integer

' int XDisplayHeight(display, screen_number)
' Returns an integer that describes the height of the screen in pixels.
Private Extern XDisplayHeight(display As Pointer, scr_num As Integer) As Integer

' unsigned long XAllPlanes()
' Returns a value with all bits set to 1 suitable for use in a plane argument to a procedure.
Private Extern XAllPlanes() As Long

' XImage *XGetImage(Display *display, Drawable d, int x, int y, unsigned int width, unsigned int height, unsigned long plane_mask, int format)
' Returns a pointer to an XImage structure.
Private Extern XGetImage(displayP As Pointer, d As Long, xI As Integer, yI As Integer, wid As Integer, hei As Integer, plane_mask As Long, formatI As Integer) As Pointer

' XCloseDisplay(Display *display)
' Closes the connection to the X server for the display specified in the Display structure and destroys all windows.
Private Extern XCloseDisplay(display As Pointer)


Library "libImlib2:1.6.1"

' Imlib_Image imlib_create_image_using_data(int width, int height, DATA32 * data)
' Creates an image from the image data - in the format of a DATA32 (32 bits) per pixel in a linear array - specified with the width and the height specified.
Private Extern imlib_create_image_using_data(width As Integer, height As Integer, data As Pointer) As Pointer

' void imlib_context_set_image(Imlib_Image image)
' Sets the current image Imlib2 will be using with its function calls.
Private Extern imlib_context_set_image(Imlib_Image As Pointer)

' void imlib_save_image(const char *filename)
' Saves the current image in the format specified by the current image's format settings to the filename.
Private Extern imlib_save_image(filename As String)


Public Sub Main()
 
 Dim dsp, vis, XImage, imago As Pointer
 Dim root As Long
 Dim scr, wi, he As Integer
 
' Si connette con il display:
   dsp = XOpenDisplay(Null)
   If dsp = 0 Then Error.Raise("Impossibile aprire una connessione al server X !")
   
   scr = XDefaultScreen(dsp)
   
   root = XDefaultRootWindow(dsp)
   
   vis = XDefaultVisual(dsp, scr)
   
   wi = XDisplayWidth(dsp, scr)
   
   he = XDisplayHeight(dsp, scr)
   
' Otteniamo un puntatore alla "Struttura" contenente i dati-immagine del desktop:
   XImage = XGetImage(dsp, root, 0, 0, wi, he, XAllPlanes(), ZPixmap)
   If XImage = 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati-immagine del desktop !")
 
   XImage = XImage + 16
   imago = imlib_create_image_using_data(wi, he, Pointer@(XImage))
   If imago = 0 Then Error.Raise("Impossibile creare l'immagine dai dati grezzi acquisiti !")
   
   imlib_context_set_image(imago)
  
' L'immagine creata viene salvata in un file immagine. Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato:
   imlib_save_image("/tmp/immagine.png")

   
' Va in chiusura:
   XCloseDisplay(dsp)
 
End


Riferimenti