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 | + | 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''' | '''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