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