You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.3 KiB
126 lines
2.3 KiB
/* -- xkb_bell.c -- */
|
|
|
|
#include "x11vnc.h"
|
|
#include "xwrappers.h"
|
|
#include "connections.h"
|
|
|
|
/*
|
|
* Bell event handling. Requires XKEYBOARD extension.
|
|
*/
|
|
int xkb_base_event_type = 0;
|
|
|
|
void initialize_xkb(void);
|
|
void initialize_watch_bell(void);
|
|
void check_bell_event(void);
|
|
|
|
|
|
#if LIBVNCSERVER_HAVE_XKEYBOARD
|
|
|
|
/*
|
|
* check for XKEYBOARD, set up xkb_base_event_type
|
|
*/
|
|
void initialize_xkb(void) {
|
|
int ir, reason;
|
|
int op, ev, er, maj, min;
|
|
|
|
if (xkbcompat) {
|
|
xkb_present = 0;
|
|
} else if (! XkbQueryExtension(dpy, &op, &ev, &er, &maj, &min)) {
|
|
if (! quiet) {
|
|
rfbLog("warning: XKEYBOARD extension not present.\n");
|
|
}
|
|
xkb_present = 0;
|
|
} else {
|
|
xkb_present = 1;
|
|
}
|
|
|
|
if (! xkb_present) {
|
|
return;
|
|
}
|
|
|
|
if (! XkbOpenDisplay(DisplayString(dpy), &xkb_base_event_type, &ir,
|
|
NULL, NULL, &reason) ) {
|
|
if (! quiet) {
|
|
rfbLog("warning: disabling XKEYBOARD. XkbOpenDisplay"
|
|
" failed.\n");
|
|
}
|
|
xkb_base_event_type = 0;
|
|
xkb_present = 0;
|
|
}
|
|
}
|
|
|
|
void initialize_watch_bell(void) {
|
|
if (! xkb_present) {
|
|
if (! quiet) {
|
|
rfbLog("warning: disabling bell. XKEYBOARD ext. "
|
|
"not present.\n");
|
|
}
|
|
watch_bell = 0;
|
|
sound_bell = 0;
|
|
return;
|
|
}
|
|
|
|
XkbSelectEvents(dpy, XkbUseCoreKbd, XkbBellNotifyMask, 0);
|
|
|
|
if (! watch_bell) {
|
|
return;
|
|
}
|
|
if (! XkbSelectEvents(dpy, XkbUseCoreKbd, XkbBellNotifyMask,
|
|
XkbBellNotifyMask) ) {
|
|
if (! quiet) {
|
|
rfbLog("warning: disabling bell. XkbSelectEvents"
|
|
" failed.\n");
|
|
}
|
|
watch_bell = 0;
|
|
sound_bell = 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* We call this periodically to process any bell events that have
|
|
* taken place.
|
|
*/
|
|
void check_bell_event(void) {
|
|
XEvent xev;
|
|
XkbAnyEvent *xkb_ev;
|
|
int got_bell = 0;
|
|
|
|
if (! xkb_base_event_type) {
|
|
return;
|
|
}
|
|
|
|
/* caller does X_LOCK */
|
|
if (! XCheckTypedEvent(dpy, xkb_base_event_type, &xev)) {
|
|
return;
|
|
}
|
|
if (! watch_bell) {
|
|
/* we return here to avoid xkb events piling up */
|
|
return;
|
|
}
|
|
|
|
xkb_ev = (XkbAnyEvent *) &xev;
|
|
if (xkb_ev->xkb_type == XkbBellNotify) {
|
|
got_bell = 1;
|
|
}
|
|
|
|
if (got_bell && sound_bell) {
|
|
if (! all_clients_initialized()) {
|
|
rfbLog("check_bell_event: not sending bell: "
|
|
"uninitialized clients\n");
|
|
} else {
|
|
if (screen && client_count) {
|
|
rfbSendBell(screen);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
void initialize_watch_bell(void) {
|
|
watch_bell = 0;
|
|
sound_bell = 0;
|
|
}
|
|
void check_bell_event(void) {}
|
|
#endif
|
|
|
|
|