diff options
author | Alan Third <alan@idiocy.org> | 2018-03-19 15:04:40 +0000 |
---|---|---|
committer | Alan Third <alan@idiocy.org> | 2018-03-19 17:16:14 +0000 |
commit | 903e3d43310638014a33fec64700e7db8e0774d0 (patch) | |
tree | 542a10151ab1d98152fbb9b0362f67873298fde0 /src/nsterm.m | |
parent | 1979bce57d1887d89de6d728bb34dcd0f6478b2f (diff) | |
download | emacs-903e3d43310638014a33fec64700e7db8e0774d0.tar.gz |
Fix frame resize flicker on macOS (bug#30699)
* src/nsterm.h (ns_enable_screen_updates): New function.
* src/nsterm.m (ns_enable_screen_updates):
(ns_disable_screen_updates): New functions.
(disable_screen_updates_count): Count of number of times we've called
NSDisableScreenUpdates.
(x_set_window_size): Disable screen updates when not in a live resize
loop.
* src/xdisp.c (redisplay_internal): Reenable screen updates when
redisplay doesn't complete due to a popup.
(unwind_redisplay): Reenable screen updates.
Diffstat (limited to 'src/nsterm.m')
-rw-r--r-- | src/nsterm.m | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/nsterm.m b/src/nsterm.m index 75e0b837c67..f9107c43ce1 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -288,6 +288,9 @@ static BOOL gsaved = NO; static BOOL ns_fake_keydown = NO; #ifdef NS_IMPL_COCOA static BOOL ns_menu_bar_is_hidden = NO; + +/* The number of times NSDisableScreenUpdates has been called. */ +static int disable_screen_updates_count = 0; #endif /*static int debug_lock = 0; */ @@ -727,6 +730,40 @@ ns_release_autorelease_pool (void *pool) } +#ifdef NS_IMPL_COCOA +/* Disabling screen updates can be used to make several actions appear + "atomic" to the end user. It seems some actions can still update + the display, though. + + When we re-enable screen updates the number of calls to + NSEnableScreenUpdates should match the number to + NSDisableScreenUpdates. + + We use these functions to prevent the user seeing a blank frame + after it has been resized. x_set_window_size disables updates and + when redisplay completes unwind_redisplay enables them again + (bug#30699). */ + +static void +ns_disable_screen_updates (void) +{ + NSDisableScreenUpdates (); + disable_screen_updates_count++; +} + +void +ns_enable_screen_updates (void) +/* Re-enable screen updates. Called from unwind_redisplay. */ +{ + while (disable_screen_updates_count > 0) + { + NSEnableScreenUpdates (); + disable_screen_updates_count--; + } +} +#endif + + static BOOL ns_menu_bar_should_be_hidden (void) /* True, if the menu bar should be hidden. */ @@ -1877,6 +1914,15 @@ x_set_window_size (struct frame *f, block_input (); +#ifdef NS_IMPL_COCOA + /* To prevent showing the user a blank frame, stop updates being + flushed to the screen until after redisplay has completed. This + breaks live resize (resizing with a mouse), so don't do it if + we're in a live resize loop. */ + if (![view inLiveResize]) + ns_disable_screen_updates (); +#endif + if (pixelwise) { pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width); |