summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-01-30 18:22:52 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2019-01-30 18:22:52 +0100
commitcefc849a9521c9d5ba85d5aa88526d0f4b059db9 (patch)
treeb5f42fb9651de5734abc2e23647ca9ec7ea49c25 /sys/src/cmd/vnc
parent8e1218acebcb87bcf16e6bca5b5f213ff2a1df3a (diff)
devdraw: get rid of softscreen==0xa110c hack and make attachscreen() return Memdata*
all screen implementations use a Memimage* internally for the framebuffer, so we can return a shared reference to its Memdata structure in attachscreen() instead of a framebuffer data pointer. this eleminates the softscreen == 0xa110c hack as we always use shared Memdata* now.
Diffstat (limited to 'sys/src/cmd/vnc')
-rw-r--r--sys/src/cmd/vnc/devdraw.c29
-rw-r--r--sys/src/cmd/vnc/screen.c5
-rw-r--r--sys/src/cmd/vnc/screen.h2
3 files changed, 9 insertions, 27 deletions
diff --git a/sys/src/cmd/vnc/devdraw.c b/sys/src/cmd/vnc/devdraw.c
index 07d27c147..48ec63e03 100644
--- a/sys/src/cmd/vnc/devdraw.c
+++ b/sys/src/cmd/vnc/devdraw.c
@@ -925,33 +925,14 @@ makescreenimage(void)
Memdata *md;
Memimage *i;
Rectangle r;
- uchar *data;
- if((data = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen)) == nil)
+ if((md = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen)) == nil)
return nil;
- if(sdraw.softscreen == 0xa110c){
- /* hack: softscreen is memimage. */
- md = *((Memdata**)(data - sizeof(ulong) - sizeof(Memdata*)));
-
- assert(md->bdata == data);
- assert(md->ref > 1);
- assert(md->allocd);
-
- if((i = allocmemimaged(r, chan, md)) == nil){
- md->ref--;
- return nil;
- }
- }else{
- if((md = malloc(sizeof *md)) == nil)
- return nil;
- md->allocd = 1;
- md->base = nil;
- md->bdata = data;
- md->ref = 1;
- if((i = allocmemimaged(r, chan, md)) == nil){
+ assert(md->ref > 0);
+ if((i = allocmemimaged(r, chan, md)) == nil){
+ if(--md->ref == 0 && md->allocd)
free(md);
- return nil;
- }
+ return nil;
}
i->width = width;
i->clipr = r;
diff --git a/sys/src/cmd/vnc/screen.c b/sys/src/cmd/vnc/screen.c
index 6d507877c..51361584d 100644
--- a/sys/src/cmd/vnc/screen.c
+++ b/sys/src/cmd/vnc/screen.c
@@ -126,7 +126,7 @@ screenwin(void)
qunlock(&drawlock);
}
-uchar*
+Memdata*
attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
{
*r = gscreen->clipr;
@@ -135,7 +135,8 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
*width = gscreen->width;
*softscreen = 1;
- return gscreen->data->bdata;
+ gscreen->data->ref++;
+ return gscreen->data;
}
void
diff --git a/sys/src/cmd/vnc/screen.h b/sys/src/cmd/vnc/screen.h
index ce525102c..5ba53a9ac 100644
--- a/sys/src/cmd/vnc/screen.h
+++ b/sys/src/cmd/vnc/screen.h
@@ -29,7 +29,7 @@ extern void blankscreen(int);
void screeninit(int x, int y, char *chanstr);
void screenwin(void);
void absmousetrack(int x, int y, int b, ulong msec);
-uchar *attachscreen(Rectangle*, ulong*, int*, int*, int*);
+Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*);
void deletescreenimage(void);
void resetscreenimage(void);