diff --git a/src/Makefile b/src/Makefile index 5af8425..d8f6d50 100644 --- a/src/Makefile +++ b/src/Makefile @@ -59,7 +59,7 @@ HACKERBASE-OBJS=hackerbase.o testing.o listing.o cal-month.o \ template-list-expander.o box-drawing.o export-web-static.o \ util-dir.o dokuwiki.o racket-kwargs.o duck.o util-bst.o \ util-bst-bdict.o util-bst-ldict.o util-bst-lset.o mailman2.o \ - mailman-common.o mailman3.o mailman3-sql.o + mailman-common.o mailman3.o mailman3-sql.o tiocgwinsz.o GENDOC-SOURCES=gendoc.scm duck-extract.import.scm \ util-time.import.scm util-csv.import.scm util-git.import.scm \ @@ -544,3 +544,8 @@ MAILMAN3-SQL-SOURCES=mailman3-sql.scm configuration.import.scm mailman3-sql.o: mailman3-sql.import.scm mailman3-sql.import.scm: $(MAILMAN3-SQL-SOURCES) + +TIOCGWINSZ-SOURCES=tiocgwinsz.scm + +tiocgwinsz.o: tiocgwinsz.import.scm +tiocgwinsz.import.scm: $(TIOCGWINSZ-SOURCES) diff --git a/src/tiocgwinsz.scm b/src/tiocgwinsz.scm new file mode 100644 index 0000000..fb77d66 --- /dev/null +++ b/src/tiocgwinsz.scm @@ -0,0 +1,58 @@ +;; +;; tiocgwinsz.scm +;; +;; Get size of current terminal. +;; +;; ISC License +;; +;; Copyright 2023 Brmlab, z.s. +;; Dominik Pantůček +;; +;; Permission to use, copy, modify, and/or distribute this software +;; for any purpose with or without fee is hereby granted, provided +;; that the above copyright notice and this permission notice appear +;; in all copies. +;; +;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +;; + +(declare (unit tiocgwinsz)) + +(module + tiocgwinsz + ( + tiocgwinsz + ) + + (import scheme + (chicken foreign) + (chicken bitwise)) + + (foreign-declare "#include ") + + (define tiocgwinsz-ioctl + (foreign-lambda* + int () + " +struct winsize wss; +if (ioctl(0, TIOCGWINSZ, &wss) == 0) { + C_return(wss.ws_row*65536+wss.ws_col); +} else { + C_return(0); +} +" + )) + + (define (tiocgwinsz) + (let ((res (tiocgwinsz-ioctl))) + (values (bitwise-and res #xffff) + (arithmetic-shift res -16)))) + + )