[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#596473: System Settings app does not remember my 2-monitor



Hi!

 I changed the patch for minimal difference to the version in debian
 squeeze as requested by Modestas Vainius <modax@debian.org>.
 krandrstartup is now a part of startkde again, diverging from upstreams
 split.

 Timo
--- a/kcontrol/randr/legacyrandrconfig.cpp
+++ b/kcontrol/randr/legacyrandrconfig.cpp
@@ -92,7 +92,11 @@
 	m_oldApply = applyOnStartup->isChecked();
 	m_oldSyncTrayApp = syncTrayApp->isChecked();
 	KConfig config("krandrrc");
-	m_display->saveDisplay(config, m_oldApply, m_oldSyncTrayApp);
+	m_display->saveDisplay(config, m_oldSyncTrayApp);
+	if(m_oldApply)
+		m_display->saveStartup(config);
+	else
+		m_display->disableStartup(config);
 
 	setChanged();
 }
--- a/kcontrol/randr/legacyrandrscreen.cpp
+++ b/kcontrol/randr/legacyrandrscreen.cpp
@@ -388,6 +388,28 @@
 	group.writeEntry("reflectY", (bool)(rotation() & RandR::ReflectMask) == RandR::ReflectY);
 }
 
+QStringList LegacyRandRScreen::startupCommands() const
+{
+	QString command = QString("xrandr -s %1x%2 -r %3 ").arg( currentPixelSize().width(),
+	    currentPixelSize().height(), refreshRateIndexToHz(size(), refreshRate()));
+	switch( rotation()) {
+		case RR_Rotate_90:
+			command += " -o 1 ";
+			break;
+		case RR_Rotate_180:
+			command += " -o 2 ";
+			break;
+		case RR_Rotate_270:
+			command += " -o 3 ";
+			break;
+	}
+	if((rotation() & RandR::ReflectMask) == RandR::ReflectX)
+		command += " -x ";
+	if((bool)(rotation() & RandR::ReflectMask) == RandR::ReflectY)
+		command += " -y ";
+	return QStringList() << command;
+}
+
 int LegacyRandRScreen::pixelCount( int index ) const
 {
 	QSize sz = pixelSize(index);
--- a/kcontrol/randr/legacyrandrscreen.h
+++ b/kcontrol/randr/legacyrandrscreen.h
@@ -130,6 +130,7 @@
 	 */
 	void load(KConfig& config);
 	void save(KConfig& config) const;
+	QStringList startupCommands() const;
 
 private:
 	XRRScreenConfiguration*	m_config;
--- a/kcontrol/randr/randrconfigbase.ui
+++ b/kcontrol/randr/randrconfigbase.ui
@@ -44,6 +44,13 @@
          </property>
         </widget>
        </item>
+       <item>
+        <widget class="QPushButton" name="saveAsDefaultButton">
+         <property name="text">
+          <string>Save as Default</string>
+         </property>
+        </widget>
+       </item>
       </layout>
      </widget>
      <widget class="QGraphicsView" name="screenView"/>
--- a/kcontrol/randr/randrconfig.cpp
+++ b/kcontrol/randr/randrconfig.cpp
@@ -31,6 +31,8 @@
 #include <kglobalsettings.h>
 #include <kmessagebox.h>
 #include <kprocess.h>
+#include <kshell.h>
+#include <qmenu.h>
 
 RandRConfig::RandRConfig(QWidget *parent, RandRDisplay *display)
 	: QWidget(parent), Ui::RandRConfigBase()
@@ -54,6 +56,12 @@
 	identifyTimer.setSingleShot( true );
 	compressUpdateViewTimer.setSingleShot( true );
 
+	connect( saveAsDefaultButton, SIGNAL( clicked()), SLOT( saveStartup()));
+	QMenu* saveMenu = new QMenu(saveAsDefaultButton);
+	saveMenu->addAction(i18n("Save as Default"),this, SLOT(saveStartup()));
+	saveMenu->addAction(i18n("Reset"),this, SLOT(disableStartup()));
+	saveAsDefaultButton->setMenu(saveMenu);
+
 	// create the container for the settings widget
 	QHBoxLayout *layout = new QHBoxLayout(outputList);
 	layout->setSpacing(0);
@@ -214,6 +222,25 @@
 	emit changed(false);
 }
 
