[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/workspace
From:       Luboš Luňák <l.lunak () kde ! org>
Date:       2010-08-31 14:04:19
Message-ID: 20100831140419.B3842AC857 () svn ! kde ! org
[Download RAW message or body]

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 <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);
@@ -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 @@
            <height>25</height>
           </size>
          </property>
-         <widget class="QWidget" name="">
+         <widget class="QWidget" name="layoutWidget">
           <property name="geometry">
            <rect>
             <x>0</x>
@@ -88,6 +88,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"/>
--- 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 <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())
--- 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 <<EOF
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic