added support for locking to a screen when the sroll lock is
toggled on or when any key or button is pressed. fully implemented on X but stubbed out for now on win32.
This commit is contained in:
parent
a0b25b9d4a
commit
34c587e864
|
@ -255,6 +255,12 @@ KeyModifierMask CMSWindowsPrimaryScreen::getToggleMask() const
|
|||
return mask;
|
||||
}
|
||||
|
||||
bool CMSWindowsPrimaryScreen::isLockedToScreen() const
|
||||
{
|
||||
// FIXME
|
||||
return false;
|
||||
}
|
||||
|
||||
void CMSWindowsPrimaryScreen::onOpenDisplay()
|
||||
{
|
||||
assert(m_window == NULL);
|
||||
|
|
|
@ -27,6 +27,7 @@ public:
|
|||
virtual SInt32 getJumpZoneSize() const;
|
||||
virtual void getClipboard(ClipboardID, IClipboard*) const;
|
||||
virtual KeyModifierMask getToggleMask() const;
|
||||
virtual bool isLockedToScreen() const;
|
||||
|
||||
protected:
|
||||
// CMSWindowsScreen overrides
|
||||
|
|
|
@ -489,7 +489,17 @@ void CServer::onMouseWheel(SInt32 delta)
|
|||
|
||||
bool CServer::isLockedToScreen() const
|
||||
{
|
||||
// FIXME
|
||||
// locked if primary says we're locked
|
||||
if (m_primary->isLockedToScreen()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// locked if scroll-lock is toggled on
|
||||
if ((m_primary->getToggleMask() & KeyModifierScrollLock) != 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// not locked
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -424,8 +424,9 @@ KeyModifierMask CXWindowsPrimaryScreen::getToggleMask() const
|
|||
int xRoot, yRoot, xWindow, yWindow;
|
||||
unsigned int state;
|
||||
if (!XQueryPointer(display, m_window, &root, &window,
|
||||
&xRoot, &yRoot, &xWindow, &yWindow, &state))
|
||||
&xRoot, &yRoot, &xWindow, &yWindow, &state)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// convert to KeyModifierMask
|
||||
KeyModifierMask mask = 0;
|
||||
|
@ -439,6 +440,38 @@ KeyModifierMask CXWindowsPrimaryScreen::getToggleMask() const
|
|||
return mask;
|
||||
}
|
||||
|
||||
bool CXWindowsPrimaryScreen::isLockedToScreen() const
|
||||
{
|
||||
CDisplayLock display(this);
|
||||
|
||||
// query the pointer to get the button state
|
||||
Window root, window;
|
||||
int xRoot, yRoot, xWindow, yWindow;
|
||||
unsigned int state;
|
||||
if (XQueryPointer(display, m_window, &root, &window,
|
||||
&xRoot, &yRoot, &xWindow, &yWindow, &state)) {
|
||||
if ((state & (Button1Mask | Button2Mask | Button3Mask |
|
||||
Button4Mask | Button5Mask)) != 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// get logical keyboard state
|
||||
char keyMap[32];
|
||||
memset(keyMap, 0, sizeof(keyMap));
|
||||
XQueryKeymap(display, keyMap);
|
||||
|
||||
// locked if any key is down
|
||||
for (unsigned int i = 0; i < sizeof(keyMap); ++i) {
|
||||
if (keyMap[i] != 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// not locked
|
||||
return false;
|
||||
}
|
||||
|
||||
void CXWindowsPrimaryScreen::onOpenDisplay()
|
||||
{
|
||||
assert(m_window == None);
|
||||
|
|
|
@ -25,6 +25,7 @@ public:
|
|||
virtual SInt32 getJumpZoneSize() const;
|
||||
virtual void getClipboard(ClipboardID, IClipboard*) const;
|
||||
virtual KeyModifierMask getToggleMask() const;
|
||||
virtual bool isLockedToScreen() const;
|
||||
|
||||
protected:
|
||||
// CXWindowsScreen overrides
|
||||
|
|
|
@ -84,6 +84,11 @@ public:
|
|||
// the returned mask should have the corresponding bit set for
|
||||
// each toggle key that is active.
|
||||
virtual KeyModifierMask getToggleMask() const = 0;
|
||||
|
||||
// return true if any key or button is being pressed or if there's
|
||||
// any other reason that the user should not be allowed to switch
|
||||
// screens.
|
||||
virtual bool isLockedToScreen() const = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue