;; 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.78 2007/07/10 08:45:06 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)
(defun dialog-find-response (dialog id)
"Finds a symbolic response given a numeric id"
- (if (< id 0)
- (int-to-response-type id)
- (aref (user-data dialog 'responses) id)))
+ (cond
+ ((not (numberp id)) id)
+ ((< id 0) (int-to-response-type id))
+ ((aref (user-data dialog 'responses) id))))
(defmethod compute-signal-id ((dialog dialog) signal)
(declare (ignore function object args))
(let ((callback (call-next-method))
(id (dialog-response-id dialog signal)))
- (if id
- #'(lambda (dialog response)
- (when (= response id)
- (funcall callback dialog)))
- callback)))
+ (cond
+ (id
+ #'(lambda (dialog response)
+ (when (= response id)
+ (funcall callback dialog))))
+ ((string-equal signal "response")
+ #'(lambda (dialog response)
+ (funcall callback dialog (dialog-find-response dialog response))))
+ (callback))))
(defbinding dialog-run () nil
(dialog dialog))
;;; Message dialog
(defmethod allocate-foreign ((dialog message-dialog) &key (message-type :info)
- (buttons :close) flags transient-parent)
- (%message-dialog-new transient-parent flags message-type buttons))
-
-
-(defmethod shared-initialize ((dialog message-dialog) names &key text
+ button buttons flags transient-parent)
+ (let ((stock-buttons
+ (cond
+ ((and (not buttons) (not button))
+ (case message-type
+ (:question :yes-no)
+ (t :ok)))
+ ((listp buttons) :none)
+ (t buttons))))
+ (%message-dialog-new transient-parent flags message-type stock-buttons)))
+
+
+(defmethod shared-initialize ((dialog message-dialog) names &rest initargs
+ &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))
- (call-next-method))
+ (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)))
(defbinding %message-dialog-new () pointer