itdevdraw: use indirect impl interface - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 94d381ec9d579e5336f3817b68cf4d1a8a7333db /src/plan9port/commit/94d381ec9d579e5336f3817b68cf4d1a8a7333db.gph mx1.adamsgaard.dk 70 1parent 162d0d5cd94fabab822ac66655be8957151cef99 /src/plan9port/commit/162d0d5cd94fabab822ac66655be8957151cef99.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Sat, 25 Jan 2020 14:31:52 -0500 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 idevdraw: use indirect impl interface Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iSetting up for a real window system. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/devdraw.c | 4 ++-- Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/devdraw.h | 23 ++++++++++++++--------- Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/mac-screen.m | 38 ++++++++++++++++++++++++------- Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/srv.c | 26 +++++++++++++++----------- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i4 files changed, 61 insertions(+), 30 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c /src/plan9port/file/src/cmd/devdraw/devdraw.c.gph mx1.adamsgaard.dk 70 it@@ -143,7 +143,7 @@ addflush(Client *c, Rectangle r) Err mx1.adamsgaard.dk 70 i // during a resize. Err mx1.adamsgaard.dk 70 i rpc_gfxdrawunlock(); Err mx1.adamsgaard.dk 70 i qunlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i- rpc_flush(c, fr); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_flush(c, fr); Err mx1.adamsgaard.dk 70 i qlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i rpc_gfxdrawlock(); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 it@@ -188,7 +188,7 @@ drawflush(Client *c) Err mx1.adamsgaard.dk 70 i // during a resize. Err mx1.adamsgaard.dk 70 i rpc_gfxdrawunlock(); Err mx1.adamsgaard.dk 70 i qunlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i- rpc_flush(c, r); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_flush(c, r); Err mx1.adamsgaard.dk 70 i qlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i rpc_gfxdrawlock(); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h /src/plan9port/file/src/cmd/devdraw/devdraw.h.gph mx1.adamsgaard.dk 70 it@@ -7,6 +7,7 @@ typedef struct Mousebuf Mousebuf; Err mx1.adamsgaard.dk 70 i typedef struct Tagbuf Tagbuf; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i typedef struct Client Client; Err mx1.adamsgaard.dk 70 i+typedef struct ClientImpl ClientImpl; Err mx1.adamsgaard.dk 70 i typedef struct DImage DImage; Err mx1.adamsgaard.dk 70 i typedef struct DScreen DScreen; Err mx1.adamsgaard.dk 70 i typedef struct CScreen CScreen; Err mx1.adamsgaard.dk 70 it@@ -43,6 +44,18 @@ struct Tagbuf Err mx1.adamsgaard.dk 70 i int wi; Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+struct ClientImpl Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ void (*rpc_resizeimg)(Client*); Err mx1.adamsgaard.dk 70 i+ void (*rpc_resizewindow)(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i+ void (*rpc_setcursor)(Client*, Cursor*, Cursor2*); Err mx1.adamsgaard.dk 70 i+ void (*rpc_setlabel)(Client*, char*); Err mx1.adamsgaard.dk 70 i+ void (*rpc_setmouse)(Client*, Point); Err mx1.adamsgaard.dk 70 i+ void (*rpc_topwin)(Client*); Err mx1.adamsgaard.dk 70 i+ void (*rpc_bouncemouse)(Client*, Mouse); Err mx1.adamsgaard.dk 70 i+ void (*rpc_flush)(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i+}; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i struct Client Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i int rfd; Err mx1.adamsgaard.dk 70 it@@ -82,6 +95,7 @@ struct Client Err mx1.adamsgaard.dk 70 i int nname; Err mx1.adamsgaard.dk 70 i DName* name; Err mx1.adamsgaard.dk 70 i int namevers; Err mx1.adamsgaard.dk 70 i+ ClientImpl* impl; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // Only accessed/modified by the graphics thread. Err mx1.adamsgaard.dk 70 i const void* view; Err mx1.adamsgaard.dk 70 it@@ -196,17 +210,8 @@ void gfx_started(void); Err mx1.adamsgaard.dk 70 i Memimage *rpc_attach(Client*, char*, char*); Err mx1.adamsgaard.dk 70 i char* rpc_getsnarf(void); Err mx1.adamsgaard.dk 70 i void rpc_putsnarf(char*); Err mx1.adamsgaard.dk 70 i-void rpc_resizeimg(Client*); Err mx1.adamsgaard.dk 70 i-void rpc_resizewindow(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i-void rpc_serve(Client*); Err mx1.adamsgaard.dk 70 i-void rpc_setcursor(Client*, Cursor*, Cursor2*); Err mx1.adamsgaard.dk 70 i-void rpc_setlabel(Client*, char*); Err mx1.adamsgaard.dk 70 i-void rpc_setmouse(Client*, Point); Err mx1.adamsgaard.dk 70 i void rpc_shutdown(void); Err mx1.adamsgaard.dk 70 i-void rpc_topwin(Client*); Err mx1.adamsgaard.dk 70 i void rpc_main(void); Err mx1.adamsgaard.dk 70 i-void rpc_bouncemouse(Client*, Mouse); Err mx1.adamsgaard.dk 70 i-void rpc_flush(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // rpc_gfxdrawlock and rpc_gfxdrawunlock Err mx1.adamsgaard.dk 70 i // are called around drawing operations to lock and unlock Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/mac-screen.m b/src/cmd/devdraw/mac-screen.m /src/plan9port/file/src/cmd/devdraw/mac-screen.m.gph mx1.adamsgaard.dk 70 it@@ -37,6 +37,27 @@ static void setprocname(const char*); Err mx1.adamsgaard.dk 70 i static uint keycvt(uint); Err mx1.adamsgaard.dk 70 i static uint msec(void); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+static void rpc_resizeimg(Client*); Err mx1.adamsgaard.dk 70 i+static void rpc_resizewindow(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i+static void rpc_serve(Client*); Err mx1.adamsgaard.dk 70 i+static void rpc_setcursor(Client*, Cursor*, Cursor2*); Err mx1.adamsgaard.dk 70 i+static void rpc_setlabel(Client*, char*); Err mx1.adamsgaard.dk 70 i+static void rpc_setmouse(Client*, Point); Err mx1.adamsgaard.dk 70 i+static void rpc_topwin(Client*); Err mx1.adamsgaard.dk 70 i+static void rpc_bouncemouse(Client*, Mouse); Err mx1.adamsgaard.dk 70 i+static void rpc_flush(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+static ClientImpl macimpl = { Err mx1.adamsgaard.dk 70 i+ rpc_resizeimg, Err mx1.adamsgaard.dk 70 i+ rpc_resizewindow, Err mx1.adamsgaard.dk 70 i+ rpc_setcursor, Err mx1.adamsgaard.dk 70 i+ rpc_setlabel, Err mx1.adamsgaard.dk 70 i+ rpc_setmouse, Err mx1.adamsgaard.dk 70 i+ rpc_topwin, Err mx1.adamsgaard.dk 70 i+ rpc_bouncemouse, Err mx1.adamsgaard.dk 70 i+ rpc_flush Err mx1.adamsgaard.dk 70 i+}; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i @class DrawView; Err mx1.adamsgaard.dk 70 i @class DrawLayer; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -201,6 +222,7 @@ rpc_attach(Client *c, char *label, char *winsize) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i LOG(@"attachscreen(%s, %s)", label, winsize); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+ c->impl = &macimpl; Err mx1.adamsgaard.dk 70 i dispatch_sync(dispatch_get_main_queue(), ^(void) { Err mx1.adamsgaard.dk 70 i @autoreleasepool { Err mx1.adamsgaard.dk 70 i DrawView *view = [[DrawView new] attach:c winsize:winsize label:label]; Err mx1.adamsgaard.dk 70 it@@ -302,7 +324,7 @@ rpc_attach(Client *c, char *label, char *winsize) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // rpc_topwin moves the window to the top of the desktop. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_topwin(Client *c) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)c->view; Err mx1.adamsgaard.dk 70 it@@ -319,7 +341,7 @@ rpc_topwin(Client *c) Err mx1.adamsgaard.dk 70 i // rpc_setlabel updates the client window's label. Err mx1.adamsgaard.dk 70 i // If label == nil, the call is a no-op. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_setlabel(Client *client, char *label) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)client->view; Err mx1.adamsgaard.dk 70 it@@ -344,7 +366,7 @@ rpc_setlabel(Client *client, char *label) Err mx1.adamsgaard.dk 70 i // rpc_setcursor updates the client window's cursor image. Err mx1.adamsgaard.dk 70 i // Either c and c2 are both non-nil, or they are both nil to use the default arrow. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_setcursor(Client *client, Cursor *c, Cursor2 *c2) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)client->view; Err mx1.adamsgaard.dk 70 it@@ -460,7 +482,7 @@ rpc_setcursor(Client *client, Cursor *c, Cursor2 *c2) Err mx1.adamsgaard.dk 70 i // rpc_flush flushes changes to view.img's rectangle r Err mx1.adamsgaard.dk 70 i // to the on-screen window, making them visible. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_flush(Client *client, Rectangle r) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)client->view; Err mx1.adamsgaard.dk 70 it@@ -506,7 +528,7 @@ rpc_flush(Client *client, Rectangle r) Err mx1.adamsgaard.dk 70 i // rpc_resizeimg forces the client window to discard its current window and make a new one. Err mx1.adamsgaard.dk 70 i // It is called when the user types Cmd-R to toggle whether retina mode is forced. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_resizeimg(Client *c) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)c->view; Err mx1.adamsgaard.dk 70 it@@ -541,7 +563,7 @@ rpc_resizeimg(Client *c) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // rpc_resizewindow asks for the client window to be resized to size r. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_resizewindow(Client *c, Rectangle r) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)c->view; Err mx1.adamsgaard.dk 70 it@@ -696,7 +718,7 @@ rpc_resizewindow(Client *c, Rectangle r) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i // rpc_setmouse moves the mouse cursor. Err mx1.adamsgaard.dk 70 i // Called from an RPC thread with no client lock held. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_setmouse(Client *c, Point p) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i DrawView *view = (__bridge DrawView*)c->view; Err mx1.adamsgaard.dk 70 it@@ -1095,7 +1117,7 @@ rpc_putsnarf(char *s) Err mx1.adamsgaard.dk 70 i // rpc_bouncemouse is for sending a mouse event Err mx1.adamsgaard.dk 70 i // back to the X11 window manager rio(1). Err mx1.adamsgaard.dk 70 i // Does not apply here. Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i+static void Err mx1.adamsgaard.dk 70 i rpc_bouncemouse(Client *c, Mouse m) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/srv.c b/src/cmd/devdraw/srv.c /src/plan9port/file/src/cmd/devdraw/srv.c.gph mx1.adamsgaard.dk 70 it@@ -54,6 +54,7 @@ threadmain(int argc, char **argv) Err mx1.adamsgaard.dk 70 i usage(); Err mx1.adamsgaard.dk 70 i }ARGEND Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+ memimageinit(); Err mx1.adamsgaard.dk 70 i fmtinstall('H', encodefmt); Err mx1.adamsgaard.dk 70 i if((p = getenv("DEVDRAWTRACE")) != nil) Err mx1.adamsgaard.dk 70 i trace = atoi(p); Err mx1.adamsgaard.dk 70 it@@ -202,8 +203,11 @@ runmsg(Client *c, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tinit: Err mx1.adamsgaard.dk 70 i- memimageinit(); Err mx1.adamsgaard.dk 70 i i = rpc_attach(c, m->label, m->winsize); Err mx1.adamsgaard.dk 70 i+ if(i == nil) { Err mx1.adamsgaard.dk 70 i+ replyerror(c, m); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i draw_initdisplaymemimage(c, i); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 it@@ -241,35 +245,35 @@ runmsg(Client *c, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tmoveto: Err mx1.adamsgaard.dk 70 i- rpc_setmouse(c, m->mouse.xy); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_setmouse(c, m->mouse.xy); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tcursor: Err mx1.adamsgaard.dk 70 i if(m->arrowcursor) Err mx1.adamsgaard.dk 70 i- rpc_setcursor(c, nil, nil); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_setcursor(c, nil, nil); Err mx1.adamsgaard.dk 70 i else { Err mx1.adamsgaard.dk 70 i scalecursor(&m->cursor2, &m->cursor); Err mx1.adamsgaard.dk 70 i- rpc_setcursor(c, &m->cursor, &m->cursor2); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_setcursor(c, &m->cursor, &m->cursor2); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tcursor2: Err mx1.adamsgaard.dk 70 i if(m->arrowcursor) Err mx1.adamsgaard.dk 70 i- rpc_setcursor(c, nil, nil); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_setcursor(c, nil, nil); Err mx1.adamsgaard.dk 70 i else Err mx1.adamsgaard.dk 70 i- rpc_setcursor(c, &m->cursor, &m->cursor2); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_setcursor(c, &m->cursor, &m->cursor2); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tbouncemouse: Err mx1.adamsgaard.dk 70 i- rpc_bouncemouse(c, m->mouse); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_bouncemouse(c, m->mouse); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tlabel: Err mx1.adamsgaard.dk 70 i- rpc_setlabel(c, m->label); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_setlabel(c, m->label); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -306,12 +310,12 @@ runmsg(Client *c, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Ttop: Err mx1.adamsgaard.dk 70 i- rpc_topwin(c); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_topwin(c); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Tresize: Err mx1.adamsgaard.dk 70 i- rpc_resizewindow(c, m->rect); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_resizewindow(c, m->rect); Err mx1.adamsgaard.dk 70 i replymsg(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 it@@ -513,7 +517,7 @@ gfx_keystroke(Client *c, int ch) Err mx1.adamsgaard.dk 70 i else Err mx1.adamsgaard.dk 70 i c->forcedpi = 225; Err mx1.adamsgaard.dk 70 i qunlock(&c->eventlk); Err mx1.adamsgaard.dk 70 i- rpc_resizeimg(c); Err mx1.adamsgaard.dk 70 i+ c->impl->rpc_resizeimg(c); Err mx1.adamsgaard.dk 70 i return; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i if(!c->kbd.alting){ Err mx1.adamsgaard.dk 70 .