--- kmix/apps/KMixApp.cpp	2011-01-02 16:53:28.000000000 +0100
+++ kmix/apps/KMixApp.cpp	2011-08-01 14:27:20.864178849 +0200
@@ -22,9 +22,11 @@
 #include "KMixApp.h"
 #include "apps/kmix.h"
 #include <kdebug.h>
+#include <kcmdlineargs.h>
 
 
 bool KMixApp::_keepVisibility = false;
+bool KMixApp::_autoStart = false;
 
 KMixApp::KMixApp()
     : KUniqueApplication(), m_kmix( 0 )
@@ -51,6 +53,17 @@
         // There are 3 cases for a new instance
 
 	//kDebug(67100) <<  "KMixApp::newInstance() isRestored()=" << isRestored() << "_keepVisibility=" << _keepVisibility;
+
+       KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+       if (args->isSet("autostart"))
+       {
+               kapp->disableSessionManagement();
+
+               if ( m_kmix )
+                       return 0;
+       }
+
 	static bool first = true;
 	if ( !first )
 	{	// There already exists an instance/window
@@ -118,6 +131,11 @@
    _keepVisibility = val_keepVisibility;
 }
 
+void KMixApp::autoStart(bool val_autoStart) {
+   //kDebug(67100) <<  "KMixApp::autoStart()";
+   _autoStart = val_autoStart;
+}
+
 /*
 void
 KMixApp::quitExtended()
--- kmix/apps/KMixApp.h	2010-09-01 23:37:58.000000000 +0200
+++ kmix/apps/KMixApp.h	2011-08-01 14:27:20.865178847 +0200
@@ -36,6 +36,7 @@
     public slots:
     //void quitExtended();  // For a hack on visibility()
     static void keepVisibility(bool);
+    static void autoStart(bool);
 /*
  signals:
     void stopUpdatesOnVisibility();
@@ -43,6 +44,7 @@
  private:
     KMixWindow *m_kmix;
     static bool _keepVisibility;
+    static bool _autoStart;
 };
 
 #endif
--- kmix/apps/kmix.cpp	2011-07-31 18:38:33.000000000 +0200
+++ kmix/apps/kmix.cpp	2011-08-01 14:29:03.519183816 +0200
@@ -29,9 +29,11 @@
 #include <qradiobutton.h>
 #include <QCursor>
 #include <QString>
+#include <QTimer>
 
 
 // include files for KDE
+#include <kcmdlineargs.h>
 #include <kcombobox.h>
 #include <kiconloader.h>
 #include <kmessagebox.h>
@@ -106,6 +108,9 @@
     fixConfigAfterRead();
     theKMixDeviceManager->initHotplug();
     connect(theKMixDeviceManager, SIGNAL(plugged(const char*,QString,QString&)), SLOT (plugged(const char*,QString,QString&)) );
+    if (KCmdLineArgs::parsedArgs()->isSet("autostart") && ! Mixer::mixers().first())
+        QTimer::singleShot(0, kapp, SLOT(quit()));
+
     connect(theKMixDeviceManager, SIGNAL(unplugged(QString)), SLOT (unplugged(QString)) );
     if ( m_startVisible && ! invisible)
         show(); // Started visible
@@ -316,6 +321,7 @@
     config.writeEntry( "Tickmarks", m_showTicks );
     config.writeEntry( "Labels", m_showLabels );
     config.writeEntry( "startkdeRestore", m_onLogin );
+    config.writeEntry( "AutoStart", m_autoStart );
     config.writeEntry( "DefaultCardOnStart", m_defaultCardOnStart );
     config.writeEntry( "ConfigVersion", KMIX_CONFIG_VERSION );
     config.writeEntry( "AutoUseMultimediaKeys", m_autouseMultimediaKeys );
@@ -420,6 +426,7 @@
     m_showLabels = config.readEntry("Labels", true);
     m_onLogin = config.readEntry("startkdeRestore", true );
     m_startVisible = config.readEntry("Visible", false);
+    m_autoStart = config.readEntry("AutoStart", true);
     m_multiDriverMode = config.readEntry("MultiDriver", false);
     const QString& orientationString = config.readEntry("Orientation", "Vertical");
     m_defaultCardOnStart = config.readEntry( "DefaultCardOnStart", "" );
@@ -1030,6 +1037,7 @@
         m_prefDlg->m_volumeChk->setChecked(m_volumeWidget);
         m_prefDlg->m_volumeChk->setEnabled( m_showDockWidget );
         m_prefDlg->m_onLogin->setChecked( m_onLogin );
+        m_prefDlg->m_disableAutoStart->setChecked( !m_autoStart );
 
         m_prefDlg->m_showTicks->setChecked( m_showTicks );
         m_prefDlg->m_showLabels->setChecked( m_showLabels );
@@ -1071,6 +1079,7 @@
     m_showDockWidget = prefDlg->m_dockingChk->isChecked();
     m_volumeWidget = prefDlg->m_volumeChk->isChecked();
     m_onLogin = prefDlg->m_onLogin->isChecked();
+    m_autoStart = !prefDlg->m_disableAutoStart->isChecked();
     if ( prefDlg->_rbVertical->isChecked() ) {
         m_toplevelOrientation = Qt::Vertical;
     }
--- kmix/apps/kmix.h	2011-07-22 01:15:32.000000000 +0200
+++ kmix/apps/kmix.h	2011-08-01 14:27:20.867178846 +0200
@@ -106,6 +106,7 @@
 
    bool m_showDockWidget;
    bool m_volumeWidget;
+   bool m_autoStart;
    bool m_showTicks;
    bool m_showLabels;
    bool m_onLogin;
--- kmix/apps/main.cpp	2010-09-07 00:50:02.000000000 +0200
+++ kmix/apps/main.cpp	2011-08-01 14:27:20.867178846 +0200
@@ -58,6 +58,7 @@
 
    KCmdLineOptions options;
    options.add("keepvisibility", ki18n("Inhibits the unhiding of the KMix main window, if KMix is already running."));
+   options.add("autostart", ki18n("Used by kmix_autostart.desktop"));
    KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
    KUniqueApplication::addCmdLineOptions();
 
@@ -65,6 +66,8 @@
    bool hasArgKeepvisibility = args->isSet("keepvisibility");
    //kDebug(67100) <<  "hasArgKeepvisibility=" << hasArgKeepvisibility;
    KMixApp::keepVisibility(hasArgKeepvisibility);
+   bool hasAutoStart = args->isSet("autostart");
+   KMixApp::autoStart(hasAutoStart);
 
    if (!KMixApp::start())
        return 0;
--- kmix/gui/kmixprefdlg.cpp	2010-09-01 23:37:58.000000000 +0200
+++ kmix/gui/kmixprefdlg.cpp	2011-08-01 14:27:20.868178847 +0200
@@ -78,6 +78,12 @@
       m_onLogin = new QCheckBox( i18n("Restore volumes on login"), m_generalTab );
       l->addWidget( m_onLogin );
 
+   l = new QHBoxLayout();
+   layout->addItem( l );
+      l->addSpacing(10);
+      m_disableAutoStart = new QCheckBox( i18n("Disable automatic startup on login"), m_generalTab );
+      l->addWidget( m_disableAutoStart );
+
 // -----------------------------------------------------------
 
    label = new QLabel( i18n("Visual"), m_generalTab );
--- kmix/gui/kmixprefdlg.h	2010-09-01 23:37:58.000000000 +0200
+++ kmix/gui/kmixprefdlg.h	2011-08-01 14:27:20.868178847 +0200
@@ -55,6 +55,7 @@
    QCheckBox *m_showTicks;
    QCheckBox *m_showLabels;
    QCheckBox *m_onLogin;
+   QCheckBox *m_disableAutoStart;
    QRadioButton *_rbVertical;
    QRadioButton *_rbHorizontal;
 };
