spred: scrolling and other bugfixes

This commit is contained in:
aiju 2014-07-31 11:36:24 +02:00
parent 98d518cc8c
commit 709e78b9f9
7 changed files with 54 additions and 36 deletions

View file

@ -19,6 +19,7 @@ dopal(int, char **argv)
if(p == nil){ if(p == nil){
cmdprint("?%r\n"); cmdprint("?%r\n");
p = newpal(argv[1]); p = newpal(argv[1]);
palsize(p, 8, 0);
} }
if(newwinsel(PAL, mc, p) == nil){ if(newwinsel(PAL, mc, p) == nil){
if(p->ref == 0) if(p->ref == 0)
@ -40,7 +41,7 @@ dosize(int, char **argv)
n = strtol(argv[1], &p, 0); n = strtol(argv[1], &p, 0);
if(*p != 0 || n < 0) if(*p != 0 || n < 0)
goto err; goto err;
palsize((Pal *) actf->f, n); palsize((Pal *) actf->f, n, 1);
return; return;
case SPR: case SPR:
n = strtol(argv[1], &p, 0); n = strtol(argv[1], &p, 0);
@ -49,7 +50,7 @@ dosize(int, char **argv)
m = strtol(++p, &p, 0); m = strtol(++p, &p, 0);
if(*p != 0 || m < 0) if(*p != 0 || m < 0)
goto err; goto err;
sprsize((Spr *) actf->f, n, m); sprsize((Spr *) actf->f, n, m, 1);
return; return;
} }
err: err:
@ -105,11 +106,14 @@ dospr(int, char **argv)
s = newspr(argv[1]); s = newspr(argv[1]);
bp = Bopen(argv[1], OREAD); bp = Bopen(argv[1], OREAD);
if(bp == nil) if(bp == nil){
cmdprint("?%r\n"); cmdprint("?%r\n");
else{ sprsize(s, 8, 8, 0);
if(readspr(s, bp) < 0) }else{
if(readspr(s, bp) < 0){
cmdprint("?%r\n"); cmdprint("?%r\n");
sprsize(s, 8, 8, 0);
}
Bterm(bp); Bterm(bp);
} }
w = newwinsel(SPR, mc, s); w = newwinsel(SPR, mc, s);

View file

@ -4,6 +4,7 @@
#include <thread.h> #include <thread.h>
#include <draw.h> #include <draw.h>
#include <mouse.h> #include <mouse.h>
#include <keyboard.h>
#include <frame.h> #include <frame.h>
#include "dat.h" #include "dat.h"
#include "fns.h" #include "fns.h"
@ -57,15 +58,18 @@ cmdscroll(Win *w, int l)
for(r = w->toprune; r < w->nrunes && l != 0; r++) for(r = w->toprune; r < w->nrunes && l != 0; r++)
if(w->runes[r] == '\n') if(w->runes[r] == '\n')
l--; l--;
frdelete(&w->fr, 0, r - w->toprune);
w->toprune = r; w->toprune = r;
}else{ }else{
for(r = w->toprune; r > 0; r--) for(r = w->toprune; r > 0; r--)
if(w->runes[r] == '\n' && --l == 0) if(w->runes[r] == '\n' && ++l == 0){
r++;
break; break;
frinsert(&w->fr, w->runes + r, w->runes + w->toprune, 0); }
w->toprune = r; w->toprune = r;
} }
frdelete(&w->fr, 0, w->fr.nchars);
frinsert(&w->fr, w->runes + w->toprune, w->runes + w->nrunes, 0);
scrollbar(w); scrollbar(w);
} }
@ -88,7 +92,7 @@ cmdrmb(Win *w, Mousectl *mc)
return 0; return 0;
} }
void int
cmdinsert(Win *w, Rune *r, int nr, int rp) cmdinsert(Win *w, Rune *r, int nr, int rp)
{ {
Rune *s; Rune *s;
@ -116,6 +120,7 @@ cmdinsert(Win *w, Rune *r, int nr, int rp)
cmdscroll(w, 1); cmdscroll(w, 1);
} }
} }
return nr;
} }
static void static void
@ -148,24 +153,27 @@ cmdkey(Win *w, Rune r)
case 0x1b: case 0x1b:
break; break;
case '\b': case '\b':
if(w->fr.p0 > 0) if(w->fr.p0 > 0 && w->toprune + w->fr.p0 != w->opoint)
cmddel(w, w->toprune + w->fr.p0 - 1, w->toprune + w->fr.p0); cmddel(w, w->toprune + w->fr.p0 - 1, w->toprune + w->fr.p0);
break; break;
case '\n': case '\n':
cmdinsert(w, &r, 1, w->fr.p0 + w->toprune); cmdinsert(w, &r, 1, w->fr.p0 + w->toprune);
if(w->toprune + w->fr.p0 == w->nrunes){ if(w->toprune + w->fr.p0 == w->nrunes){
q = w->runes + w->toprune + w->fr.p0 - 1; q = w->runes + w->opoint;
p = buf; p = buf;
while(*--q != 0xa && q > w->runes) while(q < w->runes + w->nrunes && p < buf + nelem(buf) + 1)
;
if(*q == 0xa)
q++;
while(q < w->runes + w->nrunes && p < buf + nelem(buf) + 1 && *q != 0xa)
p += runetochar(p, q++); p += runetochar(p, q++);
*p = 0; *p = 0;
w->opoint = w->nrunes;
docmd(buf); docmd(buf);
} }
break; break;
case Kview:
cmdscroll(w, 3);
break;
case Kup:
cmdscroll(w, -3);
break;
default: default:
cmdinsert(w, &r, 1, w->fr.p0 + w->toprune); cmdinsert(w, &r, 1, w->fr.p0 + w->toprune);
} }
@ -181,7 +189,7 @@ cmdprint(char *fmt, ...)
r = runevsmprint(fmt, va); r = runevsmprint(fmt, va);
va_end(va); va_end(va);
if(r != nil) if(r != nil)
cmdinsert(cmdw, r, -1, -1); cmdw->opoint += cmdinsert(cmdw, r, -1, cmdw->opoint);
} }
Wintab cmdtab = { Wintab cmdtab = {

View file

@ -50,7 +50,7 @@ struct Win {
Frame fr; Frame fr;
Rune *runes; Rune *runes;
int nrunes, arunes; int nrunes, arunes, opoint;
int toprune; int toprune;
int zoom; int zoom;

View file

@ -155,3 +155,10 @@ filredraw(File *f)
for(w = f->wins.wnext; w != &f->wins; w = w->wnext) for(w = f->wins.wnext; w != &f->wins; w = w->wnext)
w->tab->draw(w); w->tab->draw(w);
} }
void
change(File *f)
{
f->change = 1;
quitok = 0;
}

View file

@ -1,3 +1,4 @@
void change(File *);
void cmdprint(char *, ...); void cmdprint(char *, ...);
void docmd(char *); void docmd(char *);
void* emalloc(ulong); void* emalloc(ulong);
@ -15,7 +16,7 @@ Win* newwin(int, Rectangle, File *);
Win* newwinsel(int, Mousectl *, File *); Win* newwinsel(int, Mousectl *, File *);
void paldraw(Win *); void paldraw(Win *);
void palset(Pal *, int, u32int); void palset(Pal *, int, u32int);
void palsize(Pal *, int); void palsize(Pal *, int, int);
void putfil(File *); void putfil(File *);
void putident(Ident); void putident(Ident);
void putpal(Pal *); void putpal(Pal *);
@ -25,7 +26,7 @@ int readpal(Pal *, Biobuf *);
int readspr(Spr *, Biobuf *); int readspr(Spr *, Biobuf *);
void resize(void); void resize(void);
void setfocus(Win *); void setfocus(Win *);
void sprsize(Spr *, int, int); void sprsize(Spr *, int, int, int);
int tline(Biobuf *, char **, char **, int); int tline(Biobuf *, char **, char **, int);
void winclick(Mousectl *); void winclick(Mousectl *);
void winclose(Win *); void winclose(Win *);

View file

@ -177,7 +177,7 @@ palredraw(Pal *p)
} }
void void
palsize(Pal *p, int sz) palsize(Pal *p, int sz, int ch)
{ {
int i; int i;
@ -185,14 +185,14 @@ palsize(Pal *p, int sz)
return; return;
p->cols = realloc(p->cols, sz * sizeof(*p->cols)); p->cols = realloc(p->cols, sz * sizeof(*p->cols));
p->ims = realloc(p->ims, sz * sizeof(*p->ims)); p->ims = realloc(p->ims, sz * sizeof(*p->ims));
if(sz > p->ncol){ if(sz > p->ncol)
memset(p->cols + p->ncol, 0, sz); for(i = p->ncol; i < sz; i++){
for(i = p->ncol; i < sz; i++) p->cols[i] = 0;
p->ims[i] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0); p->ims[i] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0);
} }
p->ncol = sz; p->ncol = sz;
p->change = 1; if(ch)
quitok = 0; change(p);
palredraw(p); palredraw(p);
} }
@ -226,8 +226,7 @@ palset(Pal *p, int s, u32int c)
p->cols[s] = c; p->cols[s] = c;
freeimage(p->ims[s]); freeimage(p->ims[s]);
p->ims[s] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, c << 8 | 0xff); p->ims[s] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, c << 8 | 0xff);
p->change = 1; change(p);
quitok = 0;
palredraw(p); palredraw(p);
} }

View file

@ -258,15 +258,14 @@ sprclick(Win *w, Mousectl *mc)
continue; continue;
if(s->data[q.y * s->w + q.x] != p->sel){ if(s->data[q.y * s->w + q.x] != p->sel){
s->data[q.y * s->w + q.x] = p->sel; s->data[q.y * s->w + q.x] = p->sel;
s->change = 1; change(s);
quitok = 0;
sprdraw(w); sprdraw(w);
} }
}while(readmouse(mc) >= 0 && (mc->buttons & 1) != 0); }while(readmouse(mc) >= 0 && (mc->buttons & 1) != 0);
} }
void void
sprsize(Spr *s, int n, int m) sprsize(Spr *s, int n, int m, int ch)
{ {
u32int *v; u32int *v;
int i, j, w, h; int i, j, w, h;
@ -282,8 +281,8 @@ sprsize(Spr *s, int n, int m)
s->data[j * n + i] = v[j * w + i]; s->data[j * n + i] = v[j * w + i];
s->w = n; s->w = n;
s->h = m; s->h = m;
s->change = 1; if(ch)
quitok = 0; change(s);
filredraw(s); filredraw(s);
} }
@ -322,8 +321,8 @@ sprmenu(Win *w, Mousectl *mc)
s->pal = (Pal *) wp->f; s->pal = (Pal *) wp->f;
free(s->palfile); free(s->palfile);
s->palfile = palfile(s->name, s->pal->name); s->palfile = palfile(s->name, s->pal->name);
s->change = 1; cmdprint("palette set to %q\n", s->palfile);
quitok = 0; change(s);
filredraw(s); filredraw(s);
} }
break; break;