Hi,
in x2goclient's ONMainWindow::slotConfigXinerama you can find the following code that calculates the values for xinerama.conf. We see a race condition here where sometimes (well, quite often) this leads to negative x/y coordinates in xinerama.conf (size is ok) for new sessions when run from the thinclient setup. The code below contains annotations by me in [] with the variables' values that lead to the wrong xinerama.conf. I believe x2goclient sometimes catches the nxagent window too early before it is resized accordingly (maybe the window manager is too slow) thus getting a window of size 1x1 in the center of the screen (line 12):
1 void ONMainWindow::slotConfigXinerama()
2 {
3 QRect newGeometry=proxyWinGeometry(); [1x1@511,393]
4 if (newGeometry.isNull())
5 {
6 x2goWarningf(7)<< tr("Error getting window geometry.
(Did you close the window?)"); 7 xineramaTimer->stop(); 8 return; 9 } 10 if (newGeometry==lastDisplayGeometry) 11 return; 12 lastDisplayGeometry=newGeometry; [1x1@511,393]
13 QString geoStr =
14 "(x: " + QString("%1").arg(lastDisplayGeometry.x()) +
15 ", y: "+ QString("%1").arg(lastDisplayGeometry.y()) +
16 ", w: "+ QString("%1").arg(lastDisplayGeometry.width()) +
17 ", h: "+ QString("%1").arg(lastDisplayGeometry.height());
18 x2goDebug<<"New proxy geometry: " + geoStr;
19 QDesktopWidget* root=QApplication::desktop();
20 QList<QRect> newXineramaScreens;
21 for (int i=0; i< root->numScreens(); ++i)
22 {
23 QRect intersection;
24 if (resumingSession.fullscreen)
25 intersection=root->screenGeometry(i); [1024x768@0,0]
26 else
27
intersection=root->screenGeometry(i).intersected(lastDisplayGeometry); [ not executed ] 28 if (!intersection.isNull()) 29 { 30 // x2goDebug<<"intersected with "<<i<<": "<<intersection<<endl; 31 intersection.moveLeft(intersection.x()-lastDisplayGeometry.x()); [1024x768@-511,0] <- [0]-[511] 32 intersection.moveTop(intersection.y()-lastDisplayGeometry.y()); [1024x768@-511,-393] <- [0]-[393]
33 // x2goDebug<<"xinerama screen:
"<<intersection<<endl; 34 newXineramaScreens<<intersection; 35 } 36 } 37 if (xineramaScreens != newXineramaScreens) 38 { 39 xineramaScreens=newXineramaScreens; 40 // x2goDebug<<"xinerama screen changed, new screens: "<<xineramaScreens<<endl;
41 xineramaTimer->stop();
42 QStringList screens;
43 foreach (QRect disp, xineramaScreens)
44 screens<<QString::number(disp.x())+"
"+QString::number(disp.y())+" "+QString::number(disp.width())+ 45 " "+QString::number(disp.height()); ["-511 -393 1024 768"] 46 QString cmd="export DISPLAY=:"+resumingSession.display+" ;printf %b '\\''"+screens.join("\\n")+"'\\'' > $HOME/.x2go/C-"+ 47 resumingSession.sessionId+"/xinerama.conf";
48 sshConnection->executeCommand(cmd, this,
SLOT(slotXineramaConfigured())); 49 } 50 }
I am not really sure about the intentions behind this code. It looks to me that the if block (lines 28-35} should not run for the fullscreen case. Can anyone confirm this?
Uli