Hi,

here is a patch that fix the continue back into GTK/Event-Loop/C-code
(with the debugger and text widget).

Cheers,
Gwen

>From b242dc66c3b85ed5ccdb6367bbd30f61e4a29673 Mon Sep 17 00:00:00 2001
From: Gwenael Casaccio <mrg...@gmail.com>
Date: Mon, 21 Oct 2013 12:53:34 +0200
Subject: [PATCH] Makes the debugger/text widget non-blocking and fix the
 continue back into GTK/Event-Loop/C-code.

---
 packages/visualgst/ChangeLog               |  6 +++
 packages/visualgst/Debugger/GtkDebugger.st | 21 ++++----
 packages/visualgst/Misc/TaskQueue.st       | 80 ++++++++++++++++++++++++++++++
 packages/visualgst/Text/GtkTextWidget.st   | 39 +++++++++------
 packages/visualgst/package.xml             |  4 +-
 5 files changed, 124 insertions(+), 26 deletions(-)
 create mode 100644 packages/visualgst/Misc/TaskQueue.st

diff --git a/packages/visualgst/ChangeLog b/packages/visualgst/ChangeLog
index 124e0ce..8f34236 100644
--- a/packages/visualgst/ChangeLog
+++ b/packages/visualgst/ChangeLog
@@ -1,5 +1,11 @@
 2013-10-21  Gwenael Casaccio  <gwenael.casac...@gmail.com>
 
+	* Debugger/GtkDebugger.st: Makes the debugger non-blocking and fix the continue back into GTK/Event-Loop/C-code.
+	* Debugger/GtkTextWidget.st: Makes the debugger non-blocking and fix the continue back into GTK/Event-Loop/C-code.
+	* Misc/TaskQueue.st : Add a queue of tasks.
+
+2013-10-21  Gwenael Casaccio  <gwenael.casac...@gmail.com>
+
 	* Debugger/GtkDebugger.st: If stepping while the last context is not selected it finishes the execution
 	up to the selected context and does the stepping command.
 
