| Summary: | Dual screen issue caused by d6b3f6983efebc42abd6028ece9c3ec7facea2d0 | ||
|---|---|---|---|
| Product: | [Plasma] kwin | Reporter: | LuRan <hephooey_dev> |
| Component: | xrandr | Assignee: | KWin default assignee <kwin-bugs-null> |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | CC: | aleixpol |
| Priority: | NOR | ||
| Version First Reported In: | git master | ||
| Target Milestone: | 4.11 | ||
| Platform: | Compiled Sources | ||
| OS: | Linux | ||
| Latest Commit: | http://commits.kde.org/kde-workspace/c61081ffed38a2f124631d41cede6e2b839026c9 | Version Fixed/Implemented In: | |
| Sentry Crash Report: | |||
| Attachments: | qdbus org.kde.kwin /KWin supportInformation output | ||
|
Description
LuRan
2013-03-02 22:02:00 UTC
Suspend the compositor before adding the screen (shift+alt+f12) Does it then act as expected? (While i actually doubt so from the description) In case please attach the output of qdbus org.kde.kwin /KWin supportInformation Otherwise please post the output of "xrandr -q" before and after adding the screen. Disable the compositor improved the situation a litle bit, now I can see the wall paper on the main monitor and use the plasma desktop on it, once I enable composite, the main monitor black out again, and even with the compositor disabled, I cannot move window from the external monitor to the main monitor, the other way around somehow works fine. And restart kwin fixes everything. xrandr -q look normal: Before adding the monitor: Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 8192 x 8192 VGA-0 disconnected primary (normal left inverted right x axis y axis) LVDS-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm 1920x1080 60.0*+ 50.0 DP-0 disconnected (normal left inverted right x axis y axis) DP-1 disconnected (normal left inverted right x axis y axis) DP-2 disconnected (normal left inverted right x axis y axis) DP-3 disconnected (normal left inverted right x axis y axis) DP-4 disconnected (normal left inverted right x axis y axis) DP-5 disconnected (normal left inverted right x axis y axis) After adding a new monitor: Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 8192 x 8192 VGA-0 disconnected primary (normal left inverted right x axis y axis) LVDS-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm 1920x1080 60.0*+ 50.0 DP-0 disconnected (normal left inverted right x axis y axis) DP-1 disconnected (normal left inverted right x axis y axis) DP-2 disconnected (normal left inverted right x axis y axis) DP-3 connected (normal left inverted right x axis y axis) 1920x1080 60.0 + 1280x1024 75.0 60.0 1152x864 75.0 1024x768 75.0 60.0 800x600 75.0 60.3 640x480 75.0 59.9 DP-4 disconnected (normal left inverted right x axis y axis) DP-5 disconnected (normal left inverted right x axis y axis) The output of qdbus org.kde.kwin /KWin supportInformation can be find in the attachment Created attachment 77701 [details]
qdbus org.kde.kwin /KWin supportInformation output
----- Snip ---------- Before adding the monitor: Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 8192 x 8192 After adding a new monitor: Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 8192 x 8192 DP-3 connected (normal left inverted right x axis y axis) 1920x1080 60.0 + ----- /Snip ---------- DP-3 is connected, but not used. Does the output change with restarting kwin? That output is just after I connected the monitor, before enable it using xrandr, after issuing xrandr --output DP-3 --auto --left-of LVDS-0 --output LVDS-0 --auto --primary the output is: Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 8192 x 8192 VGA-0 disconnected (normal left inverted right x axis y axis) LVDS-0 connected primary 1920x1080+1920+0 (normal left inverted right x axis y axis) 344mm x 193mm 1920x1080 60.0*+ 50.0 DP-0 disconnected (normal left inverted right x axis y axis) DP-1 disconnected (normal left inverted right x axis y axis) DP-2 disconnected (normal left inverted right x axis y axis) DP-3 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 509mm x 286mm 1920x1080 60.0*+ 1280x1024 75.0 60.0 1152x864 75.0 1024x768 75.0 60.0 800x600 75.0 60.3 640x480 75.0 59.9 DP-4 disconnected (normal left inverted right x axis y axis) DP-5 disconnected (normal left inverted right x axis y axis) Also if I disable the external monitor after I fixed the dual screen display by restarting kwin, the resulting desktop is squeezed to like 2/3 of the main screen, the rest 1/3 is just black band. The issue is likely the screen caching.
If you want, you can try moving local
static xcb_screen_t *s_screen = NULL;
to a global static
static xcb_screen_t *gs_screen = NULL;
and add some
inline void invalidateScreen() {
gs_screen = NULL;
}
To call eg at events.cpp
if (e->type == Extensions::randrNotifyEvent() && Extensions::randrAvailable()) {
XRRUpdateConfiguration(e);
invalidateScreen();
...
}
or in workspace.cpp
void Workspace::desktopResized()
{
invalidateScreen();
...
}
Hi Thomas, sorry for the late reply, I tried the changes you suggested but no improvement, the diff look like this:
diff --git a/kwin/geometry.cpp b/kwin/geometry.cpp
index 03085db..3f99c01 100644
--- a/kwin/geometry.cpp
+++ b/kwin/geometry.cpp
@@ -67,6 +67,7 @@ extern bool is_multihead;
*/
void Workspace::desktopResized()
{
+ invalidateScreen();
QRect geom;
for (int i = 0; i < QApplication::desktop()->screenCount(); i++) {
//do NOT use - QApplication::desktop()->screenGeometry(i) there could be a virtual geometry
diff --git a/kwin/libkwineffects/kwinglobals.h b/kwin/libkwineffects/kwinglobals.h
index aa2681c..13276f5 100644
--- a/kwin/libkwineffects/kwinglobals.h
+++ b/kwin/libkwineffects/kwinglobals.h
@@ -158,10 +158,10 @@ KWIN_EXPORT xcb_timestamp_t xTime()
return QX11Info::appTime();
}
+static xcb_screen_t *s_screen = NULL;
inline
KWIN_EXPORT xcb_screen_t *defaultScreen()
{
- static xcb_screen_t *s_screen = NULL;
if (s_screen) {
return s_screen;
}
@@ -190,6 +190,10 @@ KWIN_EXPORT int displayHeight()
return screen ? screen->height_in_pixels : 0;
}
+inline void invalidateScreen() {
+ s_screen = NULL;
+}
+
/** @internal */
// TODO: QT5: remove
I also tried to change event.cpp (but not tried both together), the result is the same. I only restarted kwin by run kwin --replace in konsole without a full logout/login.
try after XRRUpdateConfiguration(e); in events.cpp as well. If it's not screen caching i frankly don't know what could cause any issues here ... except getting the geometry update, and calling displayWidth/Height before the structure behind the defaultScreen() pointer has updated. Brute force: add "XSync(display(), false);" on top of the defaultScreen() function. Git commit c61081ffed38a2f124631d41cede6e2b839026c9 by Martin Gräßlin. Committed on 11/03/2013 at 15:14. Pushed by graesslin into branch 'master'. Temporarily revert to XDisplayWidth/Height We don't like broken master. Proper fix coming later on. M +8 -0 kwin/libkwineffects/kwinglobals.h http://commits.kde.org/kde-workspace/c61081ffed38a2f124631d41cede6e2b839026c9 |