beagle: use new portable sw cursor Reference: /n/atom/patch/applied2013/beagleswcursor Date: Sat Sep 21 20:44:14 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/omap/screen.h Sat Sep 21 20:44:04 2013 +++ /sys/src/9/omap/screen.h Sat Sep 21 20:44:05 2013 @@ -4,8 +4,7 @@ typedef struct Omap3fb Omap3fb; typedef struct Settings Settings; -struct Cursorinfo -{ +struct Cursorinfo { Cursor; Lock; }; @@ -20,30 +19,25 @@ extern void mouseaccelerate(int); extern void mouseresize(void); +/* mouse.c */ +extern void mousectl(Cmdbuf*); +extern void mouseresize(void); +extern void mouseredraw(void); + /* screen.c */ extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void flushmemscreen(Rectangle); -extern int cursoron(int); -extern void cursoroff(int); +extern void cursoron(void); +extern void cursoroff(void); extern void setcursor(Cursor*); extern int screensize(int, int, int, ulong); extern int screenaperture(int, int); extern Rectangle physgscreenr; /* actual monitor size */ extern void blankscreen(int); - -extern void swcursorinit(void); -extern void swcursorhide(void); -extern void swcursoravoid(Rectangle); -extern void swcursorunhide(void); +extern int setcolor(ulong, ulong, ulong, ulong); +extern void getcolor(ulong, ulong*, ulong*, ulong*); /* devdraw.c */ -extern void deletescreenimage(void); -extern void resetscreenimage(void); -extern int drawhasclients(void); -extern ulong blanktime; -extern void setscreenimageclipr(Rectangle); -extern void drawflush(void); -extern int drawidletime(void); extern QLock drawlock; #define ishwimage(i) 0 /* for ../port/devdraw.c */ @@ -103,3 +97,10 @@ /* pixel data, even; base type's width must match Depth */ ushort pixel[Wid*Ht]; }; + +/* swcursor.c */ +void swcursorhide(void); +void swcursoravoid(Rectangle); +void swcursordraw(Point); +void swcursorload(Cursor *); +void swcursorinit(void); --- /sys/src/9/omap/beagle Sat Sep 21 20:44:06 2013 +++ /sys/src/9/omap/beagle Sat Sep 21 20:44:06 2013 @@ -22,7 +22,7 @@ ether netif ip arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium ptclbsum inferno - draw screen + draw screen swcursor dss kbmap kbin --- /sys/src/9/omap/screen.c Sat Sep 21 20:44:08 2013 +++ /sys/src/9/omap/screen.c Sat Sep 21 20:44:09 2013 @@ -346,70 +346,25 @@ blankscreen(on == 0); } -/* - * called with drawlock locked for us, most of the time. - * kernel prints at inopportune times might mean we don't - * hold the lock, but memimagedraw is now reentrant so - * that should be okay: worst case we get cursor droppings. - */ void -swcursorhide(void) +cursoron(void) { - if(swvisible == 0) - return; - if(swback == nil) - return; - swvisible = 0; - memimagedraw(gscreen, swrect, swback, ZP, memopaque, ZP, S); - flushmemscreen(swrect); -} - -void -swcursoravoid(Rectangle r) -{ - if(swvisible && rectXrect(r, swrect)) - swcursorhide(); -} - -void -swcursordraw(void) -{ - if(swvisible) - return; - if(swenabled == 0) - return; - if(swback == nil || swimg1 == nil || swmask1 == nil) - return; -// assert(!canqlock(&drawlock)); // assertion fails on omap - swvispt = swpt; - swvisvers = swvers; - swrect = rectaddpt(Rect(0,0,16,16), swvispt); - memimagedraw(swback, swback->r, gscreen, swpt, memopaque, ZP, S); - memimagedraw(gscreen, swrect, swimg1, ZP, swmask1, ZP, SoverD); - flushmemscreen(swrect); - swvisible = 1; -} - -int -cursoron(int dolock) -{ - if (dolock) - lock(&oscreen); - cursoroff(0); - swcursordraw(); - if (dolock) - unlock(&oscreen); - return 0; + qlock(&drawlock); + lock(&cursor); + swcursorhide(); + swcursordraw(mousexy()); + unlock(&cursor); + qunlock(&drawlock); } void -cursoroff(int dolock) +cursoroff(void) { - if (dolock) - lock(&oscreen); + qlock(&drawlock); + lock(&cursor); swcursorhide(); - if (dolock) - unlock(&oscreen); + unlock(&cursor); + qunlock(&drawlock); } void @@ -448,10 +403,10 @@ void setcursor(Cursor* curs) { - cursoroff(1); + cursoroff(); oscreen.Cursor = *curs; swload(curs); - cursoron(1); + cursoron(); } int @@ -461,61 +416,6 @@ return 0; } -void -swcursorclock(void) -{ - int x; - - if(!swenabled) - return; - swmove(mousexy()); - if(swvisible && eqpt(swpt, swvispt) && swvers==swvisvers) - return; - - x = splhi(); - if(swenabled) - if(!swvisible || !eqpt(swpt, swvispt) || swvers!=swvisvers) - if(canqlock(&drawlock)){ - swcursorhide(); - swcursordraw(); - qunlock(&drawlock); - } - splx(x); -} - -void -swcursorinit(void) -{ - static int init; - - if(!init){ - init = 1; - addclock0link(swcursorclock, 10); - } - if(swback){ - freememimage(swback); - freememimage(swmask); - freememimage(swmask1); - freememimage(swimg); - freememimage(swimg1); - } - - swback = allocmemimage(Rect(0,0,32,32), gscreen->chan); - swmask = allocmemimage(Rect(0,0,16,16), GREY8); - swmask1 = allocmemimage(Rect(0,0,16,16), GREY1); - swimg = allocmemimage(Rect(0,0,16,16), GREY8); - swimg1 = allocmemimage(Rect(0,0,16,16), GREY1); - if(swback==nil || swmask==nil || swmask1==nil || swimg==nil || swimg1 == nil){ - print("software cursor: allocmemimage fails\n"); - return; - } - - memfillcolor(swmask, DOpaque); - memfillcolor(swmask1, DOpaque); - memfillcolor(swimg, DBlack); - memfillcolor(swimg1, DBlack); -} - /* called from main and possibly later from devdss to change resolution */ void screeninit(void) @@ -550,8 +450,6 @@ /* width, in words, of a single scan line */ gscreen->width = Wid * (Depth / BI2BY) / BY2WD; flushmemscreen(gscreen->r); - - blanktime = 3; /* minutes */ if (first) { iprint("on: blue for 3 seconds...");