[kdebase-workspace/f15] [bug 718461] New: After unplugging external monitor laptop left with black screen
Lukas Tinkl
ltinkl at fedoraproject.org
Tue Jul 12 13:50:12 UTC 2011
commit b472bfb562d32bbbd8b80a0b0441d1088f599d9e
Author: Lukas Tinkl <lukas at kde.org>
Date: Tue Jul 12 15:49:21 2011 +0200
[bug 718461] New: After unplugging external monitor laptop left with black screen
kdebase-workspace-4.6.6-bug718461.patch | 161 +++++++++++++++++++++++++++++++
kdebase-workspace.spec | 8 ++-
2 files changed, 168 insertions(+), 1 deletions(-)
---
diff --git a/kdebase-workspace-4.6.6-bug718461.patch b/kdebase-workspace-4.6.6-bug718461.patch
new file mode 100644
index 0000000..b90d2d6
--- /dev/null
+++ b/kdebase-workspace-4.6.6-bug718461.patch
@@ -0,0 +1,161 @@
+--- a/kcontrol/randr/module/randrmonitor.cpp
++++ b/kcontrol/randr/module/randrmonitor.cpp
+@@ -33,10 +33,6 @@ along with this program. If not, see <h
+ #include <qtimer.h>
+ #include <qx11info_x11.h>
+
+-#include <randrdisplay.h>
+-#include <randrscreen.h>
+-#include <randroutput.h>
+-
+ K_PLUGIN_FACTORY(RandrMonitorModuleFactory,
+ registerPlugin<RandrMonitorModule>();
+ )
+@@ -48,6 +44,7 @@ RandrMonitorModule::RandrMonitorModule(
+ {
+ setModuleName( "randrmonitor" );
+ initRandr();
++ QDBusConnection::sessionBus().connect("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement", "org.kde.Solid.PowerManagement", "resumingFromSuspend", this, SLOT(resumedFromSuspend()));
+ }
+
+ RandrMonitorModule::~RandrMonitorModule()
+@@ -159,20 +156,22 @@ void RandrMonitorModule::switchDisplay()
+ {
+ QList< RandROutput* > outputs;
+ RandRDisplay display;
+- for( int scr = 0;
+- scr < display.numScreens();
+- ++scr )
++ outputs = connectedOutputs( display );
++ if( outputs.count() == 0 ) // nothing connected, do nothing
++ return;
++ if( outputs.count() == 1 ) // just one, enable it
+ {
+- foreach( RandROutput* output, display.screen( scr )->outputs())
++ enableOutput( outputs[0], true );
++ for( int scr = 0; scr < display.numScreens(); ++scr )
+ {
+- if( !output->isConnected())
+- continue;
+- if( !outputs.contains( output ))
+- outputs.append( output );
++ foreach( RandROutput* output, display.screen( scr )->outputs())
++ {
++ if( !output->isConnected())
++ enableOutput( output, false ); // switch off every output that's not connected
++ }
+ }
+- }
+- if( outputs.count() <= 1 ) // just one, do nothing
+ return;
++ }
+ if( outputs.count() == 2 ) // alternative between one, second, both
+ {
+ if( outputs[ 0 ]->isActive() && !outputs[ 1 ]->isActive())
+@@ -196,11 +195,73 @@ void RandrMonitorModule::switchDisplay()
+ KToolInvocation::kdeinitExec( "kcmshell4", QStringList() << "display" );
+ }
+
++void RandrMonitorModule::resumedFromSuspend()
++ {
++ RandRDisplay display;
++ QList< RandROutput* > m_connectedOutputs, m_validCrtcOutputs;
++ m_connectedOutputs = connectedOutputs( display );
++ m_validCrtcOutputs = validCrtcOutputs( display );
++ if( m_connectedOutputs.count() == 0 )
++ return;
++ // We have at least one connected output.
++ // We check all outputs with valid crtc if they are still connected.
++ // If not, we are going to disable them.
++ QList<RandROutput*> outputsToDisable;
++ foreach( RandROutput* output, m_validCrtcOutputs )
++ {
++ if( !output->isConnected() )
++ outputsToDisable.append( output );
++ }
++ // If no active output is still connected we are going to enable the first connected output.
++ if( outputsToDisable.size() == m_validCrtcOutputs.size() )
++ enableOutput( m_connectedOutputs[0], true);
++ // Now we can disable the disconnected outputs
++ foreach( RandROutput* output, outputsToDisable)
++ {
++ enableOutput( output, false );
++ }
++ }
++
+ void RandrMonitorModule::enableOutput( RandROutput* output, bool enable )
+ { // a bit lame, but I don't know how to do this easily with this codebase :-/
+ KProcess::execute( QStringList() << "xrandr" << "--output" << output->name() << ( enable ? "--auto" : "--off" ));
+ }
+
++QList< RandROutput* > RandrMonitorModule::connectedOutputs( RandRDisplay &display )
++ {
++ return outputs( display, true, false, false );
++ }
++
++QList< RandROutput* > RandrMonitorModule::activeOutputs( RandRDisplay &display )
++ {
++ return outputs( display, false, true, false );
++ }
++
++QList< RandROutput* > RandrMonitorModule::validCrtcOutputs( RandRDisplay &display )
++ {
++ return outputs( display, false, false, true );
++ }
++
++QList< RandROutput* > RandrMonitorModule::outputs( RandRDisplay &display, bool connected, bool active, bool validCrtc )
++ {
++ QList< RandROutput* > outputs;
++ for( int scr = 0; scr < display.numScreens(); ++scr )
++ {
++ foreach( RandROutput* output, display.screen( scr )->outputs() )
++ {
++ if( !output->isConnected() && connected )
++ continue;
++ if( !output->isActive() && active )
++ continue;
++ if( !output->crtc()->isValid() && validCrtc )
++ continue;
++ if( !outputs.contains( output ) )
++ outputs.append( output );
++ }
++ }
++ return outputs;
++ }
++
+ bool RandrMonitorHelper::x11Event( XEvent* e )
+ {
+ module->processX11Event( e );
+
+--- a/kcontrol/randr/module/randrmonitor.h
++++ b/kcontrol/randr/module/randrmonitor.h
+@@ -27,6 +27,11 @@ along with this program. If not, see <h
+ #include <X11/extensions/Xrandr.h>
+ #include <fixx11h.h>
+
++#include <randrdisplay.h>
++#include <randrscreen.h>
++#include <randroutput.h>
++#include <randrcrtc.h>
++
+ class RandROutput;
+
+ class RandrMonitorHelper;
+@@ -42,11 +47,16 @@ class RandrMonitorModule
+ private slots:
+ void poll();
+ void switchDisplay();
++ void resumedFromSuspend();
+ private:
+ void initRandr();
+ void getRandrInfo( XRROutputChangeNotifyEvent* e, QString* change, QRect* rect );
+ QStringList connectedMonitors() const;
+ void enableOutput( RandROutput* output, bool enable );
++ QList< RandROutput* > connectedOutputs( RandRDisplay &display );
++ QList< RandROutput* > activeOutputs( RandRDisplay &display );
++ QList< RandROutput* > validCrtcOutputs( RandRDisplay &display );
++ QList< RandROutput* > outputs( RandRDisplay &display, bool connected = false, bool active = false, bool validCrtc = false );
+ bool have_randr;
+ int randr_base;
+ int randr_error;
+
diff --git a/kdebase-workspace.spec b/kdebase-workspace.spec
index 7fff889..cbcc519 100644
--- a/kdebase-workspace.spec
+++ b/kdebase-workspace.spec
@@ -8,7 +8,7 @@ Version: 4.6.5
# for .0 releases we have to use '00' as '0' is treated as null by cmake, dont' forget to update
%define kde4workspace_version %{version}
-Release: 2%{?dist}
+Release: 3%{?dist}
License: GPLv2
Group: User Interface/Desktops
@@ -69,6 +69,8 @@ Patch24: kdebase-workspace-4.6.3-multilib_qt_plugin_path.patch
Patch50: kdebase-workspace-4.3.3-kde#171685.patch
## 4.6 patches
+# [Bug 718461] New: After unplugging external monitor laptop left with black screen
+Patch100: kdebase-workspace-4.6.6-bug718461.patch
## Fedora specific patches
## HAL-ectomy
@@ -315,6 +317,7 @@ Requires: akonadi
%patch50 -p1 -b .kde#171685
# 4.6 patches
+%patch100 -p1 -b .bug718461
# trunk patches
@@ -738,6 +741,9 @@ fi
%changelog
+* Tue Jul 12 2011 Lukas Tinkl <ltinkl at redhat.com> - 4.6.5-3
+- fix #718461: after unplugging external monitor laptop left with black screen
+
* Wed Jul 06 2011 Rex Dieter <rdieter at fedoraproject.org> 4.6.5-2
- move kgreet_* plugins to main pkg, needed by kscreenlocker (#711234)
More information about the scm-commits
mailing list