From kde-commits Tue Aug 31 14:04:19 2010 From: =?utf-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Tue, 31 Aug 2010 14:04:19 +0000 To: kde-commits Subject: KDE/kdebase/workspace Message-Id: <20100831140419.B3842AC857 () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=128326335002082 SVN commit 1170315 by lunakl: - move the somewhat long krandr setup code from startkde into its own separate script that is called from startkde - use properly krandrrc instead of kcmrandrrc in the script - implement support for randr1.2 (non-legacy) setup, which is done by kcm_krandr simply saving a list of CLI xrandr commands and those are executed by the script - add a buttom to kcm_krandr to save the current setup as the default to be used during desktop startup FEATURE: 157839 FEATURE: 219704 FEATURE: 235883 FEATURE: 238278 FEATURE: 163707 FEATURE: 141999 FEATURE: 229529 BUG: 246298 FEATURE: 183143 M +5 -0 kcontrol/randr/CMakeLists.txt AM kcontrol/randr/krandrstartup M +5 -1 kcontrol/randr/legacyrandrconfig.cpp M +22 -0 kcontrol/randr/legacyrandrscreen.cpp M +1 -0 kcontrol/randr/legacyrandrscreen.h M +46 -0 kcontrol/randr/randrconfig.cpp M +2 -0 kcontrol/randr/randrconfig.h M +8 -1 kcontrol/randr/randrconfigbase.ui M +31 -2 kcontrol/randr/randrdisplay.cpp M +3 -1 kcontrol/randr/randrdisplay.h M +31 -0 kcontrol/randr/randroutput.cpp M +1 -0 kcontrol/randr/randroutput.h M +11 -0 kcontrol/randr/randrscreen.cpp M +1 -0 kcontrol/randr/randrscreen.h M +7 -48 startkde.cmake --- trunk/KDE/kdebase/workspace/kcontrol/randr/CMakeLists.txt #1170314:1170315 @@ -59,6 +59,11 @@ install(TARGETS krandrtray ${INSTALL_TARGETS_DEFAULT_ARGS}) +########### next target ############### + +install(PROGRAMS krandrstartup DESTINATION ${BIN_INSTALL_DIR}) + + ########### install files ############### install( FILES krandrtray.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} ) --- trunk/KDE/kdebase/workspace/kcontrol/randr/legacyrandrconfig.cpp #1170314:1170315 @@ -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(); } --- trunk/KDE/kdebase/workspace/kcontrol/randr/legacyrandrscreen.cpp #1170314:1170315 @@ -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); --- trunk/KDE/kdebase/workspace/kcontrol/randr/legacyrandrscreen.h #1170314:1170315 @@ -130,6 +130,7 @@ */ void load(KConfig& config); void save(KConfig& config) const; + QStringList startupCommands() const; private: XRRScreenConfiguration* m_config; --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrconfig.cpp #1170314:1170315 @@ -31,6 +31,8 @@ #include #include #include +#include +#include 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); @@ -235,6 +243,7 @@ } } #ifdef HAS_RANDR_1_3 + if (RandR::has_1_3) { int primaryOutputIndex = primaryDisplayBox->currentIndex(); RandRScreen *screen = m_display->currentScreen(); @@ -267,6 +276,43 @@ emit changed(false); } +void RandRConfig::saveStartup() +{ + if (!m_display->isValid()) + return; + KConfig config("krandrrc"); + m_display->saveStartup(config); +#ifdef HAS_RANDR_1_3 + if (RandR::has_1_3) + { + // Add setting the primary screen to the list of commands + KConfigGroup group = config.group("Display"); + QStringList commands = group.readEntry("StartupCommands").split("\n"); + int primaryOutputIndex = primaryDisplayBox->currentIndex(); + if (primaryOutputIndex > 0) + { + QString primaryOutput = primaryDisplayBox->itemText(primaryOutputIndex); + commands += QString("xrandr --output %1 --primary") + .arg( KShell::quoteArg( primaryOutput )); + } + else + commands += "xrandr --noprimary"; + group.writeEntry("StartupCommands",commands.join("\n")); + } +#endif //HAS_RANDR_1_3 + 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 ) { --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrconfig.h #1170314:1170315 @@ -57,6 +57,8 @@ void slotAdjustOutput(OutputGraphicsItem *o); void identifyOutputs(); void clearIndicators(); + void saveStartup(); + void disableStartup(); signals: void changed(bool change); --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrconfigbase.ui #1170314:1170315 @@ -51,7 +51,7 @@ 25 - + 0 @@ -88,6 +88,13 @@ + + + + Save as Default + + + --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrdisplay.cpp #1170314:1170315 @@ -293,10 +293,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 @@ -313,6 +312,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) { --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrdisplay.h #1170314:1170315 @@ -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); --- trunk/KDE/kdebase/workspace/kcontrol/randr/randroutput.cpp #1170314:1170315 @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -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()) --- trunk/KDE/kdebase/workspace/kcontrol/randr/randroutput.h #1170314:1170315 @@ -118,6 +118,7 @@ void load(KConfig &config); void save(KConfig &config); + QStringList startupCommands() const; public slots: void slotChangeSize(QAction *action); --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrscreen.cpp #1170314:1170315 @@ -455,6 +455,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"); --- trunk/KDE/kdebase/workspace/kcontrol/randr/randrscreen.h #1170314:1170315 @@ -91,6 +91,7 @@ void load(KConfig &config); void save(KConfig &config); + QStringList startupCommands() const; public slots: void slotUnifyOutputs(bool unify); --- trunk/KDE/kdebase/workspace/startkde.cmake #1170314:1170315 @@ -93,11 +93,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 @@ -127,49 +128,7 @@ 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 <