From: Anders Lindgren Date: Sat, 2 Jan 2016 14:54:01 +0000 (+0100) Subject: ; Fixed visual bell artifact problem on NextStep. X-Git-Tag: emacs-25.0.90~291 X-Git-Url: https://code.delx.au/gnu-emacs/commitdiff_plain/55a28d8a1b1981d8469b39c68488f1848e8601b2 ; Fixed visual bell artifact problem on NextStep. * src/nsterm.m (EmacsBell): Add feature to remove visual bell unconditionally. (hide_bell): New function. (ns_copy_bits): Hide visible bell before scrolling the frame content. --- diff --git a/src/nsterm.m b/src/nsterm.m index 0510f8e0e9..b270e0e58b 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -1150,9 +1150,11 @@ ns_clip_to_row (struct window *w, struct glyph_row *row, { // Number of currently active bell:s. unsigned int nestCount; + bool isAttached; } - (void)show:(NSView *)view; - (void)hide; +- (void)remove; @end @implementation EmacsBell @@ -1162,6 +1164,7 @@ ns_clip_to_row (struct window *w, struct glyph_row *row, if ((self = [super init])) { nestCount = 0; + isAttached = false; self.image = [NSImage imageNamed:NSImageNameCaution]; } return self; @@ -1183,6 +1186,7 @@ ns_clip_to_row (struct window *w, struct glyph_row *row, [self setFrameOrigin:pos]; [self setFrameSize:self.image.size]; + isAttached = true; [[[view window] contentView] addSubview:self positioned:NSWindowAbove relativeTo:nil]; @@ -1199,17 +1203,31 @@ ns_clip_to_row (struct window *w, struct glyph_row *row, // Note: Trace output from this method isn't shown, reason unknown. // NSTRACE ("[EmacsBell hide]"); - --nestCount; + if (nestCount > 0) + --nestCount; // Remove the image once the last bell became inactive. if (nestCount == 0) + { + [self remove]; + } +} + + +-(void)remove +{ + if (isAttached) { [self removeFromSuperview]; + isAttached = false; } } @end + +static EmacsBell * bell_view = nil; + static void ns_ring_bell (struct frame *f) /* -------------------------------------------------------------------------- @@ -1222,7 +1240,6 @@ ns_ring_bell (struct frame *f) struct frame *frame = SELECTED_FRAME (); NSView *view; - static EmacsBell * bell_view = nil; if (bell_view == nil) { bell_view = [[EmacsBell alloc] init]; @@ -1246,6 +1263,18 @@ ns_ring_bell (struct frame *f) } +static void hide_bell () +/* -------------------------------------------------------------------------- + Ensure the bell is hidden. + -------------------------------------------------------------------------- */ +{ + if (bell_view != nil) + { + [bell_view remove]; + } +} + + /* ========================================================================== Frame / window manager related functions @@ -2328,6 +2357,8 @@ ns_copy_bits (struct frame *f, NSRect src, NSRect dest) { if (FRAME_NS_VIEW (f)) { + hide_bell(); // Ensure the bell image isn't scrolled. + ns_focus (f, &dest, 1); [FRAME_NS_VIEW (f) scrollRect: src by: NSMakeSize (dest.origin.x - src.origin.x,