+void RandRConfig::saveStartup()
+{
+	if (!m_display->isValid())
+		return;
+	KConfig config("krandrrc");
+	m_display->saveStartup(config);
+	KMessageBox::information( window(), i18n( "Configuration has been set as the desktop default." ));
+}
+
+void RandRConfig::disableStartup()
+{
+	if (!m_display->isValid())
+		return;
+	KConfig config("krandrrc");
+	m_display->disableStartup(config);
+	KMessageBox::information( window(), i18n( "Default desktop setup has been reset." ));
+}
+
+
 bool RandRConfig::eventFilter(QObject *obj, QEvent *event)
 {
 	if ( obj == screenView && event->type() == QEvent::Resize ) {
--- a/kcontrol/randr/randrconfig.h
+++ b/kcontrol/randr/randrconfig.h
@@ -57,6 +57,8 @@
 	void slotAdjustOutput(OutputGraphicsItem *o);
 	void identifyOutputs();
 	void clearIndicators();
+	void saveStartup();
+	void disableStartup();
 
 signals:
 	void changed(bool change);
--- a/kcontrol/randr/randrdisplay.cpp
+++ b/kcontrol/randr/randrdisplay.cpp
@@ -290,10 +290,9 @@
 	return config.group("Display").readEntry("SyncTrayApp", false);
 }
 
-void RandRDisplay::saveDisplay(KConfig& config, bool applyOnStartup, bool syncTrayApp)
+void RandRDisplay::saveDisplay(KConfig& config, bool syncTrayApp)
 {
 	KConfigGroup group = config.group("Display");
-	group.writeEntry("ApplyOnStartup", applyOnStartup);
 	group.writeEntry("SyncTrayApp", syncTrayApp);
 
 #ifdef HAS_RANDR_1_2
@@ -310,6 +309,36 @@
 	}
 }
 
+// to be used during desktop startup, make all screens provide the shell commands
+// (using xrandr cli tool), save them here and a script will perform these commands
+// early during desktop startup
+void RandRDisplay::saveStartup(KConfig& config)
+{
+	KConfigGroup group = config.group("Display");
+	group.writeEntry("ApplyOnStartup", true);
+	QStringList commands;
+#ifdef HAS_RANDR_1_2
+	if (RandR::has_1_2)
+	{
+		foreach(RandRScreen *s, m_screens)
+			commands += s->startupCommands();
+	}
+	else
+#endif
+	{
+		foreach(LegacyRandRScreen *s, m_legacyScreens)
+			commands += s->startupCommands();
+	}
+	group.writeEntry( "StartupCommands", commands.join( "\n" ));
+}
+
+void RandRDisplay::disableStartup(KConfig& config)
+{
+	KConfigGroup group = config.group("Display");
+	group.writeEntry("ApplyOnStartup", false);
+	group.deleteEntry( "StartupCommands" );
+}
+
 void RandRDisplay::applyProposed(bool confirm)
 {
 
--- a/kcontrol/randr/randrdisplay.h
+++ b/kcontrol/randr/randrdisplay.h
@@ -63,7 +63,9 @@
 	 * @retuns true if the settings should be applied on KDE startup.
 	 */
 	bool loadDisplay(KConfig& config, bool loadScreens = true);
-	void saveDisplay(KConfig& config, bool applyOnStartup, bool syncTrayApp);
+	void saveDisplay(KConfig& config, bool syncTrayApp);
+	void saveStartup(KConfig& config);
+	void disableStartup(KConfig& config);
 
 	static bool applyOnStartup(KConfig& config);
 	static bool syncTrayApp(KConfig& config);
--- a/kcontrol/randr/randroutput.cpp
+++ b/kcontrol/randr/randroutput.cpp
@@ -24,6 +24,7 @@
 
 #include <KConfig>
 #include <KConfigGroup>
+#include <KShell>
 #include <QX11Info>
 #include <QAction>
 
@@ -424,6 +425,36 @@
 	cg.writeEntry("RefreshRate", (double)m_crtc->refreshRate());
 }
 
+QStringList RandROutput::startupCommands() const
+{
+	if (!m_connected)
+		return QStringList();
+	if (m_crtc->id() == None)
+	     return QStringList();	
+	QString command = QString( "xrandr --output \"%1\"" ).arg( KShell::quoteArg( m_name ));
+	// if the outputs are unified, do not save size and rotation
+	// this allow us to set back the size and rotation being used
+	// when the outputs are not unified.
+	if (!m_screen->outputsUnified() || m_screen->connectedCount() <=1)
+	{
+		command += QString( " --pos %1x%2 --mode %3x%4" ).arg( m_crtc->rect().x())
+		    .arg( m_crtc->rect().y()).arg( m_crtc->rect().width()).arg( m_crtc->rect().height());
+		switch( m_crtc->rotation()) {
+			case RandR::Rotate90:
+				command += " --rotate right";
+				break;
+			case RandR::Rotate180:
+				command += " --rotate inverted";
+				break;
+			case RandR::Rotate270:
+				command += " --rotate left";
+				break;
+		}
+	}
+	command += QString(" --refresh %1").arg( m_crtc->refreshRate());
+	return QStringList() << command;
+}
+
 void RandROutput::proposeRefreshRate(float rate)
 {
 	if (!m_crtc->isValid())
--- a/kcontrol/randr/randroutput.h
+++ b/kcontrol/randr/randroutput.h
@@ -118,6 +118,7 @@
 
 	void load(KConfig &config);
 	void save(KConfig &config);
+	QStringList startupCommands() const;
 
 public slots:
 	void slotChangeSize(QAction *action);
--- a/kcontrol/randr/randrscreen.cpp
+++ b/kcontrol/randr/randrscreen.cpp
@@ -424,6 +424,17 @@
 	save(cfg);
 }
 
