URI: 
       tmouse scrolling - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 3d991901316747fa00d754b2e93f71a41adb9d33
   DIR parent 863f36263154c5b9fe6ae67f0f1f67719d9dd242
  HTML Author: rsc <devnull@localhost>
       Date:   Wed,  9 Jun 2004 14:54:37 +0000
       
       mouse scrolling
       
       Diffstat:
         M NOTES                               |      25 +++++++++++++++++++++++++
         M src/cmd/9term/9term.c               |      36 +++++++++++++++++++++++--------
       
       2 files changed, 52 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/NOTES b/NOTES
       t@@ -164,6 +164,31 @@ acme -W spec
        where spec can be WIDTHxHEIGHT, WIDTHxHEIGHT@XMIN,YMIN
        'XMIN YMIN XMAX YMAX' or XMIN,YMIN,XMAX,YMAX.
        
       +* Mouse scrolling
       +
       +The libraries pass along buttons 4 and 5, so if you have a 
       +scroll mouse and have X configured to send the up/down 
       +events as buttons 4 and 5, acme and 9term will scroll in
       +response.
       +
       +You will likely need to change your X config to enable this.
       +In my XF86Config-4 I have
       +
       +Section "InputDevice"
       +        Identifier        "Mouse0"
       +        Driver        "mouse"
       +        Option        "Buttons" "5"
       +        Option        "Emulate3Buttons" "off"
       +        Option        "Protocol" "ImPS/2"
       +        Option        "ZAxisMapping" "4 5"
       +        Option        "Device" "/dev/psaux"
       +EndSection
       +
       +You'll want to find your mouse section (which may have
       +a different Identifier -- just leave it alone) and edit that.
       +The "Buttons", "Protocol", "ZAxisMapping", and "Emulate3Buttons"
       +lines are all important.
       +
        * Helping out
        
        If you'd like to help out, great!
   DIR diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
       t@@ -115,6 +115,8 @@ void        plumbstart(void);
        void        plumb(uint, uint);
        void        plumbclick(uint*, uint*);
        uint        insert(Rune*, int, uint, int);
       +void scrolldown(int);
       +void scrollup(int);
        
        #define        runemalloc(n)                malloc((n)*sizeof(Rune))
        #define        runerealloc(a, n)        realloc(a, (n)*sizeof(Rune))
       t@@ -519,7 +521,7 @@ mouse(void)
        
                but = t.m.buttons;
        
       -        if(but != 1 && but != 2 && but != 4)
       +        if(but != 1 && but != 2 && but != 4 && but != 8 && but != 16)
                        return;
        
                if (ptinrect(t.m.xy, scrollr)) {
       t@@ -558,6 +560,12 @@ mouse(void)
                                plumb(q0, q1);
                        break;
                */
       +        case 8:
       +                scrollup(3);
       +                break;
       +        case 16:
       +                scrolldown(3);
       +                break;
                }
        }
        
       t@@ -795,6 +803,20 @@ namecomplete(void)
        }
        
        void
       +scrollup(int n)
       +{
       +        setorigin(backnl(t.org, n), 1);
       +}
       +
       +void
       +scrolldown(int n)
       +{
       +        setorigin(line2q(n), 1);
       +        if(t.qh<=t.org+t.f->nchars)
       +                consread();
       +}
       +
       +void
        key(Rune r)
        {
                Rune *rp;
       t@@ -804,20 +826,16 @@ key(Rune r)
                        return;
                switch(r){
                case Kpgup:
       -                setorigin(backnl(t.org, t.f->maxlines*2/3), 1);
       +                scrollup(t.f->maxlines*2/3);
                        return;
                case Kpgdown:
       -                setorigin(line2q(t.f->maxlines*2/3), 1);
       -                if(t.qh<=t.org+t.f->nchars)
       -                        consread();
       +                scrolldown(t.f->maxlines*2/3);
                        return;
                case Kup:
       -                setorigin(backnl(t.org, t.f->maxlines/3), 1);
       +                scrollup(t.f->maxlines/3);
                        return;
                case Kdown:
       -                setorigin(line2q(t.f->maxlines/3), 1);
       -                if(t.qh<=t.org+t.f->nchars)
       -                        consread();
       +                scrolldown(t.f->maxlines/3);
                        return;
                case Kleft:
                        if(t.q0 > 0){