Multi-threading bug fix
[clg] / gtk / gtk.lisp
index 5ec601e..6fb06ff 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtk.lisp,v 1.79 2007-07-12 09:02:13 espen Exp $
+;; $Id: gtk.lisp,v 1.83 2007-09-06 14:18:56 espen Exp $
 
 
 (in-package "GTK")
           (find-package "SWANK")
           (not (eq (symbol-value (find-symbol "*COMMUNICATION-STYLE*" "SWANK")) :spawn)))
       (error "When running clg in Slime, the communication style :spawn must be used in combination with multi threaded event handling. See the README file and <http://common-lisp.net/project/slime/doc/html/slime_45.html> for more information."))
+    (gdk:threads-init)  
     (let ((main-running (sb-thread:make-waitqueue)))
       (gdk:with-global-lock
        (setf *main-thread*
         (sb-thread:make-thread 
         #'(lambda () 
-            (gdk:threads-init)  
             (gdk:with-global-lock 
               (gdk:display-open display)
               #+win32(gdk:timeout-add-with-lock (/ *event-poll-interval* 1000)
     ;; This will *only* protect code entered directly in the REPL.
     (when (find-package "SWANK")
       (push #'(lambda (form) 
-               (within-main-loop (eval form)))
-       swank::*slime-repl-eval-hooks*))))
+               (within-main-loop (eval form)))
+       (symbol-value (find-symbol "*SLIME-REPL-EVAL-HOOKS*" "SWANK"))))))
 
 #-sb-thread
 (defmacro within-main-loop (&body body)
   (define-callback-marshal %assistant-page-func-callback int
     ((current-page int)))
 
-  (defbinding assistant-set-forward-func (assistant function) nil
+  (defbinding assistant-set-forward-page-func (assistant function) nil
     (assistant assistant)
     (%assistant-page-func-callback callback)
     ((register-callback-function function) pointer-data)
       #'(lambda (dialog response)
          (when (= response id)
            (funcall callback dialog))))
-     ((eq signal 'response)
+     ((string-equal signal "response")
       #'(lambda (dialog response)        
          (funcall callback dialog (dialog-find-response dialog response))))
      (callback))))
 
 
 (defmethod shared-initialize ((dialog message-dialog) names &rest initargs
-                             &key buttons text 
+                             &key message-type buttons button text 
                              #?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
                              secondary-text)
   (declare (ignore names))
   #?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
   (when secondary-text
     (message-dialog-format-secondary-markup dialog secondary-text))
+  (when (and (not buttons) (not button))
+    (loop
+     for (key value) on initargs by #'cddr
+     when (and (eq key :signal) (eq (first value) :close))
+     do (warn "Default button configuration changed from ~A to ~A" :close
+        (if (eq message-type :question) :yes-no :ok))
+        (loop-finish)))
   (if (typep buttons 'buttons-type)
       (apply #'call-next-method dialog names (plist-remove :buttons initargs))
     (call-next-method)))