+QStringList RandRScreen::startupCommands() const
+{
+	QStringList commands;
+	foreach(RandROutput *output, m_outputs)
+	{
+		if (output->isConnected())
+			commands += output->startupCommands();
+	}
+	return commands;
+}
+
 void RandRScreen::load()
 {
 	KConfig cfg("krandrrc");
--- a/kcontrol/randr/randrscreen.h
+++ b/kcontrol/randr/randrscreen.h
@@ -84,6 +84,7 @@
 
 	void load(KConfig &config);
 	void save(KConfig &config);
+	QStringList startupCommands() const;
 
 public slots:
 	void slotUnifyOutputs(bool unify);
--- a/startkde.cmake
+++ b/startkde.cmake
@@ -91,11 +91,12 @@
 kcminputrc Mouse cursorSize ''
 ksplashrc KSplash Theme Default
 ksplashrc KSplash Engine KSplashX
-kcmrandrrc Display ApplyOnStartup false
-kcmrandrrc [Screen0]
-kcmrandrrc [Screen1]
-kcmrandrrc [Screen2]
-kcmrandrrc [Screen3]
+krandrrc Display ApplyOnStartup false
+krandrrc Display StartupCommands ''
+krandrrc [Screen0]
+krandrrc [Screen1]
+krandrrc [Screen2]
+krandrrc [Screen3]
 kcmfonts General forceFontDPI 0
 kdeglobals Locale Language '' # trigger requesting languages from KLocale
 EOF
@@ -125,48 +126,57 @@
     fi
 fi
 
-if test "$kcmrandrrc_display_applyonstartup" = "true"; then
-    # 4 screens is hopefully enough
-    for scrn in 0 1 2 3; do
-        args=
-        width="\$kcmrandrrc_screen${scrn}_width" ; eval "width=$width"
-        height="\$kcmrandrrc_screen${scrn}_height" ; eval "height=$height"
-        if test -n "${width}" -a -n "${height}"; then
-            args="$args -s ${width}x${height}"
-        fi
-        refresh="\$kcmrandrrc_screen${scrn}_refresh" ; eval "refresh=$refresh"
-        if test -n "${refresh}"; then
-            args="$args -r ${refresh}"
-        fi
-        rotation="\$kcmrandrrc_screen${scrn}_rotation" ; eval "rotation=$rotation"
-        if test -n "${rotation}"; then
-            case "${rotation}" in
-                0)
-                    args="$args -o 0"
-                    ;;
-                90)
-                    args="$args -o 1"
-                    ;;
-                180)
-                    args="$args -o 2"
-                    ;;
-                270)
-                    args="$args -o 3"
-                    ;;
-            esac
-        fi
-        reflectx="\$kcmrandrrc_screen${scrn}_reflectx" ; eval "reflectx=$reflectx"
-        if test "${refrectx}" = "true"; then
-            args="$args -x"
-        fi
-        reflecty="\$kcmrandrrc_screen${scrn}_reflecty" ; eval "reflecty=$reflecty"
-        if test "${refrecty}" = "true"; then
-            args="$args -y"
-        fi
-        if test -n "$args"; then
-            xrandr $args
-        fi
-    done
+if test "$krandrrc_display_applyonstartup" = "true"; then
+    if test -n "$krandrrc_display_startupcommands"; then
+        # new way of simply storing the commands
+        echo "$krandrrc_display_startupcommands" | \
+        while read command; do
+            eval "$command"
+        done
+    else
+        # backwards compatibility
+        # 4 screens is hopefully enough
+        for scrn in 0 1 2 3; do
+            args=
+            width="\$krandrrc_screen${scrn}_width" ; eval "width=$width"
+            height="\$krandrrc_screen${scrn}_height" ; eval "height=$height"
+            if test -n "${width}" -a -n "${height}"; then
+                args="$args -s ${width}x${height}"
+            fi
+            refresh="\$krandrrc_screen${scrn}_refresh" ; eval "refresh=$refresh"
+            if test -n "${refresh}"; then
+                args="$args -r ${refresh}"
+            fi
+            rotation="\$krandrrc_screen${scrn}_rotation" ; eval "rotation=$rotation"
+            if test -n "${rotation}"; then
+                case "${rotation}" in
+                    0)
+                        args="$args -o 0"
+                        ;;
+                    90)
+                        args="$args -o 1"
+                        ;;
+                    180)
+                        args="$args -o 2"
+                        ;;
+                    270)
+                        args="$args -o 3"
+                        ;;
+                esac
+            fi
+            reflectx="\$krandrrc_screen${scrn}_reflectx" ; eval "reflectx=$reflectx"
+            if test "${refrectx}" = "true"; then
+                args="$args -x"
+            fi
+            reflecty="\$krandrrc_screen${scrn}_reflecty" ; eval "reflecty=$reflecty"
+            if test "${refrecty}" = "true"; then
+                args="$args -y"
+            fi
+            if test -n "$args"; then
+                xrandr $args
+            fi
+        done
+    fi
 fi
 
 if test "$kcmfonts_general_forcefontdpi" -eq 120; then

Reply to: