summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-08-20 22:18:09 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-08-20 22:18:09 +0200
commitc4fd860a561c40c7f161ff9d5886acf6f839687d (patch)
tree0716c8ed2167af995592b0b820a1eaadf6b9c15f
parent797f85f0233d1d17d887afbf73e603b93d51efcd (diff)
vt: block selection mode for snarf
-rw-r--r--sys/man/1/vt3
-rw-r--r--sys/src/cmd/vt/main.c47
2 files changed, 38 insertions, 12 deletions
diff --git a/sys/man/1/vt b/sys/man/1/vt
index 186aeec0d..6f3c35ea5 100644
--- a/sys/man/1/vt
+++ b/sys/man/1/vt
@@ -83,6 +83,9 @@ Enter raw (no echo, no interpretation) character mode for input.
.B cooked
Leave raw mode.
.TP
+.B blocksel
+Toggle block selection for mode for rio snarf buffer.
+.TP
.B exit
Exit
.IR vt .
diff --git a/sys/src/cmd/vt/main.c b/sys/src/cmd/vt/main.c
index 099c4de34..ee5a2c3f1 100644
--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -27,6 +27,7 @@ char *menutext3[] = {
"crnl",
"nl",
"raw",
+ "blocksel",
"exit",
0
};
@@ -44,6 +45,7 @@ int resize_flag = 1;
int pagemode;
int olines;
int peekc;
+int blocksel = 0;
int cursoron = 1;
int hostclosed = 0;
Menu menu2;
@@ -867,17 +869,13 @@ sendsnarf(void)
snarffp = Bopen("/dev/snarf",OREAD);
}
-int
-writesnarf(Rune *s, Rune *e)
+void
+seputrunes(Biobuf *b, Rune *s, Rune *e)
{
- Biobuf *b;
int z, p;
if(s >= e)
- return 0;
- b = Bopen("/dev/snarf", OWRITE|OTRUNC);
- if(b == nil)
- return 0;
+ return;
for(z = p = 0; s < e; s++){
if(*s){
if(*s == '\n')
@@ -890,6 +888,25 @@ writesnarf(Rune *s, Rune *e)
z++;
}
}
+}
+
+int
+snarfrect(Rectangle r)
+{
+ Biobuf *b;
+
+ b = Bopen("/dev/snarf", OWRITE|OTRUNC);
+ if(b == nil)
+ return 0;
+ if(blocksel){
+ while(r.min.y <= r.max.y){
+ seputrunes(b, onscreenr(r.min.x, r.min.y), onscreenr(r.max.x, r.min.y));
+ Bputrune(b, L'\n');
+ r.min.y++;
+ }
+ } else {
+ seputrunes(b, onscreenr(r.min.x, r.min.y), onscreenr(r.max.x, r.max.y));
+ }
Bterm(b);
return 1;
}
@@ -897,10 +914,12 @@ writesnarf(Rune *s, Rune *e)
Rectangle
drawselection(Rectangle r, Rectangle d, Image *color)
{
- while(r.min.y < r.max.y){
- d = drawselection(Rect(r.min.x, r.min.y, xmax+1, r.min.y), d, color);
- r.min.x = 0;
- r.min.y++;
+ if(!blocksel){
+ while(r.min.y < r.max.y){
+ d = drawselection(Rect(r.min.x, r.min.y, xmax+1, r.min.y), d, color);
+ r.min.x = 0;
+ r.min.y++;
+ }
}
if(r.min.x >= r.max.x)
return d;
@@ -938,7 +957,7 @@ selection(void)
} while(button1());
if((mc->buttons & 07) == 5)
sendsnarf();
- else if(writesnarf(onscreenr(r.min.x, r.min.y), onscreenr(r.max.x, r.max.y))){
+ else if(snarfrect(r)){
d = drawselection(r, ZR, green);
flushimage(display, 1);
sleep(200);
@@ -954,6 +973,7 @@ readmenu(void)
menu3.item[1] = ttystate[cs->raw].crnl ? "cr" : "crnl";
menu3.item[2] = ttystate[cs->raw].nlcr ? "nl" : "nlcr";
menu3.item[3] = cs->raw ? "cooked" : "raw";
+ menu3.item[4] = blocksel ? "linesel" : "blocksel";
switch(menuhit(3, mc, &menu3, nil)) {
case 0: /* 24x80 */
@@ -969,6 +989,9 @@ readmenu(void)
cs->raw = !cs->raw;
return;
case 4:
+ blocksel = !blocksel;
+ return;
+ case 5:
exits(0);
}
return;