Hi! I changed the patch for minimal difference to the version in debian squeeze as requested by Modestas Vainius <mo...@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