fixed problem with setConfig(). if the new config didn't
include a screen that was already connected under an alias then that screen wouldn't be disconnected and removed from the screen list until the screen voluntarily disconnected. at that time removeConnection() would assert because the screen name would not be found. now using the canonical name in the protocol object as well as CServer. this allows setConfig() to always detect removed screens and disconnect them.
This commit is contained in:
parent
a9910041b3
commit
255e46017e
|
@ -284,8 +284,7 @@ void CServer::setInfoNoLock(const CString& screen,
|
||||||
assert(zoneSize >= 0);
|
assert(zoneSize >= 0);
|
||||||
|
|
||||||
// screen must be connected
|
// screen must be connected
|
||||||
CString screenName = m_config.getCanonicalName(screen);
|
CScreenList::iterator index = m_screens.find(screen);
|
||||||
CScreenList::iterator index = m_screens.find(screenName);
|
|
||||||
if (index == m_screens.end()) {
|
if (index == m_screens.end()) {
|
||||||
throw XBadClient();
|
throw XBadClient();
|
||||||
}
|
}
|
||||||
|
@ -344,15 +343,14 @@ void CServer::grabClipboardNoLock(
|
||||||
CClipboardInfo& clipboard = m_clipboards[id];
|
CClipboardInfo& clipboard = m_clipboards[id];
|
||||||
|
|
||||||
// screen must be connected
|
// screen must be connected
|
||||||
CString screenName = m_config.getCanonicalName(screen);
|
CScreenList::iterator index = m_screens.find(screen);
|
||||||
CScreenList::iterator index = m_screens.find(screenName);
|
|
||||||
if (index == m_screens.end()) {
|
if (index == m_screens.end()) {
|
||||||
throw XBadClient();
|
throw XBadClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore grab if sequence number is old. always allow primary
|
// ignore grab if sequence number is old. always allow primary
|
||||||
// screen to grab.
|
// screen to grab.
|
||||||
if (screenName != m_primaryInfo->m_name &&
|
if (screen != m_primaryInfo->m_name &&
|
||||||
seqNum < clipboard.m_clipboardSeqNum) {
|
seqNum < clipboard.m_clipboardSeqNum) {
|
||||||
log((CLOG_INFO "ignored screen \"%s\" grab of clipboard %d", screen.c_str(), id));
|
log((CLOG_INFO "ignored screen \"%s\" grab of clipboard %d", screen.c_str(), id));
|
||||||
return;
|
return;
|
||||||
|
@ -360,7 +358,7 @@ void CServer::grabClipboardNoLock(
|
||||||
|
|
||||||
// mark screen as owning clipboard
|
// mark screen as owning clipboard
|
||||||
log((CLOG_INFO "screen \"%s\" grabbed clipboard %d from \"%s\"", screen.c_str(), id, clipboard.m_clipboardOwner.c_str()));
|
log((CLOG_INFO "screen \"%s\" grabbed clipboard %d from \"%s\"", screen.c_str(), id, clipboard.m_clipboardOwner.c_str()));
|
||||||
clipboard.m_clipboardOwner = screenName;
|
clipboard.m_clipboardOwner = screen;
|
||||||
clipboard.m_clipboardSeqNum = seqNum;
|
clipboard.m_clipboardSeqNum = seqNum;
|
||||||
|
|
||||||
// no screens have the new clipboard except the sender
|
// no screens have the new clipboard except the sender
|
||||||
|
@ -369,7 +367,7 @@ void CServer::grabClipboardNoLock(
|
||||||
|
|
||||||
// tell all other screens to take ownership of clipboard
|
// tell all other screens to take ownership of clipboard
|
||||||
for (index = m_screens.begin(); index != m_screens.end(); ++index) {
|
for (index = m_screens.begin(); index != m_screens.end(); ++index) {
|
||||||
if (index->first != screenName) {
|
if (index->first != screen) {
|
||||||
CScreenInfo* info = index->second;
|
CScreenInfo* info = index->second;
|
||||||
if (info->m_protocol == NULL) {
|
if (info->m_protocol == NULL) {
|
||||||
m_primary->grabClipboard(id);
|
m_primary->grabClipboard(id);
|
||||||
|
@ -1094,6 +1092,11 @@ void CServer::handshakeClient(void* vsocket)
|
||||||
throw XBadClient();
|
throw XBadClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert name to canonical form (if any)
|
||||||
|
if (m_config.isScreen(name)) {
|
||||||
|
name = m_config.getCanonicalName(name);
|
||||||
|
}
|
||||||
|
|
||||||
// create a protocol interpreter for the version
|
// create a protocol interpreter for the version
|
||||||
log((CLOG_DEBUG1 "creating interpreter for client \"%s\" version %d.%d", name.c_str(), major, minor));
|
log((CLOG_DEBUG1 "creating interpreter for client \"%s\" version %d.%d", name.c_str(), major, minor));
|
||||||
assign(protocol, CServerProtocol::create(major, minor,
|
assign(protocol, CServerProtocol::create(major, minor,
|
||||||
|
@ -1334,9 +1337,10 @@ void CServer::openPrimaryScreen()
|
||||||
// reset sequence number
|
// reset sequence number
|
||||||
m_seqNum = 0;
|
m_seqNum = 0;
|
||||||
|
|
||||||
|
CString primary = m_config.getCanonicalName("primary"); // FIXME
|
||||||
try {
|
try {
|
||||||
// add connection
|
// add connection
|
||||||
m_active = addConnection(CString("primary"/* FIXME */), NULL);
|
m_active = addConnection(primary, NULL);
|
||||||
m_primaryInfo = m_active;
|
m_primaryInfo = m_active;
|
||||||
|
|
||||||
// open screen
|
// open screen
|
||||||
|
@ -1351,7 +1355,7 @@ void CServer::openPrimaryScreen()
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (...) {
|
||||||
if (m_primary != NULL) {
|
if (m_primary != NULL) {
|
||||||
removeConnection(CString("primary"/* FIXME */));
|
removeConnection(primary);
|
||||||
delete m_primary;
|
delete m_primary;
|
||||||
}
|
}
|
||||||
m_primary = NULL;
|
m_primary = NULL;
|
||||||
|
@ -1376,7 +1380,8 @@ void CServer::closePrimaryScreen()
|
||||||
assert(m_primary != NULL);
|
assert(m_primary != NULL);
|
||||||
|
|
||||||
// remove connection
|
// remove connection
|
||||||
removeConnection(CString("primary"/* FIXME */));
|
CString primary = m_config.getCanonicalName("primary"); // FIXME
|
||||||
|
removeConnection(primary);
|
||||||
|
|
||||||
// close the primary screen
|
// close the primary screen
|
||||||
try {
|
try {
|
||||||
|
@ -1468,17 +1473,16 @@ CServer::CScreenInfo* CServer::addConnection(
|
||||||
if (!m_config.isScreen(name)) {
|
if (!m_config.isScreen(name)) {
|
||||||
throw XUnknownClient(name);
|
throw XUnknownClient(name);
|
||||||
}
|
}
|
||||||
CString screenName = m_config.getCanonicalName(name);
|
|
||||||
|
|
||||||
// can only have one screen with a given name at any given time
|
// can only have one screen with a given name at any given time
|
||||||
if (m_screens.count(screenName) != 0) {
|
if (m_screens.count(name) != 0) {
|
||||||
throw XDuplicateClient(name);
|
throw XDuplicateClient(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// save screen info
|
// save screen info
|
||||||
CScreenInfo* newScreen = new CScreenInfo(screenName, protocol);
|
CScreenInfo* newScreen = new CScreenInfo(name, protocol);
|
||||||
m_screens.insert(std::make_pair(screenName, newScreen));
|
m_screens.insert(std::make_pair(name, newScreen));
|
||||||
log((CLOG_DEBUG "added connection \"%s\" (\"%s\")", name.c_str(), screenName.c_str()));
|
log((CLOG_DEBUG "added connection \"%s\"", name.c_str()));
|
||||||
|
|
||||||
return newScreen;
|
return newScreen;
|
||||||
}
|
}
|
||||||
|
@ -1489,8 +1493,7 @@ void CServer::removeConnection(const CString& name)
|
||||||
CLock lock(&m_mutex);
|
CLock lock(&m_mutex);
|
||||||
|
|
||||||
// find screen info
|
// find screen info
|
||||||
CString screenName = m_config.getCanonicalName(name);
|
CScreenList::iterator index = m_screens.find(name);
|
||||||
CScreenList::iterator index = m_screens.find(screenName);
|
|
||||||
assert(index != m_screens.end());
|
assert(index != m_screens.end());
|
||||||
|
|
||||||
// if this is active screen then we have to jump off of it
|
// if this is active screen then we have to jump off of it
|
||||||
|
|
Loading…
Reference in New Issue