chiark / gitweb /
Change grabs to always grab pointer GrabModeSync
[xtrlock.git] / xtrlock.c
index 7598560463f3ea104da3c34d3d8d342daee5d111..dee9be7d9729cb87cda4921cd907eebe9fd826fc 100644 (file)
--- a/xtrlock.c
+++ b/xtrlock.c
@@ -81,19 +81,27 @@ int main(int argc, char **argv){
   Cursor cursor;
   Pixmap csr_source,csr_mask;
   XColor csr_fg, csr_bg, dummy, black;
-  int ret, screen, blank = 0;
+  int ret, screen, blank = 0, fork_after = 0;
 #ifdef SHADOW_PWD
   struct spwd *sp;
 #endif
   struct timeval tv;
   int tvt, gs;
 
-  if ((argc == 2) && (strcmp(argv[1], "-b") == 0)) {
-    blank = 1;
-  } else if (argc > 1) {
-    fprintf(stderr,"xtrlock (version %s); usage: xtrlock [-b]\n",
-            program_version);
-    exit(1);
+  while (argc > 1) {
+    if ((strcmp(argv[1], "-b") == 0)) {
+      blank = 1;
+      argc--;
+      argv++;
+    } else if ((strcmp(argv[1], "-f") == 0)) {
+      fork_after = 1;
+      argc--;
+      argv++;
+    } else {
+      fprintf(stderr,"xtrlock (version %s); usage: xtrlock [-b] [-f]\n",
+              program_version);
+      exit(1);
+    }
   }
   
   errno=0;  pw= getpwuid(getuid());
@@ -182,7 +190,9 @@ int main(int argc, char **argv){
   
   gs=0; /*gs==grab successful*/
   for (tvt=0 ; tvt<100; tvt++) {
-    ret = XGrabKeyboard(display,window,False,GrabModeAsync,GrabModeAsync,
+    ret = XGrabKeyboard(display,window,False,
+                       GrabModeSync, /* pointer_mode */
+                       GrabModeAsync, /* keyboard_mode */
                        CurrentTime);
     if (ret == GrabSuccess) {
       gs=1;
@@ -200,14 +210,27 @@ int main(int argc, char **argv){
   }
 
   if (XGrabPointer(display,window,False,(KeyPressMask|KeyReleaseMask)&0,
-               GrabModeAsync,GrabModeAsync,None,
-               cursor,CurrentTime)!=GrabSuccess) {
+                  GrabModeSync, /* pointer_mode */
+                  GrabModeAsync, /* keyboard_mode */
+                  None,
+                  cursor,CurrentTime)!=GrabSuccess) {
     XUngrabKeyboard(display,CurrentTime);
     fprintf(stderr,"xtrlock (version %s): cannot grab pointer\n",
            program_version);
     exit(1);
   }
 
+  if (fork_after) {
+    pid_t pid = fork();
+    if (pid < 0) {
+      fprintf(stderr,"xtrlock (version %s): cannot fork: %s\n",
+              program_version, strerror(errno));
+      exit(1);
+    } else if (pid > 0) {
+      exit(0);
+    }
+  }
+
   for (;;) {
     XNextEvent(display,&ev);
     switch (ev.type) {