Recently Written · git

clic

MIRROR ONLY Gopher client with pretty colours in Common Lisp

git clone https://github.com/equwal/clic

Log | Files | Refs


commit 63402005caf705a0707b910c66ed0f531d7b3d64
solene <solene@t400.lan>
2018-02-08 10:08:25 +0100

add Kiosk mode [currently ecl-only]

 clic.lisp        | 76 +++++++++++++++++++++++++++++++++++---------------------
 make-binary.lisp |  2 +-
 2 files changed, 49 insertions(+), 29 deletions(-)
diff --git a/clic.lisp b/clic.lisp
index 051e7ef..d11f7d9 100644
--- a/clic.lisp
+++ b/clic.lisp
@@ -41,6 +41,15 @@
 (defstruct location host port type uri
            :predicate)
 
+;;;; kiosk mode on/off
+(defparameter *kiosk-mode* nil)
+
+(defmacro kiosk-mode(&body code)
+  "prevent code if kiosk mode is enabled"
+  `(progn
+     (when (not *kiosk-mode*)
+       ,@code)))
+
 ;;;; BEGIN GLOBAL VARIABLES
 
 ;;; array of lines in buffer
@@ -261,7 +270,6 @@
    (format stream "~a~a~a" uri #\Return #\Newline)
    (force-output stream)
 
-
    ;; save into a file in /tmp
    (let* ((filename (subseq uri (1+ (position #\/ uri :from-end t))))
           (path (concatenate 'string "/tmp/" filename)))
@@ -318,8 +326,9 @@
          (visit destination))
         ;; visit http link
         ((search "URL:" destination)
-         (uiop:run-program (list "xdg-open"
-                                 (subseq destination 4))))))))
+         (kiosk-mode
+	  (uiop:run-program (list "xdg-open"
+				  (subseq destination 4)))))))))
 
 (defun filter-line(text)
   "display only lines containg text"
@@ -334,7 +343,6 @@
      do
        (when (search text (car (split (subseq line 1) #\Tab)) :test #'char-equal)
          (vector-push line *buffer*)))
-
   (display-interactive-menu))
 
 (defun load-file-menu(path)
@@ -449,6 +457,7 @@
     ;; exit
     ((or
       (eql nil input)
+      (string= "NIL" input)
       (string= "." input)
       (string= "exit" input)
       (string= "x" input)
@@ -468,15 +477,16 @@
 
 (defun display-interactive-binary-file()
   "call xdg-open on the binary file"
-  (let* ((location (car *history*))
-         (filename (subseq ;; get the text after last /
-                    (location-uri location)
-                    (1+ (position #\/
-                                  (location-uri location)
-                                  :from-end t))))
-         (filepath (concatenate 'string "/tmp/" (or filename "index"))))
-    (uiop:run-program (list "xdg-open" filepath))))
-
+  (kiosk-mode
+   (let* ((location (car *history*))
+	  (filename (subseq ;; get the text after last /
+		     (location-uri location)
+		     (1+ (position #\/
+				   (location-uri location)
+				   :from-end t))))
+	  (filepath (concatenate 'string "/tmp/" (or filename "index"))))
+     (uiop:run-program (list "xdg-open" filepath)))))
+  
 (defun display-text-stdout()
   "display the buffer to stdout"
   (foreach-buffer
@@ -496,6 +506,13 @@
                       :input :interactive
                       :output :interactive)))
 
+;; display a text file using the pager by piping
+;; the data to out, no temp file
+(defun display-with-pager-kiosk()
+  (loop for line across *buffer*
+	do
+	(format t "~a~%" line)))
+
 (defun display-interactive-menu()
   "display a menu"
   ;; we store the user input outside of the loop
@@ -605,9 +622,10 @@
 
            ;; if not type 0 1 7 then it's binary
            (t
-            (download-binary (location-host destination)
-                             (location-port destination)
-                             (location-uri destination))
+	    (kiosk-mode
+	     (download-binary (location-host destination)
+			      (location-port destination)
+			      (location-uri destination)))
             'binary))))
 
 
@@ -624,20 +642,24 @@
         (display-interactive-menu)
         (progn
           (if (eql type 'text)
-              (display-with-pager)
-              (display-interactive-binary-file))
-          ;; redraw last menu
-          ;; we need to get previous buffer and reset links numbering
-          (pop *history*)
-          (when *previous-buffer*
-            (setf *buffer* (copy-array *previous-buffer*))
-            (setf *links* (make-hash-table))
-            (display-interactive-menu))))))
+              (if *kiosk-mode*
+                  (display-with-pager-kiosk)
+		  (display-with-pager))
+	    (kiosk-mode (display-interactive-binary-file)))
+	   ;; redraw last menu
+	   ;; we need to get previous buffer and reset links numbering
+	   (pop *history*)
+	   (when (and
+		  *previous-buffer*
+		  (not *kiosk-mode*))
+	     (setf *buffer* (copy-array *previous-buffer*))
+	     (setf *links* (make-hash-table))
+	     (display-interactive-menu))))))
 
 
 (defun display-prompt()
   (let ((last-page (car *history*)))
-    (format t "gopher://~a:~a/~a~a (~as) / (P)rev (R)eload (H)istory : "
+    (format t "gopher://~a:~a/~a~a (~as) / (P)rev (R)edisplay (H)istory : "
             (location-host last-page)
             (location-port last-page)
             (location-type last-page)
@@ -706,5 +728,3 @@
 #+ecl
 (defconstant +uri-rules+
   '(("*DEFAULT*" 1 "" :stop)))
-
-
diff --git a/make-binary.lisp b/make-binary.lisp
index 282df84..510080f 100644
--- a/make-binary.lisp
+++ b/make-binary.lisp
@@ -9,7 +9,7 @@
 #+ecl
 (progn
   (compile-file "clic.lisp" :system-p t)
-  (c:build-program "clic" :epilogue-code '(progn (main)) :lisp-files '("clic.o")))
+  (c:build-program "clic" :epilogue-code '(progn (handler-case (main)  (condition () (quit)))) :lisp-files '("clic.o")))
 #+sbcl
 (progn
   (require 'sb-bsd-sockets)