Added a log message why the user is locked to the screen.

This commit is contained in:
crs 2003-03-17 22:32:01 +00:00
parent 0fd70ee536
commit a7e2141ede
4 changed files with 296 additions and 27 deletions

View File

@ -21,6 +21,269 @@
#include "CArchMiscWindows.h" #include "CArchMiscWindows.h"
#include <cstring> #include <cstring>
//
// map virtual key id to a name
//
static const char* g_vkToName[] = {
"vk 0x00",
"VK_LBUTTON",
"VK_RBUTTON",
"VK_CANCEL",
"VK_MBUTTON",
"vk 0x05",
"vk 0x06",
"vk 0x07",
"VK_BACK",
"VK_TAB",
"vk 0x0a",
"vk 0x0b",
"VK_CLEAR",
"VK_RETURN",
"vk 0x0e",
"vk 0x0f",
"VK_SHIFT",
"VK_CONTROL",
"VK_MENU",
"VK_PAUSE",
"VK_CAPITAL",
"VK_KANA",
"vk 0x16",
"VK_JUNJA",
"VK_FINAL",
"VK_KANJI",
"vk 0x1a",
"VK_ESCAPE",
"VK_CONVERT",
"VK_NONCONVERT",
"VK_ACCEPT",
"VK_MODECHANGE",
"VK_SPACE",
"VK_PRIOR",
"VK_NEXT",
"VK_END",
"VK_HOME",
"VK_LEFT",
"VK_UP",
"VK_RIGHT",
"VK_DOWN",
"VK_SELECT",
"VK_PRINT",
"VK_EXECUTE",
"VK_SNAPSHOT",
"VK_INSERT",
"VK_DELETE",
"VK_HELP",
"VK_0",
"VK_1",
"VK_2",
"VK_3",
"VK_4",
"VK_5",
"VK_6",
"VK_7",
"VK_8",
"VK_9",
"vk 0x3a",
"vk 0x3b",
"vk 0x3c",
"vk 0x3d",
"vk 0x3e",
"vk 0x3f",
"vk 0x40",
"VK_A",
"VK_B",
"VK_C",
"VK_D",
"VK_E",
"VK_F",
"VK_G",
"VK_H",
"VK_I",
"VK_J",
"VK_K",
"VK_L",
"VK_M",
"VK_N",
"VK_O",
"VK_P",
"VK_Q",
"VK_R",
"VK_S",
"VK_T",
"VK_U",
"VK_V",
"VK_W",
"VK_X",
"VK_Y",
"VK_Z",
"VK_LWIN",
"VK_RWIN",
"VK_APPS",
"vk 0x5e",
"vk 0x5f",
"VK_NUMPAD0",
"VK_NUMPAD1",
"VK_NUMPAD2",
"VK_NUMPAD3",
"VK_NUMPAD4",
"VK_NUMPAD5",
"VK_NUMPAD6",
"VK_NUMPAD7",
"VK_NUMPAD8",
"VK_NUMPAD9",
"VK_MULTIPLY",
"VK_ADD",
"VK_SEPARATOR",
"VK_SUBTRACT",
"VK_DECIMAL",
"VK_DIVIDE",
"VK_F1",
"VK_F2",
"VK_F3",
"VK_F4",
"VK_F5",
"VK_F6",
"VK_F7",
"VK_F8",
"VK_F9",
"VK_F10",
"VK_F11",
"VK_F12",
"VK_F13",
"VK_F14",
"VK_F15",
"VK_F16",
"VK_F17",
"VK_F18",
"VK_F19",
"VK_F20",
"VK_F21",
"VK_F22",
"VK_F23",
"VK_F24",
"vk 0x88",
"vk 0x89",
"vk 0x8a",
"vk 0x8b",
"vk 0x8c",
"vk 0x8d",
"vk 0x8e",
"vk 0x8f",
"VK_NUMLOCK",
"VK_SCROLL",
"vk 0x92",
"vk 0x93",
"vk 0x94",
"vk 0x95",
"vk 0x96",
"vk 0x97",
"vk 0x98",
"vk 0x99",
"vk 0x9a",
"vk 0x9b",
"vk 0x9c",
"vk 0x9d",
"vk 0x9e",
"vk 0x9f",
"VK_LSHIFT",
"VK_RSHIFT",
"VK_LCONTROL",
"VK_RCONTROL",
"VK_LMENU",
"VK_RMENU",
"vk 0xa6",
"vk 0xa7",
"vk 0xa8",
"vk 0xa9",
"vk 0xaa",
"vk 0xab",
"vk 0xac",
"vk 0xad",
"vk 0xae",
"vk 0xaf",
"vk 0xb0",
"vk 0xb1",
"vk 0xb2",
"vk 0xb3",
"vk 0xb4",
"vk 0xb5",
"vk 0xb6",
"vk 0xb7",
"vk 0xb8",
"vk 0xb9",
"vk 0xba",
"vk 0xbb",
"vk 0xbc",
"vk 0xbd",
"vk 0xbe",
"vk 0xbf",
"vk 0xc0",
"vk 0xc1",
"vk 0xc2",
"vk 0xc3",
"vk 0xc4",
"vk 0xc5",
"vk 0xc6",
"vk 0xc7",
"vk 0xc8",
"vk 0xc9",
"vk 0xca",
"vk 0xcb",
"vk 0xcc",
"vk 0xcd",
"vk 0xce",
"vk 0xcf",
"vk 0xd0",
"vk 0xd1",
"vk 0xd2",
"vk 0xd3",
"vk 0xd4",
"vk 0xd5",
"vk 0xd6",
"vk 0xd7",
"vk 0xd8",
"vk 0xd9",
"vk 0xda",
"vk 0xdb",
"vk 0xdc",
"vk 0xdd",
"vk 0xde",
"vk 0xdf",
"vk 0xe0",
"vk 0xe1",
"vk 0xe2",
"vk 0xe3",
"vk 0xe4",
"VK_PROCESSKEY",
"vk 0xe6",
"vk 0xe7",
"vk 0xe8",
"vk 0xe9",
"vk 0xea",
"vk 0xeb",
"vk 0xec",
"vk 0xed",
"vk 0xee",
"vk 0xef",
"vk 0xf0",
"vk 0xf1",
"vk 0xf2",
"vk 0xf3",
"vk 0xf4",
"vk 0xf5",
"VK_ATTN",
"VK_CRSEL",
"VK_EXSEL",
"VK_EREOF",
"VK_PLAY",
"VK_ZOOM",
"VK_NONAME",
"VK_PA1",
"VK_OEM_CLEAR",
"vk 0xff"
};
// //
// CMSWindowsPrimaryScreen // CMSWindowsPrimaryScreen
// //
@ -157,6 +420,7 @@ CMSWindowsPrimaryScreen::isLockedToScreen() const
// use shadow keyboard state in m_keys // use shadow keyboard state in m_keys
for (UInt32 i = 0; i < 256; ++i) { for (UInt32 i = 0; i < 256; ++i) {
if ((m_keys[i] & 0x80) != 0) { if ((m_keys[i] & 0x80) != 0) {
LOG((CLOG_DEBUG "locked by \"%s\"", g_vkToName[i]));
return true; return true;
} }
} }
@ -166,6 +430,7 @@ CMSWindowsPrimaryScreen::isLockedToScreen() const
for (UInt32 b = 1, j = 0; j < 32; b <<= 1, ++j) { for (UInt32 b = 1, j = 0; j < 32; b <<= 1, ++j) {
if ((s_mappedKeys[i] & b) != 0) { if ((s_mappedKeys[i] & b) != 0) {
if (GetAsyncKeyState(i * 32 + j) < 0) { if (GetAsyncKeyState(i * 32 + j) < 0) {
LOG((CLOG_DEBUG "locked by \"%s\"", g_vkToName[i * 32 + j]));
return true; return true;
} }
} }

View File

@ -150,6 +150,7 @@ CXWindowsPrimaryScreen::isLockedToScreen() const
&xRoot, &yRoot, &xWindow, &yWindow, &state)) { &xRoot, &yRoot, &xWindow, &yWindow, &state)) {
if ((state & (Button1Mask | Button2Mask | Button3Mask | if ((state & (Button1Mask | Button2Mask | Button3Mask |
Button4Mask | Button5Mask)) != 0) { Button4Mask | Button5Mask)) != 0) {
LOG((CLOG_DEBUG "locked by mouse button"));
return true; return true;
} }
} }
@ -162,32 +163,32 @@ CXWindowsPrimaryScreen::isLockedToScreen() const
// locked if any key is down // locked if any key is down
for (unsigned int i = 0; i < sizeof(keyMap); ++i) { for (unsigned int i = 0; i < sizeof(keyMap); ++i) {
if (keyMap[i] != 0) { if (keyMap[i] != 0) {
// if any key is half-duplex then it'll be down when for (unsigned int j = 0; j < 8; ++j) {
// toggled on but shouldn't count as a reason to lock if ((keyMap[i] & (1 << j)) != 0) {
// to the screen. const KeyCode keycode = 8 * i + j;
if (m_numLockHalfDuplex || m_capsLockHalfDuplex) { const KeySym keysym = XKeycodeToKeysym(display,
for (unsigned int j = 0; j < 8; ++j) { keycode, 0);
if ((keyMap[i] & (1 << j)) != 0) { // if any key is half-duplex then it'll be down when
const KeyCode keycode = 8 * i + j; // toggled on but shouldn't count as a reason to lock
const KeySym keysym = XKeycodeToKeysym(display, // to the screen.
keycode, 0); if (m_numLockHalfDuplex && keysym == XK_Num_Lock) {
if (m_numLockHalfDuplex && keysym == XK_Num_Lock) { continue;
continue;
}
if (m_capsLockHalfDuplex && keysym == XK_Caps_Lock) {
continue;
}
// non-half-duplex key down
return true;
} }
if (m_capsLockHalfDuplex && keysym == XK_Caps_Lock) {
continue;
}
// non-half-duplex key down
char* name = XKeysymToString(keysym);
if (name == NULL) {
LOG((CLOG_DEBUG "locked by keycode %d", keycode));
}
else {
LOG((CLOG_DEBUG "locked by \"%s\"", name));
}
return true;
} }
// only half-duplex keys down
continue;
} }
return true;
} }
} }

