spred: scrolling and other bugfixes
This commit is contained in:
parent
98d518cc8c
commit
709e78b9f9
7 changed files with 54 additions and 36 deletions
|
@ -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);
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 *);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue