Add the Cscroll{up,down}line commands. - 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 21076f0c6d1007710b95fb6f69b2af0d34453ec4
 (DIR) parent d8d972951595b12f68a1ef9707f71c3a93e7f04b
 (HTM) Author: Rob King <jking@deadpixi.com>
       Date:   Thu,  1 Sep 2016 11:45:48 -0500
       
       Add the Cscroll{up,down}line commands.
       
       (Also more fixes to the new mouse chording code.)
       
       Credit to Chris Siebenmann for the implementation of the
       Cscroll{up,down}line commands.
       
       Diffstat:
         Makefile                            |       1 +
         README.rst                          |       1 +
         chords.h.def                        |      20 ++++++++++++++++----
         commands.h.def                      |      38 +++++++++++++++++--------------
         include/commands.h                  |       2 ++
         samterm/main.c                      |      85 +++++++++++++++++++-------------
       
       6 files changed, 92 insertions(+), 55 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       @@ -22,6 +22,7 @@ config.mk:
        
        lXg:
                cd libXg; $(MAKE)
       +
        lframe:
                cd libframe; $(MAKE)
        
 (DIR) diff --git a/README.rst b/README.rst
       @@ -44,6 +44,7 @@ Installation and configuration is fairly simple:
        - Copy `config.mk.def` to `config.mk` and modify as needed.
        - Copy `config.h.def` to `config.h` and modify as needed.
        - Copy `commands.h.def` to `commands.h` and modify as needed.
       +- Copy `chords.h.def` to `chords.h` and modify as needed.
        - Run `make clean all`
        - Run `make install` or, if needed, `sudo make install`
        
 (DIR) diff --git a/chords.h.def b/chords.h.def
       @@ -7,6 +7,13 @@
         * end      - the end state (i.e. what mouse buttons are now pressed)
         * action   - one of the commands listed in commands.h (or commands.h.def)
         *
       + * The following values are available for state definitions:
       + *      None    - No buttons are pressed
       + *      B[1-5]  - Button n is pressed
       + *
       + * The Bn masks can be combined using the "|" operator, so
       + * "B1|B2" means "both buttons 1 and 2 pressed".
       + *
         * The default configuration shipped with sam has the mouse chords of the
         * "classic" Unix sam of the 1980s.
         */
       @@ -14,10 +21,15 @@
        {B1, B1|B2, Kcommand, Ccut},
        {B1, B1|B3, Kcommand, Cpaste},
        
       -/* The lines below "cancel" the mouse movement that is implicit above.
       - * If these lines are not present, dot will move to where the mouse is
       - * after the chords above. Some people might like that: if so, just
       - * remove these lines.
       +{B4, 0, Kcommand, Cscrollupline},
       +{B5, 0, Kcommand, Cscrolldownline},
       +
       +/* The lines below "cancel" the mouse movement that is implicit above
       + * in the Ccut and Cpaste chords. If these lines are not present, dot
       + * will move to where the mouse is after the chords above are used.
       + *
       + * Some people might like that kind of behavior: if so, just remove
       + * these lines.
         */
        {B1|B3, B1, Kcommand, Cnone},
        {B1|B2, B1, Kcommand, Cnone},
 (DIR) diff --git a/commands.h.def b/commands.h.def
       @@ -15,23 +15,27 @@
         *
         * Available commands are:
         *
       - * Cnone        - ignore the key
       - * Clineup      - move up by line
       - * Clinedown    - move down by line
       - * Ccharright   - move right by character
       - * Ccharleft    - move left by character
       - * Cdelbol      - delete to beginning of line
       - * Cdelword     - delete previous word
       - * Cdel         - delete previous character
       - * Cjump        - jump to and from the command window
       - * Cescape      - highlight recently typed text
       - * Csnarf       - copy text to the snarf buffer
       - * Cpaste       - paste text from the snarf buffer
       - * Ccut         - cut text to the snarf buffer
       - * Cexchange    - exchange operating system and sam snarf buffers
       - * Cwrite       - write the current file to disk
       - * Cbol         - move to beginning of line
       - * Ceol         - move to end of line
       + * Cnone           - ignore the key
       + * Cscrollup       - scroll up by screen
       + * Cscrolldown     - scroll down by screen
       + * Cscrollupline   - scroll up by line
       + * Cscrolldownline - scroll down by line
       + * Clineup         - move up by line
       + * Clinedown       - move down by line
       + * Ccharright      - move right by character
       + * Ccharleft       - move left by character
       + * Cdelbol         - delete to beginning of line
       + * Cdelword        - delete previous word
       + * Cdel            - delete previous character
       + * Cjump           - jump to and from the command window
       + * Cescape         - highlight recently typed text
       + * Csnarf          - copy text to the snarf buffer
       + * Cpaste          - paste text from the snarf buffer
       + * Ccut            - cut text to the snarf buffer
       + * Cexchange       - exchange operating system and sam snarf buffers
       + * Cwrite          - write the current file to disk
       + * Cbol            - move to beginning of line
       + * Ceol            - move to end of line
         *
         * The default configuration shipped with sam has the keyboard commands mapped
         * to the "classic" Unix sam of the 1980s, plus the WordStar Diamond for cursor
 (DIR) diff --git a/include/commands.h b/include/commands.h
       @@ -14,6 +14,8 @@ enum{
            Cescape,
            Cscrolldown,
            Cscrollup,
       +    Cscrolldownline,
       +    Cscrollupline,
            Cjump,
            Ccharright,
            Ccharleft,
 (DIR) diff --git a/samterm/main.c b/samterm/main.c
       @@ -9,6 +9,7 @@
        #include <commands.h>
        
        extern unsigned long _bgpixel;
       +extern void hmoveto(int, long);
        
        Text        cmd;
        Rune        *scratch;
       @@ -126,12 +127,6 @@ main(int argc, char *argv[])
                                                scroll(which, 3, fwdbut == 3 ? 3 : 1);
                                        else
                                                menu3hit();
       -                        }else if((mouse.buttons&16)){
       -                                flushtyping(0);
       -                                scroll(which, 5, 5);
       -                        }else if((mouse.buttons&8)){
       -                                flushtyping(0);
       -                                scroll(which, 4, 4);
                                }
                                mouseunblock();
                        }
       @@ -387,16 +382,15 @@ ctlu(Rasp *r, long o, long p)
        int
        center(Flayer *l, long a)
        {
       -        Text *t;
       +    Text *t = l->user1;
        
       -        t = l->user1;
       -        if(!t->lock && (a<l->origin || l->origin+l->f.nchars<a)){
       -                if(a > t->rasp.nrunes)
       -                        a = t->rasp.nrunes;
       -                outTsll(Torigin, t->tag, a, 2L);
       -                return 1;
       -        }
       -        return 0;
       +    if (!t->lock && (a < l->origin || l->origin + l->f.nchars < a)){
       +        a = (a > t->rasp.nrunes) ? t->rasp.nrunes : a;
       +        outTsll(Torigin, t->tag, a, 2L);
       +        return 1;
       +    }
       +
       +    return 0;
        }
        
        int
       @@ -530,6 +524,27 @@ cmdbol(Flayer *l, long a, Text *t)
        }
        
        static long
       +cmdscrollupline(Flayer *l, long a, Text *t)
       +{
       +    if (l->origin > 0)
       +        hmoveto(t->tag, l->origin - 1);
       +    return a;
       +}
       +
       +static long
       +cmdscrolldownline(Flayer *l, long a, Text *t)
       +{
       +    long tot = scrtotal(l);
       +    long p0 = l->origin + frcharofpt(&l->f, Pt(l->f.r.min.x, l->f.r.min.y + l->f.fheight));
       +    long p1 = l->origin + frcharofpt(&l->f, Pt(l->f.r.min.x, l->f.r.max.y - l->f.fheight/2));
       +
       +    if (p0 < tot && p1 < tot)
       +        horigin(t->tag, p0);
       +
       +    return a;
       +}
       +
       +static long
        cmdlineup(Flayer *l, long a, Text *t)
        {
            flsetselect(l, a, a);
       @@ -775,25 +790,27 @@ struct CommandEntry{
        };
        
        CommandEntry commands[Cmax] ={
       -    [Cnone]       = {cmdnone,       0},
       -    [Cscrolldown] = {cmdscrolldown, 0},
       -    [Cscrollup]   = {cmdscrollup,   0},
       -    [Ccharleft]   = {cmdcharleft,   0},
       -    [Ccharright]  = {cmdcharright,  0},
       -    [Clineup]     = {cmdlineup,     0},
       -    [Clinedown]   = {cmdlinedown,   0},
       -    [Cjump]       = {cmdjump,       0},
       -    [Cescape]     = {cmdescape,     0},
       -    [Csnarf]      = {cmdsnarf,      0},
       -    [Ccut]        = {cmdcut,        0},
       -    [Cpaste]      = {cmdpaste,      0},
       -    [Cexchange]   = {cmdexchange,   0},
       -    [Cdelword]    = {cmddelword,    1},
       -    [Cdelbol]     = {cmddelbol,     1},
       -    [Cdel]        = {cmddel,        1},
       -    [Cwrite]      = {cmdwrite,      1},
       -    [Ceol]        = {cmdeol,        0},
       -    [Cbol]        = {cmdbol,        0}
       +    [Cnone]           = {cmdnone,           0},
       +    [Cscrolldown]     = {cmdscrolldown,     0},
       +    [Cscrollup]       = {cmdscrollup,       0},
       +    [Cscrolldownline] = {cmdscrolldownline, 0},
       +    [Cscrollupline]   = {cmdscrollupline,   0},
       +    [Ccharleft]       = {cmdcharleft,       0},
       +    [Ccharright]      = {cmdcharright,      0},
       +    [Clineup]         = {cmdlineup,         0},
       +    [Clinedown]       = {cmdlinedown,       0},
       +    [Cjump]           = {cmdjump,           0},
       +    [Cescape]         = {cmdescape,         0},
       +    [Csnarf]          = {cmdsnarf,          0},
       +    [Ccut]            = {cmdcut,            0},
       +    [Cpaste]          = {cmdpaste,          0},
       +    [Cexchange]       = {cmdexchange,       0},
       +    [Cdelword]        = {cmddelword,        1},
       +    [Cdelbol]         = {cmddelbol,         1},
       +    [Cdel]            = {cmddel,            1},
       +    [Cwrite]          = {cmdwrite,          1},
       +    [Ceol]            = {cmdeol,            0},
       +    [Cbol]            = {cmdbol,            0}
        };
        
        void