View File

@ -897,13 +897,14 @@ CServer::onCommandKey(KeyID /*id*/, KeyModifierMask /*mask*/, bool /*down*/)
bool bool
CServer::isLockedToScreenNoLock() const CServer::isLockedToScreenNoLock() const
{ {
// locked if primary says we're locked // locked if scroll-lock is toggled on
if (m_primaryClient->isLockedToScreen()) { if ((m_primaryClient->getToggleMask() & KeyModifierScrollLock) != 0) {
LOG((CLOG_DEBUG "locked by ScrollLock"));
return true; return true;
} }
// locked if scroll-lock is toggled on // locked if primary says we're locked
if ((m_primaryClient->getToggleMask() & KeyModifierScrollLock) != 0) { if (m_primaryClient->isLockedToScreen()) {
return true; return true;
} }

View File

@ -175,6 +175,8 @@ public:
any other reason that the user should not be allowed to switch any other reason that the user should not be allowed to switch
screens. Active toggle keys (including the scroll lock key) screens. Active toggle keys (including the scroll lock key)
should not be counted as reasons to lock to the screen. should not be counted as reasons to lock to the screen.
If this method returns true it should log a message on why at
the CLOG_DEBUG level.
*/ */
virtual bool isLockedToScreen() const = 0; virtual bool isLockedToScreen() const = 0;