summaryrefslogtreecommitdiffstats
path: root/driver/test-grab.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/test-grab.c')
-rw-r--r--driver/test-grab.c146
1 files changed, 110 insertions, 36 deletions
diff --git a/driver/test-grab.c b/driver/test-grab.c
index 03018eb..65313a1 100644
--- a/driver/test-grab.c
+++ b/driver/test-grab.c
@@ -1,5 +1,5 @@
/* test-uid.c --- playing with grabs.
- * xscreensaver, Copyright (c) 1999, 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1999-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -24,8 +24,9 @@
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
+#include <X11/cursorfont.h>
-char *progname = 0;
+#include "blurb.h"
char *progclass = "XScreenSaver";
#define ALL_POINTER_EVENTS \
@@ -38,38 +39,89 @@ int
main (int argc, char **argv)
{
XtAppContext app;
- int kstatus, mstatus;
- Cursor cursor = 0;
- int delay = 60 * 15;
+ int kstatus = AlreadyGrabbed, mstatus = AlreadyGrabbed;
+ Cursor cursor1, cursor2;
+ int delay1 = 15;
+ int delay2 = 60 * 15 - delay1;
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
Window w = RootWindow (dpy, DefaultScreen(dpy));
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
-
- kstatus = XGrabKeyboard (dpy, w, True,
- GrabModeSync, GrabModeAsync,
- CurrentTime);
- fprintf (stderr, "%s: grabbing keyboard on 0x%lx... %s.\n",
- progname, (unsigned long) w,
- (kstatus == GrabSuccess ? "GrabSuccess" :
- kstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
- kstatus == GrabInvalidTime ? "GrabInvalidTime" :
- kstatus == GrabNotViewable ? "GrabNotViewable" :
- kstatus == GrabFrozen ? "GrabFrozen" :
- "???"));
-
- mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
- GrabModeAsync, GrabModeAsync, None,
- cursor, CurrentTime);
- fprintf (stderr, "%s: grabbing mouse on 0x%lx... %s.\n",
- progname, (unsigned long) w,
- (mstatus == GrabSuccess ? "GrabSuccess" :
- mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
- mstatus == GrabInvalidTime ? "GrabInvalidTime" :
- mstatus == GrabNotViewable ? "GrabNotViewable" :
- mstatus == GrabFrozen ? "GrabFrozen" :
- "???"));
+ int i;
+
+ Bool grab_kbd_p = True;
+ Bool grab_mouse_p = True;
+ Bool mouse_sync_p = True;
+ Bool kbd_sync_p = True;
+
+ progname = argv[0];
+
+ cursor1 = XCreateFontCursor (dpy, XC_hand1);
+ cursor2 = XCreateFontCursor (dpy, XC_gumby);
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *oa = argv[i];
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+ if (!strcmp (argv[i], "-kbd") || !strcmp (argv[i], "-keyboard"))
+ grab_mouse_p = False;
+ else if (!strcmp (argv[i], "-mouse") || !strcmp (argv[i], "-pointer"))
+ grab_kbd_p = False;
+ else if (!strcmp (argv[i], "-kbd-sync") ||
+ !strcmp (argv[i], "-keyboard-sync"))
+ kbd_sync_p = True;
+ else if (!strcmp (argv[i], "-kbd-async") ||
+ !strcmp (argv[i], "-keyboard-async"))
+ kbd_sync_p = False;
+ else if (!strcmp (argv[i], "-mouse-sync") ||
+ !strcmp (argv[i], "-pointer-sync"))
+ mouse_sync_p = True;
+ else if (!strcmp (argv[i], "-mouse-async") ||
+ !strcmp (argv[i], "-pointer-async"))
+ mouse_sync_p = False;
+ else
+ {
+ fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa);
+ exit (1);
+ }
+ }
+
+ if (grab_kbd_p)
+ {
+ kstatus = XGrabKeyboard (dpy, w, True,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ CurrentTime);
+ fprintf (stderr, "%s: grabbing keyboard on 0x%lx (%s, %s)... %s\n",
+ progname, (unsigned long) w,
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"),
+ (kstatus == GrabSuccess ? "GrabSuccess" :
+ kstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ kstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ kstatus == GrabNotViewable ? "GrabNotViewable" :
+ kstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+ }
+
+ if (grab_mouse_p)
+ {
+ mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ None, cursor1, CurrentTime);
+ fprintf (stderr, "%s: grabbing mouse on 0x%lx (%s, %s)... %s\n",
+ progname, (unsigned long) w,
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"),
+ (mstatus == GrabSuccess ? "GrabSuccess" :
+ mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ mstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ mstatus == GrabNotViewable ? "GrabNotViewable" :
+ mstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+ }
XSync(dpy, False);
@@ -77,12 +129,34 @@ main (int argc, char **argv)
{
fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n",
progname,
- delay / (60 * 60),
- (delay % (60 * 60)) / 60,
- delay % 60);
- fflush(stderr);
- sleep (delay);
- XSync(dpy, False);
+ delay1 / (60 * 60),
+ (delay1 % (60 * 60)) / 60,
+ delay1 % 60);
+ sleep (delay1);
+ fprintf (stderr, "%s: changing mouse cursor...\n", progname);
+
+ mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ None, cursor2, CurrentTime);
+ XSync (dpy, False);
+ if (mstatus != GrabSuccess)
+ fprintf (stderr, "%s: failed: %s\n", progname,
+ (mstatus == GrabSuccess ? "GrabSuccess" :
+ mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ mstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ mstatus == GrabNotViewable ? "GrabNotViewable" :
+ mstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+
+ fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n",
+ progname,
+ delay2 / (60 * 60),
+ (delay2 % (60 * 60)) / 60,
+ delay2 % 60);
+ fflush (stderr);
+ sleep (delay2);
+ XSync (dpy, False);
}
exit (0);