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: