From 1f799495e4aa89be5f32e3fcda8da342f3057f3c Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 14 Jan 2020 19:43:32 -0500 Subject: devdraw: notify window resize promptly on x11 Fixes #339. --- src/cmd/devdraw/devdraw.c | 5 +---- src/cmd/devdraw/devdraw.h | 1 + src/cmd/devdraw/mac-screen.m | 1 - src/cmd/devdraw/srv.c | 18 ++++++++++++++++++ src/cmd/devdraw/x11-screen.c | 16 ++++++++-------- 5 files changed, 28 insertions(+), 13 deletions(-) (limited to 'src/cmd') diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c index 086574ef..b4c373ad 100644 --- a/src/cmd/devdraw/devdraw.c +++ b/src/cmd/devdraw/devdraw.c @@ -55,10 +55,7 @@ gfx_replacescreenimage(Client *c, Memimage *m) _freememimage(om); } qunlock(&c->drawlk); - - qlock(&c->eventlk); - c->mouse.resized = 1; - qunlock(&c->eventlk); + gfx_mouseresized(c); } static void diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h index 4980ed90..6829ab32 100644 --- a/src/cmd/devdraw/devdraw.h +++ b/src/cmd/devdraw/devdraw.h @@ -187,6 +187,7 @@ void gfx_keystroke(Client*, int); void gfx_main(void); void gfx_mousetrack(Client*, int, int, int, uint); void gfx_replacescreenimage(Client*, Memimage*); +void gfx_mouseresized(Client*); void gfx_started(void); // rpc_* routines are called on the RPC thread, diff --git a/src/cmd/devdraw/mac-screen.m b/src/cmd/devdraw/mac-screen.m index 5e23c43a..4bc3f088 100644 --- a/src/cmd/devdraw/mac-screen.m +++ b/src/cmd/devdraw/mac-screen.m @@ -518,7 +518,6 @@ rpc_resizeimg(Client *c) - (void)resizeimg { [self initimg]; gfx_replacescreenimage(self.client, self.img); - [self sendmouse:0]; } - (void)windowDidResize:(NSNotification *)notification { diff --git a/src/cmd/devdraw/srv.c b/src/cmd/devdraw/srv.c index bfeb7c38..c98a865f 100644 --- a/src/cmd/devdraw/srv.c +++ b/src/cmd/devdraw/srv.c @@ -394,12 +394,30 @@ matchmouse(Client *c) } } +void +gfx_mouseresized(Client *c) +{ + gfx_mousetrack(c, -1, -1, -1, -1); +} + void gfx_mousetrack(Client *c, int x, int y, int b, uint ms) { Mouse *m; qlock(&c->eventlk); + if(x == -1 && y == -1 && b == -1 && ms == -1) { + Mouse *copy; + // repeat last mouse event for resize + if(c->mouse.ri == 0) + copy = &c->mouse.m[nelem(c->mouse.m)-1]; + else + copy = &c->mouse.m[c->mouse.ri-1]; + x = copy->xy.x; + y = copy->xy.y; + b = copy->buttons; + ms = copy->msec; + } if(x < c->mouserect.min.x) x = c->mouserect.min.x; if(x > c->mouserect.max.x) diff --git a/src/cmd/devdraw/x11-screen.c b/src/cmd/devdraw/x11-screen.c index 8026e1e6..c3a6fa33 100644 --- a/src/cmd/devdraw/x11-screen.c +++ b/src/cmd/devdraw/x11-screen.c @@ -44,7 +44,7 @@ static Xwin* newxwin(Client *c) { Xwin *w; - + w = mallocz(sizeof *w, 1); if(w == nil) sysfatal("out of memory"); @@ -59,7 +59,7 @@ static Xwin* findxwin(XDrawable d) { Xwin *w, **l; - + for(l=&_x.windows; (w=*l) != nil; l=&w->next) { if(w->drawable == d) { /* move to front */ @@ -658,7 +658,7 @@ xattach(Client *client, char *label, char *winsize) _x.losefocus = XInternAtom(_x.display, "_9WM_LOSE_FOCUS", False); _x.wmprotos = XInternAtom(_x.display, "WM_PROTOCOLS", False); } - + atoms[0] = _x.takefocus; atoms[1] = _x.losefocus; XChangeProperty(_x.display, w->drawable, _x.wmprotos, XA_ATOM, 32, @@ -700,7 +700,7 @@ xattach(Client *client, char *label, char *winsize) _x.gcsimplesrc = xgc(w->screenpm, FillStippled, -1); _x.gczero = xgc(w->screenpm, -1, -1); _x.gcreplsrc = xgc(w->screenpm, FillTiled, -1); - + pmid = XCreatePixmap(_x.display, w->drawable, 1, 1, 1); _x.gcfill0 = xgc(pmid, FillSolid, 0); _x.gccopy0 = xgc(pmid, -1, -1); @@ -729,7 +729,7 @@ rpc_setlabel(Client *client, char *label) { Xwin *w = (Xwin*)client->view; XTextProperty name; - + /* * Label and other properties required by ICCCCM. */ @@ -1032,7 +1032,7 @@ _xreplacescreenimage(Client *client) XDrawable pixmap; Rectangle r; Xwin *w; - + w = (Xwin*)client->view; r = w->newscreenr; pixmap = XCreatePixmap(_x.display, w->drawable, Dx(r), Dy(r), _x.depth); @@ -1527,7 +1527,7 @@ __xputsnarf(char *data) { XButtonEvent e; Xwin *w; - + if(strlen(data) >= SnarfSize) return; qlock(&clip.lk); @@ -1730,7 +1730,7 @@ rpc_bouncemouse(Client *c, Mouse m) Xwin *w = (Xwin*)c->view; XButtonEvent e; XWindow dw; - + xlock(); e.type = ButtonPress; e.state = 0; -- cgit v1.2.3