QWS VNC doesn't work on Portrait mode
-
If I understand the patch correctly, it only check other screens if the main screen is not transformed. Since you have more that one screen transformed, you should check all screens (main + sub-screens)
-
@SGaist Then it means that, the else part of code, should be done for if condition as well?
if (qt_screen->isTransformed()) { QSize s = QSize(qt_screen->deviceWidth(), qt_screen->deviceHeight()); tpos = qt_screen->mapFromDevice(pos, s); } //tpos = pos; // Only in case of Multi Display // If main screen is not transformed, then check if sub screens are transformed QList<QScreen*> screens = qt_screen->subScreens(); if (screens.size() && !bRemote) { for (int i = 0; i < screens.size(); ++i) { QScreen *screen = screens.at(i); if (screen->isTransformed()) { QSize s = QSize(screen->deviceWidth(), screen->deviceHeight()); tpos = screen->mapFromDevice(pos, s); break; } } }
Is it like that?
-
I'd remove also the bRemote, just check them all
-
@SGaist Hmm, let me test this.
Just for better understanding attaching the modified code:
if (qt_screen->isTransformed()) { QSize s = QSize(qt_screen->deviceWidth(), qt_screen->deviceHeight()); tpos = qt_screen->mapFromDevice(pos, s); } //tpos = pos; // Only in case of Multi Display // If main screen is not transformed, then check if sub screens are transformed QList<QScreen*> screens = qt_screen->subScreens(); if (screens.size()) { for (int i = 0; i < screens.size(); ++i) { QScreen *screen = screens.at(i); if (screen->isTransformed()) { QSize s = QSize(screen->deviceWidth(), screen->deviceHeight()); tpos = screen->mapFromDevice(pos, s); break; } } }
I'll test and keep you posted..
-
No success yet!
While running the application with Multi for VNC, still the touch inputs on the device is still not rotated.
-
Silly idea (and just to verify) but what about just dropping the if and do the transform for all screens anyway ?
-
Just for more information:
export QWS_DISPLAY="Multi: VNC:0:size=480x640 Transformed:rot0"
This displays the UI in a landscape mode and the touch input works as per the UI.
export QWS_DISPLAY="Multi: VNC:0:size=480x640 Transformed:rot90"
This rotates the UI to 90 degrees. But the touch input is as same as 0 degrees.
This clearly indicates that the display transformation works good but the transformation to touch input mapping is not working.
-
@SGaist You mean to try this kind of code:
QList<QScreen*> screens = qt_screen->subScreens(); if (screens.size()) { for (int i = 0; i < screens.size(); ++i) { QScreen *screen = screens.at(i); QSize s = QSize(screen->deviceWidth(), screen->deviceHeight()); tpos = screen->mapFromDevice(pos, s); break; } }
instead of
if (qt_screen->isTransformed()) { QSize s = QSize(qt_screen->deviceWidth(), qt_screen->deviceHeight()); tpos = qt_screen->mapFromDevice(pos, s); } else { //tpos = pos; // Only in case of Multi Display // If main screen is not transformed, then check if sub screens are transformed QList<QScreen*> screens = qt_screen->subScreens(); if (screens.size() && !bRemote) { for (int i = 0; i < screens.size(); ++i) { QScreen *screen = screens.at(i); if (screen->isTransformed()) { QSize s = QSize(screen->deviceWidth(), screen->deviceHeight()); tpos = screen->mapFromDevice(pos, s); break; } } } }
Sam, if you confirm, I can make these changes and build my packages.
Thanks,
Kumara -
Yes that's what I had in mind, without forgetting the main screen first.
-
@SGaist Oh ya, I missed the main screen
So here is the code which I can do the test:
// Main screen QSize s = QSize(qt_screen->deviceWidth(), qt_screen->deviceHeight()); tpos = qt_screen->mapFromDevice(pos, s); // Subscreens QList<QScreen*> screens = qt_screen->subScreens(); if (screens.size()) { for (int i = 0; i < screens.size(); ++i) { QScreen *screen = screens.at(i); QSize s = QSize(screen->deviceWidth(), screen->deviceHeight()); tpos = screen->mapFromDevice(pos, s); break; } }
Right?
-
@SGaist Below the patch code, I see
QPoint tpos; // Main screen QSize s = QSize(qt_screen->deviceWidth(), qt_screen->deviceHeight()); tpos = qt_screen->mapFromDevice(pos, s); // Sub screens QList<QScreen*> screens = qt_screen->subScreens(); if (screens.size()) { for (int i = 0; i < screens.size(); ++i) { QScreen *screen = screens.at(i); QSize s = QSize(screen->deviceWidth(), screen->deviceHeight()); tpos = screen->mapFromDevice(pos, s); break; } } if (qt_last_x) { *qt_last_x = tpos.x(); *qt_last_y = tpos.y(); } QWSServer::mousePosition = tpos; qwsServerPrivate->mouseState = state;
We use the tpos and mouse the mousePosition just once. Even though, we have many subscreens, we just do it once.
Is this correct?
Should we not do this in a loop for all the screens?
Please let me know.
-
Looks like I am in a wrong direction.
I suspect "Transformed" driver is not having problem.
I think, it is "multi" screen driver is what not working good.
Because, when VNC option is selected, Transformed works food.
When LinuxFb is selected, Transformed works good.When both are used, there lies the problem.
I guess, we may have to look at Multi Screen driver source code to see how it has been implemented.
Can you please point me to the right location?
Thanks,
Kumara -
I'd take a look a the qscreenmulti_qws.cpp file
-
@SGaist Later I gave a try with
export QWS_DISPLAY="VNC:Transformed:Rot270"
I dont know the magic behind this.
In my LCD display UI, looks good. And even touch works well.
And now, in the VNC client, Application was rotated. So, I used RealVNC client and rotated the screen to 270.
With that, UI looks good and even operation works well.I dont know what magic behind the scene.
But the problem I see is, display refresh in VNC client. The screen doesnt gets refreshed. There is a hug lag while updating the screen..
I am totally confused now, to understand the problem.
Based on your experience,
Where do you see the problem?Thanks a lot for your immense support!
-
90 and 270 are "complementary" meaning that 270 is equivalent to -90 so it might be that the position calculation were done wrong (or just not taking the angle in account correctly)
Do you mean that with 90, the refreshing is done correctly on both but not the mouse handling and with 270, the refreshing is wrong but the mouse move are handled correctly ?