~ chicken-core (chicken-5) 6a5a70b0e39adcba2c106a035dfb7005b8841ebf
commit 6a5a70b0e39adcba2c106a035dfb7005b8841ebf
Author: felix <bunny351@gmail.com>
AuthorDate: Thu Jun 3 09:08:00 2010 +0200
Commit: felix <bunny351@gmail.com>
CommitDate: Thu Jun 3 09:08:00 2010 +0200
fixed bug in handling of file-requirements table for extensions; fixed broken yes-or-no? in gui mode
diff --git a/eval.scm b/eval.scm
index cb00ab75..d557e62a 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1234,10 +1234,12 @@
,@(if s `((##core#require-for-syntax ',id)) '())
,@(if (or nr (and (not rr) s))
'()
- `((##sys#require
- ,@(map (lambda (id) `',id)
- (cond (rr (cdr rr))
- (else (list id)) ) ) ) ) ) )
+ (begin
+ (add-req id #f)
+ `((##sys#require
+ ,@(map (lambda (id) `',id)
+ (cond (rr (cdr rr))
+ (else (list id)) ) ) ) ) ) ) )
impid #f)
#t) ) )
(else
diff --git a/manual/Unit utils b/manual/Unit utils
index d4515bbe..e1af0895 100644
--- a/manual/Unit utils
+++ b/manual/Unit utils
@@ -110,7 +110,8 @@ button in case of a dialog box). {{title}} specifies the text shown
in the caption of the dialog box and is ignored when not running in
GUI mode. {{abort}} should be a zero-argument procedure that is
called when the user selects "abort". The default value for {{abort}}
-is the {{reset}} procedure.
+is the {{reset}} procedure. A value of {{#f}} for {{abort}} disables
+aborting completely.
Previous: [[Unit posix]]
diff --git a/utils.scm b/utils.scm
index 418129ac..03bd4ed6 100644
--- a/utils.scm
+++ b/utils.scm
@@ -136,9 +136,10 @@
# include <windows.h>
# define C_HAS_MESSAGE_BOX 1
static int
-C_confirmation_dialog(char *msg, char *caption, int def)
+C_confirmation_dialog(char *msg, char *caption, int def, int abort)
{
int d = 0, r;
+ int t = abort ? MB_YESNOCANCEL : MB_YESNO;
switch(def) {
case 0: d = MB_DEFBUTTON1; break;
@@ -146,7 +147,7 @@ C_confirmation_dialog(char *msg, char *caption, int def)
case 2: d = MB_DEFBUTTON3;
}
- r = MessageBox(NULL, msg, caption, MB_YESNOCANCEL | MB_ICONQUESTION | d);
+ r = MessageBox(NULL, msg, caption, t | MB_ICONQUESTION | d);
switch(r) {
case IDYES: return 1;
@@ -157,39 +158,49 @@ C_confirmation_dialog(char *msg, char *caption, int def)
#else
# define C_HAS_MESSAGE_BOX 0
static int
-C_confirmation_dialog(char *msg, char *caption, int def) { return -1; }
+C_confirmation_dialog(char *msg, char *caption, int def, int abort) { return -1; }
#endif
<#
+;; Note: for Mac OS X, "CFUserNotificationDisplayAlert" could be used,
+;; unless that requires linking any libraries. This would also
+;; be useful for runtime error messages.
+
(define-foreign-variable C_HAS_MESSAGE_BOX bool)
(define yes-or-no?
- (let ((dialog (foreign-lambda int "C_confirmation_dialog" c-string c-string int)))
+ (let ((dialog (foreign-lambda int "C_confirmation_dialog" c-string c-string int bool)))
(lambda (str #!key default title (abort reset))
- (define (get-input)
- (if (and C_HAS_MESSAGE_BOX (not (##sys#fudge 4))) ; C_gui_mode
- (let ((r (dialog
- str
- (or title "CHICKEN Runtime")
- (cond ((string-ci=? default "yes") 0)
- ((string-ci=? default "no") 1)
- (else 2)))))
- (case r
- ((0) "no")
- ((1) "yes")
- (else "abort")))
- (string-trim-both (read-line))))
- (let loop ()
- (printf "~%~A (yes/no/abort) " str)
- (when default (printf "[~A] " default))
- (flush-output)
- (let ((ln (get-input)))
- (cond ((eof-object? ln) (set! ln "abort"))
- ((and default (string=? "" ln)) (set! ln default)) )
- (cond ((string-ci=? "yes" ln) #t)
- ((string-ci=? "no" ln) #f)
- ((string-ci=? "abort" ln) (abort))
- (else
- (printf "~%Please enter \"yes\", \"no\" or \"abort\".~%")
- (loop) ) ) ) ) ) ) )
+ (let ((gui (and C_HAS_MESSAGE_BOX (not (##sys#fudge 4))))) ; C_gui_mode
+ (define (get-input)
+ (if gui
+ (let ((r (dialog
+ str
+ (or title "CHICKEN Runtime")
+ (cond ((not default) 3)
+ ((string-ci=? default "yes") 0)
+ ((string-ci=? default "no") 1)
+ (else 2))
+ abort)))
+ (case r
+ ((0) "no")
+ ((1) "yes")
+ (else "abort")))
+ (string-trim-both (read-line))))
+ (let loop ()
+ (unless gui
+ (printf "~%~A (yes/no~a) " str (if abort "/abort" ""))
+ (when default (printf "[~A] " default))
+ (flush-output))
+ (let ((ln (get-input)))
+ (cond ((eof-object? ln) (set! ln "abort"))
+ ((and default (string=? "" ln)) (set! ln default)) )
+ (cond ((string-ci=? "yes" ln) #t)
+ ((string-ci=? "no" ln) #f)
+ ((and abort (string-ci=? "abort" ln)) (abort))
+ (else
+ (if abort
+ (printf "~%Please enter \"yes\" or \"no\".~%")
+ (printf "~%Please enter \"yes\", \"no\" or \"abort\".~%"))
+ (loop) ) ) ) ) ) ) ) )
Trap