<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.audio.supercollider.devel">
    <title>gmane.comp.audio.supercollider.devel</title>
    <link>http://blog.gmane.org/gmane.comp.audio.supercollider.devel</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50943"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50942"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50941"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50940"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50931"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50929"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50928"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50912"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50910"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50909"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50907"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50901"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50898"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50897"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50881"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50874"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50850"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50832"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50828"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50813"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50943">
    <title>SF.net Git: supercollider branch, master, updated. 8bfc3f49053a8081e7d986743711fd7706cb047b</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50943</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  8bfc3f49053a8081e7d986743711fd7706cb047b (commit)
      from  085bc7867166b19b1b1c471aa231dac07f332f64 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 8bfc3f49053a8081e7d986743711fd7706cb047b
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Sat May 26 15:18:38 2012 +0200

    sc ide: fix recent documents menu
    
    Do not reload the list of recent documents from configuration file on
    every request from settings manager to apply settings, as that would
    discard changes occurred at runtime.
    
    Instead, only load the list once at start up.

diff --git a/editors/sc-ide/core/doc_manager.cpp b/editors/sc-ide/core/doc_manager.cpp
index e3e1abf..a30a104 100644
--- a/editors/sc-ide/core/doc_manager.cpp
+++ b/editors/sc-ide/core/doc_manager.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,8 +35,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; DocumentManager::DocumentManager( Main *main ):
 {
     connect(&amp;amp;mFsWatcher, SIGNAL(fileChanged(QString)), this, SLOT(onFileChanged(QString)));
 
-    connect(main, SIGNAL(applySettingsRequest(Settings::Manager*)),
-            this, SLOT(applySettings(Settings::Manager*)));
     connect(main, SIGNAL(storeSettingsRequest(Settings::Manager*)),
             this, SLOT(storeSettings(Settings::Manager*)));
 
-----------------------------------------------------------------------

Summary of changes:
 editors/sc-ide/core/doc_manager.cpp |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-26T13:21:17</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50942">
    <title>[PATCH] sc ide: DocumentManager: always resolve paths to canonical form</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50942</link>
    <description>&lt;pre&gt;---
 editors/sc-ide/core/doc_manager.cpp         |   72 ++++++++++++++++-----------
 editors/sc-ide/core/doc_manager.hpp         |   10 ++--
 editors/sc-ide/widgets/documents_dialog.cpp |    4 +-
 editors/sc-ide/widgets/main_window.cpp      |    5 +-
 4 files changed, 51 insertions(+), 40 deletions(-)

diff --git a/editors/sc-ide/core/doc_manager.cpp b/editors/sc-ide/core/doc_manager.cpp
index e3e1abf..2e27402 100644
--- a/editors/sc-ide/core/doc_manager.cpp
+++ b/editors/sc-ide/core/doc_manager.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -50,15 +50,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void DocumentManager::create()
     Q_EMIT( opened(doc, 0) );
 }
 
-void DocumentManager::open( const QString &amp;amp; filename, int initialCursorPosition )
+void DocumentManager::open( const QString &amp;amp; path, int initialCursorPosition )
 {
+    QFileInfo info(path);
+    QString cpath = info.canonicalFilePath();
+    info.setFile(cpath);
+
+    if (cpath.isEmpty()) {
+        qWarning() &amp;lt;&amp;lt; "DocumentManager: Can not open file: canonical path is empty.";
+        return;
+    }
+
     // Check if file already opened
 
     DocIterator it;
     for( it = mDocHash.begin(); it != mDocHash.end(); ++it )
     {
         Document *doc = it.value();
-        if(doc-&amp;gt;fileName() == filename) {
+        if(doc-&amp;gt;mFilePath == cpath) {
             Q_EMIT( showRequest(doc, initialCursorPosition) );
             addToRecent(doc);
             return;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -67,9 +76,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void DocumentManager::open( const QString &amp;amp; filename, int initialCursorPosition
 
     // Open the file
 
-    QFile file(filename);
+    QFile file(cpath);
     if(!file.open(QIODevice::ReadOnly)) {
-        qWarning() &amp;lt;&amp;lt; "DocumentManager: the file" &amp;lt;&amp;lt; filename &amp;lt;&amp;lt; "could not be opened for reading.";
+        qWarning() &amp;lt;&amp;lt; "DocumentManager: the file" &amp;lt;&amp;lt; cpath &amp;lt;&amp;lt; "could not be opened for reading.";
         return;
     }
     QByteArray bytes( file.readAll() );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -78,12 +87,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void DocumentManager::open( const QString &amp;amp; filename, int initialCursorPosition
     Document *doc = new Document();
     doc-&amp;gt;mDoc-&amp;gt;setPlainText( QString::fromUtf8( bytes.data(), bytes.size() ) );
     doc-&amp;gt;mDoc-&amp;gt;setModified(false);
-    doc-&amp;gt;mFileName = filename;
-    doc-&amp;gt;mTitle = QDir(filename).dirName();
+    doc-&amp;gt;mFilePath = cpath;
+    doc-&amp;gt;mTitle = info.fileName();
 
     mDocHash.insert( doc-&amp;gt;id(), doc );
 
-    mFsWatcher.addPath(filename);
+    mFsWatcher.addPath(cpath);
 
     Q_EMIT( opened(doc, initialCursorPosition) );
     addToRecent(doc);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -93,12 +102,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool DocumentManager::reload( Document *doc )
 {
     Q_ASSERT(doc);
 
-    if (doc-&amp;gt;mFileName.isEmpty())
+    if (doc-&amp;gt;mFilePath.isEmpty())
         return false;
 
-    QFile file(doc-&amp;gt;mFileName);
+    QFile file(doc-&amp;gt;mFilePath);
     if(!file.open(QIODevice::ReadOnly)) {
-        qWarning() &amp;lt;&amp;lt; "DocumentManager: the file" &amp;lt;&amp;lt; doc-&amp;gt;mFileName &amp;lt;&amp;lt; "could not be opened for reading.";
+        qWarning() &amp;lt;&amp;lt; "DocumentManager: the file" &amp;lt;&amp;lt; doc-&amp;gt;mFilePath &amp;lt;&amp;lt; "could not be opened for reading.";
         return false;
     }
     QByteArray bytes( file.readAll() );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,8 +116,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool DocumentManager::reload( Document *doc )
     doc-&amp;gt;mDoc-&amp;gt;setPlainText( QString::fromUtf8( bytes.data(), bytes.size() ) );
     doc-&amp;gt;mDoc-&amp;gt;setModified(false);
 
-    if (!mFsWatcher.files().contains(doc-&amp;gt;mFileName))
-        mFsWatcher.addPath(doc-&amp;gt;mFileName);
+    if (!mFsWatcher.files().contains(doc-&amp;gt;mFilePath))
+        mFsWatcher.addPath(doc-&amp;gt;mFilePath);
 
     return true;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,8 +131,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void DocumentManager::close( Document *doc )
         return;
     }
 
-    if (!doc-&amp;gt;mFileName.isEmpty())
-        mFsWatcher.removePath(doc-&amp;gt;mFileName);
+    if (!doc-&amp;gt;mFilePath.isEmpty())
+        mFsWatcher.removePath(doc-&amp;gt;mFilePath);
 
     Q_EMIT( closed(doc) );
     delete doc;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -133,28 +142,31 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool DocumentManager::save( Document *doc )
 {
     Q_ASSERT(doc);
 
-    if (doc-&amp;gt;mFileName.isEmpty())
+    if (doc-&amp;gt;mFilePath.isEmpty())
         return false;
 
-    return doSaveAs( doc, doc-&amp;gt;mFileName );
+    return doSaveAs( doc, doc-&amp;gt;mFilePath );
 }
 
-bool DocumentManager::saveAs( Document *doc, const QString &amp;amp; filename )
+bool DocumentManager::saveAs( Document *doc, const QString &amp;amp; path )
 {
     Q_ASSERT(doc);
-    bool ok = doSaveAs( doc, filename );
+
+    bool ok = doSaveAs( doc, QFileInfo(path).canonicalFilePath() );
     if (ok)
         addToRecent(doc);
     return ok;
 }
 
-bool DocumentManager::doSaveAs( Document *doc, const QString &amp;amp; fileName )
+bool DocumentManager::doSaveAs( Document *doc, const QString &amp;amp; cpath )
 {
+    // WARNING: cpath must be in canonical form!
+
     Q_ASSERT(doc);
 
-    QFile file(fileName);
+    QFile file(cpath);
     if(!file.open(QIODevice::WriteOnly)) {
-        qWarning() &amp;lt;&amp;lt; "DocumentManager: the file" &amp;lt;&amp;lt; fileName &amp;lt;&amp;lt; "could not be opened for writing.";
+        qWarning() &amp;lt;&amp;lt; "DocumentManager: the file" &amp;lt;&amp;lt; cpath &amp;lt;&amp;lt; "could not be opened for writing.";
         return false;
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -162,15 +174,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool DocumentManager::doSaveAs( Document *doc, const QString &amp;amp; fileName )
     file.write(str.toUtf8());
     file.close();
 
-    doc-&amp;gt;mFileName = fileName;
-    doc-&amp;gt;mTitle = QDir(fileName).dirName();
+    QFileInfo info(cpath);
+    doc-&amp;gt;mFilePath = cpath;
+    doc-&amp;gt;mTitle = info.fileName();
     doc-&amp;gt;mDoc-&amp;gt;setModified(false);
-    QFileInfo finfo(file);
-    doc-&amp;gt;mSaveTime = finfo.lastModified();
+    doc-&amp;gt;mSaveTime = info.lastModified();
 
     // Always try to start watching, because the file could have been removed:
-    if (!mFsWatcher.files().contains(fileName))
-        mFsWatcher.addPath(fileName);
+    if (!mFsWatcher.files().contains(cpath))
+        mFsWatcher.addPath(cpath);
 
     Q_EMIT(saved(doc));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -183,8 +195,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void DocumentManager::onFileChanged( const QString &amp;amp; path )
     for( it = mDocHash.begin(); it != mDocHash.end(); ++it )
     {
         Document *doc = it.value();
-        if (doc-&amp;gt;mFileName == path) {
-            QFileInfo info(doc-&amp;gt;mFileName);
+        if (doc-&amp;gt;mFilePath == path) {
+            QFileInfo info(doc-&amp;gt;mFilePath);
             if (doc-&amp;gt;mSaveTime &amp;lt; info.lastModified()) {
                 doc-&amp;gt;mDoc-&amp;gt;setModified(true);
                 emit changedExternally(doc);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -195,7 +207,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void DocumentManager::onFileChanged( const QString &amp;amp; path )
 
 void DocumentManager::addToRecent( Document *doc )
 {
-    const QString &amp;amp;path = doc-&amp;gt;fileName();
+    const QString &amp;amp;path = doc-&amp;gt;mFilePath;
     int i = mRecent.indexOf(path);
     if (i != -1)
         mRecent.move( i, 0 );
diff --git a/editors/sc-ide/core/doc_manager.hpp b/editors/sc-ide/core/doc_manager.hpp
index 5f6e80c..3497b96 100644
--- a/editors/sc-ide/core/doc_manager.hpp
+++ b/editors/sc-ide/core/doc_manager.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -52,13 +52,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
 
     QTextDocument *textDocument() { return mDoc; }
     const QByteArray &amp;amp; id() { return mId; }
-    const QString &amp;amp; fileName() { return mFileName; }
+    const QString &amp;amp; filePath() { return mFilePath; }
     const QString &amp;amp; title() { return mTitle; }
 
 private:
     QByteArray mId;
     QTextDocument *mDoc;
-    QString mFileName;
+    QString mFilePath;
     QString mTitle;
     QDateTime mSaveTime;
 };
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,13 +77,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
     void create();
     void close( Document * );
     bool save( Document * );
-    bool saveAs( Document *, const QString &amp;amp; filename );
+    bool saveAs( Document *, const QString &amp;amp; path );
     bool reload( Document * );
     const QStringList &amp;amp; recents() const { return mRecent; }
 
 public slots:
     // initialCursorPosition -1 means "don't change position if already open"
-    void open( const QString &amp;amp; filename, int initialCursorPosition = -1 );
+    void open( const QString &amp;amp; path, int initialCursorPosition = -1 );
     void clearRecents();
     void applySettings( Settings::Manager * );
     void storeSettings( Settings::Manager * );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -101,7 +101,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private slots:
     void onFileChanged( const QString &amp;amp; path );
 
 private:
-    bool doSaveAs( Document *, const QString &amp;amp; filename );
+    bool doSaveAs( Document *, const QString &amp;amp; path );
     void addToRecent( Document * );
 
     typedef QHash&amp;lt;QByteArray, Document*&amp;gt;::iterator DocIterator;
diff --git a/editors/sc-ide/widgets/documents_dialog.cpp b/editors/sc-ide/widgets/documents_dialog.cpp
index 12c3f14..19d1df4 100644
--- a/editors/sc-ide/widgets/documents_dialog.cpp
+++ b/editors/sc-ide/widgets/documents_dialog.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -270,8 +270,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; DocumentsDialog::Item::Item(Document *doc):
 void DocumentsDialog::Item::update()
 {
     setTitle(mDoc-&amp;gt;title());
-    setPath(mDoc-&amp;gt;fileName());
-    if (!mDoc-&amp;gt;fileName().isEmpty() &amp;amp;&amp;amp; !QFile::exists(mDoc-&amp;gt;fileName())) {
+    setPath(mDoc-&amp;gt;filePath());
+    if (!mDoc-&amp;gt;filePath().isEmpty() &amp;amp;&amp;amp; !QFile::exists(mDoc-&amp;gt;filePath())) {
         setStatus("Removed");
         setChecked(false);
     }
diff --git a/editors/sc-ide/widgets/main_window.cpp b/editors/sc-ide/widgets/main_window.cpp
index f2820df..2950941 100644
--- a/editors/sc-ide/widgets/main_window.cpp
+++ b/editors/sc-ide/widgets/main_window.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -510,7 +510,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool MainWindow::close( Document *doc )
 
 bool MainWindow::reload( Document *doc )
 {
-    if (doc-&amp;gt;fileName().isEmpty())
+    if (doc-&amp;gt;filePath().isEmpty())
         return false;
 
     if (doc-&amp;gt;textDocument()-&amp;gt;isModified())
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -534,8 +534,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool MainWindow::reload( Document *doc )
 bool MainWindow::save( Document *doc, bool forceChoose )
 {
     DocumentManager *mng = Main::instance()-&amp;gt;documentManager();
-    QString fileName = doc-&amp;gt;fileName();
-    if (forceChoose || fileName.isEmpty())
+    if (forceChoose || doc-&amp;gt;filePath().isEmpty())
     {
         QFileDialog dialog(mInstance);
 
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-26T13:06:34</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50941">
    <title>Scale.directory crossplatform-ness</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50941</link>
    <description>&lt;pre&gt;I assume this is uncontroversial. Should go into master and 3.5.

I tested by running "Scale.directory" in commandline sclang, and the directory string was dumped to standard output, as expected.

OK?

hjh


--
James Harkins /// dewdrop world
jamshark70-n2XjBy9Frl0FLkkUnhLBSV6hYfS7NtTn&amp;lt; at &amp;gt;public.gmane.org
http://www.dewdrop-world.net

"Come said the Muse,
Sing me a song no poet has yet chanted,
Sing me the universal."  -- Whitman

blog: http://www.dewdrop-world.net/words
audio clips: http://www.dewdrop-world.net/audio
more audio: http://soundcloud.com/dewdrop_world/tracks

&lt;/pre&gt;</description>
    <dc:creator>James Harkins</dc:creator>
    <dc:date>2012-05-26T01:35:20</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50940">
    <title>SF.net Git: supercollider branch, master, updated. 085bc7867166b19b1b1c471aa231dac07f332f64</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50940</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  085bc7867166b19b1b1c471aa231dac07f332f64 (commit)
       via  f21a4ed0a26f3979c353232716dd255d5d32d7c7 (commit)
       via  391cc4b1c2af98adae424da7cafcbab63f6919d8 (commit)
      from  8f471ec1f61187ef8969eb2860cee288cd27c989 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 085bc7867166b19b1b1c471aa231dac07f332f64
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Sat May 26 00:09:54 2012 +0200

    sc ide: unify find-replace panel and command-line into one toolbox
    
    This avoids unnecessary GUI bloat by only allowing one of find,
    replace, and command-line panels to be visible at a time.
    
    Also, actions are added to the View menu that control the
    visibility of the tool panels.

diff --git a/editors/sc-ide/CMakeLists.txt b/editors/sc-ide/CMakeLists.txt
index 0ab61ef..f67c92b 100644
--- a/editors/sc-ide/CMakeLists.txt
+++ b/editors/sc-ide/CMakeLists.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,6 +16,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; set ( ide_moc_hdr
     widgets/multi_editor.hpp
     widgets/doc_list.hpp
     widgets/cmd_line.hpp
+    widgets/find_replace_tool.hpp
+    widgets/tool_box.hpp
     widgets/documents_dialog.hpp
     widgets/code_editor/editor.hpp
     widgets/code_editor/highlighter.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -42,6 +44,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; set ( ide_src
     widgets/post_window.cpp
     widgets/doc_list.cpp
     widgets/cmd_line.cpp
+    widgets/find_replace_tool.cpp
     widgets/documents_dialog.cpp
     widgets/code_editor/editor.cpp
     widgets/code_editor/highlighter.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -73,6 +76,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; SET( translations
     translations/scide_zh.ts
 )
 
+# QtCollider shared sources:
+list(APPEND ide_moc_hdr
+    ${CMAKE_SOURCE_DIR}/QtCollider/layouts/stack_layout.hpp
+)
+list(APPEND ide_src
+    ${CMAKE_SOURCE_DIR}/QtCollider/layouts/stack_layout.cpp
+)
+
 QT4_ADD_TRANSLATION( translations_src ${translations} )
 
 list(APPEND ide_src ${CMAKE_SOURCE_DIR}/common/SC_DirUtils.cpp)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,6 +97,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; endif()
 include_directories(${CMAKE_SOURCE_DIR}/include/common)
 include_directories(${CMAKE_SOURCE_DIR}/external_libraries/yaml-cpp-0.3.0/include)
 include_directories(${CMAKE_SOURCE_DIR}/external_libraries/boost)
+# For QtCollider headers:
+include_directories(${CMAKE_SOURCE_DIR})
 # Needed for auto-generated forms headers:
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/widgets/util)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/widgets)
diff --git a/editors/sc-ide/widgets/find_replace_tool.cpp b/editors/sc-ide/widgets/find_replace_tool.cpp
new file mode 100644
index 0000000..2ea107e
--- /dev/null
+++ b/editors/sc-ide/widgets/find_replace_tool.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,188 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+    SuperCollider Qt IDE
+    Copyright (c) 2012 Jakob Leben &amp;amp; Tim Blechmann
+    http://www.audiosynth.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
+
+#include "find_replace_tool.hpp"
+#include "code_editor/editor.hpp"
+
+#include &amp;lt;QApplication&amp;gt;
+
+namespace ScIDE {
+
+TextFindReplacePanel::TextFindReplacePanel( QWidget * parent ):
+    QWidget(parent),
+    mMode((Mode) 0), // a hack so that first setMode() works
+    mEditor(0)
+{
+    mFindField = new QLineEdit;
+    mReplaceField = new QLineEdit;
+
+    mNextBtn = new QPushButton(tr("Next"));
+    mPrevBtn = new QPushButton(tr("Previous"));
+    mFindAllBtn = new QPushButton(tr("Find All"));
+    mReplaceBtn = new QPushButton(tr("Replace"));
+    mReplaceAllBtn = new QPushButton(tr("Replace All"));
+
+    mOptionsBtn = new QPushButton(tr("Options"));
+    QMenu *optMenu = new QMenu(this);
+    mMatchCaseAction = optMenu-&amp;gt;addAction(tr("Match Case"));
+    mMatchCaseAction-&amp;gt;setCheckable(true);
+    mRegExpAction = optMenu-&amp;gt;addAction(tr("Regular Expression"));
+    mRegExpAction-&amp;gt;setCheckable(true);
+    mWholeWordAction = optMenu-&amp;gt;addAction(tr("Whole Words"));
+    mWholeWordAction-&amp;gt;setCheckable(true);
+    mOptionsBtn-&amp;gt;setMenu(optMenu);
+
+    mFindLabel = new QLabel(tr("Find:"));
+    mFindLabel-&amp;gt;setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+    mReplaceLabel = new QLabel(tr("Replace:"));
+    mReplaceLabel-&amp;gt;setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+
+    mGrid = new QGridLayout();
+    mGrid-&amp;gt;setContentsMargins(2,2,2,2);
+    mGrid-&amp;gt;addWidget(mFindLabel, 0, 0);
+    mGrid-&amp;gt;addWidget(mFindField, 0, 1);
+    mGrid-&amp;gt;addWidget(mNextBtn, 0, 2);
+    mGrid-&amp;gt;addWidget(mPrevBtn, 0, 3);
+    mGrid-&amp;gt;addWidget(mFindAllBtn, 0, 4);
+    mGrid-&amp;gt;addWidget(mOptionsBtn, 0, 5);
+    mGrid-&amp;gt;addWidget(mReplaceLabel, 1, 0);
+    mGrid-&amp;gt;addWidget(mReplaceField, 1, 1);
+    mGrid-&amp;gt;addWidget(mReplaceBtn, 1, 2);
+    mGrid-&amp;gt;addWidget(mReplaceAllBtn, 1, 3);
+    setLayout(mGrid);
+
+    setMode(Find);
+
+    setFocusProxy(mFindField);
+    QWidget::setTabOrder(mFindField, mReplaceField);
+
+    connect(mNextBtn, SIGNAL(clicked()), this, SLOT(findNext()));
+    connect(mPrevBtn, SIGNAL(clicked()), this, SLOT(findPrevious()));
+    connect(mFindAllBtn, SIGNAL(clicked()), this, SLOT(findAll()));
+    connect(mReplaceBtn, SIGNAL(clicked()), this, SLOT(replace()));
+    connect(mReplaceAllBtn, SIGNAL(clicked()), this, SLOT(replaceAll()));
+    connect(mFindField, SIGNAL(returnPressed()), this, SLOT(onFindFieldReturn()));
+    connect(mReplaceField, SIGNAL(returnPressed()), this, SLOT(replace()));
+}
+
+void TextFindReplacePanel::setMode( Mode mode )
+{
+    if (mode == mMode) return;
+
+    mMode = mode;
+
+    bool visible = mMode == Replace;
+    mReplaceLabel-&amp;gt;setVisible(visible);
+    mReplaceField-&amp;gt;setVisible(visible);
+    mReplaceBtn-&amp;gt;setVisible(visible);
+    mReplaceAllBtn-&amp;gt;setVisible(visible);
+}
+
+void TextFindReplacePanel::initiate()
+{
+    if(mEditor)
+    {
+        QTextCursor c( mEditor-&amp;gt;textCursor() );
+        if(c.hasSelection() &amp;amp;&amp;amp;
+           c.document()-&amp;gt;findBlock(c.selectionStart()) ==
+           c.document()-&amp;gt;findBlock(c.selectionEnd()))
+        {
+            mFindField-&amp;gt;setText(c.selectedText());
+            mReplaceField-&amp;gt;clear();
+        }
+    }
+
+    mFindField-&amp;gt;selectAll();
+}
+
+QRegExp TextFindReplacePanel::regexp()
+{
+    QRegExp expr(findString());
+    expr.setPatternSyntax(asRegExp() ? QRegExp::RegExp : QRegExp::FixedString);
+    expr.setCaseSensitivity(matchCase() ? Qt::CaseSensitive : Qt::CaseInsensitive);
+    return expr;
+}
+
+QTextDocument::FindFlags TextFindReplacePanel::flags()
+{
+    QTextDocument::FindFlags f;
+    if(wholeWords())
+        f |= QTextDocument::FindWholeWords;
+    return f;
+}
+
+void TextFindReplacePanel::findNext()
+{
+    find(false);
+}
+
+void TextFindReplacePanel::findPrevious()
+{
+    find(true);
+}
+
+void TextFindReplacePanel::onFindFieldReturn()
+{
+    find (QApplication::keyboardModifiers() &amp;amp; Qt::ShiftModifier);
+}
+
+void TextFindReplacePanel::find (bool backwards)
+{
+    if (!mEditor) return;
+
+    QRegExp expr = regexp();
+    if (expr.isEmpty()) return;
+
+    QTextDocument::FindFlags opt = flags();
+    if (backwards)
+        opt |= QTextDocument::FindBackward;
+
+    mEditor-&amp;gt;find(expr, opt);
+}
+
+void TextFindReplacePanel::findAll()
+{
+    if (!mEditor) return;
+
+    // NOTE: empty expression removes any search highlighting
+    mEditor-&amp;gt;findAll(regexp(), flags());
+}
+
+void TextFindReplacePanel::replace()
+{
+    if (!mEditor) return;
+
+    QRegExp expr = regexp();
+    if (expr.isEmpty()) return;
+
+    mEditor-&amp;gt;replace(expr, replaceString(), flags());
+}
+
+void TextFindReplacePanel::replaceAll()
+{
+    if (!mEditor) return;
+
+    QRegExp expr = regexp();
+    if (expr.isEmpty()) return;
+
+    mEditor-&amp;gt;replaceAll(expr, replaceString(), flags());
+}
+
+} // namespace ScIDE
diff --git a/editors/sc-ide/widgets/find_replace_tool.hpp b/editors/sc-ide/widgets/find_replace_tool.hpp
new file mode 100644
index 0000000..c5f9ee5
--- /dev/null
+++ b/editors/sc-ide/widgets/find_replace_tool.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,101 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+    SuperCollider Qt IDE
+    Copyright (c) 2012 Jakob Leben &amp;amp; Tim Blechmann
+    http://www.audiosynth.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
+
+#ifndef SCIDE_WIDGETS_FIND_REPLACE_TOOL_HPP_INCLUDED
+#define SCIDE_WIDGETS_FIND_REPLACE_TOOL_HPP_INCLUDED
+
+#include &amp;lt;QWidget&amp;gt;
+#include &amp;lt;QPushButton&amp;gt;
+#include &amp;lt;QLabel&amp;gt;
+#include &amp;lt;QLineEdit&amp;gt;
+#include &amp;lt;QGridLayout&amp;gt;
+#include &amp;lt;QTextDocument&amp;gt;
+#include &amp;lt;QAction&amp;gt;
+#include &amp;lt;QMenu&amp;gt;
+
+namespace ScIDE {
+
+class CodeEditor;
+
+class TextFindReplacePanel : public QWidget
+{
+    Q_OBJECT
+
+public:
+    enum Mode
+    {
+        Find = 1,
+        Replace
+    };
+
+public:
+    TextFindReplacePanel( QWidget * parent = 0 );
+
+    void setEditor( CodeEditor *editor ) { mEditor = editor; }
+
+    Mode mode () const { return mMode; }
+    void setMode( Mode );
+    void initiate();
+
+    QString findString() const { return mFindField-&amp;gt;text(); }
+    QString replaceString() const { return mReplaceField-&amp;gt;text(); }
+    bool matchCase() const { return mMatchCaseAction-&amp;gt;isChecked(); }
+    bool asRegExp() const { return mRegExpAction-&amp;gt;isChecked(); }
+    bool wholeWords() const { return mWholeWordAction-&amp;gt;isChecked(); }
+    QRegExp regexp();
+    QTextDocument::FindFlags flags();
+
+public Q_SLOTS:
+    void findNext();
+    void findPrevious();
+    void findAll();
+    void replace();
+    void replaceAll();
+
+private Q_SLOTS:
+    void onFindFieldReturn();
+
+private:
+    void find (bool backwards);
+
+    QLineEdit *mFindField;
+    QLabel *mFindLabel;
+    QLineEdit *mReplaceField;
+    QLabel *mReplaceLabel;
+    QPushButton *mNextBtn;
+    QPushButton *mPrevBtn;
+    QPushButton *mFindAllBtn;
+    QPushButton *mReplaceBtn;
+    QPushButton *mReplaceAllBtn;
+    QPushButton *mOptionsBtn;
+    QAction *mMatchCaseAction;
+    QAction *mRegExpAction;
+    QAction *mWholeWordAction;
+
+    QGridLayout *mGrid;
+
+    Mode mMode;
+
+    CodeEditor *mEditor;
+};
+
+} // namespace ScIDE
+
+#endif
diff --git a/editors/sc-ide/widgets/main_window.cpp b/editors/sc-ide/widgets/main_window.cpp
index 8a59613..f2820df 100644
--- a/editors/sc-ide/widgets/main_window.cpp
+++ b/editors/sc-ide/widgets/main_window.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -24,6 +24,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "code_editor/editor.hpp"
 #include "multi_editor.hpp"
 #include "cmd_line.hpp"
+#include "find_replace_tool.hpp"
+#include "tool_box.hpp"
 #include "doc_list.hpp"
 #include "post_window.hpp"
 #include "settings/dialog.hpp"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,6 +36,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include &amp;lt;QMenu&amp;gt;
 #include &amp;lt;QMenuBar&amp;gt;
 #include &amp;lt;QVBoxLayout&amp;gt;
+#include &amp;lt;QGridLayout&amp;gt;
 #include &amp;lt;QApplication&amp;gt;
 #include &amp;lt;QMessageBox&amp;gt;
 #include &amp;lt;QStatusBar&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -68,22 +71,31 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; MainWindow::MainWindow(Main * main) :
     // Code editor
     mEditors = new MultiEditor(main);
 
+    // Tools
+
+    mCmdLine = new CmdLine("Command Line:");
+    connect(mCmdLine, SIGNAL(invoked(QString, bool)),
+            main-&amp;gt;scProcess(), SLOT(evaluateCode(QString, bool)));
+
+    mFindReplaceTool = new TextFindReplacePanel;
+
+    mToolBox = new ToolBox;
+    mToolBox-&amp;gt;addWidget(mCmdLine);
+    mToolBox-&amp;gt;addWidget(mFindReplaceTool);
+    mToolBox-&amp;gt;hide();
+
     // Docks
     mDocListDock = new DocumentsDock(main-&amp;gt;documentManager(), this);
     mPostDock = new PostDock(this);
 
     // Layout
 
-    // use a layout for tool widgets, to provide for separate margin control
-    QVBoxLayout *tool_box = new QVBoxLayout;
-    tool_box-&amp;gt;addWidget(cmdLine());
-    tool_box-&amp;gt;setContentsMargins(5,2,5,2);
-
     QVBoxLayout *center_box = new QVBoxLayout;
     center_box-&amp;gt;setContentsMargins(0,0,0,0);
     center_box-&amp;gt;setSpacing(0);
     center_box-&amp;gt;addWidget(mEditors);
-    center_box-&amp;gt;addLayout(tool_box);
+    center_box-&amp;gt;addWidget(mToolBox);
+
     QWidget *central = new QWidget;
     central-&amp;gt;setLayout(center_box);
     setCentralWidget(central);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -120,7 +132,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; MainWindow::MainWindow(Main * main) :
             this, SLOT(onDocumentChangedExternally(Document*)));
     connect(docMng, SIGNAL(recentsChanged()),
             this, SLOT(updateRecentDocsMenu()));
+    // ToolBox
+    connect(mToolBox-&amp;gt;closeButton(), SIGNAL(clicked()), this, SLOT(hideToolBox()));
 
+    createActions();
     createMenus();
 
     // Initialize recent documents menu
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -134,13 +149,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; MainWindow::MainWindow(Main * main) :
     QApplication::setWindowIcon(icon);
 }
 
-void MainWindow::createMenus()
+void MainWindow::createActions()
 {
     Settings::Manager *s = mMain-&amp;gt;settings();
     s-&amp;gt;beginGroup("IDE/shortcuts");
 
-    new QShortcut( tr("Ctrl+Tab", "Toggle command line focus"), this, SLOT(toggleComandLineFocus()) );
-
     QAction *act;
 
     // File
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -190,13 +203,39 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     connect(act, SIGNAL(triggered()),
             Main::instance()-&amp;gt;documentManager(), SLOT(clearRecents()));
 
+    // Edit
+
+    mActions[Find] = act = new QAction(
+        QIcon::fromTheme("edit-find"), tr("&amp;amp;Find..."), this);
+    act-&amp;gt;setShortcut(tr("Ctrl+F", "Find"));
+    act-&amp;gt;setStatusTip(tr("Find text in document"));
+    connect(act, SIGNAL(triggered()), this, SLOT(showFindTool()));
+
+    mActions[Replace] = act = new QAction(
+        QIcon::fromTheme("edit-replace"), tr("&amp;amp;Replace..."), this);
+    act-&amp;gt;setShortcut(tr("Ctrl+R", "Replace"));
+    act-&amp;gt;setStatusTip(tr("Find and replace text in document"));
+    connect(act, SIGNAL(triggered()), this, SLOT(showReplaceTool()));
+
     // View
+
     mActions[ShowDocList] = act = new QAction(tr("&amp;amp;Documents"), this);
     act-&amp;gt;setStatusTip(tr("Show/Hide the Documents dock"));
     act-&amp;gt;setCheckable(true);
     connect(act, SIGNAL(triggered(bool)), mDocListDock, SLOT(setVisible(bool)));
     connect(mDocListDock, SIGNAL(visibilityChanged(bool)), act, SLOT(setChecked(bool)));
 
+    mActions[ShowCmdLine] = act = new QAction(tr("&amp;amp;Command Line"), this);
+    act-&amp;gt;setStatusTip(tr("Command line for quick code evaluation"));
+    act-&amp;gt;setShortcut(tr("Ctrl+E", "Show command line"));
+    connect(act, SIGNAL(triggered()), this, SLOT(showCmdLine()));
+
+    mActions[CloseToolBox] = act = new QAction(
+        QIcon::fromTheme("window-close"), tr("&amp;amp;Close Tool Panel"), this);
+    act-&amp;gt;setStatusTip(tr("Close any open tool panel"));
+    act-&amp;gt;setShortcut(tr("Esc", "Close tool box"));
+    connect(act, SIGNAL(triggered()), this, SLOT(hideToolBox()));
+
     // Language
 
     mActions[EvaluateCurrentFile] = act = new QAction(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -240,6 +279,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
 
     s-&amp;gt;endGroup(); // IDE/shortcuts;
 
+    // Add actions to settings
+    for (int i = 0; i &amp;lt; ActionCount; ++i)
+        s-&amp;gt;addAction( mActions[i] );
+}
+
+void MainWindow::createMenus()
+{
     QMenu *menu;
     QMenu *submenu;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -268,8 +314,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::Copy) );
     menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::Paste) );
     menu-&amp;gt;addSeparator();
-    menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::Find) );
-    menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::Replace) );
+    menu-&amp;gt;addAction( mActions[Find] );
+    menu-&amp;gt;addAction( mActions[Replace] );
     menu-&amp;gt;addSeparator();
     menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::IndentMore) );
     menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::IndentLess) );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -283,6 +329,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     submenu-&amp;gt;addAction( mActions[ShowDocList] );
     menu-&amp;gt;addMenu(submenu);
     menu-&amp;gt;addSeparator();
+    submenu = menu-&amp;gt;addMenu(tr("&amp;amp;Tool Panels"));
+    submenu-&amp;gt;addAction( mActions[Find] );
+    submenu-&amp;gt;addAction( mActions[Replace] );
+    submenu-&amp;gt;addAction( mActions[ShowCmdLine] );
+    submenu-&amp;gt;addSeparator();
+    submenu-&amp;gt;addAction( mActions[CloseToolBox] );
+    menu-&amp;gt;addSeparator();
     menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::EnlargeFont) );
     menu-&amp;gt;addAction( mEditors-&amp;gt;action(MultiEditor::ShrinkFont) );
     menu-&amp;gt;addSeparator();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -314,10 +367,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     menu-&amp;gt;addAction( mActions[HelpForSelection] );
 
     menuBar()-&amp;gt;addMenu(menu);
-
-    // Add actions to settings
-    for (int i = 0; i &amp;lt; ActionCount; ++i)
-        s-&amp;gt;addAction( mActions[i] );
 }
 
 QAction *MainWindow::action( ActionRole role )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -361,6 +410,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::onCurrentDocumentChanged( Document * doc )
     mActions[DocSave]-&amp;gt;setEnabled(doc);
     mActions[DocSaveAs]-&amp;gt;setEnabled(doc);
     mActions[DocClose]-&amp;gt;setEnabled(doc);
+
+    mFindReplaceTool-&amp;gt;setEditor( mEditors-&amp;gt;currentEditor() );
 }
 
 void MainWindow::onDocumentChangedExternally( Document *doc )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -576,6 +627,49 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::closeDocument()
     MainWindow::close( editor-&amp;gt;document() );
 }
 
