; 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.
This commit is contained in:
Anders Lindgren 2016-01-02 15:54:01 +01:00
parent d064034c1c
commit 55a28d8a1b

View file

@ -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,