From: Alan Third Date: Sat, 12 Jun 2021 09:25:47 +0000 (+0100) Subject: Fix macOS live resize drawing X-Git-Tag: emacs-28.0.90~1634 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1ba02d85a964e1b2c6a9735cd3decdc524e06dc1;p=emacs.git Fix macOS live resize drawing * src/nsterm.m ([EmacsView layout]): ([EmacsView layoutSublayersOfLayer:]): Rename layout to layoutSublayersOfLayer. --- diff --git a/src/nsterm.m b/src/nsterm.m index a005c4e8139..b8b306e685a 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -8040,24 +8040,33 @@ not_in_argv (NSString *arg) redisplay before drawing. This used to be done in viewWillDraw, but with the custom layer - that method is not called. */ -- (void)layout -{ - [super layout]; - - /* If there is IO going on when redisplay is run here Emacs - crashes. I think it's because this code will always be run - within the run loop and for whatever reason processing input - is dangerous. This technique was stolen wholesale from - nsmenu.m and seems to work. */ - bool owfi = waiting_for_input; - waiting_for_input = 0; - block_input (); + that method is not called. We cannot call redisplay directly from + [NSView layout], because it may trigger another round of layout by + changing the frame size and recursive layout calls are banned. It + appears to be safe to call redisplay here. */ +- (void)layoutSublayersOfLayer:(CALayer *)layer +{ + if (!redisplaying_p && FRAME_GARBAGED_P (emacsframe)) + { + /* If there is IO going on when redisplay is run here Emacs + crashes. I think it's because this code will always be run + within the run loop and for whatever reason processing input + is dangerous. This technique was stolen wholesale from + nsmenu.m and seems to work. - redisplay (); + FIXME: I can't provoke a crash using layoutSublayersOfLayer, + however I can't understand why it would be different from + viewWillDraw. I'll leave this commented out for now, but if + nobody reports a crash it can be removed. */ + // bool owfi = waiting_for_input; + // waiting_for_input = 0; + // block_input (); - unblock_input (); - waiting_for_input = owfi; + redisplay (); + + // unblock_input (); + // waiting_for_input = owfi; + } } #endif