+void MainWindow::showCmdLine()
+{
+    mToolBox-&amp;gt;setCurrentWidget( mCmdLine );
+    mToolBox-&amp;gt;show();
+
+    mCmdLine-&amp;gt;setFocus(Qt::OtherFocusReason);
+}
+
+void MainWindow::showFindTool()
+{
+    mFindReplaceTool-&amp;gt;setMode( TextFindReplacePanel::Find );
+    mFindReplaceTool-&amp;gt;initiate();
+
+    mToolBox-&amp;gt;setCurrentWidget( mFindReplaceTool );
+    mToolBox-&amp;gt;show();
+
+    mFindReplaceTool-&amp;gt;setFocus(Qt::OtherFocusReason);
+}
+
+void MainWindow::showReplaceTool()
+{
+    mFindReplaceTool-&amp;gt;setMode( TextFindReplacePanel::Replace );
+    mFindReplaceTool-&amp;gt;initiate();
+
+    mToolBox-&amp;gt;setCurrentWidget( mFindReplaceTool );
+    mToolBox-&amp;gt;show();
+
+    mFindReplaceTool-&amp;gt;setFocus(Qt::OtherFocusReason);
+}
+
+void MainWindow::hideToolBox()
+{
+    mToolBox-&amp;gt;hide();
+    CodeEditor *editor = mEditors-&amp;gt;currentEditor();
+    if (editor) {
+        // This slot is mapped to Escape, so also clear highlighting
+        // whenever invoked:
+        editor-&amp;gt;clearSearchHighlighting();
+        if (!editor-&amp;gt;hasFocus())
+            editor-&amp;gt;setFocus(Qt::OtherFocusReason);
+    }
+}
+
 void MainWindow::toggleComandLineFocus()
 {
     QWidget *cmd = cmdLine();
diff --git a/editors/sc-ide/widgets/main_window.hpp b/editors/sc-ide/widgets/main_window.hpp
index eca273f..8fd51b5 100644
--- a/editors/sc-ide/widgets/main_window.hpp
+++ b/editors/sc-ide/widgets/main_window.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,6 +31,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace ScIDE
 
 class Main;
 class MultiEditor;
+class ToolBox;
+class TextFindReplacePanel;
 class PostDock;
 class DocumentsDock;
 class StatusLabel;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,8 +56,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
         DocReload,
         ClearRecentDocs,
 
+        // Edit
+        Find,
+        Replace,
+
         // View
         ShowDocList,
+        ShowCmdLine,
+        CloseToolBox,
 
         // Language
         EvaluateCurrentFile,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -94,6 +102,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public Q_SLOTS:
     void reloadDocument();
     void closeDocument();
 
+    void showCmdLine();
+    void showFindTool();
+    void showReplaceTool();
+    void hideToolBox();
+
 signals:
     void evaluateCode( const QString &amp;amp;, bool silent = true );
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -113,6 +126,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected:
     virtual void closeEvent(QCloseEvent *event);
 
 private:
+    void createActions();
     void createMenus();
     QWidget *cmdLine();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -123,6 +137,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
 
     MultiEditor *mEditors;
 
+    // Tools
+    ToolBox *mToolBox;
+    QWidget *mCmdLine;
+    TextFindReplacePanel *mFindReplaceTool;
+
     // Status bar
     StatusLabel *mLangStatus;
     StatusLabel *mSynthStatus;
diff --git a/editors/sc-ide/widgets/multi_editor.cpp b/editors/sc-ide/widgets/multi_editor.cpp
index 6d75d5a..e70939d 100644
--- a/editors/sc-ide/widgets/multi_editor.cpp
+++ b/editors/sc-ide/widgets/multi_editor.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -46,13 +46,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; MultiEditor::MultiEditor( Main *main, QWidget * parent ) :
     mTabs-&amp;gt;setTabsClosable(true);
     mTabs-&amp;gt;setMovable(true);
 
-    mFindReplacePanel = new TextFindReplacePanel;
-    mFindReplacePanel-&amp;gt;setVisible(false);
-
     QVBoxLayout *l = new QVBoxLayout;
     l-&amp;gt;setContentsMargins(0,0,0,0);
     l-&amp;gt;addWidget(mTabs);
-    l-&amp;gt;addWidget(mFindReplacePanel);
     setLayout(l);
 
     connect(mDocManager, SIGNAL(opened(Document*, int)),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -72,8 +68,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; MultiEditor::MultiEditor( Main *main, QWidget * parent ) :
     connect(&amp;amp;mModificationMapper, SIGNAL(mapped(QWidget*)),
             this, SLOT(onModificationChanged(QWidget*)));
 
-    connect(mFindReplacePanel, SIGNAL(close()), this, SLOT(hideToolPanel()));
-
     connect(main, SIGNAL(applySettingsRequest(Settings::Manager*)),
             this, SLOT(applySettings(Settings::Manager*)));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -125,22 +119,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::createActions()
     act-&amp;gt;setStatusTip(tr("Paste text from clipboard"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(paste()));
 
-    mActions[Find] = act = new QAction(
-        QIcon::fromTheme("edit-find"), tr("&amp;amp;Find..."), this);
-    act-&amp;gt;setShortcut(tr("Ctrl+F", "Find"));
-    act-&amp;gt;setStatusTip(tr("Find text in document"));
-    connect(act, SIGNAL(triggered()), this, SLOT(showFindPanel()));
-
-    mActions[Replace] = act = new QAction(
-        QIcon::fromTheme("edit-replace"), tr("&amp;amp;Replace..."), this);
-    act-&amp;gt;setShortcut(tr("Ctrl+R", "Replace"));
-    act-&amp;gt;setStatusTip(tr("Find and replace text in document"));
-    connect(act, SIGNAL(triggered()), this, SLOT(showReplacePanel()));
-
-    QShortcut *escShortcut =
-        new QShortcut( tr("Esc", "Hide tool panel"), this, SLOT(hideToolPanel()) );
-    mSigMux-&amp;gt;connect(escShortcut, SIGNAL(activated()), SLOT(clearSearchHighlighting()));
-
     mActions[IndentMore] = act = new QAction(
         QIcon::fromTheme("format-indent-more"), tr("Indent &amp;amp;More"), this);
     act-&amp;gt;setStatusTip(tr("Increase indentation of selected lines"));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -220,30 +198,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::setCurrent( Document *doc )
         mTabs-&amp;gt;setCurrentWidget(editor);
 }
 
-void MultiEditor::showFindPanel()
-{
-    mFindReplacePanel-&amp;gt;setMode( TextFindReplacePanel::Find );
-    mFindReplacePanel-&amp;gt;initiate();
-    mFindReplacePanel-&amp;gt;show();
-    mFindReplacePanel-&amp;gt;setFocus(Qt::OtherFocusReason);
-}
-
-void MultiEditor::showReplacePanel()
-{
-    mFindReplacePanel-&amp;gt;setMode( TextFindReplacePanel::Replace );
-    mFindReplacePanel-&amp;gt;initiate();
-    mFindReplacePanel-&amp;gt;show();
-    mFindReplacePanel-&amp;gt;setFocus(Qt::OtherFocusReason);
-}
-
-void MultiEditor::hideToolPanel()
-{
-    mFindReplacePanel-&amp;gt;hide();
-    CodeEditor *editor = currentEditor();
-    if (editor &amp;amp;&amp;amp; !editor-&amp;gt;hasFocus())
-        editor-&amp;gt;setFocus(Qt::OtherFocusReason);
-}
-
 void MultiEditor::onOpen( Document *doc, int pos )
 {
     CodeEditor *editor = new CodeEditor();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -306,8 +260,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::onCurrentChanged( int index )
         editor-&amp;gt;setFocus(Qt::OtherFocusReason);
     }
 
-    mFindReplacePanel-&amp;gt;setEditor(editor);
-
     updateActions();
 
     Q_EMIT( currentChanged( editor ? editor-&amp;gt;document() : 0 ) );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -350,174 +302,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::openClassDefinition()
     Main::instance()-&amp;gt;scProcess()-&amp;gt;getClassDefinitions(selectedText);
 }
 
-
-////////////////////// TextFindReplacePanel //////////////////////////
-
-TextFindReplacePanel::TextFindReplacePanel( QWidget * parent ):
-    QWidget(parent),
-    mMode((Mode) 0), // a hack so that first setMode() works
-    mEditor(0)
-{
-    mCloseBtn = new QToolButton;
-    mCloseBtn-&amp;gt;setIcon(QIcon::fromTheme("window-close"));
-    mCloseBtn-&amp;gt;setAutoRaise(true);
-
-    mFindField = new QLineEdit;
-    mReplaceField = new QLineEdit;
-
-    mNextBtn = new QPushButton(tr("Next"));
-    mPrevBtn = new QPushButton(tr("Previous"));
-    mFindAllBtn = new QPushButton(tr("Find All"));
-    mReplaceBtn = new QPushButton(tr("Replace"));
-    mReplaceAllBtn = new QPushButton(tr("Replace All"));
-
-    mOptionsBtn = new QPushButton(tr("Options"));
-    QMenu *optMenu = new QMenu(this);
-    mMatchCaseAction = optMenu-&amp;gt;addAction(tr("Match Case"));
-    mMatchCaseAction-&amp;gt;setCheckable(true);
-    mRegExpAction = optMenu-&amp;gt;addAction(tr("Regular Expression"));
-    mRegExpAction-&amp;gt;setCheckable(true);
-    mWholeWordAction = optMenu-&amp;gt;addAction(tr("Whole Words"));
-    mWholeWordAction-&amp;gt;setCheckable(true);
-    mOptionsBtn-&amp;gt;setMenu(optMenu);
-
-    mFindLabel = new QLabel(tr("Find:"));
-    mFindLabel-&amp;gt;setAlignment(Qt::AlignRight | Qt::AlignVCenter);
-    mReplaceLabel = new QLabel(tr("Replace:"));
-    mReplaceLabel-&amp;gt;setAlignment(Qt::AlignRight | Qt::AlignVCenter);
-
-    mGrid = new QGridLayout();
-    mGrid-&amp;gt;setContentsMargins(2,2,2,2);
-    mGrid-&amp;gt;addWidget(mCloseBtn, 0, 0);
-    mGrid-&amp;gt;addWidget(mFindLabel, 0, 1);
-    mGrid-&amp;gt;addWidget(mFindField, 0, 2);
-    mGrid-&amp;gt;addWidget(mNextBtn, 0, 3);
-    mGrid-&amp;gt;addWidget(mPrevBtn, 0, 4);
-    mGrid-&amp;gt;addWidget(mFindAllBtn, 0, 5);
-    mGrid-&amp;gt;addWidget(mOptionsBtn, 0, 6);
-    mGrid-&amp;gt;addWidget(mReplaceLabel, 1, 1);
-    mGrid-&amp;gt;addWidget(mReplaceField, 1, 2);
-    mGrid-&amp;gt;addWidget(mReplaceBtn, 1, 3);
-    mGrid-&amp;gt;addWidget(mReplaceAllBtn, 1, 4);
-    setLayout(mGrid);
-
-    setMode(Find);
-
-    setFocusProxy(mFindField);
-    QWidget::setTabOrder(mFindField, mReplaceField);
-
-    connect(mCloseBtn, SIGNAL(clicked()), this, SIGNAL(close()));
-    connect(mNextBtn, SIGNAL(clicked()), this, SLOT(findNext()));
-    connect(mPrevBtn, SIGNAL(clicked()), this, SLOT(findPrevious()));
-    connect(mFindAllBtn, SIGNAL(clicked()), this, SLOT(findAll()));
-    connect(mReplaceBtn, SIGNAL(clicked()), this, SLOT(replace()));
-    connect(mReplaceAllBtn, SIGNAL(clicked()), this, SLOT(replaceAll()));
-    connect(mFindField, SIGNAL(returnPressed()), this, SLOT(onFindFieldReturn()));
-    connect(mReplaceField, SIGNAL(returnPressed()), this, SLOT(replace()));
-}
-
-void TextFindReplacePanel::setMode( Mode mode )
-{
-    if (mode == mMode) return;
-
-    mMode = mode;
-
-    bool visible = mMode == Replace;
-    mReplaceLabel-&amp;gt;setVisible(visible);
-    mReplaceField-&amp;gt;setVisible(visible);
-    mReplaceBtn-&amp;gt;setVisible(visible);
-    mReplaceAllBtn-&amp;gt;setVisible(visible);
-}
-
-void TextFindReplacePanel::initiate()
-{
-    if(mEditor)
-    {
-        QTextCursor c( mEditor-&amp;gt;textCursor() );
-        if(c.hasSelection() &amp;amp;&amp;amp;
-           c.document()-&amp;gt;findBlock(c.selectionStart()) ==
-           c.document()-&amp;gt;findBlock(c.selectionEnd()))
-        {
-            mFindField-&amp;gt;setText(c.selectedText());
-            mReplaceField-&amp;gt;clear();
-        }
-    }
-
-    mFindField-&amp;gt;selectAll();
-}
-
-QRegExp TextFindReplacePanel::regexp()
-{
-    QRegExp expr(findString());
-    expr.setPatternSyntax(asRegExp() ? QRegExp::RegExp : QRegExp::FixedString);
-    expr.setCaseSensitivity(matchCase() ? Qt::CaseSensitive : Qt::CaseInsensitive);
-    return expr;
-}
-
-QTextDocument::FindFlags TextFindReplacePanel::flags()
-{
-    QTextDocument::FindFlags f;
-    if(wholeWords())
-        f |= QTextDocument::FindWholeWords;
-    return f;
-}
-
-void TextFindReplacePanel::findNext()
-{
-    find(false);
-}
-
-void TextFindReplacePanel::findPrevious()
-{
-    find(true);
-}
-
-void TextFindReplacePanel::onFindFieldReturn()
-{
-    find (QApplication::keyboardModifiers() &amp;amp; Qt::ShiftModifier);
-}
-
-void TextFindReplacePanel::find (bool backwards)
-{
-    if (!mEditor) return;
-
-    QRegExp expr = regexp();
-    if (expr.isEmpty()) return;
-
-    QTextDocument::FindFlags opt = flags();
-    if (backwards)
-        opt |= QTextDocument::FindBackward;
-
-    mEditor-&amp;gt;find(expr, opt);
-}
-
-void TextFindReplacePanel::findAll()
-{
-    if (!mEditor) return;
-
-    // NOTE: empty expression removes any search highlighting
-    mEditor-&amp;gt;findAll(regexp(), flags());
-}
-
-void TextFindReplacePanel::replace()
-{
-    if (!mEditor) return;
-
-    QRegExp expr = regexp();
-    if (expr.isEmpty()) return;
-
-    mEditor-&amp;gt;replace(expr, replaceString(), flags());
-}
-
-void TextFindReplacePanel::replaceAll()
-{
-    if (!mEditor) return;
-
-    QRegExp expr = regexp();
-    if (expr.isEmpty()) return;
-
-    mEditor-&amp;gt;replaceAll(expr, replaceString(), flags());
-}
-
-
 } // namespace ScIDE
