From 1ba02d85a964e1b2c6a9735cd3decdc524e06dc1 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Sat, 12 Jun 2021 10:25:47 +0100 Subject: [PATCH] Fix macOS live resize drawing * src/nsterm.m ([EmacsView layout]): ([EmacsView layoutSublayersOfLayer:]): Rename layout to layoutSublayersOfLayer. --- src/nsterm.m | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) 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 -- 2.39.2