From 11a9c72fafaa02ef26708da6ffe765a7fdaa4565 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Fri, 4 Apr 2014 18:32:24 +0200 Subject: [PATCH] Backport from trunk. * nsmenu.m (update_frame_tool_bar): Return early if view or toolbar is nil. If waiting for toolbar to complete, force a redraw. (free_frame_tool_bar): Set wait_for_tool_bar = NO * nsterm.h (EmacsView): Add wait_for_tool_bar. * nsterm.m (updateFrameSize:): If waiting for the tool bar and tool bar is zero height, just return (Bug#16976). (initFrameFromEmacs:): Initialize wait_for_tool_bar. --- src/ChangeLog | 13 +++++++++++++ src/nsmenu.m | 15 +++++++++++---- src/nsterm.h | 1 + src/nsterm.m | 14 ++++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index c35206447f1..c370bdc0404 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2014-04-04 Jan Djärv + + Backport from trunk. + * nsterm.m (updateFrameSize:): If waiting for the tool bar and tool + bar is zero height, just return (Bug#16976). + (initFrameFromEmacs:): Initialize wait_for_tool_bar. + + * nsterm.h (EmacsView): Add wait_for_tool_bar. + + * nsmenu.m (update_frame_tool_bar): Return early if view or toolbar + is nil. If waiting for toolbar to complete, force a redraw. + (free_frame_tool_bar): Set wait_for_tool_bar = NO (Bug#16976) + 2014-04-03 Ken Brown * Makefile.in (EMACS_MANIFEST): Update comment. (Bug#17176) diff --git a/src/nsmenu.m b/src/nsmenu.m index f8cd07478ed..24842241f37 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -1054,8 +1054,10 @@ free_frame_tool_bar (struct frame *f) Under NS we just hide the toolbar until it might be needed again. -------------------------------------------------------------------------- */ { + EmacsView *view = FRAME_NS_VIEW (f); block_input (); - [[FRAME_NS_VIEW (f) toolbar] setVisible: NO]; + view->wait_for_tool_bar = NO; + [[view toolbar] setVisible: NO]; FRAME_TOOLBAR_HEIGHT (f) = 0; unblock_input (); } @@ -1071,6 +1073,7 @@ update_frame_tool_bar (struct frame *f) NSWindow *window = [view window]; EmacsToolbar *toolbar = [view toolbar]; + if (view == nil || toolbar == nil) return; block_input (); #ifdef NS_IMPL_COCOA @@ -1176,9 +1179,13 @@ update_frame_tool_bar (struct frame *f) FRAME_TOOLBAR_HEIGHT (f) = NSHeight ([window frameRectForContentRect: NSMakeRect (0, 0, 0, 0)]) - FRAME_NS_TITLEBAR_HEIGHT (f); - if (FRAME_TOOLBAR_HEIGHT (f) < 0) // happens if frame is fullscreen. - FRAME_TOOLBAR_HEIGHT (f) = 0; - unblock_input (); + if (FRAME_TOOLBAR_HEIGHT (f) < 0) // happens if frame is fullscreen. + FRAME_TOOLBAR_HEIGHT (f) = 0; + + if (view->wait_for_tool_bar && FRAME_TOOLBAR_HEIGHT (f) > 0) + [view setNeedsDisplay: YES]; + + unblock_input (); } diff --git a/src/nsterm.h b/src/nsterm.h index 8e8a9b7f36f..74789634a90 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -162,6 +162,7 @@ typedef float EmacsCGFloat; int scrollbarsNeedingUpdate; EmacsToolbar *toolbar; NSRect ns_userRect; + BOOL wait_for_tool_bar; } /* AppKit-side interface */ diff --git a/src/nsterm.m b/src/nsterm.m index 0e8fc56fdd9..c7cb4faa3b7 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -5766,6 +5766,13 @@ not_in_argv (NSString *arg) + FRAME_TOOLBAR_HEIGHT (emacsframe); } + if (wait_for_tool_bar) + { + if (FRAME_TOOLBAR_HEIGHT (emacsframe) == 0) + return; + wait_for_tool_bar = NO; + } + neww = (int)wr.size.width - emacsframe->border_width; newh = (int)wr.size.height - extra; @@ -6078,6 +6085,13 @@ if (cols > 0 && rows > 0) ns_window_num]]; [win setToolbar: toolbar]; [toolbar setVisible: NO]; + + /* Don't set frame garbaged until tool bar is up to date? + This avoids an extra clear and redraw (flicker) at frame creation. */ + if (FRAME_EXTERNAL_TOOL_BAR (f)) wait_for_tool_bar = YES; + else wait_for_tool_bar = NO; + + #ifdef NS_IMPL_COCOA { NSButton *toggleButton; -- 2.39.2