if (!(accessRights & AccessSetDesktopSize)) return;
if (!rfb::Server::acceptSetDesktopSize) return;
- // Don't bother the desktop with an invalid configuration
- if (!layout.validate(fb_width, fb_height)) {
- writer()->writeExtendedDesktopSize(reasonClient, resultInvalid,
- fb_width, fb_height, layout);
- return;
- }
-
- // FIXME: the desktop will call back to VNCServerST and an extra set
- // of ExtendedDesktopSize messages will be sent. This is okay
- // protocol-wise, but unnecessary.
- result = server->desktop->setScreenLayout(fb_width, fb_height, layout);
-
+ result = server->setDesktopSize(this, fb_width, fb_height, layout);
writer()->writeExtendedDesktopSize(reasonClient, result,
fb_width, fb_height, layout);
-
- // Only notify other clients on success
- if (result == resultSuccess) {
- if (server->screenLayout != layout)
- throw Exception("Desktop configured a different screen layout than requested");
- server->notifyScreenLayoutChange(this);
- }
}
void VNCSConnectionST::fence(rdr::U32 flags, unsigned len, const char data[])
desktop->clientCutText(str, len);
}
+unsigned int VNCServerST::setDesktopSize(VNCSConnectionST* requester,
+ int fb_width, int fb_height,
+ const ScreenSet& layout)
+{
+ unsigned int result;
+ std::list<VNCSConnectionST*>::iterator ci, ci_next;
+
+ // Don't bother the desktop with an invalid configuration
+ if (!layout.validate(fb_width, fb_height))
+ return resultInvalid;
+
+ // FIXME: the desktop will call back to VNCServerST and an extra set
+ // of ExtendedDesktopSize messages will be sent. This is okay
+ // protocol-wise, but unnecessary.
+ result = desktop->setScreenLayout(fb_width, fb_height, layout);
+ if (result != resultSuccess)
+ return result;
+
+ // Sanity check
+ if (screenLayout != layout)
+ throw Exception("Desktop configured a different screen layout than requested");
+
+ // Notify other clients
+ for (ci=clients.begin();ci!=clients.end();ci=ci_next) {
+ ci_next = ci; ci_next++;
+ if ((*ci) == requester)
+ continue;
+ (*ci)->screenLayoutChangeOrClose(reasonOtherClient);
+ }
+
+ return resultSuccess;
+}
+
// Other public methods
void VNCServerST::approveConnection(network::Socket* sock, bool accept,
}
}
-void VNCServerST::notifyScreenLayoutChange(VNCSConnectionST* requester)
-{
- std::list<VNCSConnectionST*>::iterator ci, ci_next;
- for (ci=clients.begin();ci!=clients.end();ci=ci_next) {
- ci_next = ci; ci_next++;
- if ((*ci) == requester)
- continue;
- (*ci)->screenLayoutChangeOrClose(reasonOtherClient);
- }
-}
-
bool VNCServerST::getComparerState()
{
if (rfb::Server::compareFB == 0)
void pointerEvent(VNCSConnectionST* client, const Point& pos, int buttonMask);
void clientCutText(const char* str, int len);
+ unsigned int setDesktopSize(VNCSConnectionST* requester,
+ int fb_width, int fb_height,
+ const ScreenSet& layout);
+
// closeClients() closes all RFB sessions, except the specified one (if
// any), and logs the specified reason for closure.
void closeClients(const char* reason, network::Socket* sock);
Region getPendingRegion();
const RenderedCursor* getRenderedCursor();
- void notifyScreenLayoutChange(VNCSConnectionST *requester);
-
bool getComparerState();
KeyRemapper* keyRemapper;