From 20fe277f38a161b00d2425994c9db536945620bc Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 14 May 2016 00:17:07 +0200 Subject: [PATCH] revert previous commit, not ready yet --- sys/src/cmd/rio/dat.h | 1 + sys/src/cmd/rio/fns.h | 3 +- sys/src/cmd/rio/rio.c | 207 +++++++++++++++++++++++++---------------- sys/src/cmd/rio/wind.c | 28 +++--- sys/src/cmd/rio/xfid.c | 2 +- 5 files changed, 146 insertions(+), 95 deletions(-) diff --git a/sys/src/cmd/rio/dat.h b/sys/src/cmd/rio/dat.h index f97049889..5d8891162 100644 --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -172,6 +172,7 @@ struct Window char *dir; }; +int winborder(Window*, Point); void winctl(void*); void winshell(void*); Window* wlookid(int); diff --git a/sys/src/cmd/rio/fns.h b/sys/src/cmd/rio/fns.h index 5a2d1bb4a..5c23587d6 100644 --- a/sys/src/cmd/rio/fns.h +++ b/sys/src/cmd/rio/fns.h @@ -4,7 +4,7 @@ void freescrtemps(void); int parsewctl(char**, Rectangle, Rectangle*, int*, int*, int*, int*, char**, char*, char*); int writewctl(Xfid*, char*); Window *new(Image*, int, int, int, char*, char*, char**); -void riosetcursor(Cursor*); +void riosetcursor(Cursor*, int); int min(int, int); int max(int, int); Rune* strrune(Rune*, Rune); @@ -28,7 +28,6 @@ void putsnarf(void); void getsnarf(void); void timerinit(void); int goodrect(Rectangle); -int inborder(Rectangle, Point); #define runemalloc(n) malloc((n)*sizeof(Rune)) #define runerealloc(a, n) realloc(a, (n)*sizeof(Rune)) diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index 95c66095c..4a887ab20 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -355,51 +355,11 @@ keyboardthread(void*) } } -int -inborder(Rectangle r, Point xy) -{ - return ptinrect(xy, r) && !ptinrect(xy, insetrect(r, Selborder)); -} - -Rectangle -whichrect(Rectangle r, Point p, int which) -{ - switch(which){ - case 0: /* top left */ - r = Rect(p.x, p.y, r.max.x, r.max.y); - break; - case 2: /* top right */ - r = Rect(r.min.x, p.y, p.x+1, r.max.y); - break; - case 6: /* bottom left */ - r = Rect(p.x, r.min.y, r.max.x, p.y+1); - break; - case 8: /* bottom right */ - r = Rect(r.min.x, r.min.y, p.x+1, p.y+1); - break; - case 1: /* top edge */ - r = Rect(r.min.x, p.y, r.max.x, r.max.y); - break; - case 5: /* right edge */ - r = Rect(r.min.x, r.min.y, p.x+1, r.max.y); - break; - case 7: /* bottom edge */ - r = Rect(r.min.x, r.min.y, r.max.x, p.y+1); - break; - case 3: /* left edge */ - r = Rect(p.x, r.min.y, r.max.x, r.max.y); - break; - } - return canonrect(r); -} - int portion(int x, int lo, int hi) { x -= lo; hi -= lo; - if(hi < 20) - return x > 0 ? 2 : 0; if(x < 20) return 0; if(x > hi-20) @@ -408,15 +368,24 @@ portion(int x, int lo, int hi) } int -whichcorner(Rectangle r, Point p) +whichcorner(Window *w, Point p) { int i, j; - i = portion(p.x, r.min.x, r.max.x); - j = portion(p.y, r.min.y, r.max.y); + i = portion(p.x, w->screenr.min.x, w->screenr.max.x); + j = portion(p.y, w->screenr.min.y, w->screenr.max.y); return 3*j+i; } +void +cornercursor(Window *w, Point p, int force) +{ + if(w!=nil && winborder(w, p)) + riosetcursor(corners[whichcorner(w, p)], force); + else + wsetcursor(w, force); +} + /* thread to allow fsysproc to synchronize window closing with main proc */ void winclosethread(void*) @@ -480,7 +449,7 @@ keyboardhide(void) void mousethread(void*) { - int sending, inside, scrolling, moving; + int sending, inside, scrolling, moving, band; Window *w, *winput; Image *i; Point xy; @@ -540,7 +509,7 @@ mousethread(void*) else scrolling = mouse->buttons && ptinrect(xy, winput->scrollr); /* topped will be zero or less if window has been bottomed */ - if(sending == FALSE && !scrolling && inborder(winput->screenr, mouse->xy) && winput->topped>0){ + if(sending == FALSE && !scrolling && winborder(winput, mouse->xy) && winput->topped>0){ moving = TRUE; }else if(inside && (scrolling || winput->mouseopen || (mouse->buttons&1))) sending = TRUE; @@ -548,31 +517,42 @@ mousethread(void*) sending = FALSE; if(sending){ Sending: - if(mouse->buttons == 0) + if(mouse->buttons == 0){ + cornercursor(winput, mouse->xy, 0); sending = FALSE; + }else + wsetcursor(winput, 0); tmp = mousectl->Mouse; tmp.xy = xy; send(winput->mc.c, &tmp); continue; } + w = wpointto(mouse->xy); + /* change cursor if over anyone's border */ + if(w != nil) + cornercursor(w, mouse->xy, 0); + else + riosetcursor(nil, 0); if(moving && (mouse->buttons&7)){ incref(winput); - sweeping = TRUE; - if(mouse->buttons & 3) + band = mouse->buttons & 3; + sweeping = 1; + if(band) i = bandsize(winput); else i = drag(winput); - sweeping = FALSE; - if(i != nil) + sweeping = 0; + if(i != nil){ wsendctlmesg(winput, Reshaped, i->r, i); - wclose(winput); - continue; + cornercursor(winput, mouse->xy, 1); + } + if(wclose(winput) == 0) + w = winput; + else { + riosetcursor(nil, 0); + w = winput = nil; + } } - w = wpointto(mouse->xy); - if(w!=nil && inborder(w->screenr, mouse->xy)) - riosetcursor(corners[whichcorner(w->screenr, mouse->xy)]); - else - wsetcursor(w, FALSE); /* we're not sending the event, but if button is down maybe we should */ if(mouse->buttons){ /* w->topped will be zero or less if window has been bottomed */ @@ -590,7 +570,7 @@ mousethread(void*) }else{ /* if button 1 event in the window, top the window and wait for button up. */ /* otherwise, top the window and pass the event on */ - if(wtop(mouse->xy) && (mouse->buttons!=1 || inborder(w->screenr, mouse->xy))) + if(wtop(mouse->xy) && (mouse->buttons!=1 || winborder(w, mouse->xy))) goto Again; goto Drain; } @@ -746,7 +726,7 @@ button3menu(void) free(menu3str[i]); menu3str[i] = nil; } - sweeping = TRUE; + sweeping = 1; switch(i = menuhit(3, mousectl, &menu3, wscreen)){ case -1: break; @@ -775,7 +755,7 @@ button3menu(void) unhide(i); break; } - sweeping = FALSE; + sweeping = 0; } void @@ -856,7 +836,7 @@ sweep(void) i = nil; menuing = TRUE; - riosetcursor(&crosscursor); + riosetcursor(&crosscursor, 1); while(mouse->buttons == 0) readmouse(mousectl); p0 = onscreen(mouse->xy); @@ -868,7 +848,6 @@ sweep(void) if(!eqpt(mouse->xy, p)){ p = onscreen(mouse->xy); r = canonrect(Rpt(p0, p)); - r = whichrect(r, p, whichcorner(r, p)); if(Dx(r)>5 && Dy(r)>5){ i = allocwindow(wscreen, r, Refnone, DNofill); freeimage(oi); @@ -890,18 +869,18 @@ sweep(void) freeimage(oi); if(i == nil) goto Rescue; - riosetcursor(corners[whichcorner(i->r, mouse->xy)]); + cornercursor(input, mouse->xy, 1); goto Return; Rescue: - riosetcursor(nil); freeimage(i); i = nil; - flushimage(display, 1); + cornercursor(input, mouse->xy, 1); while(mouse->buttons) readmouse(mousectl); Return: + moveto(mousectl, mouse->xy); /* force cursor update; ugly */ menuing = FALSE; return i; } @@ -946,11 +925,11 @@ drag(Window *w) Rectangle r; menuing = TRUE; - riosetcursor(&boxcursor); om = mouse->xy; - dm = subpt(om, w->screenr.min); + riosetcursor(&boxcursor, 1); + dm = subpt(mouse->xy, w->screenr.min); d = subpt(w->screenr.max, w->screenr.min); - op = subpt(om, dm); + op = subpt(mouse->xy, dm); drawborder(Rect(op.x, op.y, op.x+d.x, op.y+d.y), 1); while(mouse->buttons==4){ p = subpt(mouse->xy, dm); @@ -962,11 +941,10 @@ drag(Window *w) } r = Rect(op.x, op.y, op.x+d.x, op.y+d.y); drawborder(r, 0); - p = mouse->xy; - riosetcursor(inborder(r, p) ? corners[whichcorner(r, p)] : nil); + cornercursor(w, mouse->xy, 1); + moveto(mousectl, mouse->xy); /* force cursor update; ugly */ menuing = FALSE; - if(mouse->buttons!=0 || !goodrect(r) || eqrect(r, screen->r)){ - flushimage(display, 1); + if(mouse->buttons!=0 || !goodrect(r)){ while(mouse->buttons) readmouse(mousectl); return nil; @@ -974,6 +952,70 @@ drag(Window *w) return allocwindow(wscreen, r, Refbackup, DNofill); } +Point +cornerpt(Rectangle r, Point p, int which) +{ + switch(which){ + case 0: /* top left */ + p = Pt(r.min.x, r.min.y); + break; + case 2: /* top right */ + p = Pt(r.max.x,r.min.y); + break; + case 6: /* bottom left */ + p = Pt(r.min.x, r.max.y); + break; + case 8: /* bottom right */ + p = Pt(r.max.x, r.max.y); + break; + case 1: /* top edge */ + p = Pt(p.x,r.min.y); + break; + case 5: /* right edge */ + p = Pt(r.max.x, p.y); + break; + case 7: /* bottom edge */ + p = Pt(p.x, r.max.y); + break; + case 3: /* left edge */ + p = Pt(r.min.x, p.y); + break; + } + return p; +} + +Rectangle +whichrect(Rectangle r, Point p, int which) +{ + switch(which){ + case 0: /* top left */ + r = Rect(p.x, p.y, r.max.x, r.max.y); + break; + case 2: /* top right */ + r = Rect(r.min.x, p.y, p.x, r.max.y); + break; + case 6: /* bottom left */ + r = Rect(p.x, r.min.y, r.max.x, p.y); + break; + case 8: /* bottom right */ + r = Rect(r.min.x, r.min.y, p.x, p.y); + break; + case 1: /* top edge */ + r = Rect(r.min.x, p.y, r.max.x, r.max.y); + break; + case 5: /* right edge */ + r = Rect(r.min.x, r.min.y, p.x, r.max.y); + break; + case 7: /* bottom edge */ + r = Rect(r.min.x, r.min.y, r.max.x, p.y); + break; + case 3: /* left edge */ + r = Rect(p.x, r.min.y, r.max.x, r.max.y); + break; + } + return canonrect(r); +} + Image* bandsize(Window *w) { @@ -983,8 +1025,10 @@ bandsize(Window *w) p = mouse->xy; but = mouse->buttons; - which = whichcorner(w->screenr, p); - riosetcursor(corners[which]); + which = whichcorner(w, p); + p = cornerpt(w->screenr, p, which); + wmovemouse(w, p); + readmouse(mousectl); r = whichrect(w->screenr, p, which); drawborder(r, 1); or = r; @@ -1001,13 +1045,14 @@ bandsize(Window *w) } p = mouse->xy; drawborder(or, 0); - if(mouse->buttons!=0 || !goodrect(or) || eqrect(or, w->screenr) - || abs(p.x-startp.x)+abs(p.y-startp.y) <= 1){ - flushimage(display, 1); + wsetcursor(w, 1); + if(mouse->buttons!=0 || !goodrect(or)){ while(mouse->buttons) readmouse(mousectl); return nil; } + if(abs(p.x-startp.x)+abs(p.y-startp.y) <= 1) + return nil; return allocwindow(wscreen, or, Refbackup, DNofill); } @@ -1017,7 +1062,7 @@ pointto(int wait) Window *w; menuing = TRUE; - riosetcursor(&sightcursor); + riosetcursor(&sightcursor, 1); while(mouse->buttons == 0) readmouse(mousectl); if(mouse->buttons == 4) @@ -1027,7 +1072,7 @@ pointto(int wait) if(wait){ while(mouse->buttons){ if(mouse->buttons!=4 && w !=nil){ /* cancel */ - riosetcursor(nil); + cornercursor(input, mouse->xy, 0); w = nil; } readmouse(mousectl); @@ -1035,7 +1080,8 @@ pointto(int wait) if(w != nil && wpointto(mouse->xy) != w) w = nil; } - riosetcursor(nil); + cornercursor(input, mouse->xy, 0); + moveto(mousectl, mouse->xy); /* force cursor update; ugly */ menuing = FALSE; return w; } @@ -1079,6 +1125,7 @@ move(void) i = drag(w); if(i) wsendctlmesg(w, Reshaped, i->r, i); + cornercursor(w, mouse->xy, 1); wclose(w); } diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index c90912639..d68584040 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -687,7 +687,7 @@ wkeyctl(Window *w, Rune r) --w->holding; else w->holding++; - wsetcursor(w, FALSE); + wsetcursor(w, 0); wrepaint(w); if(r == Kesc) return; @@ -871,9 +871,9 @@ wplumb(Window *w) m->data = runetobyte(w->r+p0, p1-p0, &m->ndata); if(plumbsend(fd, m) < 0){ c = lastcursor; - riosetcursor(&query); + riosetcursor(&query, 1); sleep(300); - riosetcursor(c); + riosetcursor(c, 1); } plumbfree(m); } @@ -903,6 +903,12 @@ wlook(Window *w) wshow(w, i); } +int +winborder(Window *w, Point xy) +{ + return ptinrect(xy, w->screenr) && !ptinrect(xy, insetrect(w->screenr, Selborder)); +} + void wmousectl(Window *w) { @@ -1193,7 +1199,7 @@ wctlmesg(Window *w, int m, Rectangle r, void *p) if(w->i==nil) break; if(w==input) - wsetcursor(w, FALSE); + wsetcursor(w, 0); wrepaint(w); flushimage(display, 1); break; @@ -1293,8 +1299,6 @@ wsetcursor(Window *w, int force) { Cursor *p; - if(menuing || sweeping) - return; if(w==nil || w->i==nil || Dx(w->screenr)<=0) p = nil; else if(wpointto(mouse->xy) == w){ @@ -1303,20 +1307,20 @@ wsetcursor(Window *w, int force) p = &whitearrow; }else p = nil; - if(force) /* force cursor reload */ - lastcursor = nil; - riosetcursor(p); + if(!menuing) + riosetcursor(p, force && !menuing); } void -riosetcursor(Cursor *p) +riosetcursor(Cursor *p, int force) { - if(p==lastcursor) + if(!force && p==lastcursor) return; setcursor(mousectl, p); lastcursor = p; } + void wtopme(Window *w) { @@ -1373,7 +1377,7 @@ wclunk(Window *w) w->deleted = TRUE; if(w == input){ input = nil; - wsetcursor(w, FALSE); + wsetcursor(w, 0); } if(w == wkeyboard) wkeyboard = nil; diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index bd0f42ffb..d41ec61e2 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -478,7 +478,7 @@ xfidwrite(Xfid *x) memmove(w->cursor.clr, x->data+2*4, 2*2*16); w->cursorp = &w->cursor; } - wsetcursor(w, !sweeping && !menuing); + wsetcursor(w, !sweeping); break; case Qlabel: