Created
March 10, 2018 01:06
-
-
Save aaronjensen/4e438256820aeb1e6088b9b07bfe1956 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From c382338d44c3ff833e965e1d92106a90b75edec5 Mon Sep 17 00:00:00 2001 | |
From: Alan Third <[email protected]> | |
Date: Sat, 10 Mar 2018 00:09:09 +0000 | |
Subject: [PATCH] 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 NS screenupdates at end | |
of redisplay. | |
--- | |
src/nsterm.h | 3 +++ | |
src/nsterm.m | 30 ++++++++++++++++++++++++++++++ | |
src/xdisp.c | 3 +++ | |
3 files changed, 36 insertions(+) | |
diff --git a/src/nsterm.h b/src/nsterm.h | |
index 8b985930ec..df59a7dbd9 100644 | |
--- a/src/nsterm.h | |
+++ b/src/nsterm.h | |
@@ -1160,6 +1160,9 @@ extern void ns_release_autorelease_pool (void *); | |
extern const char *ns_get_defaults_value (const char *key); | |
extern void ns_init_locale (void); | |
+#ifdef NS_IMPL_COCOA | |
+extern void ns_enable_screen_updates (void); | |
+#endif | |
/* in nsmenu */ | |
extern void update_frame_tool_bar (struct frame *f); | |
diff --git a/src/nsterm.m b/src/nsterm.m | |
index 1919c6defa..b4ec384aaf 100644 | |
--- a/src/nsterm.m | |
+++ b/src/nsterm.m | |
@@ -288,6 +288,7 @@ - (NSColor *)colorUsingDefaultColorSpace | |
static BOOL ns_fake_keydown = NO; | |
#ifdef NS_IMPL_COCOA | |
static BOOL ns_menu_bar_is_hidden = NO; | |
+static int disable_screen_updates_count = 0; | |
#endif | |
/*static int debug_lock = 0; */ | |
@@ -727,6 +728,26 @@ Free a pool and temporary objects it refers to (callable from C) | |
} | |
+#ifdef NS_IMPL_COCOA | |
+static void | |
+ns_disable_screen_updates (void) | |
+{ | |
+ NSDisableScreenUpdates (); | |
+ disable_screen_updates_count++; | |
+} | |
+ | |
+void | |
+ns_enable_screen_updates (void) | |
+{ | |
+ 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 +1898,15 @@ -(void)remove | |
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); | |
diff --git a/src/xdisp.c b/src/xdisp.c | |
index 9170d6b777..d4fdb44b32 100644 | |
--- a/src/xdisp.c | |
+++ b/src/xdisp.c | |
@@ -14599,6 +14599,9 @@ redisplay_internal (void) | |
end_of_redisplay: | |
#ifdef HAVE_NS | |
ns_set_doc_edited (); | |
+#ifdef NS_IMPL_COCOA | |
+ ns_enable_screen_updates (); | |
+#endif | |
#endif | |
if (interrupt_input && interrupts_deferred) | |
request_sigio (); | |
-- | |
2.16.1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment