Use default X cursors. - 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 d77dc3305c595d23651ca6cfdbfdf9a7503eac5c
 (DIR) parent 54d4d14c30059f3c06dd717df43c81df193c5e19
 (HTM) Author: Rob King <jking@deadpixi.com>
       Date:   Tue,  6 Sep 2016 13:54:33 -0500
       
       Use default X cursors.
       
       Diffstat:
         config.h.def                        |       6 ++++++
         include/libg.h                      |      25 +++++++++++++------------
         libXg/cursorswitch.c                |      89 +++++++++++++------------------
         libXg/getrect.c                     |      16 ++--------------
         libXg/libgint.h                     |       7 +++----
         libXg/xtbinit.c                     |      11 ++++++-----
         samterm/icons.c                     |      34 -------------------------------
         samterm/main.c                      |       2 +-
         samterm/menu.c                      |       6 +++---
         samterm/mesg.c                      |       6 +++---
         samterm/samterm.h                   |       5 +----
       
       11 files changed, 75 insertions(+), 132 deletions(-)
       ---
 (DIR) diff --git a/config.h.def b/config.h.def
       @@ -44,4 +44,10 @@
                                    "lightblue:thistle")
         */
        
       +/* You can change the default mouse cursor used by sam. By default,
       + * the "left pointer" cursor is used. Some people might prefer the
       + * Xterm-style thin bar. If so, uncomment this line.
       +#define DEFAULT_CURSOR XC_xterm
       + */
       +
        #endif
 (DIR) diff --git a/include/libg.h b/include/libg.h
       @@ -6,22 +6,31 @@
         *  Like Plan9's libg.h, but suitable for inclusion on non-Plan9 machines
         */
        
       -#define Cursor xCursor
        #include <X11/Xft/Xft.h>
       -#undef Cursor
        
        #include <commands.h>
        
        enum{ EMAXMSG = 128+8192 };        /* max event size */
        
        /*
       + * Cursors
       + */
       +
       +enum{
       +    DefaultCursor,
       +    BullseyeCursor,
       +    SweepCursor,
       +    DeadCursor,
       +    LockCursor
       +};
       +
       +/*
         * Types
         */
        
        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;
       @@ -66,14 +75,6 @@ struct  Keystroke
            Point p;
        };
        
       -struct        Cursor
       -{
       -        Point                offset;
       -        unsigned char        clr[2*16];
       -        unsigned char        set[2*16];
       -        int                id;        /* init to zero; used by library */
       -};
       -
        struct Menu
        {
                char        **item;
       @@ -179,7 +180,7 @@ extern int         rectXrect(Rectangle, Rectangle);
        extern int         eqpt(Point, Point);
        extern int         eqrect(Rectangle, Rectangle);
        extern void         border(Bitmap*, Rectangle, int, Fcode, unsigned long);
       -extern void         cursorswitch(Cursor*);
       +extern void         cursorswitch(unsigned int);
        extern void         cursorset(Point);
        extern Rectangle bscreenrect(Rectangle*);
        extern void         bflush(void);
 (DIR) diff --git a/libXg/cursorswitch.c b/libXg/cursorswitch.c
       @@ -4,63 +4,48 @@
        #include <libg.h>
        #include "libgint.h"
        
       -/*
       - * Use the id field in Cursor to hold the X id corresponding
       - * to the cursor, so that it doesn't have to be recreated on
       - * each cursorswitch.  This doesn't quite match the semantics
       - * of Plan9 libg, since the user could create a cursor (say
       - * with malloc) with garbage in the id field; or the user
       - * could change the contents of the other fields and we
       - * wouldn't know about it.  Neither of these happen in
       - * existing uses of libg.
       - */
       -static Cursor arrow =
       -{
       -        {-1, -1},
       -        {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00,
       -         0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0,
       -         0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE,
       -         0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08,
       -        },
       -        {0x00, 0x00, 0x7F, 0xC0, 0x7F, 0x00, 0x7C, 0x00,
       -         0x7E, 0x00, 0x7F, 0x00, 0x6F, 0x80, 0x67, 0xC0,
       -         0x43, 0xE0, 0x41, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
       -         0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00,
       -        }
       -};
       +#include "../config.h"
       +
       +#include <X11/cursorfont.h>
        
        static Bitmap *bsrc, *bmask;
        static Rectangle crect = { 0, 0, 16, 16 };
        
       +extern Window _topwindow;
       +
       +static Cursor sweep;
       +static Cursor crosshair;
       +static Cursor pirate;
       +static Cursor watch;
       +static Cursor defcursor;
       +
        void
       -cursorswitch(Cursor *c)
       +cursorswitch(unsigned int c)
        {
       -        if(c == 0)
       -                c = &arrow;
       -        if(c->id == 0){
       -                if(bsrc == 0){
       -                        bsrc = balloc(crect, 0);
       -                        bmask = balloc(crect, 0);
       -                }
       -                /*
       -                 * Cursor should have fg where "set" is 1,
       -                 * and bg where "clr" is 1 and "set" is 0,
       -                 * and should leave places alone where "set" and "clr" are both 0
       -                 */
       -                wrbitmap(bsrc, 0, 16, c->set);
       -#ifdef CURSORBUG
       -                /*
       -                 * Some X servers (e.g., Sun X-on-news for some color
       -                 * monitors) don't do XCreatePixmapCursor properly:
       -                 * only the mask gets displayed, all black
       -                 */
       -                wrbitmap(bmask, 0, 16, c->set);
       -#else
       -                wrbitmap(bmask, 0, 16, c->clr);
       -                bitblt(bmask, Pt(0,0), bsrc, crect, S|D);
       +    Cursor i = defcursor;
       +
       +    switch (c){
       +        case SweepCursor:    i = sweep;     break;
       +        case BullseyeCursor: i = crosshair; break;
       +        case DeadCursor:     i = pirate;    break;
       +        case LockCursor:     i = watch;     break;
       +        default:             i = defcursor; break;
       +    }
       +
       +    XDefineCursor(_dpy, _topwindow, i);
       +}
       +
       +#ifndef DEFAULT_CURSOR
       +#define DEFAULT_CURSOR XC_left_ptr
        #endif
       -                c->id = (int) XCreatePixmapCursor(_dpy, (Pixmap)bsrc->id, (Pixmap)bmask->id,
       -                        &_fgcolor, &_bgcolor, -c->offset.x, -c->offset.y);
       -        }
       -        XDefineCursor(_dpy, (Window)screen.id, (xCursor)c->id);
       +
       +void
       +initcursors(void)
       +{
       +    sweep = XCreateFontCursor(_dpy, XC_sizing);
       +    crosshair = XCreateFontCursor(_dpy, XC_crosshair);
       +    pirate = XCreateFontCursor(_dpy, XC_pirate);
       +    watch = XCreateFontCursor(_dpy, XC_watch);
       +    defcursor = XCreateFontCursor(_dpy, DEFAULT_CURSOR);
        }
       +
 (DIR) diff --git a/libXg/getrect.c b/libXg/getrect.c
       @@ -4,18 +4,6 @@
        #include <libg.h>
        #include "libgint.h"
        
       -static Cursor sweep={
       -        {-7, -7},
       -        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
       -         0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
       -         0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
       -         0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
       -        {0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
       -         0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
       -         0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
       -         0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
       -};
       -
        static void
        grabcursor(void)
        {
       @@ -44,7 +32,7 @@ getrect(int but, Mouse *m){
                Rectangle r, rc;
        
                but = 1<<(but-1);
       -        cursorswitch(&sweep);
       +        cursorswitch(SweepCursor);
                while(m->buttons)
                        *m = emouse();
                grabcursor();
       @@ -64,7 +52,7 @@ getrect(int but, Mouse *m){
                }while(m->buttons & but);
        
            Return:
       -        cursorswitch((Cursor *)0);
       +        cursorswitch(DefaultCursor);
                if(m->buttons & (7^but)){
                        rc.min.x = rc.max.x = 0;
                        rc.min.y = rc.max.y = 0;
 (DIR) diff --git a/libXg/libgint.h b/libXg/libgint.h
       @@ -14,7 +14,6 @@
         * use defines to rename X11 types Cursor, Font, Event
         */
        
       -#define Cursor xCursor
        #define Font xFont
        #define Event xEvent
        
       @@ -27,10 +26,12 @@ typedef        char*        caddr_t;
        #include <X11/Xutil.h>
        #include <X11/Xft/Xft.h>
        
       -#undef Cursor
        #undef Font
        #undef Event
        
       +/* Cursor initialization */
       +void initcursors(void);
       +
        /* Return a GCs for solid filling/strings/etc., segments/points, and tiling */
        extern GC        _getfillgc(Fcode, Bitmap*, unsigned long);
        extern GC        _getcopygc(Fcode, Bitmap*, Bitmap*, int*);
       @@ -64,8 +65,6 @@ extern unsigned long        _ld2dmask[];
         * Conventions:
         *   The .id field of a Bitmap is an X Pixmap unless the Bitmap is screen,
         *   in which case it is a Window.
       - *   The .id field of a Cursor is set to the X xCursor the first time the
       - *   cursor is used.
         *   The .id field of a Font is set to the X xFont.
         *
         *   Coordinate conventions: libg bitmaps can have non (0,0) origins,
 (DIR) diff --git a/libXg/xtbinit.c b/libXg/xtbinit.c
       @@ -9,7 +9,6 @@
        
        #define COMPRESSMOUSE
        
       -#define Cursor xCursor
        #define Font xFont
        #define Event xEvent
        
       @@ -29,7 +28,6 @@
        #define XtPointer caddr_t
        #endif
        
       -#undef Cursor
        #undef Font
        #undef Event
        
       @@ -59,6 +57,7 @@ XftColor fontcolor;
        extern char *machine;
        Display                *_dpy;
        Widget                _toplevel;
       +Window _topwindow;
        unsigned long _bgpixels[MAX_BACKGROUNDS];
        int _nbgs;
        unsigned long        _fgpixel, _bgpixel, _borderpixel;
       @@ -210,9 +209,12 @@ xtbinit(Errfunc f, char *class, int *pargc, char **argv, char **fallbacks)
                    XtSetValues(widg, args, n);
            }
        
       +    initcursors();
       +
            font = XftFontOpenName(_dpy, DefaultScreen(_dpy), getenv("FONT") ? getenv("FONT") : "monospace");
            screen.id = 0;
            XtRealizeWidget(_toplevel);
       +    _topwindow = XtWindow(_toplevel);
        
            pid_t pid = getpid();
            XChangeProperty(_dpy, XtWindow(_toplevel), XInternAtom(_dpy, "_NET_WM_PID", False), XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1);
       @@ -894,14 +896,13 @@ raisewindow(void)
        {
            XEvent e;
            Atom a = XInternAtom(_dpy, "_NET_ACTIVE_WINDOW", True);
       -    Window w = XtWindow(_toplevel);
        
       -    XRaiseWindow(_dpy, w);
       +    XRaiseWindow(_dpy, _topwindow);
        
            if (a != None){
                memset(&e, 0, sizeof(XEvent));
                e.type = ClientMessage;
       -        e.xclient.window = w;
       +        e.xclient.window = _topwindow;
                e.xclient.message_type = a;
                e.xclient.format = 32;
                e.xclient.data.l[0] = 1;
 (DIR) diff --git a/samterm/icons.c b/samterm/icons.c
       @@ -3,40 +3,6 @@
        #include <libc.h>
        #include <libg.h>
        
       -Cursor bullseye={
       -        {-7, -7},
       -        {0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0xFB, 0xDF,
       -         0xF3, 0xCF, 0xE3, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
       -         0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xC7, 0xF3, 0xCF,
       -         0x7B, 0xDF, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8,},
       -        {0x00, 0x00, 0x0F, 0xF0, 0x31, 0x8C, 0x21, 0x84,
       -         0x41, 0x82, 0x41, 0x82, 0x41, 0x82, 0x7F, 0xFE,
       -         0x7F, 0xFE, 0x41, 0x82, 0x41, 0x82, 0x41, 0x82,
       -         0x21, 0x84, 0x31, 0x8C, 0x0F, 0xF0, 0x00, 0x00,}
       -};
       -Cursor deadmouse={
       -        {-7, -7},
       -        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
       -         0x00, 0x00, 0x00, 0x0C, 0x00, 0x8E, 0x1D, 0xC7,
       -         0xFF, 0xE3, 0xFF, 0xF3, 0xFF, 0xFF, 0x7F, 0xFE, 
       -         0x3F, 0xF8, 0x17, 0xF0, 0x03, 0xE0, 0x00, 0x00,},
       -        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
       -         0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x82,
       -         0x04, 0x41, 0xFF, 0xE1, 0x5F, 0xF1, 0x3F, 0xFE, 
       -         0x17, 0xF0, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00,}
       -};
       -Cursor lockarrow={
       -        {-7, -7},
       -        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       -         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       -         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       -         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
       -        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       -         0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xC0,
       -         0x03, 0xC0, 0x07, 0xC0, 0x0E, 0xC0, 0x1C, 0xC0,
       -         0x38, 0x00, 0x70, 0x00, 0xE0, 0xDB, 0xC0, 0xDB,}
       -};
       -
        uchar darkgreybits[] = {
                0xDD, 0xDD, 0x77, 0x77, 0xDD, 0xDD, 0x77, 0x77,
                0xDD, 0xDD, 0x77, 0x77, 0xDD, 0xDD, 0x77, 0x77,
 (DIR) diff --git a/samterm/main.c b/samterm/main.c
       @@ -16,8 +16,8 @@ extern void hmoveto(int, long, Flayer *);
        Text        cmd;
        Rune        *scratch;
        long        nscralloc;
       -Cursor        *cursor;
        extern Bitmap        screen;
       +unsigned int cursor;
        Mouse        mouse;
        Flayer        *which = 0;
        Flayer  *flast = 0;
 (DIR) diff --git a/samterm/menu.c b/samterm/menu.c
       @@ -129,7 +129,7 @@ menu3hit(void)
                case Zerox:
                case Reshape:
                        if(!lock){
       -                        cursorswitch(&bullseye);
       +                        cursorswitch(BullseyeCursor);
                                buttons(Down);
                                if((mouse.buttons&4) && (l = flwhich(mouse.xy)) && getr(&r))
                                        duplicate(l, r, l->f.font, m==Reshape);
       @@ -141,7 +141,7 @@ menu3hit(void)
        
                case Close:
                        if(!lock){
       -                        cursorswitch(&bullseye);
       +                        cursorswitch(BullseyeCursor);
                                buttons(Down);
                                if((mouse.buttons&4) && (l = flwhich(mouse.xy)) && !lock){
                                        t=(Text *)l->user1;
       @@ -159,7 +159,7 @@ menu3hit(void)
        
                case Write:
                        if(!lock){
       -                        cursorswitch(&bullseye);
       +                        cursorswitch(BullseyeCursor);
                                buttons(Down);
                                if((mouse.buttons&4) && (l = flwhich(mouse.xy))){
                                        outTs(Twrite, ((Text *)l->user1)->tag);
 (DIR) diff --git a/samterm/mesg.c b/samterm/mesg.c
       @@ -324,7 +324,7 @@ void
        setlock(void)
        {
                lock++;
       -        cursorswitch(cursor = &lockarrow);
       +        cursorswitch(cursor = LockCursor);
        }
        
        void
       @@ -334,7 +334,7 @@ clrlock(void)
                if(lock > 0)
                        lock--;
                if(lock == 0)
       -                cursorswitch(cursor=(Cursor *)0);
       +                cursorswitch(cursor=DefaultCursor);
        }
        
        void
       @@ -671,7 +671,7 @@ hsetsnarf(int nc)
                int i;
                int n;
        
       -        cursorswitch(&deadmouse);
       +        cursorswitch(DeadCursor);
                s2 = alloc(nc+1);
                for(i=0; i<nc; i++)
                        s2[i] = getch();
 (DIR) diff --git a/samterm/samterm.h b/samterm/samterm.h
       @@ -55,10 +55,7 @@ extern Text        *text[];
        extern uchar        *name[];
        extern ushort        tag[];
        extern int        nname;
       -extern Cursor        bullseye;
       -extern Cursor        deadmouse;
       -extern Cursor        lockarrow;
       -extern Cursor        *cursor;
       +extern unsigned int        cursor;
        extern Flayer        *which;
        extern Flayer        *work;
        extern Text        cmd;