[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