Merge branch 'newpatch' into front
This commit is contained in:
commit
5e89dcb387
10 changed files with 233 additions and 35 deletions
9
sys/src/cmd/rio/col.h
Normal file
9
sys/src/cmd/rio/col.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
enum {
|
||||||
|
Colrioback,
|
||||||
|
|
||||||
|
Numcolors,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Image *col[Numcolors];
|
||||||
|
void themeload(char *s, int n);
|
||||||
|
char *themestring(int *n);
|
|
@ -14,6 +14,7 @@ enum
|
||||||
Qscreen,
|
Qscreen,
|
||||||
Qsnarf,
|
Qsnarf,
|
||||||
Qtext,
|
Qtext,
|
||||||
|
Qtheme,
|
||||||
Qwctl,
|
Qwctl,
|
||||||
Qwindow,
|
Qwindow,
|
||||||
Qwsys, /* directory of window directories */
|
Qwsys, /* directory of window directories */
|
||||||
|
@ -295,7 +296,6 @@ Cursor whitearrow;
|
||||||
Cursor query;
|
Cursor query;
|
||||||
Cursor *corners[9];
|
Cursor *corners[9];
|
||||||
|
|
||||||
Image *background;
|
|
||||||
Image *cols[NCOL];
|
Image *cols[NCOL];
|
||||||
Image *titlecol;
|
Image *titlecol;
|
||||||
Image *lighttitlecol;
|
Image *lighttitlecol;
|
||||||
|
@ -334,3 +334,5 @@ int snarfversion; /* updated each time it is written */
|
||||||
int messagesize; /* negotiated in 9P version setup */
|
int messagesize; /* negotiated in 9P version setup */
|
||||||
int shiftdown;
|
int shiftdown;
|
||||||
int debug;
|
int debug;
|
||||||
|
|
||||||
|
#include "col.h"
|
||||||
|
|
|
@ -172,10 +172,61 @@ Cursor *corners[9] = {
|
||||||
&bl, &b, &br,
|
&bl, &b, &br,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
Noredraw = 1,
|
||||||
|
Rgbcol = 2,
|
||||||
|
Imagecol = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct Color Color;
|
||||||
|
|
||||||
|
struct Color {
|
||||||
|
char *id;
|
||||||
|
int type;
|
||||||
|
union {
|
||||||
|
u32int rgb;
|
||||||
|
char *path;
|
||||||
|
};
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
static Color theme[Numcolors] = {
|
||||||
|
[Colrioback] = {"rioback", Rgbcol, {0x777777}, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
Image *col[Numcolors];
|
||||||
|
|
||||||
|
static char *
|
||||||
|
readall(int f, int *osz)
|
||||||
|
{
|
||||||
|
int bufsz, sz, n;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
bufsz = 1023;
|
||||||
|
s = nil;
|
||||||
|
for(sz = 0;; sz += n){
|
||||||
|
if(bufsz-sz < 1024){
|
||||||
|
bufsz *= 2;
|
||||||
|
s = realloc(s, bufsz);
|
||||||
|
}
|
||||||
|
if((n = readn(f, s+sz, bufsz-sz-1)) < 1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(n < 0 || sz < 1){
|
||||||
|
free(s);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
s[sz] = 0;
|
||||||
|
*osz = sz;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
iconinit(void)
|
iconinit(void)
|
||||||
{
|
{
|
||||||
background = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x777777FF);
|
int i, f, sz;
|
||||||
|
char *s;
|
||||||
|
|
||||||
/* greys are multiples of 0x11111100+0xFF, 14* being palest */
|
/* greys are multiples of 0x11111100+0xFF, 14* being palest */
|
||||||
cols[BACK] = allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0xFFFFFFFF^reverse);
|
cols[BACK] = allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0xFFFFFFFF^reverse);
|
||||||
|
@ -201,4 +252,97 @@ iconinit(void)
|
||||||
holdcol = dholdcol;
|
holdcol = dholdcol;
|
||||||
else
|
else
|
||||||
holdcol = paleholdcol;
|
holdcol = paleholdcol;
|
||||||
|
|
||||||
|
if((f = open("/dev/theme", OREAD|OCEXEC)) >= 0){
|
||||||
|
if((s = readall(f, &sz)) != nil)
|
||||||
|
themeload(s, sz);
|
||||||
|
free(s);
|
||||||
|
close(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nelem(col); i++){
|
||||||
|
if(col[i] == nil)
|
||||||
|
col[i] = allocimage(display, Rect(0,0,1,1), RGB24, 1, theme[i].rgb<8|0x777777ff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void redraw(void);
|
||||||
|
void
|
||||||
|
themeload(char *s, int n)
|
||||||
|
{
|
||||||
|
int i, fd;
|
||||||
|
char *t, *a[2], *e, *newp;
|
||||||
|
Image *newc, *repl;
|
||||||
|
u32int rgb;
|
||||||
|
|
||||||
|
if((t = malloc(n+1)) == nil)
|
||||||
|
return;
|
||||||
|
memmove(t, s, n);
|
||||||
|
t[n] = 0;
|
||||||
|
|
||||||
|
for(s = t; s != nil && *s; s = e){
|
||||||
|
if((e = strchr(s, '\n')) != nil)
|
||||||
|
*e++ = 0;
|
||||||
|
if(tokenize(s, a, 2) == 2){
|
||||||
|
for(i = 0; i < nelem(theme); i++) {
|
||||||
|
if(strcmp(theme[i].id, a[0]) == 0) {
|
||||||
|
newc = nil;
|
||||||
|
if(a[1][0] == '/'){
|
||||||
|
if((fd = open(a[1], OREAD)) >= 0){
|
||||||
|
if ((newc = readimage(display, fd, 0)) == nil)
|
||||||
|
goto End;
|
||||||
|
close(fd);
|
||||||
|
if ((repl = allocimage(display, Rect(0, 0, Dx(newc->r), Dy(newc->r)), RGB24, 1, 0x000000ff)) == nil)
|
||||||
|
goto End;
|
||||||
|
if (theme[i].type == Imagecol)
|
||||||
|
free(theme[i].path);
|
||||||
|
if ((newp = strdup(a[1])) == nil)
|
||||||
|
goto End;
|
||||||
|
theme[i].type = Imagecol;
|
||||||
|
theme[i].path = newp;
|
||||||
|
draw(repl, repl->r, newc, 0, newc->r.min);
|
||||||
|
freeimage(newc);
|
||||||
|
newc = repl;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
rgb = strtoul(a[1], nil, 16);
|
||||||
|
if((newc = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, rgb<<8 | 0xff)) != nil) {
|
||||||
|
if (theme[i].type == Imagecol)
|
||||||
|
free(theme[i].path);
|
||||||
|
theme[i].type = Rgbcol;
|
||||||
|
theme[i].rgb = rgb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(new != nil){
|
||||||
|
freeimage(col[i]);
|
||||||
|
col[i] = newc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
End:
|
||||||
|
free(t);
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
themestring(int *n)
|
||||||
|
{
|
||||||
|
char *s, *t, *e;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if((t = malloc(512)) != nil){
|
||||||
|
s = t;
|
||||||
|
e = s+512;
|
||||||
|
for(i = 0; i < nelem(theme); i++)
|
||||||
|
if (theme[i].type == Rgbcol)
|
||||||
|
s = seprint(s, e, "%s\t%06ux\n", theme[i].id, theme[i].rgb);
|
||||||
|
else if (theme[i].type == Imagecol)
|
||||||
|
s = seprint(s, e, "%s\t%s\n", theme[i].id, theme[i].path);
|
||||||
|
*n = s - t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ Dirtab dirtab[]=
|
||||||
{ "screen", QTFILE, Qscreen, 0400 },
|
{ "screen", QTFILE, Qscreen, 0400 },
|
||||||
{ "snarf", QTFILE, Qsnarf, 0600 },
|
{ "snarf", QTFILE, Qsnarf, 0600 },
|
||||||
{ "text", QTFILE, Qtext, 0600 },
|
{ "text", QTFILE, Qtext, 0600 },
|
||||||
|
{ "theme", QTFILE, Qtheme, 0600 },
|
||||||
{ "wdir", QTFILE, Qwdir, 0600 },
|
{ "wdir", QTFILE, Qwdir, 0600 },
|
||||||
{ "wctl", QTFILE, Qwctl, 0600 },
|
{ "wctl", QTFILE, Qwctl, 0600 },
|
||||||
{ "window", QTFILE, Qwindow, 0400 },
|
{ "window", QTFILE, Qwindow, 0400 },
|
||||||
|
|
|
@ -39,6 +39,7 @@ int threadrforkflag = 0; /* should be RFENVG but that hides rio from plumber */
|
||||||
void mousethread(void*);
|
void mousethread(void*);
|
||||||
void keyboardthread(void*);
|
void keyboardthread(void*);
|
||||||
void winclosethread(void*);
|
void winclosethread(void*);
|
||||||
|
void themethread(void*);
|
||||||
void initcmd(void*);
|
void initcmd(void*);
|
||||||
Channel* initkbd(void);
|
Channel* initkbd(void);
|
||||||
|
|
||||||
|
@ -199,10 +200,10 @@ threadmain(int argc, char *argv[])
|
||||||
kbdchan = initkbd();
|
kbdchan = initkbd();
|
||||||
if(kbdchan == nil)
|
if(kbdchan == nil)
|
||||||
error("can't find keyboard");
|
error("can't find keyboard");
|
||||||
wscreen = allocscreen(screen, background, 0);
|
wscreen = allocscreen(screen, col[Colrioback], 0);
|
||||||
if(wscreen == nil)
|
if(wscreen == nil)
|
||||||
error("can't allocate screen");
|
error("can't allocate screen");
|
||||||
draw(view, viewr, background, nil, ZP);
|
draw(view, viewr, col[Colrioback], nil, ZP);
|
||||||
flushimage(display, 1);
|
flushimage(display, 1);
|
||||||
|
|
||||||
timerinit();
|
timerinit();
|
||||||
|
@ -580,6 +581,48 @@ wtopcmp(void *a, void *b)
|
||||||
return (*(Window**)a)->topped - (*(Window**)b)->topped;
|
return (*(Window**)a)->topped - (*(Window**)b)->topped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
redraw(void)
|
||||||
|
{
|
||||||
|
Image *im;
|
||||||
|
int i, j;
|
||||||
|
Rectangle r;
|
||||||
|
Point o, n;
|
||||||
|
Window *w;
|
||||||
|
|
||||||
|
view = screen;
|
||||||
|
draw(view, view->r, col[Colrioback], nil, ZP);
|
||||||
|
o = subpt(viewr.max, viewr.min);
|
||||||
|
n = subpt(view->clipr.max, view->clipr.min);
|
||||||
|
qsort(window, nwindow, sizeof(window[0]), wtopcmp);
|
||||||
|
for(i=0; i<nwindow; i++){
|
||||||
|
w = window[i];
|
||||||
|
r = rectsubpt(w->i->r, viewr.min);
|
||||||
|
r.min.x = (r.min.x*n.x)/o.x;
|
||||||
|
r.min.y = (r.min.y*n.y)/o.y;
|
||||||
|
r.max.x = (r.max.x*n.x)/o.x;
|
||||||
|
r.max.y = (r.max.y*n.y)/o.y;
|
||||||
|
r = rectaddpt(r, view->clipr.min);
|
||||||
|
if(!goodrect(r))
|
||||||
|
r = rectsubpt(w->i->r, subpt(w->i->r.min, r.min));
|
||||||
|
for(j=0; j<nhidden; j++)
|
||||||
|
if(w == hidden[j])
|
||||||
|
break;
|
||||||
|
frinittick(w);
|
||||||
|
incref(w);
|
||||||
|
if(j < nhidden){
|
||||||
|
im = allocimage(display, r, screen->chan, 0, DNofill);
|
||||||
|
r = ZR;
|
||||||
|
} else
|
||||||
|
im = allocwindow(wscreen, r, Refbackup, DNofill);
|
||||||
|
if(im)
|
||||||
|
wsendctlmesg(w, Reshaped, r, im);
|
||||||
|
wclose(w);
|
||||||
|
}
|
||||||
|
viewr = view->r;
|
||||||
|
flushimage(display, 1);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
resized(void)
|
resized(void)
|
||||||
{
|
{
|
||||||
|
@ -594,10 +637,10 @@ resized(void)
|
||||||
freescrtemps();
|
freescrtemps();
|
||||||
view = screen;
|
view = screen;
|
||||||
freescreen(wscreen);
|
freescreen(wscreen);
|
||||||
wscreen = allocscreen(screen, background, 0);
|
wscreen = allocscreen(screen, col[Colrioback], 0);
|
||||||
if(wscreen == nil)
|
if(wscreen == nil)
|
||||||
error("can't re-allocate screen");
|
error("can't re-allocate screen");
|
||||||
draw(view, view->r, background, nil, ZP);
|
draw(view, view->r, col[Colrioback], nil, ZP);
|
||||||
o = subpt(viewr.max, viewr.min);
|
o = subpt(viewr.max, viewr.min);
|
||||||
n = subpt(view->clipr.max, view->clipr.min);
|
n = subpt(view->clipr.max, view->clipr.min);
|
||||||
qsort(window, nwindow, sizeof(window[0]), wtopcmp);
|
qsort(window, nwindow, sizeof(window[0]), wtopcmp);
|
||||||
|
|
|
@ -502,6 +502,10 @@ xfidwrite(Xfid *x)
|
||||||
memmove(w->label, x->data, cnt);
|
memmove(w->label, x->data, cnt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Qtheme:
|
||||||
|
themeload(x->data, cnt);
|
||||||
|
break;
|
||||||
|
|
||||||
case Qmouse:
|
case Qmouse:
|
||||||
if(w!=input || Dx(w->screenr)<=0)
|
if(w!=input || Dx(w->screenr)<=0)
|
||||||
break;
|
break;
|
||||||
|
@ -746,6 +750,10 @@ xfidread(Xfid *x)
|
||||||
t = wcontents(w, &n);
|
t = wcontents(w, &n);
|
||||||
goto Text;
|
goto Text;
|
||||||
|
|
||||||
|
case Qtheme:
|
||||||
|
t = themestring(&n);
|
||||||
|
goto Text;
|
||||||
|
|
||||||
Text:
|
Text:
|
||||||
if(off > n){
|
if(off > n){
|
||||||
off = n;
|
off = n;
|
||||||
|
|
|
@ -29,17 +29,17 @@ flstart(Rectangle r)
|
||||||
lDrect = r;
|
lDrect = r;
|
||||||
|
|
||||||
/* Main text is yellowish */
|
/* Main text is yellowish */
|
||||||
maincols[BACK] = allocimagemix(display, DPaleyellow, DWhite);
|
maincols[BACK] = display->black;
|
||||||
maincols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DDarkyellow);
|
maincols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x555555FF);
|
||||||
maincols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, DYellowgreen);
|
maincols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, 0x222222FF);
|
||||||
maincols[TEXT] = display->black;
|
maincols[TEXT] = display->white;
|
||||||
maincols[HTEXT] = display->black;
|
maincols[HTEXT] = display->black;
|
||||||
|
|
||||||
/* Command text is blueish */
|
/* Command text is blueish */
|
||||||
cmdcols[BACK] = allocimagemix(display, DPalebluegreen, DWhite);
|
cmdcols[BACK] = display->black;
|
||||||
cmdcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPalegreygreen);
|
cmdcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x555555FF);
|
||||||
cmdcols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, DPurpleblue);
|
cmdcols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, 0x222222FF);
|
||||||
cmdcols[TEXT] = display->black;
|
cmdcols[TEXT] = display->white;
|
||||||
cmdcols[HTEXT] = display->black;
|
cmdcols[HTEXT] = display->black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,18 +83,19 @@ flinit(Flayer *l, Rectangle r, Font *ft, Image **cols)
|
||||||
draw(screen, l->entire, l->f.cols[BACK], nil, ZP);
|
draw(screen, l->entire, l->f.cols[BACK], nil, ZP);
|
||||||
scrdraw(l, 0L);
|
scrdraw(l, 0L);
|
||||||
flborder(l, 0);
|
flborder(l, 0);
|
||||||
|
flrefresh(l, l->entire, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
flclose(Flayer *l)
|
flclose(Flayer *l)
|
||||||
{
|
{
|
||||||
if(l->visible == All)
|
if(l->visible == All)
|
||||||
draw(screen, l->entire, display->white, nil, ZP);
|
draw(screen, l->entire, display->black, nil, ZP);
|
||||||
else if(l->visible == Some){
|
else if(l->visible == Some){
|
||||||
if(l->f.b == 0)
|
if(l->f.b == 0)
|
||||||
l->f.b = allocimage(display, l->entire, screen->chan, 0, DNofill);
|
l->f.b = allocimage(display, l->entire, screen->chan, 0, DNofill);
|
||||||
if(l->f.b){
|
if(l->f.b){
|
||||||
draw(l->f.b, l->entire, display->white, nil, ZP);
|
draw(l->f.b, l->entire, display->black, nil, ZP);
|
||||||
flrefresh(l, l->entire, 0);
|
flrefresh(l, l->entire, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -362,7 +363,7 @@ flresize(Rectangle dr)
|
||||||
if(0 && Dx(dr)==Dx(olDrect) && Dy(dr)==Dy(olDrect))
|
if(0 && Dx(dr)==Dx(olDrect) && Dy(dr)==Dy(olDrect))
|
||||||
move = 1;
|
move = 1;
|
||||||
else
|
else
|
||||||
draw(screen, lDrect, display->white, nil, ZP);
|
draw(screen, lDrect, display->black, nil, ZP);
|
||||||
for(i=0; i<nllist; i++){
|
for(i=0; i<nllist; i++){
|
||||||
l = llist[i];
|
l = llist[i];
|
||||||
l->lastsr = ZR;
|
l->lastsr = ZR;
|
||||||
|
|
|
@ -246,24 +246,14 @@ getr(Rectangle *rp)
|
||||||
Point p;
|
Point p;
|
||||||
Rectangle r;
|
Rectangle r;
|
||||||
|
|
||||||
*rp = getrect(3, mousectl);
|
*rp = screen->r;
|
||||||
if(rp->max.x && rp->max.x-rp->min.x<=5 && rp->max.y-rp->min.y<=5){
|
p = rp->min;
|
||||||
p = rp->min;
|
r = cmd.l[cmd.front].entire;
|
||||||
r = cmd.l[cmd.front].entire;
|
if(cmd.nwin==1)
|
||||||
*rp = screen->r;
|
|
||||||
if(cmd.nwin==1){
|
|
||||||
if (p.y <= r.min.y)
|
|
||||||
rp->max.y = r.min.y;
|
|
||||||
else if (p.y >= r.max.y)
|
|
||||||
rp->min.y = r.max.y;
|
rp->min.y = r.max.y;
|
||||||
if (p.x <= r.min.x)
|
|
||||||
rp->max.x = r.min.x;
|
|
||||||
else if (p.x >= r.max.x)
|
|
||||||
rp->min.x = r.max.x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rectclip(rp, screen->r) &&
|
return rectclip(rp, screen->r) &&
|
||||||
rp->max.x-rp->min.x>100 && rp->max.y-rp->min.y>40;
|
rp->max.x-rp->min.x>100 && rp->max.y-rp->min.y>40;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -207,7 +207,7 @@ sweeptext(int new, int tag)
|
||||||
|
|
||||||
if(getr(&r) && (t = malloc(sizeof(Text)))){
|
if(getr(&r) && (t = malloc(sizeof(Text)))){
|
||||||
memset((void*)t, 0, sizeof(Text));
|
memset((void*)t, 0, sizeof(Text));
|
||||||
current((Flayer *)0);
|
//current((Flayer *)0);
|
||||||
flnew(&t->l[0], gettext, 0, (char *)t);
|
flnew(&t->l[0], gettext, 0, (char *)t);
|
||||||
flinit(&t->l[0], r, font, maincols); /*bnl*/
|
flinit(&t->l[0], r, font, maincols); /*bnl*/
|
||||||
t->nwin = 1;
|
t->nwin = 1;
|
||||||
|
|
|
@ -46,7 +46,7 @@ getscreen(int argc, char **argv)
|
||||||
if(t != nil)
|
if(t != nil)
|
||||||
maxtab = strtoul(t, nil, 0);
|
maxtab = strtoul(t, nil, 0);
|
||||||
free(t);
|
free(t);
|
||||||
draw(screen, screen->clipr, display->white, nil, ZP);
|
draw(screen, screen->clipr, display->black, nil, ZP);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in a new issue