Differenze tra le versioni di "Uscire da un'applicazione premendo un tasto mediante le funzioni del API di X11"

Da Gambas-it.org - Wikipedia.
Riga 49: Riga 49:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim dpy As Pointer
+
   Dim dpy, ev As Pointer
   Dim root As Integer
+
   Dim root, keycode As Integer
  Dim ev As Pointer
 
  Dim keycode As Integer
 
 
      
 
      
  ev = Alloc(192)
+
  ev = Alloc(SizeOf(gb.Byte), 192)
 
    
 
    
  dpy = XOpenDisplay(0)
+
  dpy = XOpenDisplay(0)
   
+
  If dpy == 0 Then Error.Raise("Errore !") 
  root = XDefaultRootWindow(dpy)
+
 
 +
  root = XDefaultRootWindow(dpy)
 
    
 
    
  keycode = XKeysymToKeycode(dpy, Asc("q"))
+
  keycode = XKeysymToKeycode(dpy, Asc("q"))
 
    
 
    
  XGrabKey(dpy, keycode, ControlMask Or ShiftMask, root, False, GrabModeAsync, GrabModeAsync)
+
  XGrabKey(dpy, keycode, ControlMask Or ShiftMask, root, False, GrabModeAsync, GrabModeAsync)
 
      
 
      
  XSelectInput(dpy, root, KeyPressMask)
+
  XSelectInput(dpy, root, KeyPressMask)
 
    
 
    
  While True
+
  While True
    XNextEvent(dpy, ev)
+
    XNextEvent(dpy, ev)
    Select Case Int@(ev)
+
    Select Case Int@(ev)
      Case KeyPress
+
      Case KeyPress
        Print "Premuto il tasto 'q' !"
+
        Print "Premuto il tasto 'q' !"
        XUngrabKey(dpy, keycode, ControlMask Or ShiftMask, root)
+
        XUngrabKey(dpy, keycode, ControlMask Or ShiftMask, root)
        Break
+
        Break
    End Select
+
    End Select
  Wend
+
  Wend
 
    
 
    
  Free(ev)
+
  Free(ev)
  XCloseDisplay(dpy)
+
  XCloseDisplay(dpy)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 12:21, 15 dic 2021

Con alcune risorse della libreria di X11 è possibile, premendo una combinazione di tasti della tastiera, uscire da un'applicazione.

E' necessario richiamare nell'applicazione Gambas la libreria dinamica condivisa del sistem X11: "libX11.so.6.3.0"


Mostriamo un semplice esempio pratico, nel quale, premendo la combinazione dei tasti Ctrl, shift e "q ", si determinerà la chiusura dell'applicazione:

Library "libX11:6.3.0"

Private Enum KeyPress = 2, KeyRelease, ButtonPress, ButtonRelease, MotionNotify, EnterNotify, LeaveNotify,
                           FocusIn, FocusOut, KeymapNotify, Expose, GraphicsExpose, NoExpose
Private Const GrabModeAsync As Integer = 1
Private KeyPressMask As Integer = 1 * CInt(2 ^ 0)
Private ControlMask As Integer = 1 * CInt(2 ^ 2)
Private ShiftMask As Integer = 1 * CInt(2 ^ 0)

' 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

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

' KeyCode XKeysymToKeycode(Display *display, KeySym keysym)
' Obtains a KeyCode for a key having a specific KeySym.
Private Extern XKeysymToKeycode(display As Pointer, keysym As Integer) As Integer

' XGrabKey(Display *display, int keycode, unsigned int modifiers, Window grab_window, Bool owner_events, int pointer_mode, int keyboard_mode)
' Passively grabs a single key of the keyboard.
Private Extern XGrabKey(display As Pointer, keycode As Integer, modifiers As Integer, grab_window As Integer, owner_events As Boolean, pointermode As Integer, keyboard_mode As Integer)

' XSelectInput(Display *display, Window w, long event_mask)
' Requests that the X server report the events associated with the specified event mask.
Private Extern XSelectInput(display As Pointer, w As Integer, event_mask As Long)

' XNextEvent(Display *display, XEvent *event_return)
' Gets the next event and remove it from the queue.
Private Extern XNextEvent(display As Pointer, event_return As Pointer)

' XUngrabKey(Display *display, int keycode, unsigned int modifiers, Window grab_window)
' Ungrabs a key.
Private Extern XUngrabKey(display As Pointer, keycode As Integer, modifiers As Integer, Window As Pointer)

' XCloseDisplay(Display *display)
' Closes a display or disconnects from the X server.
Private Extern XCloseDisplay(display As Pointer)


Public Sub Main()

 Dim dpy, ev As Pointer
 Dim root, keycode As Integer
    
 ev = Alloc(SizeOf(gb.Byte), 192)
  
 dpy = XOpenDisplay(0)
 If dpy == 0 Then Error.Raise("Errore !")  
 
 root = XDefaultRootWindow(dpy)
  
 keycode = XKeysymToKeycode(dpy, Asc("q"))
  
 XGrabKey(dpy, keycode, ControlMask Or ShiftMask, root, False, GrabModeAsync, GrabModeAsync)
   
 XSelectInput(dpy, root, KeyPressMask)
  
 While True
   XNextEvent(dpy, ev)
   Select Case Int@(ev)
     Case KeyPress
       Print "Premuto il tasto 'q' !"
       XUngrabKey(dpy, keycode, ControlMask Or ShiftMask, root)
       Break
   End Select
 Wend
  
 Free(ev)
 XCloseDisplay(dpy)
  
End


Riferimenti