mirror of
https://github.com/debauchee/barrier.git
synced 2026-11-05 23:07:59 +08:00
added screen locking support to win32. added support for
resolution changing (only semi-supported on X because that has no means for resizing screen anyway). also fixed some clipboard problems on win32.
This commit is contained in:
@@ -32,7 +32,8 @@ CClient::CClient(const CString& clientName) :
|
||||
m_output(NULL),
|
||||
m_screen(NULL),
|
||||
m_active(false),
|
||||
m_seqNum(0)
|
||||
m_seqNum(0),
|
||||
m_ignoreMove(false)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
@@ -106,7 +107,7 @@ void CClient::onClipboardChanged(ClipboardID id)
|
||||
m_timeClipboard[id] = 0;
|
||||
|
||||
// if we're not the active screen then send the clipboard now,
|
||||
// otherwise we'll until we leave.
|
||||
// otherwise we'll wait until we leave.
|
||||
if (!m_active) {
|
||||
// get clipboard
|
||||
CClipboard clipboard;
|
||||
@@ -127,6 +128,19 @@ void CClient::onClipboardChanged(ClipboardID id)
|
||||
}
|
||||
}
|
||||
|
||||
void CClient::onResolutionChanged()
|
||||
{
|
||||
log((CLOG_DEBUG "resolution changed"));
|
||||
|
||||
CLock lock(&m_mutex);
|
||||
|
||||
// start ignoring mouse movement until we get an acknowledgment
|
||||
m_ignoreMove = true;
|
||||
|
||||
// send notification of resolution change
|
||||
onQueryInfoNoLock();
|
||||
}
|
||||
|
||||
#include "CTCPSocket.h" // FIXME
|
||||
void CClient::runSession(void*)
|
||||
{
|
||||
@@ -261,6 +275,9 @@ void CClient::runSession(void*)
|
||||
else if (memcmp(code, kMsgQInfo, 4) == 0) {
|
||||
onQueryInfo();
|
||||
}
|
||||
else if (memcmp(code, kMsgCInfoAck, 4) == 0) {
|
||||
onInfoAcknowledgment();
|
||||
}
|
||||
else if (memcmp(code, kMsgDClipboard, 4) == 0) {
|
||||
onSetClipboard();
|
||||
}
|
||||
@@ -399,10 +416,13 @@ void CClient::onLeave()
|
||||
// marshall the data
|
||||
CString data = clipboard.marshall();
|
||||
|
||||
// send data
|
||||
log((CLOG_DEBUG "sending clipboard %d seqnum=%d, size=%d", id, m_seqNum, data.size()));
|
||||
CProtocolUtil::writef(m_output,
|
||||
// save and send data if different
|
||||
if (data != m_dataClipboard[id]) {
|
||||
log((CLOG_DEBUG "sending clipboard %d seqnum=%d, size=%d", id, m_seqNum, data.size()));
|
||||
m_dataClipboard[id] = data;
|
||||
CProtocolUtil::writef(m_output,
|
||||
kMsgDClipboard, id, m_seqNum, &data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -441,13 +461,26 @@ void CClient::onScreenSaver()
|
||||
|
||||
void CClient::onQueryInfo()
|
||||
{
|
||||
SInt32 w, h;
|
||||
CLock lock(&m_mutex);
|
||||
onQueryInfoNoLock();
|
||||
}
|
||||
|
||||
void CClient::onQueryInfoNoLock()
|
||||
{
|
||||
SInt32 x, y, w, h;
|
||||
m_screen->getMousePos(&x, &y);
|
||||
m_screen->getSize(&w, &h);
|
||||
SInt32 zoneSize = m_screen->getJumpZoneSize();
|
||||
|
||||
log((CLOG_DEBUG1 "sending info size=%d,%d zone=%d", w, h, zoneSize));
|
||||
log((CLOG_DEBUG1 "sending info size=%d,%d zone=%d pos=%d,%d", w, h, zoneSize, x, y));
|
||||
CProtocolUtil::writef(m_output, kMsgDInfo, w, h, zoneSize, x, y);
|
||||
}
|
||||
|
||||
void CClient::onInfoAcknowledgment()
|
||||
{
|
||||
log((CLOG_DEBUG1 "recv info acknowledgment"));
|
||||
CLock lock(&m_mutex);
|
||||
CProtocolUtil::writef(m_output, kMsgDInfo, w, h, zoneSize);
|
||||
m_ignoreMove = false;
|
||||
}
|
||||
|
||||
void CClient::onSetClipboard()
|
||||
@@ -536,13 +569,17 @@ void CClient::onMouseUp()
|
||||
|
||||
void CClient::onMouseMove()
|
||||
{
|
||||
bool ignore;
|
||||
SInt16 x, y;
|
||||
{
|
||||
CLock lock(&m_mutex);
|
||||
CProtocolUtil::readf(m_input, kMsgDMouseMove + 4, &x, &y);
|
||||
ignore = m_ignoreMove;
|
||||
}
|
||||
log((CLOG_DEBUG2 "recv mouse move %d,%d", x, y));
|
||||
m_screen->mouseMove(x, y);
|
||||
if (!ignore) {
|
||||
m_screen->mouseMove(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void CClient::onMouseWheel()
|
||||
|
||||
@@ -23,6 +23,7 @@ public:
|
||||
|
||||
// handle events on client's screen
|
||||
void onClipboardChanged(ClipboardID);
|
||||
void onResolutionChanged();
|
||||
|
||||
// accessors
|
||||
|
||||
@@ -40,6 +41,8 @@ private:
|
||||
void onGrabClipboard();
|
||||
void onScreenSaver();
|
||||
void onQueryInfo();
|
||||
void onQueryInfoNoLock();
|
||||
void onInfoAcknowledgment();
|
||||
void onSetClipboard();
|
||||
void onKeyDown();
|
||||
void onKeyRepeat();
|
||||
@@ -61,8 +64,10 @@ private:
|
||||
const CNetworkAddress* m_serverAddress;
|
||||
bool m_active;
|
||||
UInt32 m_seqNum;
|
||||
bool m_ignoreMove;
|
||||
bool m_ownClipboard[kClipboardEnd];
|
||||
IClipboard::Time m_timeClipboard[kClipboardEnd];
|
||||
CString m_dataClipboard[kClipboardEnd];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -315,6 +315,23 @@ void CMSWindowsSecondaryScreen::grabClipboard(ClipboardID id)
|
||||
}
|
||||
}
|
||||
|
||||
void CMSWindowsSecondaryScreen::getMousePos(
|
||||
SInt32* x, SInt32* y) const
|
||||
{
|
||||
assert(x != NULL);
|
||||
assert(y != NULL);
|
||||
|
||||
POINT pos;
|
||||
if (GetCursorPos(&pos)) {
|
||||
*x = pos.x;
|
||||
*y = pos.y;
|
||||
}
|
||||
else {
|
||||
*x = 0;
|
||||
*y = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void CMSWindowsSecondaryScreen::getSize(
|
||||
SInt32* width, SInt32* height) const
|
||||
{
|
||||
@@ -420,6 +437,12 @@ LRESULT CMSWindowsSecondaryScreen::onEvent(
|
||||
else
|
||||
SendMessage(m_nextClipboardWindow, msg, wParam, lParam);
|
||||
return 0;
|
||||
|
||||
case WM_DISPLAYCHANGE:
|
||||
// screen resolution has changed
|
||||
updateScreenSize();
|
||||
m_client->onResolutionChanged();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
|
||||
@@ -28,6 +28,7 @@ public:
|
||||
virtual void mouseWheel(SInt32 delta);
|
||||
virtual void setClipboard(ClipboardID, const IClipboard*);
|
||||
virtual void grabClipboard(ClipboardID);
|
||||
virtual void getMousePos(SInt32* x, SInt32* y) const;
|
||||
virtual void getSize(SInt32* width, SInt32* height) const;
|
||||
virtual SInt32 getJumpZoneSize() const;
|
||||
virtual void getClipboard(ClipboardID, IClipboard*) const;
|
||||
|
||||
@@ -323,6 +323,19 @@ void CXWindowsSecondaryScreen::grabClipboard(ClipboardID id)
|
||||
setDisplayClipboard(id, NULL, m_window, getCurrentTime(m_window));
|
||||
}
|
||||
|
||||
void CXWindowsSecondaryScreen::getMousePos(
|
||||
SInt32* x, SInt32* y) const
|
||||
{
|
||||
CDisplayLock display(this);
|
||||
int xTmp, yTmp, dummy;
|
||||
unsigned int dummyMask;
|
||||
Window dummyWindow;
|
||||
XQueryPointer(display, getRoot(), &dummyWindow, &dummyWindow,
|
||||
&xTmp, &yTmp, &dummy, &dummy, &dummyMask);
|
||||
*x = xTmp;
|
||||
*y = yTmp;
|
||||
}
|
||||
|
||||
void CXWindowsSecondaryScreen::getSize(
|
||||
SInt32* width, SInt32* height) const
|
||||
{
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
virtual void mouseWheel(SInt32 delta);
|
||||
virtual void setClipboard(ClipboardID, const IClipboard*);
|
||||
virtual void grabClipboard(ClipboardID);
|
||||
virtual void getMousePos(SInt32* x, SInt32* y) const;
|
||||
virtual void getSize(SInt32* width, SInt32* height) const;
|
||||
virtual SInt32 getJumpZoneSize() const;
|
||||
virtual void getClipboard(ClipboardID, IClipboard*) const;
|
||||
|
||||
Reference in New Issue
Block a user