On Wed, Jul 23, 2008 at 10:55:01PM +0200, Martin Toft wrote:
> I'm trying to compile cwm (/usr/xenocara/app/cwm) on Linux, as I would
> like to use this very supreme window manager on all my non-OpenBSD
> systems as well. The version of cwm that I'm working with is from
> yesterday's -current (23rd of July, 2008). The Linux distribution is
> Ubuntu Feisty.
[..]

oga@ and jsg@ pointed me to byacc - thanks! There is some yacc specific
constructs in cwm's parser that bison doesn't support.

To address the mail from [EMAIL PROTECTED]: I think this _is_
OpenBSD related (opposed to Linux related), as there might be other
OpenBSD users, like me, who want to use cwm on their non-OpenBSD boxes
as well, and Linux-only users hardly know about the cwm in OpenBSD.

The following is an attempt to make a simple guide.


OpenBSD's cwm window manager on Ubuntu Linux
--------------------------------------------

1. Install the following packages:

   byacc                libxext-dev
   libexpat1-dev        libxft-dev
   libfontconfig1-dev   libxrender-dev
   libxau-dev           xlibs-dev
   libxdmcp-dev         zlib1g-dev

   You might also need to install cvs and xterm (xterm is the default
   terminal for cwm to start when one types ctrl+alt+enter).

2. Pick an anonymous CVS server close to you:
   http://www.openbsd.org/anoncvs.html#CVSROOT

3. Checkout cwm as of July 24, 2008:

   $ export CVSROOT=(what you picked in step 2)
   $ cvs -q -d$CVSROOT checkout -D 2008-07-24 xenocara/app/cwm
   U xenocara/app/cwm/LICENSE
   U xenocara/app/cwm/Makefile
   [..]
   U xenocara/app/cwm/xmalloc.c
   U xenocara/app/cwm/xutil.c
   $ cd xenocara/app/cwm

4. Patch the source using cwm-linux.patch (attached inline further
   down):

   $ patch < cwm-linux.patch
   patching file calmwm.c
   patching file calmwm.h
   patching file conf.c
   patching file headers.h
   patching file kbfunc.c
   patching file parse.y

5. Generate the parser using byacc:

   $ byacc -d parse.y 
   $ mv y.tab.c parse.c

6. Compile and link:

   $ for i in *.c; do gcc -I /usr/include/freetype2 -c $i; done
   $ gcc -lXft -lXrender -lX11 -lXau -lXdmcp -lXext -lfontconfig -lexpat 
-lfreetype -lz -o cwm *.o

7. Enjoy:

   $ ls -l cwm
   -rwxr-xr-x 1 mt mt 83963 2008-07-24 21:21 cwm


Corrections and flames are most welcome :-)

Martin


cwm-linux.patch:

--- calmwm.c.orig       2008-07-23 15:25:38.000000000 +0200
+++ calmwm.c    2008-07-23 15:25:51.000000000 +0200
@@ -317,7 +317,7 @@
        errno = save_errno;
 }
 
-__dead void
+void
 usage(void)
 {
        extern char     *__progname;
--- calmwm.h.orig       2008-07-23 15:25:30.000000000 +0200
+++ calmwm.h    2008-07-23 15:25:45.000000000 +0200
@@ -312,7 +312,7 @@
 void                    x_setup(void);
 char                   *x_screenname(int);
 void                    x_setupscreen(struct screen_ctx *, u_int);
-__dead void             usage(void);
+void            usage(void);
 
 struct client_ctx      *client_find(Window);
 void                    client_setup(void);
--- conf.c.orig 2008-07-24 18:20:14.000000000 +0200
+++ conf.c      2008-07-24 18:37:49.000000000 +0200
@@ -464,9 +464,9 @@
        if (strchr(name, '-') == NULL)
                substring = name;
 
-       current_binding->button = strtonum(substring, 1, 3, &errstr);
-       if (errstr)
-               warnx("number of buttons is %s: %s", errstr, substring);
+       current_binding->button = strtoll(substring, NULL, 10);
+       if (errno || current_binding->button < 1 || current_binding->button > 3)
+               warn("invalid number or out of range: %s", substring);
 
        conf_mouseunbind(c, current_binding);
 
--- headers.h.orig      2008-07-24 16:52:46.000000000 +0200
+++ headers.h   2008-07-24 19:08:23.000000000 +0200
@@ -52,4 +52,8 @@
 
 #include <err.h>
 
+#define strlcpy(dst, src, size) (strncpy((dst), (src), (size) - 1))
+#define strlcat(dst, src, size) (strncat((dst), (src), (size) - 1))
+#define TAILQ_END(head) NULL
+
 #endif /* _CALMWM_HEADERS_H_ */
--- kbfunc.c.orig       2008-07-24 19:04:56.000000000 +0200
+++ kbfunc.c    2008-07-24 19:04:15.000000000 +0200
@@ -345,7 +345,7 @@
        FILE            *fp;
        char            *buf, *lbuf, *p, *home;
        char             hostbuf[MAXHOSTNAMELEN], filename[MAXPATHLEN];
-       char             cmd[256];
+       char             cmd[256], buffer[1024];
        int              l;
        size_t           len;
 
@@ -361,7 +361,9 @@
 
        TAILQ_INIT(&menuq);
        lbuf = NULL;
-       while ((buf = fgetln(fp, &len))) {
+       while (!feof(fp)) {
+               buf = fgets(buffer, sizeof(buffer), fp);
+               len = strlen(buf);
                if (buf[len - 1] == '\n')
                        buf[len - 1] = '\0';
                else {
--- parse.y.orig        2008-07-23 15:44:14.000000000 +0200
+++ parse.y     2008-07-24 18:31:47.000000000 +0200
@@ -379,11 +379,9 @@
                        const char *errstr = NULL;
 
                        *p = '\0';
-                       yylval.v.number = strtonum(buf, LLONG_MIN,
-                           LLONG_MAX, &errstr);
-                       if (errstr) {
-                               yyerror("\"%s\" invalid number: %s",
-                                   buf, errstr);
+                       yylval.v.number = strtoll(buf, NULL, 10);
+                       if (errno) {
+                               yyerror("invalid number: %s", buf);
                                return (findeol());
                        }
                        return (NUMBER);

Reply via email to