st-scrollback-mouse-20170427-5a10aca.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-scrollback-mouse-20170427-5a10aca.diff (2287B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 3e9cda5..a9c65a9 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -156,8 +156,14 @@ unsigned int defaultattr = 11;
            6   */
            7  MouseShortcut mshortcuts[] = {
            8          /* button               mask            string */
            9 -        { Button4,              XK_ANY_MOD,     "\031" },
           10 -        { Button5,              XK_ANY_MOD,     "\005" },
           11 +        { Button4,              XK_NO_MOD,      "\031" },
           12 +        { Button5,              XK_NO_MOD,      "\005" },
           13 +};
           14 +
           15 +MouseKey mkeys[] = {
           16 +        /* button               mask            function        argument */
           17 +        { Button4,              ShiftMask,      kscrollup,      {.i =  1} },
           18 +        { Button5,              ShiftMask,      kscrolldown,    {.i =  1} },
           19  };
           20  
           21  /* Internal keyboard shortcuts. */
           22 diff --git a/st.c b/st.c
           23 index b74b9dc..d33eb5b 100644
           24 --- a/st.c
           25 +++ b/st.c
           26 @@ -237,6 +237,7 @@ static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
           27  /* config.h array lengths */
           28  size_t colornamelen = LEN(colorname);
           29  size_t mshortcutslen = LEN(mshortcuts);
           30 +size_t mkeyslen = LEN(mkeys);
           31  size_t shortcutslen = LEN(shortcuts);
           32  size_t selmaskslen = LEN(selmasks);
           33  
           34 diff --git a/st.h b/st.h
           35 index 2d9b028..ca90c31 100644
           36 --- a/st.h
           37 +++ b/st.h
           38 @@ -182,6 +182,13 @@ typedef union {
           39  } Arg;
           40  
           41  typedef struct {
           42 +        uint b;
           43 +        uint mask;
           44 +        void (*func)(const Arg *);
           45 +        const Arg arg;
           46 +} MouseKey;
           47 +
           48 +typedef struct {
           49          uint mod;
           50          KeySym keysym;
           51          void (*func)(const Arg *);
           52 @@ -271,6 +278,8 @@ extern unsigned int mousebg;
           53  extern unsigned int defaultattr;
           54  extern MouseShortcut mshortcuts[];
           55  extern size_t mshortcutslen;
           56 +extern MouseKey mkeys[];
           57 +extern size_t mkeyslen;
           58  extern Shortcut shortcuts[];
           59  extern size_t shortcutslen;
           60  extern uint forceselmod;
           61 diff --git a/x.c b/x.c
           62 index 495cd90..67dcfdc 100644
           63 --- a/x.c
           64 +++ b/x.c
           65 @@ -248,6 +248,7 @@ bpress(XEvent *e)
           66  {
           67          struct timespec now;
           68          MouseShortcut *ms;
           69 +        MouseKey *mk;
           70  
           71          if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
           72                  mousereport(e);
           73 @@ -262,6 +263,14 @@ bpress(XEvent *e)
           74                  }
           75          }
           76  
           77 +        for (mk = mkeys; mk < mkeys + mkeyslen; mk++) {
           78 +                if (e->xbutton.button == mk->b
           79 +                                && match(mk->mask, e->xbutton.state)) {
           80 +                        mk->func(&mk->arg);
           81 +                        return;
           82 +                }
           83 +        }
           84 +
           85          if (e->xbutton.button == Button1) {
           86                  clock_gettime(CLOCK_MONOTONIC, &now);
           87