Avoid screen artifacts with new OS X visible bell after scrolling
* src/nsterm.m (EmacsBell): Save NSView when displaying the visible bell and set `needsDisplay' when removed. (hide_bell): Trace. (ns_copy_bits): Trace.
This commit is contained in:
parent
7a2edd3427
commit
1df7173eb2
1 changed files with 29 additions and 1 deletions
30
src/nsterm.m
30
src/nsterm.m
|
@ -1172,10 +1172,31 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
// This bell implementation shows the visual bell image asynchronously
|
||||||
|
// from the rest of Emacs. This is done by adding a NSView to the
|
||||||
|
// superview of the Emacs window and removing it using a timer.
|
||||||
|
//
|
||||||
|
// Unfortunately, some Emacs operations, like scrolling, is done using
|
||||||
|
// low-level primitives that copy the content of the window, including
|
||||||
|
// the bell image. To some extent, this is handled by removing the
|
||||||
|
// image prior to scrolling and marking that the window is in need for
|
||||||
|
// redisplay.
|
||||||
|
//
|
||||||
|
// To test this code, make sure that there is no artifacts of the bell
|
||||||
|
// image in the following situations. Use a non-empty buffer (like the
|
||||||
|
// tutorial) to ensure that a scroll is performed:
|
||||||
|
//
|
||||||
|
// * Single-window: C-g C-v
|
||||||
|
//
|
||||||
|
// * Side-by-windows: C-x 3 C-g C-v
|
||||||
|
//
|
||||||
|
// * Windows above each other: C-x 2 C-g C-v
|
||||||
|
|
||||||
@interface EmacsBell : NSImageView
|
@interface EmacsBell : NSImageView
|
||||||
{
|
{
|
||||||
// Number of currently active bell:s.
|
// Number of currently active bell:s.
|
||||||
unsigned int nestCount;
|
unsigned int nestCount;
|
||||||
|
NSView * mView;
|
||||||
bool isAttached;
|
bool isAttached;
|
||||||
}
|
}
|
||||||
- (void)show:(NSView *)view;
|
- (void)show:(NSView *)view;
|
||||||
|
@ -1204,7 +1225,6 @@ - (id)init;
|
||||||
[self.image unlockFocus];
|
[self.image unlockFocus];
|
||||||
#else
|
#else
|
||||||
self.image = [NSImage imageNamed:NSImageNameCaution];
|
self.image = [NSImage imageNamed:NSImageNameCaution];
|
||||||
[self.image setScalesWhenResized:YES];
|
|
||||||
[self.image setSize:NSMakeSize(self.image.size.width * 5,
|
[self.image setSize:NSMakeSize(self.image.size.width * 5,
|
||||||
self.image.size.height * 5)];
|
self.image.size.height * 5)];
|
||||||
#endif
|
#endif
|
||||||
|
@ -1229,6 +1249,7 @@ - (void)show:(NSView *)view
|
||||||
[self setFrameSize:self.image.size];
|
[self setFrameSize:self.image.size];
|
||||||
|
|
||||||
isAttached = true;
|
isAttached = true;
|
||||||
|
mView = view;
|
||||||
[[[view window] contentView] addSubview:self
|
[[[view window] contentView] addSubview:self
|
||||||
positioned:NSWindowAbove
|
positioned:NSWindowAbove
|
||||||
relativeTo:nil];
|
relativeTo:nil];
|
||||||
|
@ -1258,9 +1279,12 @@ - (void)hide
|
||||||
|
|
||||||
-(void)remove
|
-(void)remove
|
||||||
{
|
{
|
||||||
|
NSTRACE ("[EmacsBell remove]");
|
||||||
if (isAttached)
|
if (isAttached)
|
||||||
{
|
{
|
||||||
|
NSTRACE_MSG ("removeFromSuperview");
|
||||||
[self removeFromSuperview];
|
[self removeFromSuperview];
|
||||||
|
mView.needsDisplay = YES;
|
||||||
isAttached = false;
|
isAttached = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1310,6 +1334,8 @@ static void hide_bell ()
|
||||||
Ensure the bell is hidden.
|
Ensure the bell is hidden.
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
{
|
{
|
||||||
|
NSTRACE ("hide_bell");
|
||||||
|
|
||||||
if (bell_view != nil)
|
if (bell_view != nil)
|
||||||
{
|
{
|
||||||
[bell_view remove];
|
[bell_view remove];
|
||||||
|
@ -2392,6 +2418,8 @@ static void hide_bell ()
|
||||||
static void
|
static void
|
||||||
ns_copy_bits (struct frame *f, NSRect src, NSRect dest)
|
ns_copy_bits (struct frame *f, NSRect src, NSRect dest)
|
||||||
{
|
{
|
||||||
|
NSTRACE ("ns_copy_bits");
|
||||||
|
|
||||||
if (FRAME_NS_VIEW (f))
|
if (FRAME_NS_VIEW (f))
|
||||||
{
|
{
|
||||||
hide_bell(); // Ensure the bell image isn't scrolled.
|
hide_bell(); // Ensure the bell image isn't scrolled.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue