Unverified Commit 6bca289a authored by Mike Gabriel's avatar Mike Gabriel

Merge branch 'uli42-gh-sunweaver/pr/autograb-without-inputlock' into 3.6.x

parents daa50fd8 6181aa91
...@@ -126,6 +126,9 @@ reread_keystrokes ...@@ -126,6 +126,9 @@ reread_keystrokes
Forces nxagent to re-read the keystroke configuration. Useful to Forces nxagent to re-read the keystroke configuration. Useful to
add/change keystrokes to a running session. add/change keystrokes to a running session.
autograb
Toggles autograb mode
force_synchronization force_synchronization
Forces immediate drawing of elements to be synchronized which can Forces immediate drawing of elements to be synchronized which can
fix some visual bugs. fix some visual bugs.
...@@ -24,4 +24,5 @@ ...@@ -24,4 +24,5 @@
<keystroke action="viewport_scroll_down" Control="1" AltMeta="1" key="Down" /> <keystroke action="viewport_scroll_down" Control="1" AltMeta="1" key="Down" />
<keystroke action="viewport_scroll_down" Control="1" AltMeta="1" key="KP_Down" /> <keystroke action="viewport_scroll_down" Control="1" AltMeta="1" key="KP_Down" />
<keystroke action="reread_keystrokes" Control="1" AltMeta="1" key="k" /> <keystroke action="reread_keystrokes" Control="1" AltMeta="1" key="k" />
<keystroke action="autograb" Control="1" AltMeta="1" key="g" />
</keystrokes> </keystrokes>
...@@ -1039,6 +1039,14 @@ int ddxProcessArgument(int argc, char *argv[], int i) ...@@ -1039,6 +1039,14 @@ int ddxProcessArgument(int argc, char *argv[], int i)
return 0; return 0;
} }
if (!strcmp(argv[i], "-autograb"))
{
nxagentChangeOption(AutoGrab, True);
return 1;
}
/* /*
* Disable Xinerama (i.e. fake it in Screen.c) if somehow Xinerama support * Disable Xinerama (i.e. fake it in Screen.c) if somehow Xinerama support
* has been disabled on the cmdline. * has been disabled on the cmdline.
...@@ -1539,6 +1547,19 @@ static void nxagentParseSingleOption(char *name, char *value) ...@@ -1539,6 +1547,19 @@ static void nxagentParseSingleOption(char *name, char *value)
return; return;
} }
else if (!strcmp(name, "autograb"))
{
if (!strcmp(value, "0"))
{
nxagentChangeOption(AutoGrab, False);
}
else
{
nxagentChangeOption(AutoGrab, True);
}
return;
}
else else
{ {
#ifdef DEBUG #ifdef DEBUG
...@@ -2195,6 +2216,7 @@ void ddxUseMsg(void) ...@@ -2195,6 +2216,7 @@ void ddxUseMsg(void)
ErrorF("-noignore don't ignore pointer and keyboard configuration changes mandated by clients\n"); ErrorF("-noignore don't ignore pointer and keyboard configuration changes mandated by clients\n");
ErrorF("-nokbreset don't reset keyboard device if the session is resumed\n"); ErrorF("-nokbreset don't reset keyboard device if the session is resumed\n");
ErrorF("-noxkblock always allow applications to change layout through XKEYBOARD\n"); ErrorF("-noxkblock always allow applications to change layout through XKEYBOARD\n");
ErrorF("-autograb enable autograb\n");
ErrorF("-tile WxH size of image tiles (minimum allowed: 32x32)\n"); ErrorF("-tile WxH size of image tiles (minimum allowed: 32x32)\n");
ErrorF("-keystrokefile file file with keyboard shortcut definitions\n"); ErrorF("-keystrokefile file file with keyboard shortcut definitions\n");
ErrorF("-verbose print more warning and error messages\n"); ErrorF("-verbose print more warning and error messages\n");
......
...@@ -63,6 +63,8 @@ int nxagentEnableRandRModeDialogPid = 0; ...@@ -63,6 +63,8 @@ int nxagentEnableRandRModeDialogPid = 0;
int nxagentDisableRandRModeDialogPid = 0; int nxagentDisableRandRModeDialogPid = 0;
int nxagentEnableDeferModePid = 0; int nxagentEnableDeferModePid = 0;
int nxagentDisableDeferModePid = 0; int nxagentDisableDeferModePid = 0;
int nxagentEnableAutograbModePid = 0;
int nxagentDisableAutograbModePid = 0;
static int nxagentFailedReconnectionDialogPid = 0; static int nxagentFailedReconnectionDialogPid = 0;
...@@ -158,6 +160,24 @@ void nxagentResetDialog(int pid) ...@@ -158,6 +160,24 @@ void nxagentResetDialog(int pid)
nxagentDisableDeferModePid = 0; nxagentDisableDeferModePid = 0;
} }
else if (pid == nxagentEnableAutograbModePid)
{
#ifdef TEST
fprintf(stderr, "nxagentResetDialog: Resetting enable autograb mode dialog pid [%d].\n",
nxagentEnableAutograbModePid);
#endif
nxagentEnableAutograbModePid = 0;
}
else if (pid == nxagentDisableAutograbModePid)
{
#ifdef TEST
fprintf(stderr, "nxagentResetDialog: Resetting disable autograb mode dialog pid [%d].\n",
nxagentDisableAutograbModePid);
#endif
nxagentDisableAutograbModePid = 0;
}
} }
void nxagentLaunchDialog(DialogType dialogType) void nxagentLaunchDialog(DialogType dialogType)
...@@ -263,6 +283,24 @@ void nxagentLaunchDialog(DialogType dialogType) ...@@ -263,6 +283,24 @@ void nxagentLaunchDialog(DialogType dialogType)
break; break;
} }
case DIALOG_ENABLE_AUTOGRAB_MODE:
{
message = DIALOG_ENABLE_AUTOGRAB_MODE_MESSAGE;
type = DIALOG_ENABLE_AUTOGRAB_MODE_TYPE;
local = DIALOG_ENABLE_AUTOGRAB_MODE_LOCAL;
pid = &nxagentEnableAutograbModePid;
break;
}
case DIALOG_DISABLE_AUTOGRAB_MODE:
{
message = DIALOG_DISABLE_AUTOGRAB_MODE_MESSAGE;
type = DIALOG_DISABLE_AUTOGRAB_MODE_TYPE;
local = DIALOG_DISABLE_AUTOGRAB_MODE_LOCAL;
pid = &nxagentDisableAutograbModePid;
break;
}
default: default:
{ {
#ifdef WARNING #ifdef WARNING
...@@ -496,6 +534,18 @@ void nxagentTerminateDialog(DialogType type) ...@@ -496,6 +534,18 @@ void nxagentTerminateDialog(DialogType type)
break; break;
} }
case DIALOG_ENABLE_AUTOGRAB_MODE:
{
pid = nxagentEnableAutograbModePid;
break;
}
case DIALOG_DISABLE_AUTOGRAB_MODE:
{
pid = nxagentDisableAutograbModePid;
break;
}
default: default:
{ {
#ifdef WARNING #ifdef WARNING
......
...@@ -41,6 +41,8 @@ typedef enum ...@@ -41,6 +41,8 @@ typedef enum
DIALOG_FAILED_RECONNECTION, DIALOG_FAILED_RECONNECTION,
DIALOG_ENABLE_DEFER_MODE, DIALOG_ENABLE_DEFER_MODE,
DIALOG_DISABLE_DEFER_MODE, DIALOG_DISABLE_DEFER_MODE,
DIALOG_ENABLE_AUTOGRAB_MODE,
DIALOG_DISABLE_AUTOGRAB_MODE,
DIALOG_LAST_TAG DIALOG_LAST_TAG
} DialogType; } DialogType;
...@@ -54,6 +56,8 @@ extern int nxagentEnableRandRModeDialogPid; ...@@ -54,6 +56,8 @@ extern int nxagentEnableRandRModeDialogPid;
extern int nxagentDisableRandRModeDialogPid; extern int nxagentDisableRandRModeDialogPid;
extern int nxagentEnableDeferModePid; extern int nxagentEnableDeferModePid;
extern int nxagentDisableDeferModePid; extern int nxagentDisableDeferModePid;
extern int nxagentEnableAutograbModePid;
extern int nxagentDisableAutograbModePid;
#define NXAGENTFAILEDRECONNECTIONMESSAGELENGTH 256 #define NXAGENTFAILEDRECONNECTIONMESSAGELENGTH 256
extern char nxagentFailedReconnectionMessage[NXAGENTFAILEDRECONNECTIONMESSAGELENGTH]; extern char nxagentFailedReconnectionMessage[NXAGENTFAILEDRECONNECTIONMESSAGELENGTH];
...@@ -87,6 +91,8 @@ extern void nxagentTerminateDialogs(void); ...@@ -87,6 +91,8 @@ extern void nxagentTerminateDialogs(void);
(type) == DIALOG_FAILED_RECONNECTION ? "DIALOG_FAILED_RECONNECTION" : \ (type) == DIALOG_FAILED_RECONNECTION ? "DIALOG_FAILED_RECONNECTION" : \
(type) == DIALOG_ENABLE_DEFER_MODE ? "DIALOG_ENABLE_DEFER_MODE" : \ (type) == DIALOG_ENABLE_DEFER_MODE ? "DIALOG_ENABLE_DEFER_MODE" : \
(type) == DIALOG_DISABLE_DEFER_MODE ? "DIALOG_DISABLE_DEFER_MODE" : \ (type) == DIALOG_DISABLE_DEFER_MODE ? "DIALOG_DISABLE_DEFER_MODE" : \
(type) == DIALOG_ENABLE_AUTOGRAB_MODE ? "DIALOG_ENABLE_AUTGRAB_MODE" : \
(type) == DIALOG_DISABLE_AUTOGRAB_MODE ? "DIALOG_DISABLE_AUTOGRAB_MODE" : \
"UNKNOWN_DIALOG") "UNKNOWN_DIALOG")
/* /*
...@@ -214,5 +220,29 @@ Ctrl+Alt+E to enable it again.\ ...@@ -214,5 +220,29 @@ Ctrl+Alt+E to enable it again.\
#define DIALOG_DISABLE_DEFER_MODE_LOCAL 0 #define DIALOG_DISABLE_DEFER_MODE_LOCAL 0
#define DIALOG_ENABLE_AUTOGRAB_MODE_MESSAGE \
\
"\
Keyboard auto-grabbing mode is now enabled. You can press\n\
Ctrl+Alt+G again to disable auto-grabbing.\
"
#define DIALOG_ENABLE_AUTOGRAB_MODE_TYPE "ok"
#define DIALOG_ENABLE_AUTOGRAB_MODE_LOCAL 0
#define DIALOG_DISABLE_AUTOGRAB_MODE_MESSAGE \
\
"\
Keyboard auto-grabbing mode is now disabled. You can press\n\
Ctrl+Alt+G again to re-enable auto-grabbing.\
"
#define DIALOG_DISABLE_AUTOGRAB_MODE_TYPE "ok"
#define DIALOG_DISABLE_AUTOGRAB_MODE_LOCAL 0
#endif /* __Dialog_H__ */ #endif /* __Dialog_H__ */
...@@ -115,6 +115,15 @@ ...@@ -115,6 +115,15 @@
#undef TEST #undef TEST
#undef DEBUG #undef DEBUG
/* debug individual subsystems */
#undef DEBUG_AUTOGRAB
/* aktivate subsystems if generic DEBUG is activated */
#ifdef DEBUG
#ifndef DEBUG_AUTOGRAB
#define DEBUG_AUTOGRAB
#endif
#endif
/* /*
* Log begin and end of the important handlers. * Log begin and end of the important handlers.
*/ */
...@@ -292,6 +301,36 @@ void ProcessInputEvents(void) ...@@ -292,6 +301,36 @@ void ProcessInputEvents(void)
mieqProcessInputEvents(); mieqProcessInputEvents();
} }
#ifdef DEBUG
char * nxagentGetNotifyMode(int mode)
{
switch (mode)
{
case NotifyNormal:
{
return "NotifyNormal";
break;
}
case NotifyGrab:
{
return "NotifyGrab";
break;
}
case NotifyUngrab:
{
return "NotifyUngrab";
break;
}
case NotifyWhileGrabbed:
{
return "NotifyWhileGrabbed";
break;
}
}
return "Unknown";
}
#endif
#ifdef DEBUG_TREE #ifdef DEBUG_TREE
/* /*
...@@ -674,6 +713,40 @@ static void nxagentSwitchDeferMode(void) ...@@ -674,6 +713,40 @@ static void nxagentSwitchDeferMode(void)
} }
} }
static void nxagentEnableAutoGrab(void)
{
#ifdef DEBUG_AUTOGRAB
fprintf(stderr, "enabling autograb\n");
#endif
nxagentGrabPointerAndKeyboard(NULL);
nxagentChangeOption(AutoGrab, True);
nxagentLaunchDialog(DIALOG_ENABLE_AUTOGRAB_MODE);
}
static void nxagentDisableAutoGrab(void)
{
#ifdef DEBUG_AUTOGRAB
fprintf(stderr, "disabling autograb\n");
#endif
nxagentUngrabPointerAndKeyboard(NULL);
nxagentChangeOption(AutoGrab, False);
nxagentLaunchDialog(DIALOG_DISABLE_AUTOGRAB_MODE);
}
static void nxagentToggleAutoGrab(void)
{
/* autograb only works in windowed mode */
if (nxagentOption(Rootless) || nxagentOption(Fullscreen))
return;
if (!nxagentOption(AutoGrab))
nxagentEnableAutoGrab();
else
nxagentDisableAutoGrab();
}
static Bool nxagentExposurePredicate(Display *display, XEvent *event, XPointer window) static Bool nxagentExposurePredicate(Display *display, XEvent *event, XPointer window)
{ {
/* /*
...@@ -1060,6 +1133,12 @@ void nxagentDispatchEvents(PredicateFuncPtr predicate) ...@@ -1060,6 +1133,12 @@ void nxagentDispatchEvents(PredicateFuncPtr predicate)
break; break;
} }
case doAutoGrab:
{
nxagentToggleAutoGrab();
break;
}
default: default:
{ {
FatalError("nxagentDispatchEvent: handleKeyPress returned unknown value\n"); FatalError("nxagentDispatchEvent: handleKeyPress returned unknown value\n");
...@@ -1492,8 +1571,18 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1492,8 +1571,18 @@ FIXME: Don't enqueue the KeyRelease event if the key was
{ {
WindowPtr pWin; WindowPtr pWin;
#ifdef TEST #ifdef DEBUG
fprintf(stderr, "nxagentDispatchEvents: Going to handle new FocusIn event.\n"); fprintf(stderr, "%s: Going to handle new FocusIn event [0x%x] mode: [%s]\n", __func__, X.xfocus.window, nxagentGetNotifyMode(X.xfocus.mode));
{
XlibWindow w;
int revert_to;
XGetInputFocus(nxagentDisplay, &w, &revert_to);
fprintf(stderr, "%s: (FocusIn): Event win [0x%x] Focus owner [0x%x] nxagentDefaultWindows[0] [0x%x]\n", __func__, X.xfocus.window, w, nxagentDefaultWindows[0]);
}
#else
#ifdef TEST
fprintf(stderr, "%s: Going to handle new FocusIn event\n", __func__);
#endif
#endif #endif
/* /*
...@@ -1519,12 +1608,34 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1519,12 +1608,34 @@ FIXME: Don't enqueue the KeyRelease event if the key was
} }
} }
if (nxagentOption(AutoGrab) && !(nxagentOption(AllScreens) || nxagentOption(Fullscreen) || nxagentOption(Rootless)))
{
if (X.xfocus.window == nxagentDefaultWindows[0] && X.xfocus.mode == NotifyNormal)
{
#if defined(DEBUG) || defined(DEBUG_AUTOGRAB)
fprintf(stderr, "%s: (FocusIn): grabbing\n", __func__);
#endif
nxagentGrabPointerAndKeyboard(NULL);
}
/* else
{
#if defined(DEBUG) || defined(DEBUG_AUTOGRAB)
fprintf(stderr, "%s: (FocusIn): ungrabbing\n", __func__);
#endif
nxagentUngrabPointerAndKeyboard(NULL);
}
*/
}
break; break;
} }
case FocusOut: case FocusOut:
{ {
#ifdef TEST #ifdef DEBUG
fprintf(stderr, "nxagentDispatchEvents: Going to handle new FocusOut event.\n"); fprintf(stderr, "%s: Going to handle new FocusOut event [0x%x] mode: [%s]\n", __func__, X.xfocus.window, nxagentGetNotifyMode(X.xfocus.mode));
#else
#ifdef TEST
fprintf(stderr, "%s: Going to handle new FocusOut event.\n", __func__);
#endif
#endif #endif
if (X.xfocus.detail != NotifyInferior) if (X.xfocus.detail != NotifyInferior)
...@@ -1597,6 +1708,19 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1597,6 +1708,19 @@ FIXME: Don't enqueue the KeyRelease event if the key was
#endif /* NXAGENT_FIXKEYS */ #endif /* NXAGENT_FIXKEYS */
if (nxagentOption(AutoGrab) && !nxagentFullscreenWindow)
{
XlibWindow w;
int revert_to;
XGetInputFocus(nxagentDisplay, &w, &revert_to);
if (w != nxagentDefaultWindows[0] && X.xfocus.mode == NotifyWhileGrabbed)
{
#if defined(DEBUG) || defined(DEBUG_AUTOGRAB)
fprintf(stderr, "%s: (FocusOut): ungrabbing\n", __func__);
#endif
nxagentUngrabPointerAndKeyboard(NULL);
}
}
break; break;
} }
case KeymapNotify: case KeymapNotify:
...@@ -1732,11 +1856,14 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1732,11 +1856,14 @@ FIXME: Don't enqueue the KeyRelease event if the key was
nxagentLastEnteredWindow = NULL; nxagentLastEnteredWindow = NULL;
} }
if (X.xcrossing.window == nxagentDefaultWindows[0] && if (!nxagentOption(AutoGrab))
X.xcrossing.detail != NotifyInferior &&
X.xcrossing.mode == NotifyNormal)
{ {
nxagentUngrabPointerAndKeyboard(&X); if (X.xcrossing.window == nxagentDefaultWindows[0] &&
X.xcrossing.detail != NotifyInferior &&
X.xcrossing.mode == NotifyNormal)
{
nxagentUngrabPointerAndKeyboard(&X);
}
} }
if (X.xcrossing.detail != NotifyInferior) if (X.xcrossing.detail != NotifyInferior)
...@@ -3827,13 +3954,26 @@ void nxagentGrabPointerAndKeyboard(XEvent *X) ...@@ -3827,13 +3954,26 @@ void nxagentGrabPointerAndKeyboard(XEvent *X)
fprintf(stderr, "nxagentGrabPointerAndKeyboard: Going to grab the keyboard in context [B1].\n"); fprintf(stderr, "nxagentGrabPointerAndKeyboard: Going to grab the keyboard in context [B1].\n");
#endif #endif
result = XGrabKeyboard(nxagentDisplay, nxagentFullscreenWindow, if (nxagentFullscreenWindow)
True, GrabModeAsync, GrabModeAsync, now); result = XGrabKeyboard(nxagentDisplay, nxagentFullscreenWindow,
True, GrabModeAsync, GrabModeAsync, now);
else
result = XGrabKeyboard(nxagentDisplay, RootWindow(nxagentDisplay, DefaultScreen(nxagentDisplay)),
True, GrabModeAsync, GrabModeAsync, now);
if (result != GrabSuccess) if (result != GrabSuccess)
{ {
#ifdef DEBUG
fprintf(stderr, "%s: keyboard grab failed.\n", __func__);
#endif
return; return;
} }
#ifdef DEBUG
else
{
fprintf(stderr, "%s: keyboard grab successful.\n", __func__);
}
#endif
/* /*
* The smart scheduler could be stopped while * The smart scheduler could be stopped while
...@@ -3851,7 +3991,8 @@ void nxagentGrabPointerAndKeyboard(XEvent *X) ...@@ -3851,7 +3991,8 @@ void nxagentGrabPointerAndKeyboard(XEvent *X)
resource = nxagentWaitForResource(NXGetCollectGrabPointerResource, resource = nxagentWaitForResource(NXGetCollectGrabPointerResource,
nxagentCollectGrabPointerPredicate); nxagentCollectGrabPointerPredicate);
NXCollectGrabPointer(nxagentDisplay, resource, if (nxagentFullscreenWindow)
NXCollectGrabPointer(nxagentDisplay, resource,
nxagentFullscreenWindow, True, NXAGENT_POINTER_EVENT_MASK, nxagentFullscreenWindow, True, NXAGENT_POINTER_EVENT_MASK,
GrabModeAsync, GrabModeAsync, None, None, now); GrabModeAsync, GrabModeAsync, None, None, now);
......
...@@ -50,7 +50,8 @@ enum HandleEventResult ...@@ -50,7 +50,8 @@ enum HandleEventResult
doViewportRight, doViewportRight,
doViewportDown, doViewportDown,
doSwitchResizeMode, doSwitchResizeMode,
doSwitchDeferMode doSwitchDeferMode,
doAutoGrab,
}; };
extern CARD32 nxagentLastEventTime; extern CARD32 nxagentLastEventTime;
......
...@@ -99,6 +99,9 @@ char * nxagentSpecialKeystrokeNames[] = { ...@@ -99,6 +99,9 @@ char * nxagentSpecialKeystrokeNames[] = {
"viewport_scroll_down", "viewport_scroll_down",
"reread_keystrokes", "reread_keystrokes",
"autograb",
NULL, NULL,
}; };
...@@ -138,6 +141,7 @@ struct nxagentSpecialKeystrokeMap default_map[] = { ...@@ -138,6 +141,7 @@ struct nxagentSpecialKeystrokeMap default_map[] = {
{KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_Down}, {KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_Down},
{KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_KP_Down}, {KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_KP_Down},
{KEYSTROKE_REREAD_KEYSTROKES, ControlMask, True, XK_k}, {KEYSTROKE_REREAD_KEYSTROKES, ControlMask, True, XK_k},
{KEYSTROKE_AUTOGRAB, ControlMask, True, XK_g},
{KEYSTROKE_END_MARKER, 0, False, NoSymbol}, {KEYSTROKE_END_MARKER, 0, False, NoSymbol},
}; };
struct nxagentSpecialKeystrokeMap *map = default_map; struct nxagentSpecialKeystrokeMap *map = default_map;
...@@ -467,7 +471,7 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X) ...@@ -467,7 +471,7 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X)
#endif #endif
for (struct nxagentSpecialKeystrokeMap *cur = map; cur->stroke != KEYSTROKE_END_MARKER; cur++) { for (struct nxagentSpecialKeystrokeMap *cur = map; cur->stroke != KEYSTROKE_END_MARKER; cur++) {
#ifdef DEBUG #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 #endif
if (cur->keysym == keysym && modifier_matches(cur->modifierMask, cur->modifierAltMeta, X->state)) { if (cur->keysym == keysym && modifier_matches(cur->modifierMask, cur->modifierAltMeta, X->state)) {
#ifdef DEBUG #ifdef DEBUG
...@@ -627,6 +631,9 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result) ...@@ -627,6 +631,9 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
if (X->type == KeyRelease) if (X->type == KeyRelease)
nxagentInitKeystrokes(True); nxagentInitKeystrokes(True);
break; break;
case KEYSTROKE_AUTOGRAB:
*result = doAutoGrab;
break;
case KEYSTROKE_NOTHING: /* do nothing. difference to KEYSTROKE_IGNORE is the return value */ case KEYSTROKE_NOTHING: /* do nothing. difference to KEYSTROKE_IGNORE is the return value */
case KEYSTROKE_END_MARKER: /* just to make gcc STFU */ case KEYSTROKE_END_MARKER: /* just to make gcc STFU */
case KEYSTROKE_MAX: case KEYSTROKE_MAX:
......
...@@ -73,6 +73,8 @@ enum nxagentSpecialKeystroke { ...@@ -73,6 +73,8 @@ enum nxagentSpecialKeystroke {
KEYSTROKE_REREAD_KEYSTROKES, KEYSTROKE_REREAD_KEYSTROKES,
KEYSTROKE_AUTOGRAB,
KEYSTROKE_NOTHING, KEYSTROKE_NOTHING,
/* insert more here and in the string translation */ /* insert more here and in the string translation */
......
...@@ -172,6 +172,8 @@ void nxagentInitOptions(void) ...@@ -172,6 +172,8 @@ void nxagentInitOptions(void)
nxagentOptions.ReconnectTolerance = DEFAULT_TOLERANCE; nxagentOptions.ReconnectTolerance = DEFAULT_TOLERANCE;
nxagentOptions.KeycodeConversion = DEFAULT_KEYCODE_CONVERSION; nxagentOptions.KeycodeConversion = DEFAULT_KEYCODE_CONVERSION;
nxagentOptions.AutoGrab = False;
} }
/* /*
......
...@@ -450,6 +450,13 @@ typedef struct _AgentOptions ...@@ -450,6 +450,13 @@ typedef struct _AgentOptions
* Convert evdev keycodes to pc105. * Convert evdev keycodes to pc105.
*/ */
KeycodeConversionMode KeycodeConversion; KeycodeConversionMode KeycodeConversion;
/*
* True if agent should grab the input in windowed mode whenever the
* agent window gets the focus
*/
int AutoGrab; /* Should be Bool but I do not want to include Xlib.h here */
} AgentOptionsRec; } AgentOptionsRec;
typedef AgentOptionsRec *AgentOptionsPtr; typedef AgentOptionsRec *AgentOptionsPtr;
......
...@@ -754,7 +754,12 @@ void nxagentSwitchFullscreen(ScreenPtr pScreen, Bool switchOn) ...@@ -754,7 +754,12 @@ void nxagentSwitchFullscreen(ScreenPtr pScreen, Bool switchOn)
else else
{ {
nxagentFullscreenWindow = None; nxagentFullscreenWindow = None;
nxagentUngrabPointerAndKeyboard(NULL);
/* if we had AutoGrab before entering fullscreen reactivate it now */
if (nxagentOption(AutoGrab))
nxagentGrabPointerAndKeyboard(NULL);
else
nxagentUngrabPointerAndKeyboard(NULL);
} }
} }
...@@ -1005,6 +1010,10 @@ void nxagentSwitchAllScreens(ScreenPtr pScreen, Bool switchOn) ...@@ -1005,6 +1010,10 @@ void nxagentSwitchAllScreens(ScreenPtr pScreen, Bool switchOn)
XMoveResizeWindow(nxagentDisplay, nxagentInputWindows[0], 0, 0, XMoveResizeWindow(nxagentDisplay, nxagentInputWindows[0], 0, 0,
nxagentOption(Width), nxagentOption(Height)); nxagentOption(Width), nxagentOption(Height));
/* if we had AutoGrab before entering fullscreen reactivate it now */
if (nxagentOption(AutoGrab))
nxagentGrabPointerAndKeyboard(NULL);
nxagentSetPrintGeometry(pScreen -> myNum); nxagentSetPrintGeometry(pScreen -> myNum);
} }
......
...@@ -457,6 +457,9 @@ The nx-X11 system adds the following command line arguments: ...@@ -457,6 +457,9 @@ The nx-X11 system adds the following command line arguments:
.B \-forcenx .B \-forcenx
force use of NX protocol messages assuming communication through \fBnxproxy\fR force use of NX protocol messages assuming communication through \fBnxproxy\fR
.TP 8 .TP 8
.B \-autograb
enable autograb mode on \fBnxagent\fR startup. The autograb feature can be toggled via nxagent keystrokes
.TP 8
.B \-nxrealwindowprop .B \-nxrealwindowprop
set property NX_REAL_WINDOW for each X11 client inside \fBnxagent\fR, set property NX_REAL_WINDOW for each X11 client inside \fBnxagent\fR,
providing the window XID of the corresponding window object on the X providing the window XID of the corresponding window object on the X
...@@ -753,6 +756,10 @@ format must be included in both. This is potentially unsafe. ...@@ -753,6 +756,10 @@ format must be included in both. This is potentially unsafe.
means that all of these checks are essentially means that all of these checks are essentially
deactivated. This is a very bad idea. deactivated. This is a very bad idea.
.RE .RE
.TP 8
.B autograb=<int>
enable or disable autograb (default: disabled)
.RE
If you want to use \fBnxagent\fR as a replacement for Xnest or Xephyr you If you want to use \fBnxagent\fR as a replacement for Xnest or Xephyr you
can pass options like this: can pass options like this:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment