zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: curses module
@ 2007-10-08  2:01 Clint Adams
  2007-10-08  9:13 ` Peter Stephenson
  0 siblings, 1 reply; 3+ messages in thread
From: Clint Adams @ 2007-10-08  2:01 UTC (permalink / raw)
  To: zsh-workers

Since there's little value in building this out-of-tree, I've reworked
23821 to build in-tree, renamed a few things, relicensed it, and adapted
it to the New Module Way.

Unfortunately it depends on wide character support in ncurses
unconditionally.

Index: configure.ac
===================================================================
RCS file: /cvsroot/zsh/zsh/configure.ac,v
retrieving revision 1.69
diff -u -r1.69 configure.ac
--- configure.ac	2 Oct 2007 10:22:26 -0000	1.69
+++ configure.ac	8 Oct 2007 01:53:38 -0000
@@ -1133,7 +1133,8 @@
 	       putenv getenv setenv unsetenv xw\
 	       brk sbrk \
 	       pathconf sysconf \
-	       tgetent tigetflag tigetnum tigetstr setupterm \
+	       tgetent tigetflag tigetnum tigetstr setupterm initscr \
+	       setcchar \
 	       pcre_compile pcre_study pcre_exec \
 	       nl_langinfo \
 	       erand48 open_memstream \
Index: Src/Modules/curses.c
===================================================================
RCS file: Src/Modules/curses.c
diff -N Src/Modules/curses.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Src/Modules/curses.c	8 Oct 2007 01:53:38 -0000
@@ -0,0 +1,331 @@
+/*
+ * curses.c - curses windowing module for zsh
+ *
+ * This file is part of zsh, the Z shell.
+ *
+ * Copyright (c) 2007  Clint Adams
+ * All rights reserved.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and to distribute modified versions of this software for any
+ * purpose, provided that the above copyright notice and the following
+ * two paragraphs appear in all copies of this software.
+ *
+ * In no event shall Clint Adams or the Zsh Development Group be liable
+ * to any party for direct, indirect, special, incidental, or consequential
+ * damages arising out of the use of this software and its documentation,
+ * even if Clint Adams and the Zsh Development Group have been advised of
+ * the possibility of such damage.
+ *
+ * Clint Adams and the Zsh Development Group specifically disclaim any
+ * warranties, including, but not limited to, the implied warranties of
+ * merchantability and fitness for a particular purpose.  The software
+ * provided hereunder is on an "as is" basis, and Clint Adams and the
+ * Zsh Development Group have no obligation to provide maintenance,
+ * support, updates, enhancements, or modifications.
+ *
+ */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+
+#include <ncurses.h>
+#include <wchar.h>
+
+#include <stdio.h>
+
+#include "curses.mdh"
+#include "curses.pro"
+
+static char *nam="curses";
+
+#define ZCURSES_MAX_WINDOWS 9
+
+static WINDOW *zcurses_WIN[ZCURSES_MAX_WINDOWS + 1];
+
+/**/
+static int
+bin_zcurses_newwin(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    int nlines, ncols, begin_y, begin_x;
+    unsigned winnum;
+
+    nlines = atoi(args[0]);
+    ncols = atoi(args[1]);
+    begin_y = atoi(args[2]);
+    begin_x = atoi(args[3]);
+    winnum = atoi(args[4]);
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[4], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]!=NULL) {
+        zwarnnam(nam, "window number %s already defined", args[4], 0);
+        return 1;
+    }
+
+    zcurses_WIN[winnum]=newwin(nlines, ncols, begin_y, begin_x);
+
+    if(zcurses_WIN[winnum]==NULL)
+	return 1;
+
+    return 0;
+}
+
+/**/
+static int
+bin_zcurses_delwin(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    unsigned winnum;
+
+    winnum = atoi(args[0]);
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[0], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]==NULL) {
+        zwarnnam(nam, "window number %s does not exist", args[0], 0);
+        return 1;
+    }
+
+    if(delwin(zcurses_WIN[winnum])!=OK)
+	return 1;
+
+    zcurses_WIN[winnum]=NULL;
+    return 0;
+}
+
+/**/
+static int
+bin_zcurses_wrefresh(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    unsigned winnum;
+
+    winnum = atoi(args[0]);
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[0], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]==NULL) {
+        zwarnnam(nam, "window number %s does not exist", args[0], 0);
+        return 1;
+    }
+
+    if(wrefresh(zcurses_WIN[winnum])!=OK)
+	return 1;
+
+    return 0;
+}
+
+/**/
+static int
+bin_zcurses_wmove(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    int y, x;
+    unsigned winnum;
+
+    winnum = atoi(args[0]);
+    y = atoi(args[1]);
+    x = atoi(args[2]);
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[0], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]==NULL) {
+        zwarnnam(nam, "window number %s is not defined", args[0], 0);
+        return 1;
+    }
+
+    if(wmove(zcurses_WIN[winnum], y, x)!=OK)
+	return 1;
+
+    return 0;
+}
+
+/**/
+static int
+bin_zcurses_wadd_wch(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    unsigned winnum;
+    wchar_t c;
+    cchar_t cc;
+
+    winnum = atoi(args[0]);
+
+    if(mbrtowc(&c, args[1], MB_CUR_MAX, NULL) < 1)
+	return 1;
+
+    if (setcchar(&cc, &c, A_NORMAL, 0, NULL)==ERR)
+	return 1;
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[0], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]==NULL) {
+        zwarnnam(nam, "window number %s is not defined", args[0], 0);
+        return 1;
+    }
+
+    if(wadd_wch(zcurses_WIN[winnum], &cc)!=OK)
+	return 1;
+
+    return 0;
+}
+
+/**/
+static int
+bin_zcurses_wadd_wchstr(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    unsigned winnum;
+    wchar_t *ws;
+    cchar_t *wcc;
+    size_t sl;
+
+    winnum = atoi(args[0]);
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[0], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]==NULL) {
+        zwarnnam(nam, "window number %s is not defined", args[0], 0);
+        return 1;
+    }
+
+    sl = strlen(args[1]);
+
+    if(sl == 0) {
+        return 0;
+    }
+
+    ws = malloc(sl * sizeof(wchar_t));
+
+    if(mbstowcs(ws, args[1], sl) < 1) {
+	free(ws);
+	return 1;
+    }
+
+    wcc = malloc(wcslen(ws) * sizeof(cchar_t));
+
+    if (setcchar(wcc, ws, A_NORMAL, 0, NULL)==ERR) {
+	return 1;
+    }
+
+    free(ws);
+
+    if(wadd_wchstr(zcurses_WIN[winnum], wcc)!=OK) {
+        free(wcc);
+	return 1;
+    }
+
+    free(wcc);
+    return 0;
+}
+
+/**/
+static int
+bin_zcurses_wborder(char *nam, char **args, Options ops, UNUSED(int func))
+{
+    unsigned winnum;
+
+    winnum = atoi(args[0]);
+
+    if(winnum > ZCURSES_MAX_WINDOWS) {
+        zerrnam(nam, "bad window number: %s", args[0], 0);
+        return 1;
+    }
+
+    if(zcurses_WIN[winnum]==NULL) {
+        zwarnnam(nam, "window number %s does not exist", args[0], 0);
+        return 1;
+    }
+
+    if(wborder(zcurses_WIN[winnum], 0, 0, 0, 0, 0, 0, 0, 0)!=OK)
+	return 1;
+
+    return 0;
+}
+
+
+
+/*
+ * boot_ is executed when the module is loaded.
+ */
+
+static struct builtin bintab[] = {
+    BUILTIN("zcurses_newwin", 0, bin_zcurses_newwin, 5, 5, 0, NULL, NULL),
+    BUILTIN("zcurses_delwin", 0, bin_zcurses_delwin, 1, 1, 0, NULL, NULL),
+    BUILTIN("zcurses_wrefresh", 0, bin_zcurses_wrefresh, 1, 1, 0, NULL, NULL),
+    BUILTIN("zcurses_wmove", 0, bin_zcurses_wmove, 3, 3, 0, NULL, NULL),
+    BUILTIN("zcurses_wadd_wch", 0, bin_zcurses_wadd_wch, 2, 2, 0, NULL, NULL),
+    BUILTIN("zcurses_wadd_wchstr", 0, bin_zcurses_wadd_wchstr, 2, 2, 0, NULL, NULL),
+    BUILTIN("zcurses_wborder", 0, bin_zcurses_wborder, 1, 1, 0, NULL, NULL),
+};
+
+static struct features module_features = {
+    bintab, sizeof(bintab)/sizeof(*bintab),
+    NULL, 0,
+    NULL, 0,
+    NULL, 0,
+    0
+};
+
+/**/
+int
+setup_(UNUSED(Module m))
+{
+    return 0;
+}
+
+/**/
+int
+features_(Module m, char ***features)
+{
+    *features = featuresarray(m, &module_features);
+    return 0;
+}
+
+/**/
+int
+enables_(Module m, int **enables)
+{
+    return handlefeatures(m, &module_features, enables);
+}
+
+/**/
+int
+boot_(Module m)
+{
+    int i;
+    for(i=1;i<=ZCURSES_MAX_WINDOWS;i++)
+	zcurses_WIN[i]=NULL;
+
+    zcurses_WIN[0]=initscr();
+
+    return 0;
+}
+
+/**/
+int
+cleanup_(Module m)
+{
+    return setfeatureenables(m, &module_features, NULL);
+}
+
+/**/
+int
+finish_(UNUSED(Module m))
+{
+    return 0;
+}
Index: Src/Modules/curses.mdd
===================================================================
RCS file: Src/Modules/curses.mdd
diff -N Src/Modules/curses.mdd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Src/Modules/curses.mdd	8 Oct 2007 01:53:38 -0000
@@ -0,0 +1,7 @@
+name=zsh/curses
+link='if test "x$ac_cv_func_initscr" = xyes -a "x$ac_cv_header_curses_h" = xyes -a "x$ac_cv_func_setcchar" = xyes; then echo dynamic; else echo no; fi'
+load=no
+
+autobins="zcurses_newwin"
+
+objects="curses.o"


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: PATCH: curses module
  2007-10-08  2:01 PATCH: curses module Clint Adams
@ 2007-10-08  9:13 ` Peter Stephenson
  2007-10-08 11:15   ` Clint Adams
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Stephenson @ 2007-10-08  9:13 UTC (permalink / raw)
  To: zsh-workers

On Sun, 7 Oct 2007 22:01:28 -0400
Clint Adams <clint@zsh.org> wrote:
> Since there's little value in building this out-of-tree, I've reworked
> 23821 to build in-tree, renamed a few things, relicensed it, and adapted
> it to the New Module Way.
> 
> Unfortunately it depends on wide character support in ncurses
> unconditionally.

I suppose it might be sensible to test for multibyte support early on in
configure and if it's present put ncursesw to the front of the library
search list?  (With last week's patch --with-term-lib=ncursesw works.)

Would it be more consistent to make zcurses the command name and
the action the first argument (c.f. zle, ztcp, zsocket, ...)?

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: PATCH: curses module
  2007-10-08  9:13 ` Peter Stephenson
@ 2007-10-08 11:15   ` Clint Adams
  0 siblings, 0 replies; 3+ messages in thread
From: Clint Adams @ 2007-10-08 11:15 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: zsh-workers

On Mon, Oct 08, 2007 at 10:13:42AM +0100, Peter Stephenson wrote:
> I suppose it might be sensible to test for multibyte support early on in
> configure and if it's present put ncursesw to the front of the library
> search list?  (With last week's patch --with-term-lib=ncursesw works.)

On Debian I need to do --with-term-lib=ncursesw and
CPPFLAGS=-I/usr/include/ncursesw , though I am led to believe
that with the next version of ncurses, the wide support will
be in the main library.

> Would it be more consistent to make zcurses the command name and
> the action the first argument (c.f. zle, ztcp, zsocket, ...)?

Sounds fine.  I'll try to make this adjustment and add some
documentation in a few hours.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-10-08 11:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-08  2:01 PATCH: curses module Clint Adams
2007-10-08  9:13 ` Peter Stephenson
2007-10-08 11:15   ` Clint Adams

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).