Treat keyboard events as structured events. - sam - An updated version of the sam text editor.
 (HTM) git clone git://vernunftzentrum.de/sam.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 7dbd2384a6bb71e4f846fd69ce323a43d1bccec6
 (DIR) parent 008130285693511e05f4b8da9b3331af5bc0a7ad
 (HTM) Author: Rob King <jking@deadpixi.com>
       Date:   Tue, 17 May 2016 17:43:08 -0500
       
       Treat keyboard events as structured events.
       
       Keyboard events are now structures with two members: c, the
       (possibly composed) key that was pressed; and composed, which
       is nonzero if the key was composed of multiple keystrokes.
       
       This was done so that we can reliabily differentiate between
       composed and "normal" keystrokes. This makes it possible to
       insert tabs even when tab expansion is enabled (meaning a user
       could turn it on by default and still edit Makefiles easily).
       
       Diffstat:
         include/libg.h                      |      11 +++++++++--
         libXg/Gwin.h                        |       2 +-
         libXg/GwinP.h                       |       3 +++
         libXg/arith.c                       |       4 ++++
         libXg/clipline.c                    |       2 +-
         libXg/gcs.c                         |       2 +-
         libXg/gwin.c                        |      14 +++++++++-----
         libXg/latin1.c                      |       4 ++--
         libXg/rectclip.c                    |       2 +-
         libXg/xtbinit.c                     |      22 +++++++++++++---------
       
       10 files changed, 44 insertions(+), 22 deletions(-)
       ---
 (DIR) diff --git a/include/libg.h b/include/libg.h
       @@ -23,6 +23,7 @@ typedef        struct        Bitmap                Bitmap;
        typedef struct        Point                Point;
        typedef struct        Rectangle         Rectangle;
        typedef struct        Cursor                Cursor;
       +typedef struct        Keystroke        Keystroke;
        typedef struct        Mouse                Mouse;
        typedef struct        Menu                Menu;
        typedef struct        Event                Event;
       @@ -57,6 +58,12 @@ struct        Mouse
                unsigned long        msec;
        };
        
       +struct  Keystroke
       +{
       +    int c;
       +    int composed;
       +};
       +
        struct        Cursor
        {
                Point                offset;
       @@ -74,7 +81,7 @@ struct Menu
        
        struct        Event
        {
       -        int                kbdc;
       +        Keystroke        keystroke;
                Mouse                mouse;
                int                n;                /* number of characters in mesage */
                unsigned char        data[EMAXMSG];        /* message from an arbitrary file descriptor */
       @@ -182,7 +189,7 @@ extern unsigned long etimer(unsigned long, long);
        extern unsigned long event(Event*);
        extern unsigned long eread(unsigned long, Event*);
        extern Mouse         emouse(void);
       -extern int         ekbd(void);
       +extern Keystroke         ekbd(void);
        extern int         ecanread(unsigned long);
        extern int         ecanmouse(void);
        extern int         ecankbd(void);
 (DIR) diff --git a/libXg/Gwin.h b/libXg/Gwin.h
       @@ -34,7 +34,7 @@ typedef struct {
                } Gwinmouse;
        
        typedef void (*Reshapefunc)(int, int, int, int);
       -typedef void (*Charfunc)(int);
       +typedef void (*Charfunc)(int, int);
        typedef void (*Mousefunc)(Gwinmouse*);
        
        /* Method declarations */
 (DIR) diff --git a/libXg/GwinP.h b/libXg/GwinP.h
       @@ -42,4 +42,7 @@ typedef struct _GwinClassRec {
        /* External definition for class record */
        extern GwinClassRec gwinClassRec;
        
       +int unicode(unsigned char *k);
       +int latin1(unsigned char *k);
       +
        #endif /* GWINP_H */
 (DIR) diff --git a/libXg/arith.c b/libXg/arith.c
       @@ -108,17 +108,20 @@ rshift(Rectangle r, int a)
                return r;
        }
        
       +int
        eqpt(Point p, Point q)
        {
                return p.x==q.x && p.y==q.y;
        }
        
       +int
        eqrect(Rectangle r, Rectangle s)
        {
                return r.min.x==s.min.x && r.max.x==s.max.x &&
                       r.min.y==s.min.y && r.max.y==s.max.y;
        }
        
       +int
        rectXrect(Rectangle r, Rectangle s)
        {
                return r.min.x<s.max.x && s.min.x<r.max.x &&
       @@ -135,6 +138,7 @@ rectinrect(Rectangle r, Rectangle s)
                return r.max.x<=s.max.x && r.max.y<=s.max.y;
        }
        
       +int
        ptinrect(Point p, Rectangle r)
        {
                return p.x>=r.min.x && p.x<r.max.x &&
 (DIR) diff --git a/libXg/clipline.c b/libXg/clipline.c
       @@ -133,7 +133,7 @@ gsetline(Point *pp0, Point *pp1, Linedesc *l)
         *        Newman & Sproull 124 (1st edition)
         */
        
       -static
       +static int
        code(Point *p, Rectangle *r)
        {
                return( (p->x<r->min.x? 1 : p->x>=r->max.x? 2 : 0) |
 (DIR) diff --git a/libXg/gcs.c b/libXg/gcs.c
       @@ -161,7 +161,7 @@ GC
        _getgc(Bitmap *b, unsigned long gcvm, XGCValues *pgcv)
        {
                static GC gc0, gcn;
       -        static clipset = 0;
       +        static int clipset = 0;
                GC g;
                XRectangle xr;
        
 (DIR) diff --git a/libXg/gwin.c b/libXg/gwin.c
       @@ -10,6 +10,7 @@ typedef        char*        caddr_t;
        #include <X11/Xatom.h>
        #include <X11/keysym.h>
        
       +
        #ifndef XtSpecificationRelease
        #define R3
        #define XtPointer caddr_t
       @@ -161,13 +162,14 @@ Mappingaction(Widget w, XEvent *e, String *p, Cardinal *np)
                                        f = ((GwinWidget)w)->gwin.gotchar; \
                                        if (f) \
                                                for (c = 0; c < composing; c++) \
       -                                                (*f)(compose[c])
       +                                                (*f)(compose[c], 0)
        
        static void
        Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
        {
                static unsigned char compose[5];
                static int composing = -2;
       +    int composed = 0;
        
                int c, minmod;
                KeySym k, mk;
       @@ -275,11 +277,12 @@ Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
                                        c = (unsigned short)k;
                                        composing = -2;
                                } else if (composing == 4) {
       -                                c = (int)unicode(compose);
       +                                c = unicode(compose);
                                        if (c == -1) {
                                                STUFFCOMPOSE();
                                                c = (unsigned short)compose[4];
       -                                }
       +                                } else
       +                    composed = 1;
                                        composing = -2;
                                }
                        } else if (composing == 1) {
       @@ -287,7 +290,8 @@ Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
                                if (c == -1) {
                                        STUFFCOMPOSE();
                                        c = (unsigned short)compose[1];
       -                        }
       +                        } else
       +                composed = 1;
                                composing = -2;
                        }
                } else {
       @@ -304,7 +308,7 @@ Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
        
                f = ((GwinWidget)w)->gwin.gotchar;
                if(f)
       -                (*f)(c);
       +                (*f)(c, composed);
        }
        
        static void
 (DIR) diff --git a/libXg/latin1.c b/libXg/latin1.c
       @@ -291,10 +291,10 @@ latin1(unsigned char *k)
                return -1;
        }
        
       -long
       +int
        unicode(unsigned char *k)
        {
       -        long i, c;
       +        int i, c;
        
                k++;        /* skip 'X' */
                c = 0;
 (DIR) diff --git a/libXg/rectclip.c b/libXg/rectclip.c
       @@ -3,7 +3,7 @@
        #include <libc.h>
        #include <libg.h>
        
       -rectclip(Rectangle *rp, Rectangle b)                /* first by reference, second by value */
       +int rectclip(Rectangle *rp, Rectangle b)                /* first by reference, second by value */
        {
                Rectangle *bp = &b;
                /*
 (DIR) diff --git a/libXg/xtbinit.c b/libXg/xtbinit.c
       @@ -59,7 +59,7 @@ static Mouse lastmouse;
        typedef struct Ebuf {
            struct Ebuf        *next;
            int                n;
       -    unsigned char        buf[2];
       +    unsigned char        buf[20]; /* note that this must be at least as large as the largest of struct Mouse and struct Keystroke */
        } Ebuf;
        
        typedef struct Esrc {
       @@ -84,7 +84,7 @@ static int Stimer = -1;
        
        
        static void        reshaped(int, int, int, int);
       -static void        gotchar(int);
       +static void        gotchar(int, int);
        static void        gotmouse(Gwinmouse *);
        static int        ilog2(int);
        static void        pixtocolor(Pixel, XColor *);
       @@ -278,16 +278,19 @@ reshaped(int minx, int miny, int maxx, int maxy)
        }
        
        static void
       -gotchar(int c)
       +gotchar(int c, int composed)
        {
            Ebuf *eb;
       +    Keystroke k;
        
            if(!einitcalled || Skeyboard == -1)
                    return;
            eb = ebadd(&esrc[Skeyboard]);
            if (eb == 0)
                    berror("eballoc can't malloc");
       -    BPSHORT(eb->buf, (unsigned short)(c & 0xffff));
       +    k.c = c;
       +    k.composed = composed;
       +    memcpy(eb->buf, &k, sizeof(Keystroke));
            esrc[Skeyboard].count++;
        }
        
       @@ -541,7 +544,7 @@ einit(unsigned long keys)
            if(keys&Ekeyboard){
                    Skeyboard = 1;
                    esrc[Skeyboard].inuse = 1;
       -            esrc[Skeyboard].size = 1;
       +            esrc[Skeyboard].size = sizeof(Keystroke);
                    esrc[Skeyboard].count = 0;
                    if(Skeyboard >= nsrc)
                            nsrc = Skeyboard+1;
       @@ -619,7 +622,7 @@ eread(unsigned long keys, Event *e)
                                    if(i == Smouse)
                                            e->mouse = emouse();
                                    else if(i == Skeyboard)
       -                                    e->kbdc = ekbd();
       +                                    e->keystroke = ekbd();
                                    else if(i == Stimer) {
                                            esrc[i].head = 0;
                                            esrc[i].count = 0;
       @@ -671,18 +674,19 @@ emouse(void)
            return m;
        }
        
       -int
       +Keystroke
        ekbd(void)
        {
            Ebuf *eb;
            int c;
       +    Keystroke k;
        
            if(!esrc[Skeyboard].inuse)
                    berror("keyboard events not selected");
            eb = ebread(&esrc[Skeyboard]);
       -    c = BGSHORT(eb->buf);
       +    memcpy(&k, eb->buf, sizeof(Keystroke));
            free(eb);
       -    return c;
       +    return k;
        }
        
        int