diff --git a/packages/visualgst/Debugger/GtkDebugger.st b/packages/visualgst/Debugger/GtkDebugger.st
index 6420e8d..e93ff5d 100644
--- a/packages/visualgst/Debugger/GtkDebugger.st
+++ b/packages/visualgst/Debugger/GtkDebugger.st
@@ -285,25 +285,28 @@ GtkBrowsingTool subclass: GtkDebugger [
     stepInto [
         <category: 'execute events'>
 
-        self isLastContextSelected ifFalse: [ self stepToSelectedContext ].
-        debugger step.
-        self updateContextWidget
+        TaskQueue uniqueInstance add: [
+            self isLastContextSelected ifFalse: [ self stepToSelectedContext ].
+            debugger step.
+            self updateContextWidget ]
     ]
 
     stepOver [
         <category: 'execute events'>
 
-        self isLastContextSelected ifFalse: [ self stepToSelectedContext ].
-        debugger next.
-        self updateContextWidget
+        TaskQueue uniqueInstance add: [
+            self isLastContextSelected ifFalse: [ self stepToSelectedContext ].
+            debugger next.
+            self updateContextWidget ]
     ]
 
     stepOut [
         <category: 'execute events'>
 
-        self isLastContextSelected ifFalse: [ self stepToSelectedContext ].
-        debugger finish.
-        self updateContextWidget
+        TaskQueue uniqueInstance add: [
+            self isLastContextSelected ifFalse: [ self stepToSelectedContext ].
+            debugger finish.
+            self updateContextWidget ]
     ]
 
     continue [
diff --git a/packages/visualgst/Misc/TaskQueue.st b/packages/visualgst/Misc/TaskQueue.st
new file mode 100644
index 0000000..2b18096
--- /dev/null
+++ b/packages/visualgst/Misc/TaskQueue.st
@@ -0,0 +1,80 @@
+"======================================================================
+| 
+| TaskQueue class definition
+| 
+======================================================================"
+  
+"======================================================================
+| 
+| Copyright (c) 2013
+| Gwenael Casaccio <gwenael.casac...@gmail.com>,
+| 
+| 
+| This file is part of VisualGST.
+| 
+| Permission is hereby granted, free of charge, to any person obtaining
+| a copy of this software and associated documentation files (the
+| 'Software'), to deal in the Software without restriction, including
+| without limitation the rights to use, copy, modify, merge, publish,
+| distribute, sublicense, and/or sell copies of the Software, and to
+| permit persons to whom the Software is furnished to do so, subject to
+| the following conditions:
+| 
+| The above copyright notice and this permission notice shall be
+| included in all copies or substantial portions of the Software.
+| 
+| THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+| 
+======================================================================"
+
+Object subclass: TaskQueue [
+
+    TaskQueue class [ | uniqueInstance | ]
+
+    | queue |
+
+    TaskQueue class >> new [
+        <category: 'instance creation'>
+
+        ^ super new
+            initialize;
+            yourself
+    ]
+
+    TaskQueue class >> uniqueInstance [
+        <category: 'accessing'>
+
+        ^ uniqueInstance ifNil: [ uniqueInstance := self new ]
+    ]
+
+    initialize [
+        <category: 'initialization'>
+
+        queue := SharedQueue new
+    ]
+
+    add: aBlock [
+        <category: 'accessing'>
+
+        queue nextPut: aBlock
+    ]
+
+    run [
+        <category: 'accessing'>
+
+        [ | task sem |
+          sem := Semaphore new.
+          [ queue peek.
+            [ queue isEmpty ] whileFalse: [
+              task := queue next.
+              [ task ensure: [ sem signal ] ] fork"At: Processor userBackgroundPriority".
+              sem wait ] ] repeat ] fork
+    ]
+]
+
diff --git a/packages/visualgst/Text/GtkTextWidget.st b/packages/visualgst/Text/GtkTextWidget.st
index 0036562..0008237 100644
--- a/packages/visualgst/Text/GtkTextWidget.st
+++ b/packages/visualgst/Text/GtkTextWidget.st
@@ -381,17 +381,23 @@ GtkConcreteWidget subclass: GtkTextWidget [
         <category: 'smalltalk event'>
     ]
 
-    doIt: object [
+    doWithoutForkIt: object [
         <category: 'smalltalk event'>
 
-	| result |
+        | result |
         self beforeEvaluation.
         result := Behavior
-		    evaluate: self buffer selectedText
-		    to: object
-		    ifError: [ :fname :lineNo :errorString | self error: errorString ].
-	self afterEvaluation.
-	^ result
+                    evaluate: self buffer selectedText
+                    to: object
+                    ifError: [ :fname :lineNo :errorString | self error: errorString ].
+        self afterEvaluation.
+        ^ result
+    ]
+
+    doIt: object [
+        <category: 'smalltalk event'>
+
+	TaskQueue uniqueInstance add: [ self doWithoutForkIt: object ]
     ]
 
     debugIt: object [
@@ -409,19 +415,20 @@ GtkConcreteWidget subclass: GtkTextWidget [
     inspectIt: object [
         <category: 'smalltalk event'>
 
-        GtkInspector openOn: (self doIt: object)
+        TaskQueue uniqueInstance add: [ GtkInspector openOn: (self doWithoutForkIt: object) ]
     ]
 
     printIt: object [
         <category: 'smalltalk event'>
 
-        | iter start end result |
-        iter := self buffer iterOfSelectedText second.
-        result := ' ', ((self doIt: object) displayString), ' '.
-        self buffer insertInteractive: iter text: result len: result size defaultEditable: true.
-        start := self buffer getIterAtOffset: (iter getOffset - result size).
-        end := self buffer getIterAtOffset: (iter getOffset).
-        self buffer selectRange: start bound: end
+        TaskQueue uniqueInstance add:
+            [ | iter start end result |
+              iter := self buffer iterOfSelectedText second.
+              result := ' ', ((self doWithoutForkIt: object) displayString), ' '.
+              self buffer insertInteractive: iter text: result len: result size defaultEditable: true.
+              start := self buffer getIterAtOffset: (iter getOffset - result size).
+              end := self buffer getIterAtOffset: (iter getOffset).
+              self buffer selectRange: start bound: end ]
     ]
-
 ]
+
diff --git a/packages/visualgst/package.xml b/packages/visualgst/package.xml
index d21c5e3..52e7a31 100644
--- a/packages/visualgst/package.xml
+++ b/packages/visualgst/package.xml
@@ -71,6 +71,7 @@
   <filein>Gtk/GtkEntry.st</filein>
   <filein>Gtk/GtkEntryBuffer.st</filein>
   <filein>Extensions.st</filein>
+  <filein>Misc/TaskQueue.st</filein>
   <filein>Notification/AbstractEvent.st</filein>
   <filein>Notification/AddedEvent.st</filein>
   <filein>Notification/CommentedEvent.st</filein>
@@ -556,5 +557,6 @@
   <file>Icons/override.png</file>
   <file>Icons/visualgst.png</file>
   <start>VisualGST.GtkLauncher open.
-    GTK.Gtk main</start>
+         VisualGST.TaskQueue uniqueInstance run.
+         GTK.Gtk main.</start>
 </package>
-- 
1.8.3.2

_______________________________________________
help-smalltalk mailing list
help-smalltalk@gnu.org
https://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to