-/* I don't really understand Sync vs Async, but these seem to work... */
-#define grab_kbd(dpy,win) \
- XGrabKeyboard ((dpy), (win), True, GrabModeSync, GrabModeAsync, CurrentTime)
-#define grab_mouse(dpy,win,cursor) \
- XGrabPointer ((dpy), (win), True, ALL_POINTER_EVENTS, \
- GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime)
+
+static int
+grab_kbd(saver_info *si, Window w)
+{
+ saver_preferences *p = &si->prefs;
+ int status = XGrabKeyboard (si->dpy, w, True,
+ /* I don't really understand Sync vs Async,
+ but these seem to work... */
+ GrabModeSync, GrabModeAsync,
+ CurrentTime);
+ if (status == GrabSuccess)
+ si->keyboard_grab_window = w;
+
+ if (p->debug_p)
+ fprintf(stderr, "%s: XGrabKeyboard(... 0x%x ...) ==> %s\n",
+ progname, (unsigned long) w,
+ (status == GrabSuccess ? "GrabSuccess" :
+ status == AlreadyGrabbed ? "AlreadyGrabbed" :
+ status == GrabInvalidTime ? "GrabInvalidTime" :
+ status == GrabNotViewable ? "GrabNotViewable" :
+ status == GrabFrozen ? "GrabFrozen" :
+ "???"));
+
+ return status;
+}
+
+static const char *
+grab_string(int status)
+{
+ switch (status)
+ {
+ case GrabSuccess: return "GrabSuccess"; break;
+ case AlreadyGrabbed: return "AlreadyGrabbed"; break;
+ case GrabInvalidTime: return "GrabInvalidTime"; break;
+ case GrabNotViewable: return "GrabNotViewable"; break;
+ case GrabFrozen: return "GrabFrozen"; break;
+ default:
+ {
+ static char foo[255];
+ sprintf(foo, "unknown status: %d", status);
+ return foo;
+ }
+ }
+}
+
+
+static int
+grab_mouse (saver_info *si, Window w, Cursor cursor)
+{
+ saver_preferences *p = &si->prefs;
+ int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS,
+ GrabModeAsync, GrabModeAsync, None,
+ cursor, CurrentTime);
+ if (status == GrabSuccess)
+ si->mouse_grab_window = w;
+
+ if (p->debug_p)
+ fprintf(stderr, "%s: XGrabPointer(... 0x%x, 0x%x ...) ==> %s\n",
+ progname, (unsigned long) w, (unsigned long) cursor,
+ grab_string(status));
+ return status;
+}
+
+
+static void
+ungrab_kbd(saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ XUngrabKeyboard(si->dpy, CurrentTime);
+ if (p->debug_p)
+ fprintf(stderr, "%s: XUngrabKeyboard (was 0x%x)\n", progname,
+ (unsigned long) si->keyboard_grab_window);
+ si->keyboard_grab_window = 0;
+}
+
+
+static void
+ungrab_mouse(saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ XUngrabPointer(si->dpy, CurrentTime);
+ if (p->debug_p)
+ fprintf(stderr, "%s: XUngrabPointer (was 0x%x)\n", progname,
+ (unsigned long) si->mouse_grab_window);
+ si->mouse_grab_window = 0;
+}
+