diff --git a/doc/nxagent/README.keystrokes b/doc/nxagent/README.keystrokes
index 3d55f50968..84c0e1cdfe 100644
--- a/doc/nxagent/README.keystrokes
+++ b/doc/nxagent/README.keystrokes
@@ -108,6 +108,9 @@ reread_keystrokes
Forces nxagent to re-read the keystroke configuration. Useful to
add/change keystrokes to a running session.
+autograb
+ Toggles autograb mode
+
force_synchronization
Forces immediate drawing of elements to be synchronized which can
fix some visual bugs.
diff --git a/etc/keystrokes.cfg b/etc/keystrokes.cfg
index b482119ad5..d3b2d7669e 100644
--- a/etc/keystrokes.cfg
+++ b/etc/keystrokes.cfg
@@ -25,4 +25,5 @@
+
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c
index e360d21f6a..50199030e2 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c
@@ -690,6 +690,40 @@ static void nxagentSwitchDeferMode(void)
}
}
+static Bool autograb = False;
+
+static void nxagentEnableAutoGrab(void)
+{
+#ifdef DEBUG
+ fprintf(stderr, "enabling autograb\n");
+#endif
+
+ nxagentGrabPointerAndKeyboard(NULL);
+ autograb = True;
+}
+
+static void nxagentDisableAutoGrab(void)
+{
+#ifdef DEBUG
+ fprintf(stderr, "disabling autograb\n");
+#endif
+
+ nxagentUngrabPointerAndKeyboard(NULL);
+ autograb = False;
+}
+
+static void nxagentToggleAutoGrab(void)
+{
+ /* autograb only works in windowed mode */
+ if (nxagentOption(Rootless) || nxagentOption(Fullscreen))
+ return;
+
+ if (!autograb)
+ nxagentEnableAutoGrab();
+ else
+ nxagentDisableAutoGrab();
+}
+
static Bool nxagentExposurePredicate(Display *display, XEvent *event, XPointer window)
{
/*
@@ -1083,6 +1117,12 @@ void nxagentDispatchEvents(PredicateFuncPtr predicate)
break;
}
+ case doAutoGrab:
+ {
+ nxagentToggleAutoGrab();
+
+ break;
+ }
default:
{
FatalError("nxagentDispatchEvent: handleKeyPress returned unknown value\n");
@@ -1532,6 +1572,17 @@ FIXME: Don't enqueue the KeyRelease event if the key was
}
}
+ /* FIXME: only when in windowed mode! */
+ if (autograb)
+ {
+ if (X.xfocus.window == nxagentDefaultWindows[0] && X.xfocus.mode == NotifyNormal)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "%s: (FocusIn): grabbing\n", __func__);
+ #endif
+ nxagentGrabPointerAndKeyboard(NULL);
+ }
+ }
break;
}
case FocusOut:
@@ -1610,6 +1661,19 @@ FIXME: Don't enqueue the KeyRelease event if the key was
#endif /* NXAGENT_FIXKEYS */
+ if (autograb)
+ {
+ XlibWindow w;
+ int revert_to;
+ XGetInputFocus(nxagentDisplay, &w, &revert_to);
+ if (w != nxagentDefaultWindows[0] && X.xfocus.mode == NotifyWhileGrabbed)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "%s: (FocusOut): ungrabbing\n", __func__);
+ #endif
+ nxagentUngrabPointerAndKeyboard(NULL);
+ }
+ }
break;
}
case KeymapNotify:
@@ -3871,13 +3935,26 @@ void nxagentGrabPointerAndKeyboard(XEvent *X)
fprintf(stderr, "nxagentGrabPointerAndKeyboard: Going to grab the keyboard in context [B1].\n");
#endif
- result = XGrabKeyboard(nxagentDisplay, nxagentFullscreenWindow,
- True, GrabModeAsync, GrabModeAsync, now);
+ if (nxagentFullscreenWindow)
+ result = XGrabKeyboard(nxagentDisplay, nxagentFullscreenWindow,
+ True, GrabModeAsync, GrabModeAsync, now);
+ else
+ result = XGrabKeyboard(nxagentDisplay, RootWindow(nxagentDisplay, DefaultScreen(nxagentDisplay)),
+ True, GrabModeAsync, GrabModeAsync, now);
if (result != GrabSuccess)
{
+ #ifdef DEBUG
+ fprintf(stderr, "%s: keyboard grab failed.\n", __func__);
+ #endif
return;
}
+ #ifdef DEBUG
+ else
+ {
+ fprintf(stderr, "%s: keyboard grab successful.\n", __func__);
+ }
+ #endif
/*
* The smart scheduler could be stopped while
@@ -3895,7 +3972,8 @@ void nxagentGrabPointerAndKeyboard(XEvent *X)
resource = nxagentWaitForResource(NXGetCollectGrabPointerResource,
nxagentCollectGrabPointerPredicate);
- NXCollectGrabPointer(nxagentDisplay, resource,
+ if (nxagentFullscreenWindow)
+ NXCollectGrabPointer(nxagentDisplay, resource,
nxagentFullscreenWindow, True, NXAGENT_POINTER_EVENT_MASK,
GrabModeAsync, GrabModeAsync, None, None, now);
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.h b/nx-X11/programs/Xserver/hw/nxagent/Events.h
index 7d313c331d..74a8e83294 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.h
@@ -51,7 +51,8 @@ enum HandleEventResult
doViewportRight,
doViewportDown,
doSwitchResizeMode,
- doSwitchDeferMode
+ doSwitchDeferMode,
+ doAutoGrab,
};
extern CARD32 nxagentLastEventTime;
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
index f790090bf5..76b811a443 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
@@ -100,6 +100,9 @@ char * nxagentSpecialKeystrokeNames[] = {
"viewport_scroll_down",
"reread_keystrokes",
+
+ "autograb",
+
NULL,
};
@@ -141,6 +144,7 @@ struct nxagentSpecialKeystrokeMap default_map[] = {
{KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_Down},
{KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_KP_Down},
{KEYSTROKE_REREAD_KEYSTROKES, ControlMask, True, XK_k},
+ {KEYSTROKE_AUTOGRAB, ControlMask, True, XK_g},
{KEYSTROKE_END_MARKER, 0, False, NoSymbol},
};
struct nxagentSpecialKeystrokeMap *map = default_map;
@@ -472,7 +476,7 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X)
#endif
for (struct nxagentSpecialKeystrokeMap *cur = map; cur->stroke != KEYSTROKE_END_MARKER; cur++) {
#ifdef DEBUG
- fprintf(stderr, "%s: checking keysym '%c' (%d)\n", __func__, cur->keysym, cur->keysym);
+ fprintf(stderr,"%s: keysym %d stroke %d, type %d\n", __func__, cur->keysym, cur->stroke, X->type);
#endif
if (cur->keysym == keysym && modifier_matches(cur->modifierMask, cur->modifierAltMeta, X->state)) {
#ifdef DEBUG
@@ -636,6 +640,9 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
if (X->type == KeyRelease)
nxagentInitKeystrokes(True);
break;
+ case KEYSTROKE_AUTOGRAB:
+ *result = doAutoGrab;
+ break;
case KEYSTROKE_NOTHING: /* do nothing. difference to KEYSTROKE_IGNORE is the return value */
case KEYSTROKE_END_MARKER: /* just to make gcc STFU */
case KEYSTROKE_MAX:
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
index 13a83d0fea..9d7c4c4d5a 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
@@ -73,6 +73,8 @@ enum nxagentSpecialKeystroke {
KEYSTROKE_REREAD_KEYSTROKES,
+ KEYSTROKE_AUTOGRAB,
+
KEYSTROKE_NOTHING,
/* insert more here and in the string translation */