From 9febb10bd7853319f3bfa2b5472e23b0cba207b4 Mon Sep 17 00:00:00 2001
From: Alessandro Ranellucci <aar@cpan.org>
Date: Sun, 8 Nov 2015 10:10:54 +0100
Subject: [PATCH] Smoother manual control movements

---
 lib/Slic3r/GUI/Controller/ManualControlDialog.pm |  3 +++
 xs/src/libslic3r/GCodeSender.cpp                 | 11 +++++++----
 xs/src/libslic3r/GCodeSender.hpp                 |  2 +-
 xs/xsp/GCodeSender.xsp                           |  2 +-
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/lib/Slic3r/GUI/Controller/ManualControlDialog.pm b/lib/Slic3r/GUI/Controller/ManualControlDialog.pm
index 3f971d3e3..d22d86d79 100644
--- a/lib/Slic3r/GUI/Controller/ManualControlDialog.pm
+++ b/lib/Slic3r/GUI/Controller/ManualControlDialog.pm
@@ -58,6 +58,9 @@ sub new {
         $canvas->interactive(1);
         $canvas->on_move(sub {
             my ($pos) = @_;
+            
+            # delete any pending commands to get a smoother movement
+            $self->purge_queue(1);
             $self->abs_xy_move($pos);
         });
         $bed_sizer->Add($canvas, 0, wxEXPAND | wxRIGHT, 3);
diff --git a/xs/src/libslic3r/GCodeSender.cpp b/xs/src/libslic3r/GCodeSender.cpp
index c7d7cd996..7f6b7af08 100644
--- a/xs/src/libslic3r/GCodeSender.cpp
+++ b/xs/src/libslic3r/GCodeSender.cpp
@@ -172,15 +172,18 @@ GCodeSender::resume_queue()
 }
 
 void
-GCodeSender::purge_queue()
+GCodeSender::purge_queue(bool priority)
 {
     boost::lock_guard<boost::mutex> l(this->queue_mutex);
-    {
+    std::queue<std::string> empty;
+    if (priority) {
+        // clear priority queue
+        std::swap(this->priqueue, empty);
+    } else {
         // clear queue
-        std::queue<std::string> empty;
         std::swap(this->queue, empty);
+        this->queue_paused = false;
     }
-    this->queue_paused = false;
 }
 
 // purge log and return its contents
diff --git a/xs/src/libslic3r/GCodeSender.hpp b/xs/src/libslic3r/GCodeSender.hpp
index 01a52d208..5390e8e9e 100644
--- a/xs/src/libslic3r/GCodeSender.hpp
+++ b/xs/src/libslic3r/GCodeSender.hpp
@@ -28,7 +28,7 @@ class GCodeSender : private boost::noncopyable {
     size_t queue_size() const;
     void pause_queue();
     void resume_queue();
-    void purge_queue();
+    void purge_queue(bool priority = false);
     std::vector<std::string> purge_log();
     std::string getT() const;
     std::string getB() const;
diff --git a/xs/xsp/GCodeSender.xsp b/xs/xsp/GCodeSender.xsp
index cef61128f..9ff9281bf 100644
--- a/xs/xsp/GCodeSender.xsp
+++ b/xs/xsp/GCodeSender.xsp
@@ -18,7 +18,7 @@
     void send(std::string s, bool priority = false);
     void pause_queue();
     void resume_queue();
-    void purge_queue();
+    void purge_queue(bool priority = false);
     std::vector<std::string> purge_log();
     std::string getT();
     std::string getB();