now handling disconnect of secondary screen that has the cursor

by jumping back to the primary screen (without trying to notify
the now disconnected secondary screen).  also fixed blown assert
in mapPosition().
This commit is contained in:
crs 2001-10-24 23:29:29 +00:00
parent 066910fab8
commit 5b1826a638
2 changed files with 38 additions and 5 deletions

View File

@ -33,7 +33,10 @@ else { wait(0); exit(1); }
// CServer // CServer
// //
CServer::CServer() : m_done(&m_mutex, false) CServer::CServer() : m_done(&m_mutex, false),
m_primary(NULL),
m_active(NULL),
m_primaryInfo(NULL)
{ {
m_socketFactory = NULL; m_socketFactory = NULL;
m_securityFactory = NULL; m_securityFactory = NULL;
@ -566,16 +569,24 @@ void CServer::mapPosition(CScreenInfo* src,
switch (srcSide) { switch (srcSide) {
case CScreenMap::kLeft: case CScreenMap::kLeft:
case CScreenMap::kRight: case CScreenMap::kRight:
assert(y >= 0 && y < src->m_height); if (y < 0)
y = static_cast<SInt32>(0.5 + y * y = 0;
else if (y >= src->m_height)
y = src->m_height - 1;
else
y = static_cast<SInt32>(0.5 + y *
static_cast<double>(dst->m_height - 1) / static_cast<double>(dst->m_height - 1) /
(src->m_height - 1)); (src->m_height - 1));
break; break;
case CScreenMap::kTop: case CScreenMap::kTop:
case CScreenMap::kBottom: case CScreenMap::kBottom:
assert(x >= 0 && x < src->m_width); if (x < 0)
x = static_cast<SInt32>(0.5 + x * x = 0;
else if (x >= src->m_width)
x = src->m_width - 1;
else
x = static_cast<SInt32>(0.5 + x *
static_cast<double>(dst->m_width - 1) / static_cast<double>(dst->m_width - 1) /
(src->m_width - 1)); (src->m_width - 1));
break; break;
@ -769,6 +780,7 @@ void CServer::openPrimaryScreen()
// add connection // add connection
m_active = addConnection(CString("primary"/* FIXME */), NULL); m_active = addConnection(CString("primary"/* FIXME */), NULL);
m_primaryInfo = m_active;
// update info // update info
m_primary->getSize(&m_active->m_width, &m_active->m_height); m_primary->getSize(&m_active->m_width, &m_active->m_height);
@ -854,8 +866,28 @@ void CServer::removeConnection(const CString& name)
{ {
log((CLOG_DEBUG "removing connection \"%s\"", name.c_str())); log((CLOG_DEBUG "removing connection \"%s\"", name.c_str()));
CLock lock(&m_mutex); CLock lock(&m_mutex);
// find screen info
CScreenList::iterator index = m_screens.find(name); CScreenList::iterator index = m_screens.find(name);
assert(index != m_screens.end()); assert(index != m_screens.end());
// if this is active screen then we have to jump off of it
if (m_active == index->second) {
// record new position (center of primary screen)
m_x = m_primaryInfo->m_width >> 1;
m_y = m_primaryInfo->m_height >> 1;
// don't notify active screen since it probably already disconnected
log((CLOG_NOTE "jump from \"%s\" to \"%s\" at %d,%d", m_active->m_name.c_str(), m_primaryInfo->m_name.c_str(), m_x, m_y));
// cut over
m_active = m_primaryInfo;
// enter new screen
m_primary->enter(m_x, m_y);
}
// done with screen info
delete index->second; delete index->second;
m_screens.erase(index); m_screens.erase(index);
} }

View File

@ -149,6 +149,7 @@ class CServer {
IPrimaryScreen* m_primary; IPrimaryScreen* m_primary;
CScreenList m_screens; CScreenList m_screens;
CScreenInfo* m_active; CScreenInfo* m_active;
CScreenInfo* m_primaryInfo;
SInt32 m_x, m_y; SInt32 m_x, m_y;