diff --git a/editors/sc-ide/widgets/multi_editor.hpp b/editors/sc-ide/widgets/multi_editor.hpp
index 1809ba6..6cf63a5 100644
--- a/editors/sc-ide/widgets/multi_editor.hpp
+++ b/editors/sc-ide/widgets/multi_editor.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -43,8 +43,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class SignalMultiplexer;
 
 namespace Settings { class Manager; }
 
-class TextFindReplacePanel;
-
 class MultiEditor : public QWidget
 {
     Q_OBJECT
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,8 +57,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
         Cut,
         Copy,
         Paste,
-        Find,
-        Replace,
         IndentMore,
         IndentLess,
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -94,10 +90,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public Q_SLOTS:
 
     void setCurrent( Document * );
 
-    void showFindPanel();
-    void showReplacePanel();
-    void hideToolPanel();
-
     void applySettings( Settings::Manager * );
 
 private Q_SLOTS:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -124,79 +116,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
 
     // gui
     QTabWidget *mTabs;
-    TextFindReplacePanel *mFindReplacePanel;
     QIcon mDocModifiedIcon;
 
     // settings
     bool mStepForwardEvaluation;
 };
 
-class TextFindReplacePanel : public QWidget
-{
-    Q_OBJECT
-
-public:
-    enum Mode
-    {
-        Find = 1,
-        Replace
-    };
-
-public:
-    TextFindReplacePanel( QWidget * parent = 0 );
-
-    void setEditor( CodeEditor *editor ) { mEditor = editor; }
-
-    Mode mode () const { return mMode; }
-    void setMode( Mode );
-    void initiate();
-
-    QString findString() const { return mFindField-&amp;gt;text(); }
-    QString replaceString() const { return mReplaceField-&amp;gt;text(); }
-    bool matchCase() const { return mMatchCaseAction-&amp;gt;isChecked(); }
-    bool asRegExp() const { return mRegExpAction-&amp;gt;isChecked(); }
-    bool wholeWords() const { return mWholeWordAction-&amp;gt;isChecked(); }
-    QRegExp regexp();
-    QTextDocument::FindFlags flags();
-
-public Q_SLOTS:
-    void findNext();
-    void findPrevious();
-    void findAll();
-    void replace();
-    void replaceAll();
-
-Q_SIGNALS:
-    void close();
-
-private Q_SLOTS:
-    void onFindFieldReturn();
-
-private:
-    void find (bool backwards);
-
-    QToolButton *mCloseBtn;
-    QLineEdit *mFindField;
-    QLabel *mFindLabel;
-    QLineEdit *mReplaceField;
-    QLabel *mReplaceLabel;
-    QPushButton *mNextBtn;
-    QPushButton *mPrevBtn;
-    QPushButton *mFindAllBtn;
-    QPushButton *mReplaceBtn;
-    QPushButton *mReplaceAllBtn;
-    QPushButton *mOptionsBtn;
-    QAction *mMatchCaseAction;
-    QAction *mRegExpAction;
-    QAction *mWholeWordAction;
-
-    QGridLayout *mGrid;
-
-    Mode mMode;
-
-    CodeEditor *mEditor;
-};
-
 } // namespace ScIDE
 
 #endif // SCIDE_WIDGETS_MULTI_EDITOR_HPP_INCLUDED
diff --git a/editors/sc-ide/widgets/tool_box.hpp b/editors/sc-ide/widgets/tool_box.hpp
new file mode 100644
index 0000000..d4b3f56
--- /dev/null
+++ b/editors/sc-ide/widgets/tool_box.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,72 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+    SuperCollider Qt IDE
+    Copyright (c) 2012 Jakob Leben &amp;amp; Tim Blechmann
+    http://www.audiosynth.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
+
+#ifndef SCIDE_WIDGETS_TOOL_BOX_HPP_INCLUDED
+#define SCIDE_WIDGETS_TOOL_BOX_HPP_INCLUDED
+
+#include &amp;lt;QtCollider/layouts/stack_layout.hpp&amp;gt;
+
+#include &amp;lt;QWidget&amp;gt;
+#include &amp;lt;QToolButton&amp;gt;
+#include &amp;lt;QGridLayout&amp;gt;
+
+namespace ScIDE {
+
+class ToolBox : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ToolBox( QWidget * parent = 0 ): QWidget(parent)
+    {
+        mCloseBtn = new QToolButton;
+        mCloseBtn-&amp;gt;setIcon(QIcon::fromTheme("window-close"));
+        mCloseBtn-&amp;gt;setText("X");
+        mCloseBtn-&amp;gt;setAutoRaise(true);
+
+        mStack = new QtCollider::StackLayout;
+
+        QGridLayout *grid = new QGridLayout;
+        grid-&amp;gt;addWidget(mCloseBtn, 0, 0);
+        grid-&amp;gt;addLayout(mStack, 0, 1, 2, 1);
+
+        setLayout(grid);
+    }
+
+    QAbstractButton *closeButton() { return mCloseBtn; }
+
+    void addWidget ( QWidget *w ) { mStack-&amp;gt;addWidget(w); }
+
+    int currentIndex () const { return mStack-&amp;gt;currentIndex(); }
+
+    QWidget * currentWidget() const { return mStack-&amp;gt;currentWidget(); }
+
+    void setCurrentWidget ( QWidget *w ) { mStack-&amp;gt;setCurrentWidget(w); }
+
+    void setCurrentIndex ( int i ) { mStack-&amp;gt;setCurrentIndex(i); }
+
+private:
+    QtCollider::StackLayout *mStack;
+    QToolButton *mCloseBtn;
+};
+
+} // namespace ScIDE
+
+#endif
commit f21a4ed0a26f3979c353232716dd255d5d32d7c7
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Sat May 26 01:23:15 2012 +0200

    qtcollider: StackLayout: calculate size policies based on stacking mode
    
    When stacking mode is StackOne (only one widget visible at a time), only
    include that widget in calculation of sizeHint() and minimumSizeHint().
    
    Moreover, implement expandingDirections() following the same principle.

diff --git a/QtCollider/layouts/stack_layout.cpp b/QtCollider/layouts/stack_layout.cpp
index 837a232..9aee8af 100644
--- a/QtCollider/layouts/stack_layout.cpp
+++ b/QtCollider/layouts/stack_layout.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -146,6 +146,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void StackLayout::setCurrentIndex(int index)
     }
     if (reenableUpdates)
         parent-&amp;gt;setUpdatesEnabled(true);
