diff --git a/src/nsterm.m b/src/nsterm.m index 0510f8e0e91..b270e0e58b5 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -1150,9 +1150,11 @@ @interface EmacsBell : NSImageView { // 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 @@ - (id)init; if ((self = [super init])) { nestCount = 0; + isAttached = false; self.image = [NSImage imageNamed:NSImageNameCaution]; } return self; @@ -1183,6 +1186,7 @@ - (void)show:(NSView *)view [self setFrameOrigin:pos]; [self setFrameSize:self.image.size]; + isAttached = true; [[[view window] contentView] addSubview:self positioned:NSWindowAbove relativeTo:nil]; @@ -1199,17 +1203,31 @@ - (void)hide // 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 @@ - (void)hide 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 @@ - (void)hide } +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 @@ - (void)hide { 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,