diff -up kdebase-workspace-4.5.2/kcontrol/randr/CMakeLists.txt.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/CMakeLists.txt --- kdebase-workspace-4.5.2/kcontrol/randr/CMakeLists.txt.krandrtray_backport 2010-05-16 05:04:23.000000000 -0500 +++ kdebase-workspace-4.5.2/kcontrol/randr/CMakeLists.txt 2010-10-15 13:49:39.466636332 -0500 @@ -58,6 +58,8 @@ target_link_libraries(krandrtray ${KDE4_ install(TARGETS krandrtray ${INSTALL_TARGETS_DEFAULT_ARGS}) +install(PROGRAMS krandrstartup DESTINATION ${BIN_INSTALL_DIR}) + ########### install files ############### diff -up kdebase-workspace-4.5.2/kcontrol/randr/krandrstartup.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/krandrstartup --- kdebase-workspace-4.5.2/kcontrol/randr/krandrstartup.krandrtray_backport 2010-10-15 13:49:39.466636332 -0500 +++ kdebase-workspace-4.5.2/kcontrol/randr/krandrstartup 2010-10-15 13:49:39.466636332 -0500 @@ -0,0 +1,57 @@ +#!/bin/sh +# +# A script that is called from startkde. Does early setup of a configuration +# saved by krandr. + +if test "$kcmrandrrc_display_applyonstartup" = "true"; then + if test -n "$kcmrandrrc_display_startupcommands"; then + # new way of simply storing the commands + echo "$kcmrandrrc_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="\$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 + fi +fi diff -up kdebase-workspace-4.5.2/kcontrol/randr/krandrtray.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/krandrtray.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/krandrtray.cpp.krandrtray_backport 2010-05-05 04:37:46.000000000 -0500 +++ kdebase-workspace-4.5.2/kcontrol/randr/krandrtray.cpp 2010-10-15 13:49:39.466636332 -0500 @@ -505,7 +505,7 @@ void KRandRSystemTray::slotResolutionCha if (screen->applyProposedAndConfirm()) { - KConfig config("krandrrc"); + KConfig config("kcmrandrrc"); if (m_display->syncTrayApp(config)) screen->save(config); } @@ -531,7 +531,7 @@ void KRandRSystemTray::slotOrientationCh if (screen->applyProposedAndConfirm()) { - KConfig config("krandrrc"); + KConfig config("kcmrandrrc"); if (m_display->syncTrayApp(config)) screen->save(config); } @@ -551,7 +551,7 @@ void KRandRSystemTray::slotRefreshRateCh if (screen->applyProposedAndConfirm()) { - KConfig config("krandrrc"); + KConfig config("kcmrandrrc"); if (m_display->syncTrayApp(config)) screen->save(config); } diff -up kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrconfig.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrconfig.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrconfig.cpp.krandrtray_backport 2009-11-13 04:57:32.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrconfig.cpp 2010-10-15 13:49:39.467636123 -0500 @@ -73,7 +73,7 @@ void LegacyRandRConfig::load() // and if it isn't correct they have changed a) their X configuration, b) the screen // with another program, or c) their hardware. - KConfig config("krandrrc"); + KConfig config("kcmrandrrc"); m_oldApply = m_display->loadDisplay(config, false); m_oldSyncTrayApp = m_display->syncTrayApp(config); applyOnStartup->setChecked(m_oldApply); @@ -91,8 +91,12 @@ void LegacyRandRConfig::save() m_oldApply = applyOnStartup->isChecked(); m_oldSyncTrayApp = syncTrayApp->isChecked(); - KConfig config("krandrrc"); - m_display->saveDisplay(config, m_oldApply, m_oldSyncTrayApp); + KConfig config("kcmrandrrc"); + m_display->saveDisplay(config, m_oldSyncTrayApp); + if(m_oldApply) + m_display->saveStartup(config); + else + m_display->disableStartup(config); setChanged(); } diff -up kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.cpp.krandrtray_backport 2008-07-08 04:26:10.000000000 -0500 +++ kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.cpp 2010-10-15 13:49:39.467636123 -0500 @@ -388,6 +388,28 @@ void LegacyRandRScreen::save(KConfig& co 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); diff -up kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.h.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.h --- kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.h.krandrtray_backport 2008-01-14 19:50:55.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/legacyrandrscreen.h 2010-10-15 13:49:39.468636472 -0500 @@ -130,6 +130,7 @@ public: */ void load(KConfig& config); void save(KConfig& config) const; + QStringList startupCommands() const; private: XRRScreenConfiguration* m_config; diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrconfigbase.ui.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrconfigbase.ui --- kdebase-workspace-4.5.2/kcontrol/randr/randrconfigbase.ui.krandrtray_backport 2009-11-13 04:57:32.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrconfigbase.ui 2010-10-15 13:49:39.468636472 -0500 @@ -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"/> diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.cpp.krandrtray_backport 2009-12-10 17:14:03.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.cpp 2010-10-15 13:49:39.469636751 -0500 @@ -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 @@ RandRConfig::RandRConfig(QWidget *parent 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 @@ void RandRConfig::update() emit changed(false); } +void RandRConfig::saveStartup() +{ + if (!m_display->isValid()) + return; + KConfig config("kcmrandrrc"); + 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("kcmrandrrc"); + 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 ) { diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.h.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.h --- kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.h.krandrtray_backport 2009-11-13 04:57:32.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrconfig.h 2010-10-15 13:49:39.469636751 -0500 @@ -57,6 +57,8 @@ protected slots: void slotAdjustOutput(OutputGraphicsItem *o); void identifyOutputs(); void clearIndicators(); + void saveStartup(); + void disableStartup(); signals: void changed(bool change); diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.cpp.krandrtray_backport 2008-09-29 00:55:38.000000000 -0500 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.cpp 2010-10-15 13:49:39.470636332 -0500 @@ -290,10 +290,9 @@ bool RandRDisplay::syncTrayApp(KConfig& 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 @@ void RandRDisplay::saveDisplay(KConfig& } } +// 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) { diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.h.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.h --- kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.h.krandrtray_backport 2009-11-13 04:57:32.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrdisplay.h 2010-10-15 13:49:39.470636332 -0500 @@ -63,7 +63,9 @@ public: * @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); diff -up kdebase-workspace-4.5.2/kcontrol/randr/randroutput.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randroutput.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/randroutput.cpp.krandrtray_backport 2010-04-15 03:59:20.000000000 -0500 +++ kdebase-workspace-4.5.2/kcontrol/randr/randroutput.cpp 2010-10-15 13:49:39.471635983 -0500 @@ -24,6 +24,7 @@ #include <KConfig> #include <KConfigGroup> +#include <KShell> #include <QX11Info> #include <QAction> @@ -424,6 +425,36 @@ void RandROutput::save(KConfig &config) 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()) @@ -559,7 +590,7 @@ bool RandROutput::applyProposed(int chan } kDebug() << "Applying proposed changes for output" << m_name << "..."; - KConfig cfg("krandrrc"); + KConfig cfg("kcmrandrrc"); RandRCrtc *crtc; // first try to apply to the already attached crtc if any diff -up kdebase-workspace-4.5.2/kcontrol/randr/randroutput.h.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randroutput.h --- kdebase-workspace-4.5.2/kcontrol/randr/randroutput.h.krandrtray_backport 2009-11-13 04:57:32.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randroutput.h 2010-10-15 13:49:39.472635843 -0500 @@ -118,6 +118,7 @@ public: void load(KConfig &config); void save(KConfig &config); + QStringList startupCommands() const; public slots: void slotChangeSize(QAction *action); diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.cpp.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.cpp --- kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.cpp.krandrtray_backport 2009-11-13 04:57:32.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.cpp 2010-10-15 13:49:39.472635843 -0500 @@ -420,13 +420,24 @@ void RandRScreen::save(KConfig &config) void RandRScreen::save() { - KConfig cfg("krandrrc"); + KConfig cfg("kcmrandrrc"); 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"); + KConfig cfg("kcmrandrrc"); load(cfg); } @@ -511,7 +522,7 @@ bool RandRScreen::applyProposed(bool con void RandRScreen::unifyOutputs() { - KConfig cfg("krandrrc"); + KConfig cfg("kcmrandrrc"); SizeList sizes = unifiedSizes(); //FIXME: better handle this @@ -562,7 +573,7 @@ void RandRScreen::slotResizeUnified(QAct void RandRScreen::slotUnifyOutputs(bool unified) { m_outputsUnified = unified; - KConfig cfg("krandrrc"); + KConfig cfg("kcmrandrrc"); if (!unified || m_connectedCount <= 1) { diff -up kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.h.krandrtray_backport kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.h --- kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.h.krandrtray_backport 2008-01-14 19:50:55.000000000 -0600 +++ kdebase-workspace-4.5.2/kcontrol/randr/randrscreen.h 2010-10-15 13:49:39.473636192 -0500 @@ -84,6 +84,7 @@ public: void load(KConfig &config); void save(KConfig &config); + QStringList startupCommands() const; public slots: void slotUnifyOutputs(bool unify); diff -up kdebase-workspace-4.5.2/startkde.cmake.krandrtray_backport kdebase-workspace-4.5.2/startkde.cmake --- kdebase-workspace-4.5.2/startkde.cmake.krandrtray_backport 2010-08-27 03:10:26.000000000 -0500 +++ kdebase-workspace-4.5.2/startkde.cmake 2010-10-15 13:49:39.473636192 -0500 @@ -82,6 +82,7 @@ kcminputrc Mouse cursorSize '' ksplashrc KSplash Theme Default ksplashrc KSplash Engine KSplashX kcmrandrrc Display ApplyOnStartup false +kcmrandrrc Display StartupCommands '' kcmrandrrc [Screen0] kcmrandrrc [Screen1] kcmrandrrc [Screen2] @@ -115,49 +116,7 @@ if test -n "$kcminputrc_mouse_cursorthem 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 -fi +. krandrstartup 2>/dev/null if test "$kcmfonts_general_forcefontdpi" -eq 120; then xrdb -quiet -merge -nocpp <<EOF