+
+    if (_mode == StackOne)
+      // expandingDirections() might have changed, so invalidate():
+      invalidate();
 }
 
 int StackLayout::currentIndex() const
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -194,17 +198,35 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void StackLayout::addItem(QLayoutItem *item)
 QSize StackLayout::sizeHint() const
 {
     QSize s(0, 0);
-    int n = _list.count();
-
-    for (int i = 0; i &amp;lt; n; ++i)
-        if (QWidget *widget = _list.at(i)-&amp;gt;widget()) {
-            QSize ws(widget-&amp;gt;sizeHint());
-            if (widget-&amp;gt;sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
-                ws.setWidth(0);
-            if (widget-&amp;gt;sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
-                ws.setHeight(0);
-            s = s.expandedTo(ws);
-        }
+
+    switch (_mode)
+    {
+    case StackOne:
+        if (_index &amp;gt;= 0)
+            if (QWidget *w = _list.at(_index)-&amp;gt;widget()) {
+                if (w-&amp;gt;sizePolicy().horizontalPolicy() != QSizePolicy::Ignored)
+                  s.setWidth(w-&amp;gt;sizeHint().width());
+                if (w-&amp;gt;sizePolicy().verticalPolicy() != QSizePolicy::Ignored)
+                  s.setHeight(w-&amp;gt;sizeHint().height());
+            }
+        break;
+
+    case StackAll:
+    {
+        int n = _list.count();
+        for (int i = 0; i &amp;lt; n; ++i)
+            if (QWidget *w = _list.at(i)-&amp;gt;widget()) {
+                QSize ws(w-&amp;gt;sizeHint());
+                if (w-&amp;gt;sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
+                    ws.setWidth(0);
+                if (w-&amp;gt;sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
+                    ws.setHeight(0);
+                s = s.expandedTo(ws);
+            }
+        break;
+    }
+    }
+
     return s;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -241,17 +263,56 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static QSize smartMinSize(const QSize &amp;amp;sizeHint, const QSize &amp;amp;minSizeHint,
 QSize StackLayout::minimumSize() const
 {
     QSize s(0, 0);
-    int n = _list.count();
-
-    for (int i = 0; i &amp;lt; n; ++i)
-        if (QWidget *w = _list.at(i)-&amp;gt;widget())
-            s = s.expandedTo(
-              smartMinSize(w-&amp;gt;sizeHint(), w-&amp;gt;minimumSizeHint(),
-                            w-&amp;gt;minimumSize(), w-&amp;gt;maximumSize(),
-                            w-&amp;gt;sizePolicy()));
+
+    switch (_mode)
+    {
+    case StackOne:
+        if (_index &amp;gt;= 0)
+            if (QWidget *w = _list.at(_index)-&amp;gt;widget())
+                s = smartMinSize(w-&amp;gt;sizeHint(), w-&amp;gt;minimumSizeHint(),
+                                 w-&amp;gt;minimumSize(), w-&amp;gt;maximumSize(),
+                                 w-&amp;gt;sizePolicy());
+        break;
+
+    case StackAll:
+    {
+        int n = _list.count();
+        for (int i = 0; i &amp;lt; n; ++i)
+            if (QWidget *w = _list.at(i)-&amp;gt;widget())
+                s = s.expandedTo(
+                  smartMinSize(w-&amp;gt;sizeHint(), w-&amp;gt;minimumSizeHint(),
+                               w-&amp;gt;minimumSize(), w-&amp;gt;maximumSize(),
+                               w-&amp;gt;sizePolicy()));
+        break;
+    }
+    }
+
     return s;
 }
 
+Qt::Orientations StackLayout::expandingDirections () const
+{
+    Qt::Orientations directions;
+
+    switch (_mode)
+    {
+    case StackOne:
+        directions = _index &amp;gt;= 0 ? _list.at(_index)-&amp;gt;expandingDirections() : (Qt::Orientations) 0;
+        break;
+
+    case StackAll:
+    {
+        Qt::Orientations directions = 0;
+        int n = _list.count();
+        for (int i = 0; i &amp;lt; n; ++i)
+            directions |= _list.at(i)-&amp;gt;expandingDirections();
+        break;
+    }
+    }
+
+    return directions;
+}
+
 void StackLayout::setGeometry(const QRect &amp;amp;rect)
 {
     switch (_mode) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -307,6 +368,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void StackLayout::setStackingMode(StackingMode stackingMode)
     }
         break;
     }
+
+    invalidate();
 }
 
 void StackLayout::invalidate()
diff --git a/QtCollider/layouts/stack_layout.hpp b/QtCollider/layouts/stack_layout.hpp
index 04a827d..fa24e7f 100644
--- a/QtCollider/layouts/stack_layout.hpp
+++ b/QtCollider/layouts/stack_layout.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -70,6 +70,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
     QLayoutItem *takeAt(int);
     QSize sizeHint() const;
     QSize minimumSize() const;
+    Qt::Orientations expandingDirections () const;
     void setGeometry(const QRect &amp;amp;rect);
 
     virtual void invalidate();
commit 391cc4b1c2af98adae424da7cafcbab63f6919d8
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Sat May 26 00:17:03 2012 +0200

    qtcollider: separate QtCollider::StackLayout to support reuse
    
    Make our custom reimplementation of QStackedLayout independent from
    QtCollider code so it can be reused outside of QtCollider (e.g. in the
    Qt IDE).
    
    Effectively, the QcStackLayout is split into two classes:
    * QtCollider::StackLayout = generic implementation.
    * QcStackLayout = subclass of the above with the addition of QtCollider
      specifics

diff --git a/QtCollider/layouts/layouts.cpp b/QtCollider/layouts/layouts.cpp
index 67e5b85..e98f29c 100644
--- a/QtCollider/layouts/layouts.cpp
+++ b/QtCollider/layouts/layouts.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -24,6 +24,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 QC_DECLARE_QOBJECT_FACTORY(QcHBoxLayout);
 QC_DECLARE_QOBJECT_FACTORY(QcVBoxLayout);
 QC_DECLARE_QOBJECT_FACTORY(QcGridLayout);
+QC_DECLARE_QOBJECT_FACTORY(QcStackLayout);
 
 void QcGridLayout::addItem( const VariantList &amp;amp;dataList )
 {
diff --git a/QtCollider/layouts/layouts.hpp b/QtCollider/layouts/layouts.hpp
index f030743..395296a 100644
--- a/QtCollider/layouts/layouts.hpp
+++ b/QtCollider/layouts/layouts.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,7 +22,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #ifndef QC_LAYOUTS_H
 #define QC_LAYOUTS_H
 
+#include "stack_layout.hpp"
+#include "../Common.h"
 #include "../QcObjectFactory.h"
+#include "../QObjectProxy.h"
 
 #include &amp;lt;QHBoxLayout&amp;gt;
 #include &amp;lt;QVBoxLayout&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -252,4 +255,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
   }
 };
 
+class QcStackLayout : public QcLayout&amp;lt;QtCollider::StackLayout&amp;gt;
+{
+  Q_OBJECT
+  Q_PROPERTY( VariantList margins READ margins WRITE setMargins )
+
+public:
+  QcStackLayout() {}
+
+  Q_INVOKABLE QcStackLayout( const VariantList &amp;amp;items )
+  {
+    Q_FOREACH(QVariant var, items.data) {
+      QObjectProxy *p = var.value&amp;lt;QObjectProxy*&amp;gt;();
+      if(!p) return;
+      QWidget *w = qobject_cast&amp;lt;QWidget*&amp;gt;( p-&amp;gt;object() );
+      if(w) addWidget(w);
+    }
+  }
+
+  Q_INVOKABLE void insertWidget( int index, QObjectProxy *proxy )
+  {
+    if (QWidget *w = qobject_cast&amp;lt;QWidget*&amp;gt;( proxy-&amp;gt;object() ))
+      QtCollider::StackLayout::insertWidget(index, w);
+  }
+};
+
 #endif
diff --git a/QtCollider/layouts/stack_layout.cpp b/QtCollider/layouts/stack_layout.cpp
index 6a1f4c5..837a232 100644
--- a/QtCollider/layouts/stack_layout.cpp
+++ b/QtCollider/layouts/stack_layout.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -27,38 +27,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 #include &amp;lt;QWidget&amp;gt;
 
-QC_DECLARE_QOBJECT_FACTORY(QcStackLayout);
+namespace QtCollider {
 
-QcStackLayout::QcStackLayout() :
+StackLayout::StackLayout() :
   _index(-1),
   _mode(StackOne),
   _gotParent(false)
 {}
 
-QcStackLayout::QcStackLayout( const VariantList &amp;amp;items ) :
-  _index(-1),
-  _mode(StackOne),
-  _gotParent(false)
-{
-  Q_FOREACH(QVariant var, items.data) {
-    QObjectProxy *p = var.value&amp;lt;QObjectProxy*&amp;gt;();
-    if(!p) return;
-    QWidget *w = qobject_cast&amp;lt;QWidget*&amp;gt;( p-&amp;gt;object() );
-    if(w) addWidget(w);
-  }
-}
-
-QcStackLayout::~QcStackLayout()
+StackLayout::~StackLayout()
 {
   qDeleteAll(_list);
 }
 
-int QcStackLayout::addWidget(QWidget *widget)
+int StackLayout::addWidget(QWidget *widget)
 {
   return insertWidget(_list.count(), widget);
 }
 
-int QcStackLayout::insertWidget(int index, QWidget *widget)
+int StackLayout::insertWidget(int index, QWidget *widget)
 {
     addChildWidget(widget);
     index = qMin(index, _list.count());
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -79,12 +66,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int QcStackLayout::insertWidget(int index, QWidget *widget)
     return index;
 }
 
-QLayoutItem *QcStackLayout::itemAt(int index) const
+QLayoutItem *StackLayout::itemAt(int index) const
 {
     return _list.value(index);
 }
 
-QLayoutItem *QcStackLayout::takeAt(int index)
+QLayoutItem *StackLayout::takeAt(int index)
 {
     if (index &amp;lt; 0 || index &amp;gt;= _list.size())
         return 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -103,7 +90,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QLayoutItem *QcStackLayout::takeAt(int index)
     return item;
 }
 
-void QcStackLayout::setCurrentIndex(int index)
+void StackLayout::setCurrentIndex(int index)
 {
     QWidget *prev = currentWidget();
     QWidget *next = widget(index);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -161,50 +148,50 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void QcStackLayout::setCurrentIndex(int index)
         parent-&amp;gt;setUpdatesEnabled(true);
 }
 
-int QcStackLayout::currentIndex() const
+int StackLayout::currentIndex() const
 {
     return _index;
 }
 
-void QcStackLayout::setCurrentWidget(QWidget *widget)
+void StackLayout::setCurrentWidget(QWidget *widget)
 {
     int index = indexOf(widget);
     if (index == -1) {
-        qWarning("QcStackLayout::setCurrentWidget: Widget %p not contained in stack", widget);
+        qWarning("StackLayout::setCurrentWidget: Widget %p not contained in stack", widget);
         return;
     }
     setCurrentIndex(index);
 }
 
-QWidget *QcStackLayout::currentWidget() const
+QWidget *StackLayout::currentWidget() const
 {
     return _index &amp;gt;= 0 ? _list.at(_index)-&amp;gt;widget() : 0;
 }
 
-QWidget *QcStackLayout::widget(int index) const
+QWidget *StackLayout::widget(int index) const
 {
      if (index &amp;lt; 0 || index &amp;gt;= _list.size())
         return 0;
     return _list.at(index)-&amp;gt;widget();
 }
 
-int QcStackLayout::count() const
+int StackLayout::count() const
 {
     return _list.size();
 }
 
-void QcStackLayout::addItem(QLayoutItem *item)
+void StackLayout::addItem(QLayoutItem *item)
 {
     QWidget *widget = item-&amp;gt;widget();
     if (widget) {
         addWidget(widget);
         delete item;
     } else {
-        qWarning("QcStackLayout::addItem: Only widgets can be added");
+        qWarning("StackLayout::addItem: Only widgets can be added");
     }
 }
 
-QSize QcStackLayout::sizeHint() const
+QSize StackLayout::sizeHint() const
 {
     QSize s(0, 0);
     int n = _list.count();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -251,7 +238,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static QSize smartMinSize(const QSize &amp;amp;sizeHint, const QSize &amp;amp;minSizeHint,
     return s.expandedTo(QSize(0,0));
 }
 
-QSize QcStackLayout::minimumSize() const
+QSize StackLayout::minimumSize() const
 {
     QSize s(0, 0);
     int n = _list.count();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -265,7 +252,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QSize QcStackLayout::minimumSize() const
     return s;
 }
 
-void QcStackLayout::setGeometry(const QRect &amp;amp;rect)
+void StackLayout::setGeometry(const QRect &amp;amp;rect)
 {
     switch (_mode) {
     case StackOne:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -281,12 +268,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void QcStackLayout::setGeometry(const QRect &amp;amp;rect)
     }
 }
 
-QcStackLayout::StackingMode QcStackLayout::stackingMode() const
+StackLayout::StackingMode StackLayout::stackingMode() const
 {
     return _mode;
 }
 
-void QcStackLayout::setStackingMode(StackingMode stackingMode)
+void StackLayout::setStackingMode(StackingMode stackingMode)
 {
     if (_mode == stackingMode)
         return;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -322,7 +309,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void QcStackLayout::setStackingMode(StackingMode stackingMode)
     }
 }
 
-void QcStackLayout::invalidate()
+void StackLayout::invalidate()
 {
   QWidget *pw = parentWidget();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -364,3 +351,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void QcStackLayout::invalidate()
 
   QLayout::invalidate();
 }
+
+} // namespace QtCollider
diff --git a/QtCollider/layouts/stack_layout.hpp b/QtCollider/layouts/stack_layout.hpp
index 2305352..04a827d 100644
--- a/QtCollider/layouts/stack_layout.hpp
+++ b/QtCollider/layouts/stack_layout.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -23,41 +23,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 *
 ************************************************************************/
 
-#ifndef QC_STACK_LAYOUT_HPP
-#define QC_STACK_LAYOUT_HPP
-
-#include "layouts.hpp"
-#include "../Common.h"
-#include "../QObjectProxy.h"
+#ifndef QT_COLLIDER_STACK_LAYOUT_HPP_INCLUDED
+#define QT_COLLIDER_STACK_LAYOUT_HPP_INCLUDED
 
 #include &amp;lt;QLayout&amp;gt;
 #include &amp;lt;QList&amp;gt;
 
-class QcStackLayout : public QcLayout&amp;lt;QLayout&amp;gt;
+namespace QtCollider {
+
+class StackLayout : public QLayout
 {
     Q_OBJECT
     Q_ENUMS(StackingMode)
-    Q_PROPERTY( VariantList margins READ margins WRITE setMargins )
     Q_PROPERTY( int currentIndex READ currentIndex WRITE setCurrentIndex )
     Q_PROPERTY( StackingMode stackingMode READ stackingMode WRITE setStackingMode )
     Q_PROPERTY( int count READ count )
 
 public:
-  Q_INVOKABLE QcStackLayout( const VariantList &amp;amp;items );
-
-  Q_INVOKABLE void insertWidget( int index, QObjectProxy *proxy ) {
-    QWidget *w = qobject_cast&amp;lt;QWidget*&amp;gt;( proxy-&amp;gt;object() );
-    if( w ) insertWidget(index, w);
-  }
-
-public:
     enum StackingMode {
         StackOne,
         StackAll
     };
 
-    QcStackLayout();
-    ~QcStackLayout();
+    StackLayout();
+    ~StackLayout();
 
     int addWidget(QWidget *w);
     int insertWidget(int index, QWidget *w);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -92,4 +81,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
     bool _gotParent;
 };
 
-#endif // QC_STACK_LAYOUT_HPP
+} // namespace QtCollider
+
+#endif // QT_COLLIDER_STACK_LAYOUT_HPP_INCLUDED
-----------------------------------------------------------------------

Summary of changes:
 QtCollider/layouts/layouts.cpp               |    1 +
 QtCollider/layouts/layouts.hpp               |   28 ++++
 QtCollider/layouts/stack_layout.cpp          |  160 +++++++++++++-------
 QtCollider/layouts/stack_layout.hpp          |   30 ++---
 editors/sc-ide/CMakeLists.txt                |   13 ++
 editors/sc-ide/widgets/find_replace_tool.cpp |  188 ++++++++++++++++++++++
 editors/sc-ide/widgets/find_replace_tool.hpp |  101 ++++++++++++
 editors/sc-ide/widgets/main_window.cpp       |  124 +++++++++++++--
 editors/sc-ide/widgets/main_window.hpp       |   19 +++
 editors/sc-ide/widgets/multi_editor.cpp      |  218 --------------------------
 editors/sc-ide/widgets/multi_editor.hpp      |   75 ---------
 editors/sc-ide/widgets/tool_box.hpp          |   72 +++++++++
 12 files changed, 648 insertions(+), 381 deletions(-)
 create mode 100644 editors/sc-ide/widgets/find_replace_tool.cpp
 create mode 100644 editors/sc-ide/widgets/find_replace_tool.hpp
 create mode 100644 editors/sc-ide/widgets/tool_box.hpp


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-26T00:12:29</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50931">
    <title>Call For Open Source Software Competition</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50931</link>
    <description>&lt;pre&gt;Hi -

Anyone fancy putting something together for this?

Call For Open Source Software Competition
http://www.acmmm12.org/call-for-open-source-software-competition/

SuperCollider would fit the remit. Entering the competition involves
writing a 4-page paper describing the software...

Dan

_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>Dan Stowell</dc:creator>
    <dc:date>2012-05-25T10:38:45</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50929">
    <title>SF.net Git: supercollider branch, 3.5, updated. 06a962956d04cb53059481a7ec4e24de04b8ddaf</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50929</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, 3.5 has been updated
       via  06a962956d04cb53059481a7ec4e24de04b8ddaf (commit)
      from  c3471187db047e02880f8a3fa7ae85479953967e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 06a962956d04cb53059481a7ec4e24de04b8ddaf
Author: Jonatan Liljedahl &amp;lt;lijon-fwFeWneuYPZWk0Htik3J/w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Fri May 25 11:52:59 2012 +0200

    Methods.html: auto-redirect to Search if method not found

diff --git a/HelpSource/Overviews/Methods.html b/HelpSource/Overviews/Methods.html
index 5ae799d..b97acf8 100644
--- a/HelpSource/Overviews/Methods.html
+++ b/HelpSource/Overviews/Methods.html
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -231,6 +231,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; function showmethods() {
         var div = document.createElement("p");
         div.appendChild(document.createTextNode("Method not found: "+hash));
         res.appendChild(div);
+        window.location = "../Search.html#"+hash;
         return;
     }
 
-----------------------------------------------------------------------

Summary of changes:
 HelpSource/Overviews/Methods.html |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jonatan Liljedahl</dc:creator>
    <dc:date>2012-05-25T09:55:39</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50928">
    <title>SF.net Git: supercollider branch, master, updated. 8f471ec1f61187ef8969eb2860cee288cd27c989</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50928</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  8f471ec1f61187ef8969eb2860cee288cd27c989 (commit)
      from  ada1d13ca305c857104045a12f015a5cd28eca78 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 8f471ec1f61187ef8969eb2860cee288cd27c989
Author: Jonatan Liljedahl &amp;lt;lijon-fwFeWneuYPZWk0Htik3J/w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Fri May 25 11:52:59 2012 +0200

    Methods.html: auto-redirect to Search if method not found

diff --git a/HelpSource/Overviews/Methods.html b/HelpSource/Overviews/Methods.html
index 5ae799d..b97acf8 100644
--- a/HelpSource/Overviews/Methods.html
+++ b/HelpSource/Overviews/Methods.html
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -231,6 +231,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; function showmethods() {
         var div = document.createElement("p");
         div.appendChild(document.createTextNode("Method not found: "+hash));
         res.appendChild(div);
+        window.location = "../Search.html#"+hash;
         return;
     }
 
-----------------------------------------------------------------------

Summary of changes:
 HelpSource/Overviews/Methods.html |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jonatan Liljedahl</dc:creator>
    <dc:date>2012-05-25T09:55:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50912">
    <title>SF.net Git: supercollider branch, master, updated. ada1d13ca305c857104045a12f015a5cd28eca78</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50912</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  ada1d13ca305c857104045a12f015a5cd28eca78 (commit)
       via  e8540406a7365bea7cc5a69a09b4d7b8f31fab9f (commit)
      from  55bc16987f9dac0ba91412fe15644ab2f46044e7 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit ada1d13ca305c857104045a12f015a5cd28eca78
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Thu May 24 19:09:45 2012 +0200

    sc ide: ask for confirmation when closing document via tab button

diff --git a/editors/sc-ide/widgets/multi_editor.cpp b/editors/sc-ide/widgets/multi_editor.cpp
index 7164a6c..6d75d5a 100644
--- a/editors/sc-ide/widgets/multi_editor.cpp
+++ b/editors/sc-ide/widgets/multi_editor.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,6 +19,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 */
 
 #include "multi_editor.hpp"
+#include "main_window.hpp"
 #include "code_editor/editor.hpp"
 #include "../core/doc_manager.hpp"
 #include "../core/sig_mux.hpp"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -293,7 +294,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::onCloseRequest( int index )
 {
     CodeEditor *editor = editorForTab( index );
     if(editor)
-        mDocManager-&amp;gt;close(editor-&amp;gt;document());
+        MainWindow::close(editor-&amp;gt;document());
 }
 
 void MultiEditor::onCurrentChanged( int index )
commit e8540406a7365bea7cc5a69a09b4d7b8f31fab9f
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Thu May 24 19:01:53 2012 +0200

    sc ide: shortcut settings GUI: fix potential null pointer dereference

diff --git a/editors/sc-ide/widgets/settings/shortcuts_page.cpp b/editors/sc-ide/widgets/settings/shortcuts_page.cpp
index 73d721f..131ac1e 100644
--- a/editors/sc-ide/widgets/settings/shortcuts_page.cpp
+++ b/editors/sc-ide/widgets/settings/shortcuts_page.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -152,13 +152,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ShortcutsPage::filterBy( const QString &amp;amp;str )
 
 void ShortcutsPage::showItem( QTreeWidgetItem *item, QTreeWidgetItem *prev )
 {
-    QAction *a = item-&amp;gt;data(0, ActionRole).value&amp;lt;QAction*&amp;gt;();
-    Q_ASSERT(a);
+    QVariant defaultSeqVar = item ? item-&amp;gt;data(0, DefaultSequenceRole) : QVariant();
+    QString defaultSeq = defaultSeqVar.value&amp;lt;QKeySequence&amp;gt;().toString(QKeySequence::NativeText);
+    ui-&amp;gt;defaultSeq-&amp;gt;setText(defaultSeq);
 
-    QString defaultSeq = item-&amp;gt;data(0, DefaultSequenceRole).toString();
-    ui-&amp;gt;defaultSeq-&amp;gt;setText( defaultSeq );
-
-    QVariant customSeqVar = item-&amp;gt;data(0, CustomSequenceRole);
+    QVariant customSeqVar = item ? item-&amp;gt;data(0, CustomSequenceRole) : QVariant();
     ui-&amp;gt;customSeq-&amp;gt;setSequence( customSeqVar.value&amp;lt;QKeySequence&amp;gt;() );
 
     if (customSeqVar.isValid())
-----------------------------------------------------------------------

Summary of changes:
 editors/sc-ide/widgets/multi_editor.cpp            |    3 ++-
 editors/sc-ide/widgets/settings/shortcuts_page.cpp |   10 ++++------
 2 files changed, 6 insertions(+), 7 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-24T17:14:06</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50910">
    <title>SF.net Git: supercollider branch, master, updated. 55bc16987f9dac0ba91412fe15644ab2f46044e7</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50910</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  55bc16987f9dac0ba91412fe15644ab2f46044e7 (commit)
      from  0ba3c32734b98d58cf5569fc65e2627ea492ce17 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 55bc16987f9dac0ba91412fe15644ab2f46044e7
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Thu May 24 18:46:40 2012 +0200

    sc ide: merge Evaluate Region and Evaluate Selection actions
    
    Evaluate Region action will now evaluate the current selection if any,
    or the current region if any, or the current line.

diff --git a/editors/sc-ide/widgets/main_window.cpp b/editors/sc-ide/widgets/main_window.cpp
index c86ea0a..8a59613 100644
--- a/editors/sc-ide/widgets/main_window.cpp
+++ b/editors/sc-ide/widgets/main_window.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -204,15 +204,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     act-&amp;gt;setStatusTip(tr("Evaluate current File"));
     connect(act, SIGNAL(triggered()), this, SLOT(evaluateCurrentFile()));
 
-    mActions[EvaluateSelection] = act = new QAction(
-        QIcon::fromTheme("media-playback-start"), tr("&amp;amp;Evaluate Selection"), this);
-    act-&amp;gt;setShortcut(tr("Ctrl+Return", "Evaluate selection"));
-    act-&amp;gt;setStatusTip(tr("Evaluate selection or current line"));
-    connect(act, SIGNAL(triggered()), this, SLOT(evaluateSelection()));
-
     mActions[EvaluateRegion] = act = new QAction(
     QIcon::fromTheme("media-playback-start"), tr("&amp;amp;Evaluate Region"), this);
-    act-&amp;gt;setShortcut(tr("Alt+Return", "Evaluate region"));
+    act-&amp;gt;setShortcut(tr("Ctrl+Return", "Evaluate region"));
     act-&amp;gt;setStatusTip(tr("Evaluate current region"));
     connect(act, SIGNAL(triggered()), this, SLOT(evaluateRegion()));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -303,7 +297,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     menu-&amp;gt;addSeparator();
     menu-&amp;gt;addAction( mActions[EvaluateCurrentFile] );
     menu-&amp;gt;addAction( mActions[EvaluateRegion] );
-    menu-&amp;gt;addAction( mActions[EvaluateSelection] );
     menu-&amp;gt;addSeparator();
     menu-&amp;gt;addAction( mMain-&amp;gt;scProcess()-&amp;gt;action(ScIDE::SCProcess::RunMain) );
     menu-&amp;gt;addAction( mMain-&amp;gt;scProcess()-&amp;gt;action(ScIDE::SCProcess::StopMain) );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -615,59 +608,49 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QWidget *MainWindow::cmdLine()
     return widget;
 }
 
-void MainWindow::evaluateSelection()
+void MainWindow::evaluateRegion()
 {
-    // Evaluate selection, if any, otherwise current line
-
     CodeEditor *editor = mEditors-&amp;gt;currentEditor();
     if (!editor)
         return;
 
     QString text;
+
+    // Try current selection
     QTextCursor cursor = editor-&amp;gt;textCursor();
     if (cursor.hasSelection())
         text = cursor.selectedText();
-    else {
-        text = cursor.block().text();
-        if( mEditors-&amp;gt;stepForwardEvaluation() ) {
-            QTextCursor newCursor = cursor;
-            newCursor.movePosition(QTextCursor::NextBlock);
-            newCursor.movePosition(QTextCursor::EndOfBlock);
-            editor-&amp;gt;setTextCursor(newCursor);
+    else
+    {
+        // If no selection, try current region
+        cursor = editor-&amp;gt;currentRegion();
+        if (!cursor.isNull())
+            text = cursor.selectedText();
+        else
+        {
+            //If no current region, try current line
+            cursor = editor-&amp;gt;textCursor();
+            text = cursor.block().text();
+            if( mEditors-&amp;gt;stepForwardEvaluation() ) {
+                QTextCursor newCursor = cursor;
+                newCursor.movePosition(QTextCursor::NextBlock);
+                newCursor.movePosition(QTextCursor::EndOfBlock);
+                editor-&amp;gt;setTextCursor(newCursor);
+            }
+            // Adjust cursor for code blinking:
+            cursor.movePosition(QTextCursor::StartOfBlock);
+            cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
         }
-        // Adjust cursor for code blinking:
-        cursor.movePosition(QTextCursor::StartOfBlock);
-        cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
     }
 
-    if (text.isEmpty()) return;
-
-    // NOTE: QTextDocument contains unicode paragraph separators U+2029
-    text.replace( QChar( 0x2029 ), QChar( '\n' ) );
-
-    Main::instance()-&amp;gt;scProcess()-&amp;gt;evaluateCode(text);
-
-    editor-&amp;gt;blinkCode(cursor);
-}
-
-void MainWindow::evaluateRegion()
-{
-    CodeEditor *editor = mEditors-&amp;gt;currentEditor();
-    if (!editor)
-        return;
-
-    QTextCursor region = editor-&amp;gt;currentRegion();
-    if(region.isNull()) {
-        // TODO: post a warning in status bar
+    if (text.isEmpty())
         return;
-    }
 
-    QString text = region.selectedText();
     text.replace( QChar( 0x2029 ), QChar( '\n' ) );
 
     Main::instance()-&amp;gt;scProcess()-&amp;gt;evaluateCode(text);
 
-    editor-&amp;gt;blinkCode(region);
+    editor-&amp;gt;blinkCode(cursor);
 }
 
 void MainWindow::evaluateCurrentFile()
diff --git a/editors/sc-ide/widgets/main_window.hpp b/editors/sc-ide/widgets/main_window.hpp
index c3a96aa..eca273f 100644
--- a/editors/sc-ide/widgets/main_window.hpp
+++ b/editors/sc-ide/widgets/main_window.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,7 +59,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
 
         // Language
         EvaluateCurrentFile,
-        EvaluateSelection,
         EvaluateRegion,
 
         // Settings
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -99,7 +98,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; signals:
     void evaluateCode( const QString &amp;amp;, bool silent = true );
 
 private Q_SLOTS:
-    void evaluateSelection(); // either selection, or current line
     void evaluateRegion();
     void evaluateCurrentFile();
     void helpForSelection();
-----------------------------------------------------------------------

Summary of changes:
 editors/sc-ide/widgets/main_window.cpp |   69 ++++++++++++--------------------
 editors/sc-ide/widgets/main_window.hpp |    2 -
 2 files changed, 26 insertions(+), 45 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-24T16:49:09</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50909">
    <title>SF.net Git: supercollider branch, master, updated. 0ba3c32734b98d58cf5569fc65e2627ea492ce17</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50909</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  0ba3c32734b98d58cf5569fc65e2627ea492ce17 (commit)
       via  50b92c4d83a1ddd49d3c8559a156dd8c0e7926c5 (commit)
      from  f65e9d8ce42498a94c4333ca7624efed4f1de502 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 0ba3c32734b98d58cf5569fc65e2627ea492ce17
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Thu May 24 15:30:05 2012 +0200

    sc ide: announce all actions to shortcut settings

diff --git a/editors/sc-ide/core/sc_process.cpp b/editors/sc-ide/core/sc_process.cpp
index 1d4f1ff..8baeaf9 100644
--- a/editors/sc-ide/core/sc_process.cpp
+++ b/editors/sc-ide/core/sc_process.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -24,10 +24,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 namespace ScIDE {
 
-SCProcess::SCProcess( QObject *parent ):
+SCProcess::SCProcess( Main *parent ):
     QProcess( parent ), mIPC( new SCIpcServer(this) )
 {
-    prepareActions();
+    prepareActions(parent);
 
     connect(this, SIGNAL( readyRead() ),
             this, SLOT( onReadyRead() ));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -68,4 +68,33 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void SCProcess::start (void)
         onSclangStart();
 }
 
+void SCProcess::prepareActions(Main * main)
+{
+    QAction * action;
+    mActions[StartSCLang] = action = new QAction(
+        QIcon::fromTheme("system-run"), tr("Start SCLang"), this);
+    connect(action, SIGNAL(triggered()), this, SLOT(start()) );
+
+    mActions[RecompileClassLibrary] = action = new QAction(
+        QIcon::fromTheme("system-reboot"), tr("Recompile Class Library"), this);
+    connect(action, SIGNAL(triggered()), this, SLOT(recompileClassLibrary()) );
+
+    mActions[StopSCLang] = action = new QAction(
+        QIcon::fromTheme("system-shutdown"), tr("Stop SCLang"), this);
+    connect(action, SIGNAL(triggered()), this, SLOT(stopLanguage()) );
+
+    mActions[RunMain] = action = new QAction(
+        QIcon::fromTheme("media-playback-start"), tr("Run Main"), this);
+    connect(action, SIGNAL(triggered()), this, SLOT(runMain()));
+
+    mActions[StopMain] = action = new QAction(
+        QIcon::fromTheme("process-stop"), tr("Stop Main"), this);
+    action-&amp;gt;setShortcut(tr("Ctrl+.", "Stop Main (a.k.a. cmd-period)"));
+    connect(action, SIGNAL(triggered()), this, SLOT(stopMain()));
+
+    Settings::Manager *settings = main-&amp;gt;settings();
+    for (int i = 0; i &amp;lt; SCProcessActionCount; ++i)
+        settings-&amp;gt;addAction( mActions[i] );
+}
+
 } // namespace ScIDE
diff --git a/editors/sc-ide/core/sc_process.hpp b/editors/sc-ide/core/sc_process.hpp
index f782546..f3bbe6c 100644
--- a/editors/sc-ide/core/sc_process.hpp
+++ b/editors/sc-ide/core/sc_process.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,6 +29,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 namespace ScIDE {
 
+class Main;
+
 class SCProcess:
     public QProcess
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,7 +38,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Q_OBJECT
     SCIpcServer * mIPC;
 
 public:
-    SCProcess( QObject *parent = 0 );
+    SCProcess( Main * );
 
     enum SCProcessActionRole {
         StartSCLang = 0,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -132,29 +134,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
         evaluateCode ( command, true );
     }
 
-    void prepareActions(void)
-    {
-        QAction * action;
-        mActions[StartSCLang] = action = new QAction(
-            QIcon::fromTheme("system-run"), tr("Start SCLang"), this);
-        connect(action, SIGNAL(triggered()), this, SLOT(start()) );
-
-        mActions[RecompileClassLibrary] = action = new QAction(
-            QIcon::fromTheme("system-reboot"), tr("Recompile Class Library"), this);
-        connect(action, SIGNAL(triggered()), this, SLOT(recompileClassLibrary()) );
-
-        mActions[StopSCLang] = action = new QAction(
-            QIcon::fromTheme("system-shutdown"), tr("Stop SCLang"), this);
-        connect(action, SIGNAL(triggered()), this, SLOT(stopLanguage()) );
-
-        mActions[RunMain] = action = new QAction(
-            QIcon::fromTheme("media-playback-start"), tr("Run Main"), this);
-        connect(action, SIGNAL(triggered()), this, SLOT(runMain()));
-
-        mActions[StopMain] = action = new QAction(
-            QIcon::fromTheme("process-stop"), tr("Stop Main"), this);
-        connect(action, SIGNAL(triggered()), this, SLOT(stopMain()));
-    }
+    void prepareActions(Main *);
 
     QAction * mActions[SCProcessActionCount];
 };
diff --git a/editors/sc-ide/core/settings/manager.cpp b/editors/sc-ide/core/settings/manager.cpp
index 2880613..6dc91a5 100644
--- a/editors/sc-ide/core/settings/manager.cpp
+++ b/editors/sc-ide/core/settings/manager.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -72,31 +72,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void Manager::initDefaults()
 
     endGroup(); // editor
 
-    beginGroup("shortcuts");
-    setDefault("cmdLineFocus", tr("Ctrl+Tab", "Toggle command line focus"));
-    setDefault("quit", tr("Ctrl+Q", "Quit application"));
-    setDefault("evaluateSelection", tr("Ctrl+Return", "Evaluate selection"));
-    setDefault("evaluateRegion", tr("Alt+Return", "Evaluate region"));
-    setDefault("stopMain", tr("Ctrl+.", "Stop Main (a.k.a. cmd-period)"));
-    setDefault("helpForSelection", tr("Ctrl+H", "Help for selection"));
-    setDefault("newDocument", tr("Ctrl+N", "New document"));
-    setDefault("openDocument", tr("Ctrl+O", "Open document"));
-    setDefault("saveDocument", tr("Ctrl+S", "Save document"));
-    setDefault("reloadDocument", tr("F5", "Reload document"));
-    setDefault("closeDocument", tr("Ctrl+W", "Close document"));
-    setDefault("undo", tr("Ctrl+Z", "Undo"));
-    setDefault("redo", tr("Ctrl+Shift+Z", "Redo"));
-    setDefault("cut", tr("Ctrl+X", "Cut"));
-    setDefault("copy", tr("Ctrl+C", "Copy"));
-    setDefault("paste", tr("Ctrl+V", "Paste"));
-    setDefault("find", tr("Ctrl+F", "Find"));
-    setDefault("replace", tr("Ctrl+R", "Replace"));
-    setDefault("hideToolPanel", tr("Esc", "Hide tool panel"));
-    setDefault("enlargeFont", tr("Ctrl++", "Enlarge font"));
-    setDefault("shrinkFont", tr("Ctrl+-", "Shrink font"));
-    setDefault("openDefinition", tr("Ctrl+D", "Open definition"));
-    endGroup(); // shortcuts
-
     endGroup(); // IDE
 }
 
diff --git a/editors/sc-ide/widgets/main_window.cpp b/editors/sc-ide/widgets/main_window.cpp
index 1030a0b..c86ea0a 100644
--- a/editors/sc-ide/widgets/main_window.cpp
+++ b/editors/sc-ide/widgets/main_window.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -139,7 +139,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     Settings::Manager *s = mMain-&amp;gt;settings();
     s-&amp;gt;beginGroup("IDE/shortcuts");
 
-    new QShortcut( s-&amp;gt;shortcut("cmdLineFocus"), this, SLOT(toggleComandLineFocus()) );
+    new QShortcut( tr("Ctrl+Tab", "Toggle command line focus"), this, SLOT(toggleComandLineFocus()) );
 
     QAction *act;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -147,25 +147,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
 
     mActions[Quit] = act = new QAction(
         QIcon::fromTheme("application-exit"), tr("&amp;amp;Quit..."), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("quit"));
+    act-&amp;gt;setShortcut(tr("Ctrl+Q", "Quit application"));
     act-&amp;gt;setStatusTip(tr("Quit SuperCollider IDE"));
     QObject::connect( act, SIGNAL(triggered()), this, SLOT(onQuit()) );
 
     mActions[DocNew] = act = new QAction(
         QIcon::fromTheme("document-new"), tr("&amp;amp;New"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("newDocument"));
+    act-&amp;gt;setShortcut(tr("Ctrl+N", "New document"));
     act-&amp;gt;setStatusTip(tr("Create a new document"));
     connect(act, SIGNAL(triggered()), this, SLOT(newDocument()));
 
     mActions[DocOpen] = act = new QAction(
         QIcon::fromTheme("document-open"), tr("&amp;amp;Open..."), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("openDocument"));
+    act-&amp;gt;setShortcut(tr("Ctrl+O", "Open document"));
     act-&amp;gt;setStatusTip(tr("Open an existing file"));
     connect(act, SIGNAL(triggered()), this, SLOT(openDocument()));
 
     mActions[DocSave] = act = new QAction(
         QIcon::fromTheme("document-save"), tr("&amp;amp;Save"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("saveDocument"));
+    act-&amp;gt;setShortcut(tr("Ctrl+S", "Save document"));
     act-&amp;gt;setStatusTip(tr("Save the current document"));
     connect(act, SIGNAL(triggered()), this, SLOT(saveDocument()));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -176,13 +176,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
 
     mActions[DocClose] = act = new QAction(
         QIcon::fromTheme("window-close"), tr("&amp;amp;Close"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("closeDocument"));
+    act-&amp;gt;setShortcut(tr("Ctrl+W", "Close document"));
     act-&amp;gt;setStatusTip(tr("Close the current document"));
     connect(act, SIGNAL(triggered()), this, SLOT(closeDocument()));
 
     mActions[DocReload] = act = new QAction(
         QIcon::fromTheme("view-refresh"), tr("&amp;amp;Reload"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("reloadDocument"));
+    act-&amp;gt;setShortcut(tr("F5", "Reload document"));
     act-&amp;gt;setStatusTip(tr("Reload the current document"));
     connect(act, SIGNAL(triggered()), this, SLOT(reloadDocument()));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -206,19 +206,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
 
     mActions[EvaluateSelection] = act = new QAction(
         QIcon::fromTheme("media-playback-start"), tr("&amp;amp;Evaluate Selection"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("evaluateSelection"));
+    act-&amp;gt;setShortcut(tr("Ctrl+Return", "Evaluate selection"));
     act-&amp;gt;setStatusTip(tr("Evaluate selection or current line"));
     connect(act, SIGNAL(triggered()), this, SLOT(evaluateSelection()));
 
     mActions[EvaluateRegion] = act = new QAction(
     QIcon::fromTheme("media-playback-start"), tr("&amp;amp;Evaluate Region"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("evaluateRegion"));
+    act-&amp;gt;setShortcut(tr("Alt+Return", "Evaluate region"));
     act-&amp;gt;setStatusTip(tr("Evaluate current region"));
     connect(act, SIGNAL(triggered()), this, SLOT(evaluateRegion()));
 
-    mMain-&amp;gt;scProcess()-&amp;gt;action(ScIDE::SCProcess::StopMain)
-        -&amp;gt;setShortcut(s-&amp;gt;shortcut("stopMain"));
-
     // Settings
 
     mActions[ShowSettings] = act = new QAction(tr("&amp;amp;Configure IDE..."), this);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -243,7 +240,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
 
     mActions[HelpForSelection] = act = new QAction(
     QIcon::fromTheme("system-help"), tr("&amp;amp;Help for Selection"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("helpForSelection"));
+    act-&amp;gt;setShortcut(tr("Ctrl+H", "Help for selection"));
     act-&amp;gt;setStatusTip(tr("Find help for selected text"));
     connect(act, SIGNAL(triggered()), this, SLOT(helpForSelection()));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -324,6 +321,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MainWindow::createMenus()
     menu-&amp;gt;addAction( mActions[HelpForSelection] );
 
     menuBar()-&amp;gt;addMenu(menu);
+
+    // Add actions to settings
+    for (int i = 0; i &amp;lt; ActionCount; ++i)
+        s-&amp;gt;addAction( mActions[i] );
 }
 
 QAction *MainWindow::action( ActionRole role )
diff --git a/editors/sc-ide/widgets/multi_editor.cpp b/editors/sc-ide/widgets/multi_editor.cpp
index 4dabb65..7164a6c 100644
--- a/editors/sc-ide/widgets/multi_editor.cpp
+++ b/editors/sc-ide/widgets/multi_editor.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -92,52 +92,52 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::createActions()
 
     mActions[Undo] = act = new QAction(
         QIcon::fromTheme("edit-undo"), tr("&amp;amp;Undo"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("undo"));
+    act-&amp;gt;setShortcut(tr("Ctrl+Z", "Undo"));
     act-&amp;gt;setStatusTip(tr("Undo last editing action"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(undo()));
     mSigMux-&amp;gt;connect(SIGNAL(undoAvailable(bool)), act, SLOT(setEnabled(bool)));
 
     mActions[Redo] = act = new QAction(
         QIcon::fromTheme("edit-redo"), tr("Re&amp;amp;do"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("redo"));
+    act-&amp;gt;setShortcut(tr("Ctrl+Shift+Z", "Redo"));
     act-&amp;gt;setStatusTip(tr("Redo next editing action"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(redo()));
     mSigMux-&amp;gt;connect(SIGNAL(redoAvailable(bool)), act, SLOT(setEnabled(bool)));
 
     mActions[Cut] = act = new QAction(
         QIcon::fromTheme("edit-cut"), tr("Cu&amp;amp;t"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("cut"));
+    act-&amp;gt;setShortcut(tr("Ctrl+X", "Cut"));
     act-&amp;gt;setStatusTip(tr("Cut text to clipboard"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(cut()));
     mSigMux-&amp;gt;connect(SIGNAL(copyAvailable(bool)), act, SLOT(setEnabled(bool)));
 
     mActions[Copy] = act = new QAction(
         QIcon::fromTheme("edit-copy"), tr("&amp;amp;Copy"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("copy"));
+    act-&amp;gt;setShortcut(tr("Ctrl+C", "Copy"));
     act-&amp;gt;setStatusTip(tr("Copy text to clipboard"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(copy()));
     mSigMux-&amp;gt;connect(SIGNAL(copyAvailable(bool)), act, SLOT(setEnabled(bool)));
 
     mActions[Paste] = act = new QAction(
         QIcon::fromTheme("edit-paste"), tr("&amp;amp;Paste"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("paste"));
+    act-&amp;gt;setShortcut(tr("Ctrl+V", "Paste"));
     act-&amp;gt;setStatusTip(tr("Paste text from clipboard"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(paste()));
 
     mActions[Find] = act = new QAction(
         QIcon::fromTheme("edit-find"), tr("&amp;amp;Find..."), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("find"));
+    act-&amp;gt;setShortcut(tr("Ctrl+F", "Find"));
     act-&amp;gt;setStatusTip(tr("Find text in document"));
     connect(act, SIGNAL(triggered()), this, SLOT(showFindPanel()));
 
     mActions[Replace] = act = new QAction(
         QIcon::fromTheme("edit-replace"), tr("&amp;amp;Replace..."), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("replace"));
+    act-&amp;gt;setShortcut(tr("Ctrl+R", "Replace"));
     act-&amp;gt;setStatusTip(tr("Find and replace text in document"));
     connect(act, SIGNAL(triggered()), this, SLOT(showReplacePanel()));
 
     QShortcut *escShortcut =
-        new QShortcut( s-&amp;gt;shortcut("hideToolPanel"), this, SLOT(hideToolPanel()) );
+        new QShortcut( tr("Esc", "Hide tool panel"), this, SLOT(hideToolPanel()) );
     mSigMux-&amp;gt;connect(escShortcut, SIGNAL(activated()), SLOT(clearSearchHighlighting()));
 
     mActions[IndentMore] = act = new QAction(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -154,13 +154,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::createActions()
 
     mActions[EnlargeFont] = act = new QAction(
         QIcon::fromTheme("zoom-in"), tr("&amp;amp;Enlarge Font"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("enlargeFont"));
+    act-&amp;gt;setShortcut(tr("Ctrl++", "Enlarge font"));
     act-&amp;gt;setStatusTip(tr("Increase displayed font size"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(zoomIn()));
 
     mActions[ShrinkFont] = act = new QAction(
         QIcon::fromTheme("zoom-out"), tr("&amp;amp;Shrink Font"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("shrinkFont"));
+    act-&amp;gt;setShortcut( tr("Ctrl+-", "Shrink font"));
     act-&amp;gt;setStatusTip(tr("Decrease displayed font size"));
     mSigMux-&amp;gt;connect(act, SIGNAL(triggered()), SLOT(zoomOut()));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -170,10 +170,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void MultiEditor::createActions()
 
     // Browse
     mActions[OpenClassDefinition] = act = new QAction(tr("Open Class Definition"), this);
-    act-&amp;gt;setShortcut(s-&amp;gt;shortcut("openDefinition"));
+    act-&amp;gt;setShortcut(tr("Ctrl+D", "Open definition"));
     connect(act, SIGNAL(triggered(bool)), this, SLOT(openClassDefinition()));
 
     s-&amp;gt;endGroup(); // IDE/shortcuts
+
+    for (int i = 0; i &amp;lt; ActionRoleCount; ++i)
+        s-&amp;gt;addAction( mActions[i] );
 }
 
 void MultiEditor::updateActions()
commit 50b92c4d83a1ddd49d3c8559a156dd8c0e7926c5
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Thu May 24 15:27:54 2012 +0200

    sc ide: implement shortcut settings GUI

diff --git a/editors/sc-ide/CMakeLists.txt b/editors/sc-ide/CMakeLists.txt
index 26e15fd..0ab61ef 100644
--- a/editors/sc-ide/CMakeLists.txt
+++ b/editors/sc-ide/CMakeLists.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -23,8 +23,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; set ( ide_moc_hdr
     widgets/settings/dialog.hpp
     widgets/settings/sclang_page.hpp
     widgets/settings/editor_page.hpp
+    widgets/settings/shortcuts_page.hpp
     widgets/util/path_chooser_widget.hpp
     widgets/util/text_format_list_widget.hpp
+    widgets/util/key_sequence_edit.hpp
 )
 
 set ( ide_src
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,6 +49,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; set ( ide_src
     widgets/settings/dialog.cpp
     widgets/settings/sclang_page.cpp
     widgets/settings/editor_page.cpp
+    widgets/settings/shortcuts_page.cpp
     widgets/util/text_format_list_widget.cpp
 )
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,6 +57,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; set( ide_forms
     forms/settings_dialog.ui
     forms/settings_sclang.ui
     forms/settings_editor.ui
+    forms/settings_shortcuts.ui
 )
 
 # Translation files
diff --git a/editors/sc-ide/core/settings/manager.cpp b/editors/sc-ide/core/settings/manager.cpp
index 4168776..2880613 100644
--- a/editors/sc-ide/core/settings/manager.cpp
+++ b/editors/sc-ide/core/settings/manager.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -154,4 +154,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QKeySequence Manager::shortcut( const QString &amp;amp; key )
     return QKeySequence( value(key).toString() );
 }
 
+void Manager::addAction ( QAction *action )
+{
+    mActions.append(action);
+    QString key = keyForAction(action);
+
+    beginGroup("IDE/shortcuts");
+
+    setDefault( key, QVariant::fromValue&amp;lt;QKeySequence&amp;gt;(action-&amp;gt;shortcut()) );
+    action-&amp;gt;setShortcut( value(key).value&amp;lt;QKeySequence&amp;gt;() );
+
+    endGroup();
+}
+
+QString Manager::keyForAction ( QAction *action )
+{
+    return action-&amp;gt;text().toLower().remove('&amp;amp;').replace(' ', '_');
+}
+
 }} // namespace ScIDE::Settings
diff --git a/editors/sc-ide/core/settings/manager.hpp b/editors/sc-ide/core/settings/manager.hpp
index fd90163..dd4e1f4 100644
--- a/editors/sc-ide/core/settings/manager.hpp
+++ b/editors/sc-ide/core/settings/manager.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -25,6 +25,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 #include &amp;lt;QObject&amp;gt;
 #include &amp;lt;QKeySequence&amp;gt;
+#include &amp;lt;QList&amp;gt;
+#include &amp;lt;QAction&amp;gt;
 
 namespace ScIDE { namespace Settings {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -51,10 +53,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
 
     void sync() { mSettings-&amp;gt;sync(); }
 
+    void remove ( const QString &amp;amp;key ) { mSettings-&amp;gt;remove(key); }
+
     // extended
 
     bool contains ( const QString &amp;amp; key ) const;
 
+    bool isOverridden( const QString &amp;amp; key ) const
+    {
+        return mSettings-&amp;gt;contains( key );
+    }
+
     QVariant value ( const QString &amp;amp; key ) const;
 
     QVariant defaultValue ( const QString &amp;amp; key ) const
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,6 +75,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
 
     QKeySequence shortcut( const QString &amp;amp; key );
 
+    const QList&amp;lt;QAction*&amp;gt; &amp;amp; actions() { return mActions; }
+    void addAction ( QAction *action );
+    QString keyForAction ( QAction *action );
+
 private:
     void setDefault ( const QString &amp;amp; key, const QVariant &amp;amp; value )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -87,6 +100,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
 
     QSettings *mSettings;
     SettingsMap mDefaults;
+    QList&amp;lt;QAction*&amp;gt; mActions;
 };
 
 }} // namespace ScIDE::Settings
diff --git a/editors/sc-ide/forms/settings_shortcuts.ui b/editors/sc-ide/forms/settings_shortcuts.ui
new file mode 100644
index 0000000..f807ec0
--- /dev/null
+++ b/editors/sc-ide/forms/settings_shortcuts.ui
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,109 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
+&amp;lt;ui version="4.0"&amp;gt;
+ &amp;lt;class&amp;gt;ShortcutConfigPage&amp;lt;/class&amp;gt;
+ &amp;lt;widget class="QWidget" name="ShortcutConfigPage"&amp;gt;
+  &amp;lt;property name="geometry"&amp;gt;
+   &amp;lt;rect&amp;gt;
+    &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;
+    &amp;lt;y&amp;gt;0&amp;lt;/y&amp;gt;
+    &amp;lt;width&amp;gt;507&amp;lt;/width&amp;gt;
+    &amp;lt;height&amp;gt;378&amp;lt;/height&amp;gt;
+   &amp;lt;/rect&amp;gt;
+  &amp;lt;/property&amp;gt;
+  &amp;lt;property name="windowTitle"&amp;gt;
+   &amp;lt;string&amp;gt;Form&amp;lt;/string&amp;gt;
+  &amp;lt;/property&amp;gt;
+  &amp;lt;layout class="QVBoxLayout" name="verticalLayout"&amp;gt;
+   &amp;lt;item&amp;gt;
+    &amp;lt;layout class="QHBoxLayout" name="horizontalLayout"&amp;gt;
+     &amp;lt;item&amp;gt;
+      &amp;lt;widget class="QLabel" name="label_3"&amp;gt;
+       &amp;lt;property name="text"&amp;gt;
+        &amp;lt;string&amp;gt;Filter:&amp;lt;/string&amp;gt;
+       &amp;lt;/property&amp;gt;
+      &amp;lt;/widget&amp;gt;
+     &amp;lt;/item&amp;gt;
+     &amp;lt;item&amp;gt;
+      &amp;lt;widget class="QLineEdit" name="filter"/&amp;gt;
+     &amp;lt;/item&amp;gt;
+    &amp;lt;/layout&amp;gt;
+   &amp;lt;/item&amp;gt;
+   &amp;lt;item&amp;gt;
+    &amp;lt;widget class="QTreeWidget" name="actionTree"&amp;gt;
+     &amp;lt;column&amp;gt;
+      &amp;lt;property name="text"&amp;gt;
+       &amp;lt;string&amp;gt;Action&amp;lt;/string&amp;gt;
+      &amp;lt;/property&amp;gt;
+     &amp;lt;/column&amp;gt;
+     &amp;lt;column&amp;gt;
+      &amp;lt;property name="text"&amp;gt;
+       &amp;lt;string&amp;gt;Shortcut&amp;lt;/string&amp;gt;
+      &amp;lt;/property&amp;gt;
+     &amp;lt;/column&amp;gt;
+     &amp;lt;column&amp;gt;
+      &amp;lt;property name="text"&amp;gt;
+       &amp;lt;string&amp;gt;Description&amp;lt;/string&amp;gt;
+      &amp;lt;/property&amp;gt;
+     &amp;lt;/column&amp;gt;
+    &amp;lt;/widget&amp;gt;
+   &amp;lt;/item&amp;gt;
+   &amp;lt;item&amp;gt;
+    &amp;lt;layout class="QFormLayout" name="formLayout"&amp;gt;
+     &amp;lt;property name="labelAlignment"&amp;gt;
+      &amp;lt;set&amp;gt;Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter&amp;lt;/set&amp;gt;
+     &amp;lt;/property&amp;gt;
+     &amp;lt;item row="0" column="0"&amp;gt;
+      &amp;lt;widget class="QRadioButton" name="defaultOpt"&amp;gt;
+       &amp;lt;property name="text"&amp;gt;
+        &amp;lt;string&amp;gt;Default:&amp;lt;/string&amp;gt;
+       &amp;lt;/property&amp;gt;
+      &amp;lt;/widget&amp;gt;
+     &amp;lt;/item&amp;gt;
+     &amp;lt;item row="0" column="1"&amp;gt;
+      &amp;lt;widget class="QLabel" name="defaultSeq"/&amp;gt;
+     &amp;lt;/item&amp;gt;
+     &amp;lt;item row="1" column="0"&amp;gt;
+      &amp;lt;widget class="QRadioButton" name="customOpt"&amp;gt;
+       &amp;lt;property name="text"&amp;gt;
+        &amp;lt;string&amp;gt;Custom:&amp;lt;/string&amp;gt;
+       &amp;lt;/property&amp;gt;
+      &amp;lt;/widget&amp;gt;
+     &amp;lt;/item&amp;gt;
+     &amp;lt;item row="1" column="1"&amp;gt;
+      &amp;lt;layout class="QHBoxLayout" name="horizontalLayout_2"&amp;gt;
+       &amp;lt;item&amp;gt;
+        &amp;lt;widget class="ScIDE::KeySequenceEdit" name="customSeq"&amp;gt;
+         &amp;lt;property name="readOnly"&amp;gt;
+          &amp;lt;bool&amp;gt;true&amp;lt;/bool&amp;gt;
+         &amp;lt;/property&amp;gt;
+        &amp;lt;/widget&amp;gt;
+       &amp;lt;/item&amp;gt;
+       &amp;lt;item&amp;gt;
+        &amp;lt;widget class="QToolButton" name="clearSeq"&amp;gt;
+         &amp;lt;property name="text"&amp;gt;
+          &amp;lt;string&amp;gt;Clear&amp;lt;/string&amp;gt;
+         &amp;lt;/property&amp;gt;
+         &amp;lt;property name="toolButtonStyle"&amp;gt;
+          &amp;lt;enum&amp;gt;Qt::ToolButtonIconOnly&amp;lt;/enum&amp;gt;
+         &amp;lt;/property&amp;gt;
+         &amp;lt;property name="autoRaise"&amp;gt;
+          &amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt;
+         &amp;lt;/property&amp;gt;
+        &amp;lt;/widget&amp;gt;
+       &amp;lt;/item&amp;gt;
+      &amp;lt;/layout&amp;gt;
+     &amp;lt;/item&amp;gt;
+    &amp;lt;/layout&amp;gt;
+   &amp;lt;/item&amp;gt;
+  &amp;lt;/layout&amp;gt;
+ &amp;lt;/widget&amp;gt;
+ &amp;lt;customwidgets&amp;gt;
+  &amp;lt;customwidget&amp;gt;
+   &amp;lt;class&amp;gt;ScIDE::KeySequenceEdit&amp;lt;/class&amp;gt;
+   &amp;lt;extends&amp;gt;QLineEdit&amp;lt;/extends&amp;gt;
+   &amp;lt;header&amp;gt;key_sequence_edit.hpp&amp;lt;/header&amp;gt;
+  &amp;lt;/customwidget&amp;gt;
+ &amp;lt;/customwidgets&amp;gt;
+ &amp;lt;resources/&amp;gt;
+ &amp;lt;connections/&amp;gt;
+&amp;lt;/ui&amp;gt;
diff --git a/editors/sc-ide/widgets/settings/dialog.cpp b/editors/sc-ide/widgets/settings/dialog.cpp
index ccd3d2a..cabfb7a 100644
--- a/editors/sc-ide/widgets/settings/dialog.cpp
+++ b/editors/sc-ide/widgets/settings/dialog.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,6 +22,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "ui_settings_dialog.h"
 #include "sclang_page.hpp"
 #include "editor_page.hpp"
+#include "shortcuts_page.hpp"
 #include "../../core/settings/manager.hpp"
 
 #include &amp;lt;QVBoxLayout&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -56,6 +57,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Dialog::Dialog( Manager *settings, QWidget * parent ):
     connect(this, SIGNAL(storeRequest(Manager*)), w, SLOT(store(Manager*)));
     connect(this, SIGNAL(loadRequest(Manager*)), w, SLOT(load(Manager*)));
 
+    w = new ShortcutsPage;
+    ui-&amp;gt;configPageStack-&amp;gt;addWidget(w);
+    ui-&amp;gt;configPageList-&amp;gt;addItem (
+        new QListWidgetItem(QIcon::fromTheme("input-keyboard"), "Shortcuts"));
+    connect(this, SIGNAL(storeRequest(Manager*)), w, SLOT(store(Manager*)));
+    connect(this, SIGNAL(loadRequest(Manager*)), w, SLOT(load(Manager*)));
+
     connect(ui-&amp;gt;buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
     connect(ui-&amp;gt;buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
     connect(ui-&amp;gt;buttonBox-&amp;gt;button(QDialogButtonBox::Reset), SIGNAL(clicked()),
diff --git a/editors/sc-ide/widgets/settings/shortcuts_page.cpp b/editors/sc-ide/widgets/settings/shortcuts_page.cpp
new file mode 100644
index 0000000..73d721f
--- /dev/null
+++ b/editors/sc-ide/widgets/settings/shortcuts_page.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,200 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+    SuperCollider Qt IDE
+    Copyright (c) 2012 Jakob Leben &amp;amp; Tim Blechmann
+    http://www.audiosynth.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
+
+#include "shortcuts_page.hpp"
+#include "ui_settings_shortcuts.h"
+#include "../../core/settings/manager.hpp"
+#include "../../core/main.hpp"
+
+#include &amp;lt;QHeaderView&amp;gt;
+#include &amp;lt;QTreeWidget&amp;gt;
+#include &amp;lt;QTreeWidgetItem&amp;gt;
+#include &amp;lt;QKeyEvent&amp;gt;
+
+Q_DECLARE_METATYPE(QAction*);
+Q_DECLARE_METATYPE(QKeySequence);
+
+namespace ScIDE { namespace Settings {
+
+ShortcutsPage::ShortcutsPage(QWidget *parent) :
+    QWidget(parent),
+    ui( new Ui::ShortcutConfigPage )
+{
+    ui-&amp;gt;setupUi(this);
+
+    ui-&amp;gt;clearSeq-&amp;gt;setIcon( style()-&amp;gt;standardIcon(QStyle::SP_DockWidgetCloseButton) );
+
+    connect(ui-&amp;gt;filter, SIGNAL(textChanged(QString)), this, SLOT(filterBy(QString)));
+    connect(ui-&amp;gt;actionTree, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
+            this, SLOT(showItem(QTreeWidgetItem*,QTreeWidgetItem*)));
+
+    // automation
+    connect(ui-&amp;gt;defaultOpt, SIGNAL(clicked()), ui-&amp;gt;customSeq, SLOT(reset()));
+    connect(ui-&amp;gt;customOpt, SIGNAL(clicked()), ui-&amp;gt;customSeq, SLOT(setFocus()));
+    connect(ui-&amp;gt;customSeq, SIGNAL(editingStarted()), ui-&amp;gt;customOpt, SLOT(toggle()));
+    connect(ui-&amp;gt;clearSeq, SIGNAL(clicked()), ui-&amp;gt;customSeq, SLOT(reset()));
+    connect(ui-&amp;gt;clearSeq, SIGNAL(clicked()), ui-&amp;gt;customOpt, SLOT(click()));
+
+    // value application
+    connect(ui-&amp;gt;defaultOpt, SIGNAL(clicked()), this, SLOT(apply()));
+    connect(ui-&amp;gt;customOpt, SIGNAL(clicked()), this, SLOT(apply()));
+    connect(ui-&amp;gt;customSeq, SIGNAL(editingFinished()), this, SLOT(apply()));
+}
+
+ShortcutsPage::~ShortcutsPage()
+{
+    delete ui;
+}
+
+void ShortcutsPage::load( Manager *s )
+{
+    ui-&amp;gt;actionTree-&amp;gt;clear();
+
+    s-&amp;gt;beginGroup("IDE/shortcuts");
+
+    const QList&amp;lt;QAction*&amp;gt; &amp;amp; actions = s-&amp;gt;actions();
+    foreach (QAction *action, actions)
+        addAction(action, s);
+
+    s-&amp;gt;endGroup();
+
+    ui-&amp;gt;actionTree-&amp;gt;sortByColumn(0, Qt::AscendingOrder);
+    ui-&amp;gt;actionTree-&amp;gt;header()-&amp;gt;resizeSections(QHeaderView::ResizeToContents);
+}
+
+void ShortcutsPage::store( Manager *s )
+{
+    s-&amp;gt;beginGroup("IDE/shortcuts");
+
+    s-&amp;gt;remove("");
+
+    int c = ui-&amp;gt;actionTree-&amp;gt;topLevelItemCount();
+    for (int i = 0; i &amp;lt; c; ++i)
+    {
+        QTreeWidgetItem *item = ui-&amp;gt;actionTree-&amp;gt;topLevelItem(i);
+        QAction *action = item-&amp;gt;data(0, ActionRole).value&amp;lt;QAction*&amp;gt;();
+        Q_ASSERT(action);
+
+        QVariant var = item-&amp;gt;data(0, CustomSequenceRole);
+        if (var.isValid()) {
+            s-&amp;gt;setValue( s-&amp;gt;keyForAction(action), var );
+        }
+        else {
+            var = s-&amp;gt;defaultValue( s-&amp;gt;keyForAction(action) );
+        }
+        action-&amp;gt;setShortcut( var.value&amp;lt;QKeySequence&amp;gt;() );
+    }
+
+    s-&amp;gt;endGroup();
+}
+
+void ShortcutsPage::addAction( QAction *a, Manager *s )
+{
+    QTreeWidgetItem *item = new QTreeWidgetItem;
+    item-&amp;gt;setIcon(0, a-&amp;gt;icon());
+    item-&amp;gt;setText(0, a-&amp;gt;text().remove('&amp;amp;'));
+    item-&amp;gt;setText(2, a-&amp;gt;statusTip() );
+
+    QString key = s-&amp;gt;keyForAction(a);
+
+    item-&amp;gt;setData(0, ActionRole, QVariant::fromValue&amp;lt;QAction*&amp;gt;(a));
+
+    item-&amp;gt;setData(0, DefaultSequenceRole, s-&amp;gt;defaultValue(key));
+
+    if (s-&amp;gt;isOverridden(key)) {
+        // For reason of performance, ensure the variant holds a QKeySequence
+        QKeySequence seq = s-&amp;gt;value(key).value&amp;lt;QKeySequence&amp;gt;();
+        item-&amp;gt;setData(0, CustomSequenceRole, QVariant::fromValue&amp;lt;QKeySequence&amp;gt;(seq) );
+    }
+
+    updateItem(item);
+
+    ui-&amp;gt;actionTree-&amp;gt;addTopLevelItem(item);
+}
+
+void ShortcutsPage::filterBy( const QString &amp;amp;str )
+{
+    int c = ui-&amp;gt;actionTree-&amp;gt;topLevelItemCount();
+    if (str.isEmpty())
+    {
+        for (int i = 0; i &amp;lt; c; ++i)
+            ui-&amp;gt;actionTree-&amp;gt;topLevelItem(i)-&amp;gt;setHidden(false);
+    }
+    else
+    {
+        for (int i = 0; i &amp;lt; c; ++i)
+        {
+            QTreeWidgetItem *item = ui-&amp;gt;actionTree-&amp;gt;topLevelItem(i);
+            bool visible =
+                item-&amp;gt;text(0).contains(str, Qt::CaseInsensitive)
+                || item-&amp;gt;text(2).contains(str, Qt::CaseInsensitive);
+            item-&amp;gt;setHidden(!visible);
+        }
+    }
+}
+
+void ShortcutsPage::showItem( QTreeWidgetItem *item, QTreeWidgetItem *prev )
+{
+    QAction *a = item-&amp;gt;data(0, ActionRole).value&amp;lt;QAction*&amp;gt;();
+    Q_ASSERT(a);
+
+    QString defaultSeq = item-&amp;gt;data(0, DefaultSequenceRole).toString();
+    ui-&amp;gt;defaultSeq-&amp;gt;setText( defaultSeq );
+
+    QVariant customSeqVar = item-&amp;gt;data(0, CustomSequenceRole);
+    ui-&amp;gt;customSeq-&amp;gt;setSequence( customSeqVar.value&amp;lt;QKeySequence&amp;gt;() );
+
+    if (customSeqVar.isValid())
+        ui-&amp;gt;customOpt-&amp;gt;setChecked(true);
+    else
+        ui-&amp;gt;defaultOpt-&amp;gt;setChecked(true);
+}
+
+void ShortcutsPage::apply()
+{
+    applyTo( ui-&amp;gt;actionTree-&amp;gt;currentItem() );
+}
+
+void ShortcutsPage::applyTo( QTreeWidgetItem *item )
+{
+    if (!item) return;
+
+    if (ui-&amp;gt;customOpt-&amp;gt;isChecked()) {
+        QKeySequence seq = ui-&amp;gt;customSeq-&amp;gt;sequence();
+        item-&amp;gt;setData(0, CustomSequenceRole, QVariant::fromValue&amp;lt;QKeySequence&amp;gt;(seq));
+    }
+    else {
+        item-&amp;gt;setData(0, CustomSequenceRole, QVariant());
+    }
+    updateItem(item);
+}
+
+void ShortcutsPage::updateItem( QTreeWidgetItem *item )
+{
+    QVariant seqData = item-&amp;gt;data(0, CustomSequenceRole);
+    if (!seqData.isValid())
+        seqData = item-&amp;gt;data(0, DefaultSequenceRole);
+
+    QKeySequence seq = seqData.value&amp;lt;QKeySequence&amp;gt;();
+
+    item-&amp;gt;setText(1, seq.toString(QKeySequence::NativeText));
+}
+
+}} // namespace ScIDE::Settings
diff --git a/editors/sc-ide/widgets/settings/shortcuts_page.hpp b/editors/sc-ide/widgets/settings/shortcuts_page.hpp
new file mode 100644
index 0000000..b84d652
--- /dev/null
+++ b/editors/sc-ide/widgets/settings/shortcuts_page.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,76 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+    SuperCollider Qt IDE
+    Copyright (c) 2012 Jakob Leben &amp;amp; Tim Blechmann
+    http://www.audiosynth.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
+
+#ifndef SCIDE_WIDGETS_SETTINGS_SHORTCUTS_PAGE_HPP_INCLUDED
+#define SCIDE_WIDGETS_SETTINGS_SHORTCUTS_PAGE_HPP_INCLUDED
+
+#include &amp;lt;QWidget&amp;gt;
+#include &amp;lt;QStandardItemModel&amp;gt;
+#include &amp;lt;QSortFilterProxyModel&amp;gt;
+
+class QTreeWidgetItem;
+
+namespace Ui {
+    class ShortcutConfigPage;
+}
+
+namespace ScIDE { namespace Settings {
+
+class Manager;
+
+class ShortcutsPage : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ShortcutsPage(QWidget *parent = 0);
+    ~ShortcutsPage();
+
+public Q_SLOTS:
+    void load( Manager * );
+    void store( Manager * );
+    void filterBy( const QString &amp;amp; );
+
+private Q_SLOTS:
+    void showItem( QTreeWidgetItem *, QTreeWidgetItem * );
+    void apply();
+
+private:
+    enum ItemDataRole
+    {
+        ActionRole = Qt::UserRole,
+        SettingsKeyRole,
+        DefaultSequenceRole,
+        CustomSequenceRole,
+        EditedRole
+    };
+
+    void addAction( QAction *, Manager * );
+    void applyTo( QTreeWidgetItem * );
+    void updateItem( QTreeWidgetItem * );
+
+    Ui::ShortcutConfigPage *ui;
+    QStandardItemModel *mActionModel;
+    QSortFilterProxyModel *mFilter;
+};
+
+}} // namespace ScIDE::Settings
+
+#endif // SCIDE_WIDGETS_SETTINGS_SHORTCUTS_PAGE_HPP_INCLUDED
diff --git a/editors/sc-ide/widgets/util/key_sequence_edit.hpp b/editors/sc-ide/widgets/util/key_sequence_edit.hpp
new file mode 100644
index 0000000..7200212
--- /dev/null
+++ b/editors/sc-ide/widgets/util/key_sequence_edit.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,180 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+    SuperCollider Qt IDE
+    Copyright (c) 2012 Jakob Leben &amp;amp; Tim Blechmann
+    http://www.audiosynth.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
+
+#ifndef SCIDE_WIDGETS_KEY_SEQUENCE_EDIT_HPP_INCLUDED
+#define SCIDE_WIDGETS_KEY_SEQUENCE_EDIT_HPP_INCLUDED
+
+#include &amp;lt;QLineEdit&amp;gt;
+#include &amp;lt;QKeyEvent&amp;gt;
+#include &amp;lt;QBasicTimer&amp;gt;
+
+namespace ScIDE {
+
+class KeySequenceEdit : public QLineEdit
+{
+    Q_OBJECT
+
+private:
+    QBasicTimer mEditingTimer;
+
+public:
+    KeySequenceEdit( QWidget *parent = 0 ):
+        QLineEdit(parent),
+        k1(0), k2(0), k3(0), k4(0),
+        mEditing(false)
+    {
+        setReadOnly(true);
+    }
+
+    QKeySequence sequence()
+    {
+        return QKeySequence(k1, k2, k3, k4);
+    }
+
+    void setSequence( const QKeySequence &amp;amp;seq )
+    {
+        k1 = seq[0];
+        k2 = seq[1];
+        k3 = seq[2];
+        k4 = seq[3];
+
+        if (mEditing)
+            finishEditing();
+        else
+            updateText();
+    }
+
+public slots:
+    void reset()
+    {
+        k1 = k2 = k3 = k4 = 0;
+
+        if (mEditing)
+            finishEditing();
+        else
+            updateText();
+    }
+
+    void finishEditing()
+    {
+        if (mEditing) {
+            mEditing = false;
+            mEditingTimer.stop();
+            updateText();
+            emit editingFinished();
+        }
+    }
+
+signals:
+    void editingStarted();
+
+protected:
+//#if 0
+    void updateText()
+    {
+        QKeySequence seq = sequence();
+        if (seq.isEmpty())
+            clear();
+        else {
+            QString text = sequence().toString(QKeySequence::NativeText);
+            if (mEditing) text.append(", ...");
+            setText( text );
+        }
+    }
+
+    bool event( QEvent *e )
+    {
+        if (e-&amp;gt;type() != QEvent::KeyPress)
+            return QLineEdit::event(e);
+
+        e-&amp;gt;accept();
+
+        QKeyEvent *ke = static_cast&amp;lt;QKeyEvent*&amp;gt;(e);
+        int key = ke-&amp;gt;key();
+
+        if (isModifier(key))
+            return true;
+
+        int *k;
+        if (!mEditing) {
+            k1 = k2 = k3 = k4 = 0;
+            mEditing = true;
+            k = &amp;amp;k1;
+        }
+        else {
+            if(k1 == 0)
+                k = &amp;amp;k1;
+            else if(k2 == 0)
+                k = &amp;amp;k2;
+            else if(k3 == 0)
+                k = &amp;amp;k3;
+            else
+                k = &amp;amp;k4;
+        }
+
+        *k = key | ke-&amp;gt;modifiers();
+
+        if (k == &amp;amp;k4)
+            finishEditing();
+        else {
+            mEditingTimer.start(800, this);
+            updateText();
+            if (k == &amp;amp;k1)
+                emit editingStarted();
+        }
+
+        return true;
+    }
+
+    virtual void timerEvent ( QTimerEvent * e )
+    {
+        if (e-&amp;gt;timerId() == mEditingTimer.timerId())
+            finishEditing();
+    }
+
+    void focusOutEvent( QFocusEvent * e )
+    {
+        finishEditing();
+    }
+
+//#endif
+private:
+    bool isModifier(int key)
+    {
+        switch (key)
+        {
+        case Qt::Key_Shift:
+        case Qt::Key_Control:
+        case Qt::Key_Meta:
+        case Qt::Key_Alt:
+        case Qt::Key_AltGr:
+            return true;
+        default:
+            return false;
+        }
+    }
+
+    int k1, k2, k3, k4;
+    bool mEditing;
+};
+
+} // namespace ScIDE
+
+#endif // SCIDE_WIDGETS_KEY_SEQUENCE_EDIT_HPP_INCLUDED
-----------------------------------------------------------------------

Summary of changes:
 editors/sc-ide/CMakeLists.txt                      |    4 +
 editors/sc-ide/core/sc_process.cpp                 |   33 +++-
 editors/sc-ide/core/sc_process.hpp                 |   28 +---
 editors/sc-ide/core/settings/manager.cpp           |   43 ++---
 editors/sc-ide/core/settings/manager.hpp           |   14 ++
 editors/sc-ide/forms/settings_shortcuts.ui         |  109 +++++++++++
 editors/sc-ide/widgets/main_window.cpp             |   27 ++--
 editors/sc-ide/widgets/multi_editor.cpp            |   25 ++-
 editors/sc-ide/widgets/settings/dialog.cpp         |    8 +
 editors/sc-ide/widgets/settings/shortcuts_page.cpp |  200 ++++++++++++++++++++
 .../{editor_page.hpp =&amp;gt; shortcuts_page.hpp}        |   49 +++--
 editors/sc-ide/widgets/util/key_sequence_edit.hpp  |  180 ++++++++++++++++++
 12 files changed, 625 insertions(+), 95 deletions(-)
 create mode 100644 editors/sc-ide/forms/settings_shortcuts.ui
 create mode 100644 editors/sc-ide/widgets/settings/shortcuts_page.cpp
 copy editors/sc-ide/widgets/settings/{editor_page.hpp =&amp;gt; shortcuts_page.hpp} (54%)
 create mode 100644 editors/sc-ide/widgets/util/key_sequence_edit.hpp


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-24T16:24:53</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50907">
    <title>sc3-plugins DL outdated</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50907</link>
    <description>&lt;pre&gt;hola,

I noticed that the sc3plugins "latest version" downloads are very 
outdated on sf.net.
both [1] and [2] main downloads link to a src from 2010-09-03...
maybe that could be updated a bit?

just saying...

[1] http://sc3-plugins.sf.net
[2] http://sf.net/projects/sc3-plugins

y

&lt;/pre&gt;</description>
    <dc:creator>yvan volochine</dc:creator>
    <dc:date>2012-05-24T10:11:28</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50901">
    <title>HID on OSX</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50901</link>
    <description>&lt;pre&gt;Hiho,

the attempts to fix HID on OSX are stagnating again.

A while ago (right after the symposium), I posted a workaround to deal with 
the 64bit long locID; Miguel improved the patch, so basically the work that 
Josh started could be continued from there.

Is there anyone who wants to pick this up? and has time?

This bug is really a showstopper for a lot of people!
Until this is fixed, we will have a large user base who will not move on to 
3.5 (or 3.6...).

sincerely,
Marije

_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>nescivi</dc:creator>
    <dc:date>2012-05-23T11:55:47</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50898">
    <title>SF.net Git: supercollider branch, 3.5, updated. c3471187db047e02880f8a3fa7ae85479953967e</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50898</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, 3.5 has been updated
       via  c3471187db047e02880f8a3fa7ae85479953967e (commit)
      from  e3bbcb0b6d4ab0fff0a32fa27bec1050d8f8c85c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit c3471187db047e02880f8a3fa7ae85479953967e
Author: Tim Blechmann &amp;lt;tim-xpEK/MU0Hawdnm+yROfE0A&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Tue May 22 17:08:40 2012 +0200

    external libraries: update nova-tt (gcc 4.7 fix)
    
    Signed-off-by: Tim Blechmann &amp;lt;tim-xpEK/MU0Hawdnm+yROfE0A&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

diff --git a/external_libraries/nova-tt b/external_libraries/nova-tt
index 871c09e..377f79a 160000
--- a/external_libraries/nova-tt
+++ b/external_libraries/nova-tt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1 +1 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-Subproject commit 871c09e261986726e193a0213193f01695b0f0ca
+Subproject commit 377f79ac6326704c334ae87081969d71e8b94b2f
-----------------------------------------------------------------------

Summary of changes:
 external_libraries/nova-tt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Tim Blechmann</dc:creator>
    <dc:date>2012-05-22T15:18:14</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50897">
    <title>SF.net Git: supercollider branch, master, updated. f65e9d8ce42498a94c4333ca7624efed4f1de502</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50897</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  f65e9d8ce42498a94c4333ca7624efed4f1de502 (commit)
       via  461fcef475470738747725bbcb12c62f5f9ed02c (commit)
      from  500d3d523f5208e8aa4a39d13e7fd128aa79e18f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit f65e9d8ce42498a94c4333ca7624efed4f1de502
Author: Tim Blechmann &amp;lt;tim-xpEK/MU0Hawdnm+yROfE0A&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Tue May 22 17:08:40 2012 +0200

    external libraries: update nova-tt (gcc 4.7 fix)
    
    Signed-off-by: Tim Blechmann &amp;lt;tim-xpEK/MU0Hawdnm+yROfE0A&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

diff --git a/external_libraries/nova-tt b/external_libraries/nova-tt
index 871c09e..377f79a 160000
--- a/external_libraries/nova-tt
+++ b/external_libraries/nova-tt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1 +1 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-Subproject commit 871c09e261986726e193a0213193f01695b0f0ca
+Subproject commit 377f79ac6326704c334ae87081969d71e8b94b2f
commit 461fcef475470738747725bbcb12c62f5f9ed02c
Author: Tim Blechmann &amp;lt;tim-xpEK/MU0Hawdnm+yROfE0A&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Fri May 18 12:24:04 2012 +0200

    cmake build system: locate server plugins on freebsd
    
    Signed-off-by: Tim Blechmann &amp;lt;tim-xpEK/MU0Hawdnm+yROfE0A&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

diff --git a/server/scsynth/CMakeLists.txt b/server/scsynth/CMakeLists.txt
index 25a8f4f..1c93824 100644
--- a/server/scsynth/CMakeLists.txt
+++ b/server/scsynth/CMakeLists.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -165,7 +165,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; elseif(NOT NO_LIBSNDFILE)
 message(SEND_ERROR "Cannot find libsndfile")
 endif(SNDFILE_FOUND)
 
-if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
 add_definitions(-DSC_PLUGIN_DIR="${CMAKE_INSTALL_PREFIX}/lib/SuperCollider/plugins")
 endif()
 
-----------------------------------------------------------------------

Summary of changes:
 external_libraries/nova-tt    |    2 +-
 server/scsynth/CMakeLists.txt |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Tim Blechmann</dc:creator>
    <dc:date>2012-05-22T15:17:01</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50881">
    <title>SF.net Git: supercollider branch, master, updated. 500d3d523f5208e8aa4a39d13e7fd128aa79e18f</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50881</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  500d3d523f5208e8aa4a39d13e7fd128aa79e18f (commit)
       via  5ca3c77b5901b53d698b7c3146e33be281f0993a (commit)
       via  f158be344527570cea05e6f81112d1fc6843bfbe (commit)
       via  7dadbe26221452728a847b463d0f8005700f3758 (commit)
      from  3f34cdf356aa3c4150714f846d92574bf6d7f717 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 500d3d523f5208e8aa4a39d13e7fd128aa79e18f
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Fri May 4 22:37:19 2012 +0200

    qtcollider: only hide windows on language shutdown (do not destroy them)

diff --git a/QtCollider/LanguageClient.cpp b/QtCollider/LanguageClient.cpp
index f701435..93cfa2a 100644
--- a/QtCollider/LanguageClient.cpp
+++ b/QtCollider/LanguageClient.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,6 +28,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include &amp;lt;PyrLexer.h&amp;gt;
 
 #include &amp;lt;qmath.h&amp;gt;
+#include &amp;lt;QWidget&amp;gt;
 
 extern double elapsedTime();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -118,40 +119,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void LangClient::onQuit( int exitCode )
 
 void LangClient::onLibraryShutdown()
 {
-  // NOTE: Finalization does not work properly in sclang:
-  // finalizers of still accessible objects are not called at shutdown.
-  // Therefore we finalize here manually.
-
-  QtCollider::lockLang();
-  if(!compiledOK) {
-    QtCollider::unlockLang();
-    return;
-  }
-
-  VMGlobals *g = gMainVMGlobals;
-
-  // Get the 'heap' classvar of QObject:
-  int idx = slotRawInt( &amp;amp;SC_CLASS(QObject)-&amp;gt;classVarIndex );
-  PyrSlot *heap_slot = slotRawObject( &amp;amp;g-&amp;gt;process-&amp;gt;classVars )-&amp;gt;slots + idx;
-
-  if (IsObj(heap_slot))
-  {
-    // Delete all objects on heap:
-    PyrObject *heap = slotRawObject( heap_slot );
-    int n = heap-&amp;gt;size;
-    for(int i = 0; i &amp;lt; n; ++i)
-    {
-        PyrObject *object = slotRawObject(heap-&amp;gt;slots+i);
-        QObjectProxy *proxy = static_cast&amp;lt;QObjectProxy*&amp;gt;(slotRawPtr(object-&amp;gt;slots));
-        proxy-&amp;gt;finalize();
-        proxy-&amp;gt;destroy( QObjectProxy::DestroyObject );
-        // Destroy the proxy later, to keep it safe for other shutdown handlers:
-        DestroyEvent *e = new DestroyEvent( QObjectProxy::DestroyProxy );
-        QApplication::postEvent( proxy, e );
-    }
-  }
-
-  QtCollider::unlockLang();
+  QWidgetList windows = QApplication::topLevelWidgets();
+  Q_FOREACH( QWidget *w, windows )
+    w-&amp;gt;hide();
 }
 
 void LangClient::customEvent( QEvent *e )
commit 5ca3c77b5901b53d698b7c3146e33be281f0993a
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Mon May 21 19:28:37 2012 +0200

    qtcollider: remove an unneeded primitive

diff --git a/QtCollider/primitives/prim_QObject.cpp b/QtCollider/primitives/prim_QObject.cpp
index faf7789..223bf89 100644
--- a/QtCollider/primitives/prim_QObject.cpp
+++ b/QtCollider/primitives/prim_QObject.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -126,17 +126,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int QObject_Finalize( struct VMGlobals *, struct PyrObject *obj )
   return errNone;
 }
 
-QC_LANG_PRIMITIVE( QObject_ManuallyFinalize, 0, PyrSlot *r, PyrSlot *a, VMGlobals *g )
-{
-  qcSCObjectDebugMsg( 1, slotRawObject(r), "MANUAL FINALIZE" );
-
-  // WARNING we assume that proxy's deletion will be deferred until any
-  // language shutdown code using it will have been executed, so any
-  // shutdown code is safe.
-
-  return QObject_Finalize( g, slotRawObject(r) );
-}
-
 QC_LANG_PRIMITIVE( QObject_SetParent, 1, PyrSlot *r, PyrSlot *a, VMGlobals *g )
 {
   QObjectProxy *proxy = QOBJECT_FROM_SLOT( r );
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -602,7 +591,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void defineQObjectPrimitives()
   LangPrimitiveDefiner definer;
   definer.define&amp;lt;QObject_New&amp;gt;();
   definer.define&amp;lt;QObject_Destroy&amp;gt;();
-  definer.define&amp;lt;QObject_ManuallyFinalize&amp;gt;();
   definer.define&amp;lt;QObject_SetParent&amp;gt;();
   definer.define&amp;lt;QMetaObject_Properties&amp;gt;();
   definer.define&amp;lt;QMetaObject_Methods&amp;gt;();
diff --git a/SCClassLibrary/QtCollider/QObject.sc b/SCClassLibrary/QtCollider/QObject.sc
index f22e415..ea0641a 100644
--- a/SCClassLibrary/QtCollider/QObject.sc
+++ b/SCClassLibrary/QtCollider/QObject.sc
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -165,11 +165,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QObject {
     ^this.primitiveFailed
   }
 
-  prFinalize {
-    _QObject_ManuallyFinalize
-    ^this.primitiveFailed
-  }
-
   prRelease { heap.remove(this); }
 
   doFunction { arg f ... args; f.performList(\value, this, args); }
commit f158be344527570cea05e6f81112d1fc6843bfbe
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Fri May 4 21:58:31 2012 +0200

    sclang: run all finalizers on library shutdown
    
    Previously, only the already unreachable finalizers were run.
    However, shutting down the library implicitly makes all objects unreachable,
    so all finalizers need to be run.

diff --git a/include/lang/GC.h b/include/lang/GC.h
index ecd2ffc..6cb539e 100644
--- a/include/lang/GC.h
+++ b/include/lang/GC.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -144,6 +144,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public:
 }
 void FullCollection();
 void ScanFinalizers();
+void RunAllFinalizers();
 GCSet* GetGCSet(PyrObjectHdr* inObj);
 void CompletePartialScan(PyrObject *obj);
 
diff --git a/lang/LangSource/GC.cpp b/lang/LangSource/GC.cpp
index 969f9da..89dafda 100644
--- a/lang/LangSource/GC.cpp
+++ b/lang/LangSource/GC.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -756,6 +756,31 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void PyrGC::ScanFinalizers()
 }
 }
 
+void PyrGC::RunAllFinalizers()
+{
+GCSet *gcs = &amp;amp;mSets[kFinalizerSet];
+
+PyrObjectHdr *obj = gcs-&amp;gt;mBlack.next;
+while (!IsMarker(obj)) {
+Finalize((PyrObject*)obj);
+obj = obj-&amp;gt;next;
+}
+
+obj = gcs-&amp;gt;mWhite.next;
+PyrObjectHdr *firstFreeObj = gcs-&amp;gt;mFree;
+while (obj != firstFreeObj) {
+Finalize((PyrObject*)obj);
+obj = obj-&amp;gt;next;
+}
+
+obj = mGrey.next;
+while (!IsMarker(obj)) {
+if (obj-&amp;gt;classptr == class_finalizer)
+Finalize((PyrObject*)obj);
+obj = obj-&amp;gt;next;
+}
+}
+
 bool PyrGC::SanityCheck2()
 {
 int numgrey = 0;
diff --git a/lang/LangSource/PyrLexer.cpp b/lang/LangSource/PyrLexer.cpp
index ca303f6..f142885 100644
--- a/lang/LangSource/PyrLexer.cpp
+++ b/lang/LangSource/PyrLexer.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2175,8 +2175,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void aboutToCompileLibrary()
 SetObject(g-&amp;gt;sp, g-&amp;gt;process);
 runInterpreter(g, s_shutdown, 1);
 
-g-&amp;gt;gc-&amp;gt;ScanFinalizers(); // run finalizers
-
 g-&amp;gt;canCallOS = false;
 }
 pthread_mutex_unlock (&amp;amp;gLangMutex);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2190,16 +2188,28 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void closeAllCustomPorts();
 void shutdownLibrary()
 {
 closeAllGUIScreens();
+
 schedStop();
+
 aboutToCompileLibrary();
 
 TempoClock_stopAll();
 
 pthread_mutex_lock (&amp;amp;gLangMutex);
+
 closeAllCustomPorts();
 
+if (compiledOK) {
+VMGlobals *g = gMainVMGlobals;
+g-&amp;gt;canCallOS = true;
+g-&amp;gt;gc-&amp;gt;RunAllFinalizers();
+g-&amp;gt;canCallOS = false;
+}
+
 pyr_pool_runtime-&amp;gt;FreeAll();
+
 compiledOK = false;
+
 pthread_mutex_unlock (&amp;amp;gLangMutex);
 }
 
commit 7dadbe26221452728a847b463d0f8005700f3758
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Fri May 4 22:42:01 2012 +0200

    qtcollider: remove unnecessary duplicate code
    
    QWindow:-onClose is a duplication of QView:-onClose. Remove it, and instead
    just forward to the view's method.

diff --git a/SCClassLibrary/QtCollider/QWindow.sc b/SCClassLibrary/QtCollider/QWindow.sc
index 06bf1b4..d034634 100644
--- a/SCClassLibrary/QtCollider/QWindow.sc
+++ b/SCClassLibrary/QtCollider/QWindow.sc
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -75,7 +75,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QWindow
 {
   classvar &amp;lt;allWindows, &amp;lt;&amp;gt;initAction;
 
-  var resizable, &amp;lt;drawFunc, &amp;lt;onClose;
+  var resizable, &amp;lt;drawFunc;
   var &amp;lt;view;
 
   //TODO
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -166,10 +166,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QWindow
     view.setProperty( \geometry, rect.moveBy( 0, menuSpacer ) );
   }
 
-  onClose_ { arg func;
-    view.manageFunctionConnection( onClose, func, 'destroyed()', false );
-    onClose = func;
-  }
+  onClose { ^view.onClose }
+  onClose_ { arg func; view.onClose_(func) }
 
   // TODO
   addToOnClose{ arg function; }
-----------------------------------------------------------------------

Summary of changes:
 QtCollider/LanguageClient.cpp          |   38 +++----------------------------
 QtCollider/primitives/prim_QObject.cpp |   12 ----------
 SCClassLibrary/QtCollider/QObject.sc   |    5 ----
 SCClassLibrary/QtCollider/QWindow.sc   |    8 ++----
 include/lang/GC.h                      |    1 +
 lang/LangSource/GC.cpp                 |   25 +++++++++++++++++++++
 lang/LangSource/PyrLexer.cpp           |   14 ++++++++++-
 7 files changed, 45 insertions(+), 58 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-21T18:13:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50874">
    <title>SF.net Git: supercollider branch, master, updated. 3f34cdf356aa3c4150714f846d92574bf6d7f717</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50874</link>
    <description>&lt;pre&gt;This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "supercollider".

The branch, master has been updated
       via  3f34cdf356aa3c4150714f846d92574bf6d7f717 (commit)
      from  9ad4cd17f0a7d06e3e53b7b3da7ac9911a8e0703 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3f34cdf356aa3c4150714f846d92574bf6d7f717
Author: Jakob Leben &amp;lt;jakob.leben-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Date:   Mon May 21 14:09:05 2012 +0200

    sc ide: avoid dependency on Qt &amp;gt;= 4.7

diff --git a/editors/sc-ide/widgets/code_editor/editor.cpp b/editors/sc-ide/widgets/code_editor/editor.cpp
index 6a6f245..0b96aec 100644
--- a/editors/sc-ide/widgets/code_editor/editor.cpp
+++ b/editors/sc-ide/widgets/code_editor/editor.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -393,7 +393,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; QTextCursor CodeEditor::currentRegion()
     QTextCursor c(textCursor());
     QTextBlock b(c.block());
 
-    int pos = c.positionInBlock();
+    int pos = c.position() - b.position();
     BracketIterator start;
     BracketIterator end;
     int topLevel = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -645,8 +645,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void CodeEditor::mouseReleaseEvent ( QMouseEvent *e )
 void CodeEditor::mouseDoubleClickEvent ( QMouseEvent *e )
 {
     QTextCursor c(textCursor());
+    QTextBlock b(c.block());
+
     BracketMatch m;
-    matchBracket( c.block(), c.positionInBlock(), m );
+    matchBracket( b, c.position() - b.position(), m );
     if(m.pos &amp;gt; -1 &amp;amp;&amp;amp; m.matchPos &amp;gt; -1)
     {
         c.setPosition(qMin(m.pos, m.matchPos));
-----------------------------------------------------------------------

Summary of changes:
 editors/sc-ide/widgets/code_editor/editor.cpp |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)


hooks/post-receive
&lt;/pre&gt;</description>
    <dc:creator>Jakob Leben</dc:creator>
    <dc:date>2012-05-21T13:02:52</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50850">
    <title>scide ‘class QTextCursor’ has no member named ‘positionInBlock’</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50850</link>
    <description>&lt;pre&gt;The recent thread about scide made me keen to try, but I ran into a build error. I'm quite sure this error was posted before, and I thought that a fix was checked in, but even after pulling and merging into my private branch, I still get this:

[ 81%] Building CXX object editors/sc-ide/CMakeFiles/scide.dir/widgets/code_editor/editor.cpp.o
/home/dlm/share/sc.git/editors/sc-ide/widgets/code_editor/editor.cpp: In member function ‘QTextCursor ScIDE::CodeEditor::currentRegion()’:
/home/dlm/share/sc.git/editors/sc-ide/widgets/code_editor/editor.cpp:396: error: ‘class QTextCursor’ has no member named ‘positionInBlock’
/home/dlm/share/sc.git/editors/sc-ide/widgets/code_editor/editor.cpp: In member function ‘virtual void ScIDE::CodeEditor::mouseDoubleClickEvent(QMouseEvent*)’:
/home/dlm/share/sc.git/editors/sc-ide/widgets/code_editor/editor.cpp:649: error: ‘class QTextCursor’ has no member named ‘positionInBlock’
make[2]: *** [editors/sc-ide/CMakeFiles/scide.dir/widgets/code_editor/editor.cpp.o] Error 1
make[1]: *** [editors/sc-ide/CMakeFiles/scide.dir/all] Error 2
make: *** [all] Error 2

Sorry for repeating the issue -- I really don't have time this morning to go searching back through the list archives.

hjh


--
James Harkins /// dewdrop world
jamshark70-n2XjBy9Frl0FLkkUnhLBSV6hYfS7NtTn&amp;lt; at &amp;gt;public.gmane.org
http://www.dewdrop-world.net

"Come said the Muse,
Sing me a song no poet has yet chanted,
Sing me the universal."  -- Whitman

blog: http://www.dewdrop-world.net/words
audio clips: http://www.dewdrop-world.net/audio
more audio: http://soundcloud.com/dewdrop_world/tracks

_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>James Harkins</dc:creator>
    <dc:date>2012-05-21T02:12:30</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50832">
    <title>SChelp: Inherited methods</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50832</link>
    <description>&lt;pre&gt;Would it make sense to allow the helpfile to configure which inherited methods are shown directly? This may be a good way to defragment the search for help given a specific problem ...

_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>Julian Rohrhuber</dc:creator>
    <dc:date>2012-05-20T17:50:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50828">
    <title>qt windows dont close at reboot</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50828</link>
    <description>&lt;pre&gt;Hi,

im on recent git build
9ad4cd17f0a7d06e3e53b7b3da7ac9911a8e0703
and noticed that qt windows dont close at reboot.

is this intended?
I remember that we had this issue a while ago (in the beginning of the qt gui system) but jacob/jonathan (?) fixed it...

cheers
Till
_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>Bovermann Till</dc:creator>
    <dc:date>2012-05-20T15:47:49</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50813">
    <title>SF.net SVN: quarks:[2318] MathLib/HelpSource/Classes/ScatterView3d.schelp</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50813</link>
    <description>&lt;pre&gt;Revision: 2318
          http://quarks.svn.sourceforge.net/quarks/?rev=2318&amp;amp;view=rev
Author:   cruxxial
Date:     2012-05-19 15:49:49 +0000 (Sat, 19 May 2012)
Log Message:
-----------
adding ScatterView3d help file

Added Paths:
-----------
    MathLib/HelpSource/Classes/ScatterView3d.schelp

Added: MathLib/HelpSource/Classes/ScatterView3d.schelp
===================================================================
--- MathLib/HelpSource/Classes/ScatterView3d.schelp                        (rev 0)
+++ MathLib/HelpSource/Classes/ScatterView3d.schelp2012-05-19 15:49:49 UTC (rev 2318)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,217 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+CLASS:: ScatterView3d
+summary:: Plot a collection of points in 3D
+categories:: GUI&amp;gt;Accessories
+related:: Reference/plot, Classes/Matrix
+
+DESCRIPTION::
+Plot a collection of points in 3D
+
+CLASSMETHODS::
+
+METHOD:: new
+
+argument:: parent
+Parent view or window
+
+argument:: bounds
+Bounds
+
+argument:: data
+An array of [[x1,y1,z1], [x1,y1,z2], ...[xn,yN,zN]]
+
+argument:: specX
+ControlSpec with min/max of the plotted range of dimension X
+
+argument:: specY
+ControlSpec with min/max of the plotted range of dimension Y
+
+argument:: specZ
+ControlSpec with min/max of the plotted range of dimension Z
+
+argument:: rotX
+Initial X rotation in radians
+
+argument:: rotY
+Initial Y rotation in radians
+
+argument:: rotZ
+Initial Z rotation in radians
+
+
+
+INSTANCEMETHODS::
+
+METHOD:: init3d
+private init
+
+METHOD:: data
+Get or set data array.
+
+argument:: data
+An array of [[x1,y1,z1], [x1,y1,z2], ...[xn,yN,zN]]
+
+returns:: (returnvalue)
+
+METHOD:: refresh
+Refresh the view. You will need to call this after making any changes to data or settings.
+
+
+METHOD:: rotX
+Rotate
+
+argument:: val
+radians
+
+
+METHOD:: rotY
+Rotate
+
+argument:: val
+radians
+
+
+METHOD:: rotZ
+Rotate
+
+argument:: val
+radians
+
+
+METHOD:: rot
+Rotate
+
+argument:: rX
+radians
+
+argument:: rY
+radians
+
+argument:: rZ
+radians
+
+
+METHOD:: drawMethod
+Set the shape that will be drawn for each point.
+
+argument:: method
+One of: [\fillRect, \fillOval, \strokeOval, \strokeRect]
+
+returns:: (returnvalue)
+
+METHOD:: symbolSize
+Size in pixels of the shape plotted for each point
+
+argument:: val
+pixels
+
+returns:: (returnvalue)
+
+METHOD:: symbolColor
+Color of the shape plotted for each point
+
+argument:: val
+Color
+
+returns:: (returnvalue)
+
+METHOD:: isHighlight
+Set highlighting mode which adds a crosshair at the selected point or points
+
+argument:: val
+Boolean
+
+returns:: Boolean
+
+METHOD:: highlightItem
+Highlight a point
+
+argument:: item
+Integer index in data array
+
+
+METHOD:: highlightRange
+Highlight multiple points
+
+argument:: start
+Integer index in data array
+
+argument:: end
+Integer index in data array
+
+
+METHOD:: highlightColor
+(describe method here)
+
+argument:: color
+(describe argument here)
+
+returns:: (returnvalue)
+
+METHOD:: highlightSize
+(describe method here)
+
+argument:: size
+(describe argument here)
+
+returns:: (returnvalue)
+
+METHOD:: background
+(describe method here)
+
+argument:: val
+(describe argument here)
+
+returns:: (returnvalue)
+
+METHOD:: resize
+(describe method here)
+
+argument:: resize
+(describe argument here)
+
+returns:: (returnvalue)
+
+METHOD:: pr_project
+(describe method here)
+
+returns:: (returnvalue)
+
+
+EXAMPLES::
+
+code::
+(
+var data;
+data = {{2.0.rand2}!3}!150;
+w = Window.new("3D Scatterplot", Rect(40,40, 500, 500)).front;
+a = ScatterView3d(w, Rect(10,10, 450, 450), data, [-2, 2].asSpec);
+a.drawMethod = \fillRect;
+a.symbolSize = 3;
+a.symbolColor = Color.blue;
+a.background = Color.black;
+
+// Y Slider
+Slider(w, Rect(10, 470, 450, 10)).action_{|me|
+a.rotY = me.value * 2pi;
+w.refresh;
+};
+// X Slider
+Slider(w, Rect(470, 10, 10, 450)).action_{|me|
+a.rotX = me.value * 2pi;
+w.refresh;
+};
+// Z Slider
+Slider(w, Rect(490, 10, 10, 450)).action_{|me|
+a.rotZ = me.value * 2pi;
+w.refresh;
+};
+)
+
+a.isHighlight = true;
+a.highlightColor = Color.green;
+a.highlightSize = 10&amp;lt; at &amp;gt;10;
+(
+a.highlightItem = 150.rand;
+w.refresh;
+)
+::

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.


_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>cruxxial-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f&lt; at &gt;public.gmane.org</dc:creator>
    <dc:date>2012-05-19T15:49:49</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50800">
    <title>scide crash</title>
    <link>http://comments.gmane.org/gmane.comp.audio.supercollider.devel/50800</link>
    <description>&lt;pre&gt;Hi again,

I got into a state where scide would be crashed by my ATI driver 
(fglrx on Fedora 16) immediately after launch (backtrace below).   In 
my Chrome browser, I happened to be looking at

http://www.openframeworks.cc/tutorials/firstSteps/004_presentations.html

which has some fancy slideshare viewers on it.  I was able to stop 
the crashing by switching to a different tab in Chrome, thereby 
hiding the exposed slideshare window.  Perhaps there is some kind of 
unarbitrated contention for the GPU causing this?

- jos

Crash example and backtrace follow:

  &amp;gt; scide
using visual class 4, id 29
hijackWindow() context created for ScIDE::MainWindow(0xa8ce10) 1
Segmentation fault (core dumped)
  &amp;gt;
  &amp;gt; gdb scide
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
...
This GDB was configured as "x86_64-redhat-linux-gnu".
...
Reading symbols from /usr/local/bin/scide...done.
(gdb) r
Starting program: /usr/local/bin/scide
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
using visual class 4, id 29
[New Thread 0x7fffeb9e7700 (LWP 18477)]
Detaching after fork from child process 18478.
hijackWindow() context created for ScIDE::MainWindow(0xa09960) 1

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff05a9880 in ?? () from /usr/lib64/dri/fglrx_dri.so
Missing separate debuginfos, use: debuginfo-install
GConf2-3.2.3-1.fc16.x86_64 ORBit2-2.14.19-2.fc15.x86_64
PackageKit-gtk-module-0.6.22-2.fc16.x86_64 atk-2.2.0-2.fc16.x86_64
avahi-glib-0.6.30-4.fc16.x86_64 avahi-libs-0.6.30-4.fc16.x86_64
cairo-1.10.2-4.fc16.x86_64 dbus-glib-0.92-2.fc15.x86_64
dbus-libs-1.4.10-3.fc16.x86_64 expat-2.1.0-1.fc16.x86_64
fontconfig-2.8.0-4.fc16.x86_64 freetype-2.4.6-5.fc16.x86_64
gdk-pixbuf2-2.24.1-1.fc16.x86_64 glib2-2.30.3-1.fc16.x86_64
glibc-2.14.90-24.fc16.6.x86_64 gnome-vfs2-2.24.4-6.fc16.x86_64
gtk2-2.24.8-3.fc16.x86_64 gtk2-engines-2.20.2-2.fc15.x86_64
keyutils-libs-1.5.2-1.fc16.x86_64 krb5-libs-1.9.3-1.fc16.x86_64
lcms-libs-1.19-4.fc16.x86_64 libICE-1.0.7-1.fc16.x86_64
libSM-1.2.0-2.fc15.x86_64 libX11-1.4.3-1.fc16.x86_64
libXau-1.0.6-2.fc15.x86_64 libXcomposite-0.4.3-2.fc15.x86_64
libXcursor-1.1.11-3.fc15.x86_64 libXdamage-1.1.3-2.fc15.x86_64
libXext-1.3.0-1.fc16.x86_64 libXfixes-5.0-1.fc16.x86_64
libXi-1.4.5-1.fc16.x86_64 libXinerama-1.1.1-2.fc15.x86_64
libXrandr-1.3.1-2.fc15.x86_64 libXrender-0.9.6-2.fc15.x86_64
libart_lgpl-2.3.21-2.fc15.x86_64 libbonobo-2.32.1-1.fc16.x86_64
libbonoboui-2.24.5-1.fc16.x86_64 libcanberra-0.28-3.fc16.x86_64
libcanberra-gtk2-0.28-3.fc16.x86_64 libcom_err-1.41.14-2.fc15.x86_64
libffi-3.0.10-1.fc16.x86_64 libgcc-4.6.3-2.fc16.x86_64
libgcrypt-1.5.0-2.fc16.x86_64 libgnome-2.32.1-2.fc15.x86_64
libgnome-keyring-3.2.0-1.fc16.x86_64
libgnomecanvas-2.30.3-2.fc15.x86_64 libgnomeui-2.24.5-2.fc15.x86_64
libgpg-error-1.10-1.fc16.x86_64 libicu-4.6-4.fc16.x86_64
libjpeg-turbo-1.2.0-1.fc16.x86_64 libmng-1.0.10-5.fc15.x86_64
libogg-1.2.2-3.fc15.x86_64 libpng-1.2.49-1.fc16.x86_64
libselinux-2.1.6-6.fc16.x86_64 libstdc++-4.6.3-2.fc16.x86_64
libtdb-1.2.9-10.fc16.x86_64 libtiff-3.9.5-3.fc16.x86_64
libtool-ltdl-2.4-9.fc16.x86_64 libuuid-2.20.1-2.3.fc16.x86_64
libvorbis-1.3.3-1.fc16.x86_64 libxcb-1.7-3.fc16.x86_64
libxml2-2.7.8-6.fc16.x86_64 nss-softokn-freebl-3.13.4-1.fc16.x86_64
openssl-1.0.0i-1.fc16.x86_64 pango-1.29.4-1.fc16.x86_64
pixman-0.24.4-1.fc16.x86_64 popt-1.13-9.fc16.x86_64
qt-4.8.1-5.fc16.x86_64 qt-x11-4.8.1-5.fc16.x86_64 zlib-1.2.5-6.fc16.x86_64
(gdb)
(gdb) bt
#0  0x00007ffff05a9880 in ?? () from /usr/lib64/dri/fglrx_dri.so
#1  0x00007ffff05935f2 in ?? () from /usr/lib64/dri/fglrx_dri.so
#2  0x00007ffff0117ba0 in ?? () from /usr/lib64/dri/fglrx_dri.so
#3  0x00007ffff011846e in ?? () from /usr/lib64/dri/fglrx_dri.so
#4  0x00007ffff011e0e7 in ?? () from /usr/lib64/dri/fglrx_dri.so
#5  0x00007fffeff5bf57 in ?? () from /usr/lib64/dri/fglrx_dri.so
#6  0x00007fffef6c01f9 in ?? () from /usr/lib64/dri/fglrx_dri.so
#7  0x00007fffef6c0413 in ?? () from /usr/lib64/dri/fglrx_dri.so
#8  0x000000347c2437fb in ?? () from /usr/lib64/libQtOpenGL.so.4
#9  0x000000347c244879 in
QGLFramebufferObject::QGLFramebufferObject(QSize const&amp;amp;,
QGLFramebufferObjectFormat const&amp;amp;) () from /usr/lib64/libQtOpenGL.so.4
#10 0x000000347c2764ca in QGLWindowSurface::updateGeometry() ()
     from /usr/lib64/libQtOpenGL.so.4
#11 0x000000347c277936 in QGLWindowSurface::beginPaint(QRegion const&amp;amp;) ()
     from /usr/lib64/libQtOpenGL.so.4
#12 0x00000038cdfe0f2a in ?? () from /usr/lib64/libQtGui.so.4
#13 0x00000038cde0c4f0 in QWidgetPrivate::syncBackingStore() ()
     from /usr/lib64/libQtGui.so.4
#14 0x00000038cde37dc8 in ?? () from /usr/lib64/libQtGui.so.4
#15 0x00000038cde44f1f in QApplication::x11ProcessEvent(_XEvent*) ()
     from /usr/lib64/libQtGui.so.4
#16 0x00000038cde6cbdc in ?? () from /usr/lib64/libQtGui.so.4
#17 0x00000038cca44f3d in g_main_context_dispatch ()
---Type &amp;lt;return&amp;gt; to continue, or q &amp;lt;return&amp;gt; to quit---
     from /lib64/libglib-2.0.so.0
#18 0x00000038cca45738 in ?? () from /lib64/libglib-2.0.so.0
#19 0x00000038cca4590c in g_main_context_iteration ()
     from /lib64/libglib-2.0.so.0
#20 0x00000038cd7a85bf in
QEventDispatcherGlib::processEvents(QFlags&amp;lt;QEventLoop::ProcessEventsFlag&amp;gt;)
() from /usr/lib64/libQtCore.so.4
#21 0x00000038cde6c8ce in ?? () from /usr/lib64/libQtGui.so.4
#22 0x00000038cd778a12 in
QEventLoop::processEvents(QFlags&amp;lt;QEventLoop::ProcessEventsFlag&amp;gt;) ()
from /usr/lib64/libQtCore.so.4
#23 0x00000038cd778c67 in
QEventLoop::exec(QFlags&amp;lt;QEventLoop::ProcessEventsFlag&amp;gt;) () from
/usr/lib64/libQtCore.so.4
#24 0x00000038cd77d665 in QCoreApplication::exec() ()
     from /usr/lib64/libQtCore.so.4
#25 0x000000000043711a in main (argc=1, argv=&amp;lt;optimized out&amp;gt;)
      at /l/scg/editors/sc-ide/core/main.cpp:58
(gdb)




Julius O. Smith III &amp;lt;jos-l0SEpsmuUtBegcJQxxnBRDe48wsgrGvP&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Prof. of Music and Assoc. Prof. (by courtesy) of Electrical Engineering
CCRMA, Stanford University
http://ccrma.stanford.edu/~jos/  


_______________________________________________
sc-dev mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-dev/
search: http://www.listarc.bham.ac.uk/lists/sc-dev/search/

&lt;/pre&gt;</description>
    <dc:creator>Julius Smith</dc:creator>
    <dc:date>2012-05-18T21:05:49</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.audio.supercollider.devel">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.audio.supercollider.devel</link>
  </textinput>
</rdf:RDF>

