=== modified file 'mixxx/src/configobject.cpp'
--- mixxx/src/configobject.cpp	2009-08-11 04:38:51 +0000
+++ mixxx/src/configobject.cpp	2009-08-14 19:55:33 +0000
@@ -70,12 +70,14 @@
 {
 }
 
-ConfigValueKbd::ConfigValueKbd(QString _value) : ConfigValue(_value)
+ConfigValueKbd::ConfigValueKbd(QString _value,bool bAuto) : ConfigValue(_value)
 {
     QString key;
 
     QTextIStream(&_value) >> key;
     m_qKey = QKeySequence(key);
+
+    m_bAutoRepeat=bAuto;
 }
 
 ConfigValueKbd::ConfigValueKbd(QKeySequence key)
@@ -185,7 +187,30 @@
 {
     return get(k)->val->value;
 }
-
+template <class ValueType> bool ConfigObject<ValueType>::getAutoRepeat(ValueType v){return false;}
+template <> bool ConfigObject<ConfigValueKbd>::getAutoRepeat(ConfigValueKbd v)
+{
+  ConfigOption<ConfigValueKbd> *it;
+    for (it = list.first(); it; it = list.next())
+    {
+        if (QString::compare(it->val->value, v.value, Qt::CaseInsensitive) == 0){
+            //qDebug() << "ConfigObject #534: QString::compare match for " << it->key->group << it->key->item;
+            return it->val->m_bAutoRepeat;
+        }
+        if (((ConfigValueKbd)*it->val) == ((ConfigValueKbd)v))
+        {
+            //qDebug() << "ConfigObject: match" << it->val->value.toUpper() << "with" << v.value.toUpper();
+            return it->val->m_bAutoRepeat;
+        }
+
+        if (it == list.getLast()) {
+            //qDebug() << "ConfigObject: last match attempted" << it->val->value.toUpper() << "with" << v.value.toUpper();
+        }
+    }
+    //qDebug() << "No match for ConfigObject:" << v.value;
+    return true;
+
+}
 template <class ValueType> bool ConfigObject<ValueType>::Parse()
 {
     // Open file for reading
@@ -231,6 +256,56 @@
     }
     return true;
 }
+template <> bool ConfigObject<ConfigValueKbd>::Parse()
+{
+    // Open file for reading
+    QFile configfile(filename);
+    if (filename.length()<1 || !configfile.open(QIODevice::ReadOnly))
+    {
+        qDebug() << "Could not read" << filename;
+        return false;
+    }
+    else
+    {
+        // Parse the file
+        int group = 0;
+        QString groupStr, line;
+        QTextStream text(&configfile);
+
+        while (!text.atEnd())
+        {
+            line = text.readLine().trimmed();
+
+            if (line.length() != 0)
+                        {
+                if (line.startsWith("[") && line.endsWith("]"))
+                {
+                    group++;
+                    groupStr = line;
+                    //qDebug() << "Group :" << groupStr;
+                }
+                else if (group>0)
+                {
+                    QString key;
+                    QString val;
+                    QString tog;
+                    bool bTog;
+                    QTextIStream(&line) >> key>>val>>tog;
+                    bTog=tog.isNull();
+                    //QString val = line.right(line.length() - key.length()); // finds the value string
+                    //val = val.trimmed();
+                    qDebug() << "control:" << key << "value:" << val<< "AutoRepeat:"<<bTog;
+                    ConfigKey k(groupStr, key);
+                    ConfigValueKbd m(val,bTog);
+                    set(k, m);
+                }
+                        }
+        }
+        configfile.close();
+    }
+    return true;
+}
+
 
 
 template <class ValueType> void ConfigObject<ValueType>::clear()

=== modified file 'mixxx/src/configobject.h'
--- mixxx/src/configobject.h	2009-04-11 20:16:51 +0000
+++ mixxx/src/configobject.h	2009-08-14 19:49:59 +0000
@@ -84,13 +84,14 @@
 {
 public:
     ConfigValueKbd();
-    ConfigValueKbd(QString _value);
+    ConfigValueKbd(QString _value, bool bAuto=true);
     ConfigValueKbd(QKeySequence key);
     inline ConfigValueKbd(QDomNode /* node */) { qFatal("ConfigValueKbd from QDomNode not implemented here"); }
     void valCopy(const ConfigValueKbd v);
     friend bool operator==(const ConfigValueKbd & s1, const ConfigValueKbd & s2);
 
     QKeySequence m_qKey;
+    bool m_bAutoRepeat;
 };
 
 template <class ValueType> class ConfigOption
@@ -116,6 +117,7 @@
     ConfigOption<ValueType> *get(ConfigKey key);
     ConfigKey *get(ValueType v);
     QString getValueString(ConfigKey k);
+    bool getAutoRepeat(ValueType v);
 
     void clear();
     void reopen(QString file);

=== modified file 'mixxx/src/controlobject.h'
--- mixxx/src/controlobject.h	2009-07-17 05:06:48 +0000
+++ mixxx/src/controlobject.h	2009-08-14 20:03:38 +0000
@@ -98,7 +98,7 @@
     virtual double getValueToWidget(double dValue);
     /** get value (range 0..127) **/
     virtual double GetMidiValue();
-
+   
 public slots:
     /** Sets the value of the object and updates associated proxy objects. Not thread safe. */
     void set(double dValue);

=== modified file 'mixxx/src/mixxxkeyboard.cpp'
--- mixxx/src/mixxxkeyboard.cpp	2009-08-11 07:24:19 +0000
+++ mixxx/src/mixxxkeyboard.cpp	2009-08-14 19:50:19 +0000
@@ -42,7 +42,7 @@
 
         //qDebug() << "press";
 
-        if (!kbdPress(getKeySeq(ke), false))
+        if (!kbdPress(getKeySeq(ke), false,ke->isAutoRepeat()))
             ke->ignore();
         else
         {
@@ -90,7 +90,7 @@
     return false;
 }
 
-bool MixxxKeyboard::kbdPress(QKeySequence k, bool release)
+bool MixxxKeyboard::kbdPress(QKeySequence k, bool release, bool bAuto)
 {
     bool react = false;
 
@@ -107,8 +107,10 @@
             }
             else
             {
-                //qDebug() << "Sending MIDI NOTE_ON";
-                ControlObject::getControl(*pConfigKey)->queueFromMidi(NOTE_ON, 1);
+                if((!bAuto)||m_pKbdConfigObject->getAutoRepeat(ConfigValueKbd(k.toString()))){
+                    //qDebug() << "Sending MIDI NOTE_ON";
+                    ControlObject::getControl(*pConfigKey)->queueFromMidi(NOTE_ON, 1);
+                }
             }
 
             react = true;

=== modified file 'mixxx/src/mixxxkeyboard.h'
--- mixxx/src/mixxxkeyboard.h	2007-07-16 01:21:42 +0000
+++ mixxx/src/mixxxkeyboard.h	2009-08-14 09:50:58 +0000
@@ -42,7 +42,7 @@
     bool eventFilter(QObject *obj, QEvent *e);
 
 private:
-    bool kbdPress(QKeySequence k, bool release);
+    bool kbdPress(QKeySequence k, bool release,bool auto = false);
     /** Returns a valid QKeySequency with modifier keys from a QKeyEvent */
     QKeySequence getKeySeq(QKeyEvent *e);
     /** List containing keys which is currently pressed */

