#endif
#ifdef NS_IMPL_COCOA
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
#include "macfont.h"
#endif
-#endif
/* call tracing */
#if 0
ns_update_auto_hide_menu_bar (void)
{
#ifdef NS_IMPL_COCOA
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
block_input ();
NSTRACE (ns_update_auto_hide_menu_bar);
unblock_input ();
#endif
-#endif
}
block_input ();
- if (dpyinfo->last_mouse_scroll_bar != nil && insist == 0)
- {
- /* TODO: we do not use this path at the moment because drag events will
- go directly to the EmacsScroller. Leaving code in for now. */
- [dpyinfo->last_mouse_scroll_bar
- getMouseMotionPart: (int *)part window: bar_window x: x y: y];
- if (time)
- *time = dpyinfo->last_mouse_movement_time;
- dpyinfo->last_mouse_scroll_bar = nil;
- }
+ /* Clear the mouse-moved flag for every frame on this display. */
+ FOR_EACH_FRAME (tail, frame)
+ if (FRAME_NS_P (XFRAME (frame))
+ && FRAME_NS_DISPLAY (XFRAME (frame)) == FRAME_NS_DISPLAY (*fp))
+ XFRAME (frame)->mouse_moved = 0;
+
+ dpyinfo->last_mouse_scroll_bar = nil;
+ if (dpyinfo->last_mouse_frame
+ && FRAME_LIVE_P (dpyinfo->last_mouse_frame))
+ f = dpyinfo->last_mouse_frame;
else
- {
- /* Clear the mouse-moved flag for every frame on this display. */
- FOR_EACH_FRAME (tail, frame)
- if (FRAME_NS_P (XFRAME (frame))
- && FRAME_NS_DISPLAY (XFRAME (frame)) == FRAME_NS_DISPLAY (*fp))
- XFRAME (frame)->mouse_moved = 0;
+ f = dpyinfo->x_focus_frame ? dpyinfo->x_focus_frame : SELECTED_FRAME ();
- dpyinfo->last_mouse_scroll_bar = nil;
- if (dpyinfo->last_mouse_frame
- && FRAME_LIVE_P (dpyinfo->last_mouse_frame))
- f = dpyinfo->last_mouse_frame;
- else
- f = dpyinfo->x_focus_frame ? dpyinfo->x_focus_frame
- : SELECTED_FRAME ();
-
- if (f && FRAME_NS_P (f))
- {
- view = FRAME_NS_VIEW (*fp);
+ if (f && FRAME_NS_P (f))
+ {
+ view = FRAME_NS_VIEW (*fp);
- position = [[view window] mouseLocationOutsideOfEventStream];
- position = [view convertPoint: position fromView: nil];
- remember_mouse_glyph (f, position.x, position.y,
- &dpyinfo->last_mouse_glyph);
+ position = [[view window] mouseLocationOutsideOfEventStream];
+ position = [view convertPoint: position fromView: nil];
+ remember_mouse_glyph (f, position.x, position.y,
+ &dpyinfo->last_mouse_glyph);
/*fprintf (stderr, "ns_mouse_position: %.0f, %.0f\n", position.x, position.y); */
- if (bar_window) *bar_window = Qnil;
- if (part) *part = 0; /*scroll_bar_handle; */
+ if (bar_window) *bar_window = Qnil;
+ if (part) *part = scroll_bar_above_handle;
- if (x) XSETINT (*x, lrint (position.x));
- if (y) XSETINT (*y, lrint (position.y));
- if (time)
- *time = dpyinfo->last_mouse_movement_time;
- *fp = f;
- }
+ if (x) XSETINT (*x, lrint (position.x));
+ if (y) XSETINT (*y, lrint (position.y));
+ if (time)
+ *time = dpyinfo->last_mouse_movement_time;
+ *fp = f;
}
unblock_input ();
to erase the whole background. */
[ns_lookup_indexed_color(face->background, f) set];
NSRectFill (r);
- [img setXBMColor: ns_lookup_indexed_color(face->foreground, f)];
-#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+
+ {
+ NSColor *bm_color;
+ if (!p->cursor_p)
+ bm_color = ns_lookup_indexed_color(face->foreground, f);
+ else if (p->overlay_p)
+ bm_color = ns_lookup_indexed_color(face->background, f);
+ else
+ bm_color = f->output_data.ns->cursor_color;
+ [img setXBMColor: bm_color];
+ }
+
+#ifdef NS_IMPL_COCOA
[img drawInRect: r
fromRect: NSZeroRect
operation: NSCompositeSourceOver
else if (cursor_type == HBAR_CURSOR)
{
cursor_height = (cursor_width < 1) ? lrint (0.25 * h) : cursor_width;
- fy += h - cursor_height;
+ if (cursor_height > glyph_row->height)
+ cursor_height = glyph_row->height;
+ if (h > cursor_height) // Cursor smaller than line height, move down
+ fy += h - cursor_height;
h = cursor_height;
}
/* Draw the image.. do we need to draw placeholder if img ==nil? */
if (img != nil)
{
-#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+#ifdef NS_IMPL_COCOA
NSRect dr = NSMakeRect (x, y, s->slice.width, s->slice.height);
NSRect ir = NSMakeRect (s->slice.x, s->slice.y,
s->slice.width, s->slice.height);
}
#endif
-/* GNUstep and OSX <= 10.4 does not have cancelTracking. */
-#if defined (NS_IMPL_COCOA) && \
- MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+/* GNUstep does not have cancelTracking. */
+#ifdef NS_IMPL_COCOA
/* Check if menu open should be canceled or continued as normal. */
void
ns_check_menu_open (NSMenu *menu)
menu_will_open_state = MENU_OPENING;
}
}
-#endif /* NS_IMPL_COCOA) && >= MAC_OS_X_VERSION_10_5 */
+#endif /* NS_IMPL_COCOA */
+
+static void
+unwind_apploopnr (Lisp_Object not_used)
+{
+ --apploopnr;
+ n_emacs_events_pending = 0;
+ ns_finish_events ();
+ q_event_ptr = NULL;
+}
static int
ns_read_socket (struct terminal *terminal, struct input_event *hold_quit)
}
else
{
+ ptrdiff_t specpdl_count = SPECPDL_INDEX ();
/* Run and wait for events. We must always send one NX_APPDEFINED event
to ourself, otherwise [NXApp run] will never exit. */
send_appdefined = YES;
{
emacs_abort ();
}
+ record_unwind_protect (unwind_apploopnr, Qt);
[NSApp run];
- --apploopnr;
+ unbind_to (specpdl_count, Qnil); /* calls unwind_apploopnr */
}
nevents = n_emacs_events_pending;
{
emacs_abort ();
}
- [NSApp run];
- --apploopnr;
+
+ {
+ ptrdiff_t specpdl_count = SPECPDL_INDEX ();
+ record_unwind_protect (unwind_apploopnr, Qt);
+ [NSApp run];
+ unbind_to (specpdl_count, Qnil); /* calls unwind_apploopnr */
+ }
+
ns_finish_events ();
if (nr > 0 && readfds)
{
EmacsScroller *bar;
int window_y, window_height;
int top, left, height, width;
+ BOOL update_p = YES;
/* optimization; display engine sends WAY too many of these.. */
if (!NILP (window->vertical_scroll_bar))
}
else
view->scrollbarsNeedingUpdate--;
+ update_p = NO;
}
}
bar = [[EmacsScroller alloc] initFrame: r window: win];
wset_vertical_scroll_bar (window, make_save_ptr (bar));
+ update_p = YES;
}
else
{
if (oldRect.origin.x != r.origin.x)
ns_clear_frame_area (f, left, top, width, height);
[bar setFrame: r];
+ update_p = YES;
}
}
- [bar setPosition: position portion: portion whole: whole];
+ if (update_p)
+ [bar setPosition: position portion: portion whole: whole];
unblock_input ();
}
#ifdef NS_IMPL_COCOA
- (void)run
{
-#ifndef NSAppKitVersionNumber10_8
-#define NSAppKitVersionNumber10_8 1187
+#ifndef NSAppKitVersionNumber10_9
+#define NSAppKitVersionNumber10_9 1265
#endif
- if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8)
- {
- [super run];
- return;
- }
+ if ((int)NSAppKitVersionNumber != NSAppKitVersionNumber10_9)
+ {
+ [super run];
+ return;
+ }
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self antialiasThresholdDidChange:nil];
#ifdef NS_IMPL_COCOA
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(antialiasThresholdDidChange:)
name:NSAntialiasThresholdChangedNotification
object:nil];
-#endif
#endif
ns_send_appdefined (-2);
- (void)antialiasThresholdDidChange:(NSNotification *)notification
{
#ifdef NS_IMPL_COCOA
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
macfont_update_antialias_threshold ();
#endif
-#endif
}
if (!emacs_event)
return;
- if (EQ (font->driver->type, Qns))
- nsfont = ((struct nsfont_info *)font)->nsfont;
-#ifdef NS_IMPL_COCOA
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- else
- nsfont = (NSFont *) macfont_get_nsctfont (font);
+#ifdef NS_IMPL_GNUSTEP
+ nsfont = ((struct nsfont_info *)font)->nsfont;
#endif
+#ifdef NS_IMPL_COCOA
+ nsfont = (NSFont *) macfont_get_nsctfont (font);
#endif
if ((newFont = [sender convertFont: nsfont]))
int code;
unsigned fnKeysym = 0;
static NSMutableArray *nsEvArray;
-#if !defined (NS_IMPL_COCOA) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
+#ifdef NS_IMPL_GNUSTEP
static BOOL firstTime = YES;
#endif
int left_is_none;
}
-#if !defined (NS_IMPL_COCOA) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
+#ifdef NS_IMPL_GNUSTEP
/* if we get here we should send the key for input manager processing */
/* Disable warning, there is nothing a user can do about it anyway, and
it does not seem to matter. */
{
#ifdef NS_IMPL_GNUSTEP
// GNUstep does not always update the tool bar height. Force it.
- if (toolbar) update_frame_tool_bar (emacsframe);
+ if (toolbar && [toolbar isVisible])
+ update_frame_tool_bar (emacsframe);
#endif
extra = FRAME_NS_TITLEBAR_HEIGHT (emacsframe)
// Did resize increments change because of a font change?
if (sz.width != FRAME_COLUMN_WIDTH (emacsframe) ||
- sz.height != FRAME_LINE_HEIGHT (emacsframe))
+ sz.height != FRAME_LINE_HEIGHT (emacsframe) ||
+ (frame_resize_pixelwise && sz.width != 1))
{
- sz.width = FRAME_COLUMN_WIDTH (emacsframe);
- sz.height = FRAME_LINE_HEIGHT (emacsframe);
+ sz.width = frame_resize_pixelwise
+ ? 1 : FRAME_COLUMN_WIDTH (emacsframe);
+ sz.height = frame_resize_pixelwise
+ ? 1 : FRAME_LINE_HEIGHT (emacsframe);
[win setResizeIncrements: sz];
NSTRACE_SIZE ("New size", NSMakeSize (neww, newh));
[win setDelegate: self];
[win useOptimizedDrawing: YES];
- sz.width = FRAME_COLUMN_WIDTH (f);
- sz.height = FRAME_LINE_HEIGHT (f);
+ sz.width = frame_resize_pixelwise ? 1 : FRAME_COLUMN_WIDTH (f);
+ sz.height = frame_resize_pixelwise ? 1 : FRAME_LINE_HEIGHT (f);
[win setResizeIncrements: sz];
[[win contentView] addSubview: self];
(FRAME_DEFAULT_FACE (f)),
f);
- sz.width = FRAME_COLUMN_WIDTH (f);
- sz.height = FRAME_LINE_HEIGHT (f);
+ sz.width = frame_resize_pixelwise ? 1 : FRAME_COLUMN_WIDTH (f);
+ sz.height = frame_resize_pixelwise ? 1 : FRAME_LINE_HEIGHT (f);
if (fs_state != FULLSCREEN_BOTH)
{
/* Hide dock and menubar if we are on the primary screen. */
if (onFirstScreen)
{
-#if defined (NS_IMPL_COCOA) && \
- MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+#ifdef NS_IMPL_COCOA
NSApplicationPresentationOptions options
= NSApplicationPresentationAutoHideDock
| NSApplicationPresentationAutoHideMenuBar;
[fw makeFirstResponder:self];
[w orderOut:self];
r = [fw frameRectForContentRect:[screen frame]];
- [fw setFrame: r display:YES animate:YES];
+ [fw setFrame: r display:YES animate:ns_use_fullscreen_animation];
[self windowDidEnterFullScreen:nil];
[fw display];
}
if (onFirstScreen)
{
-#if defined (NS_IMPL_COCOA) && \
- MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+#ifdef NS_IMPL_COCOA
[NSApp setPresentationOptions: NSApplicationPresentationDefault];
#else
[NSMenu setMenuBarVisible:YES];
FRAME_TOOLBAR_HEIGHT (f) = tobar_height;
[self windowWillExitFullScreen:nil];
- [fw setFrame: [w frame] display:YES animate:YES];
+ [fw setFrame: [w frame] display:YES animate:ns_use_fullscreen_animation];
[fw close];
[w makeKeyAndOrderFront:NSApp];
[self windowDidExitFullScreen:nil];
}
else
{
- error ("Invalid data type in dragging pasteboard");
+ fprintf (stderr, "Invalid data type in dragging pasteboard");
return NO;
}
}
#endif
#endif
- for (i = 0; i < nr_screens; ++i)
+ for (i = 0; i < nr_screens; ++i)
{
NSScreen *s = [screens objectAtIndex: i];
NSRect scrrect = [s frame];
[self setAutoresizingMask: NSViewMinXMargin | NSViewHeightSizable];
#endif
- win = nwin;
+ window = XWINDOW (nwin);
condemned = NO;
pixel_height = NSHeight (r);
if (pixel_height == 0) pixel_height = 1;
min_portion = 20 / pixel_height;
- frame = XFRAME (XWINDOW (win)->frame);
+ frame = XFRAME (window->frame);
if (FRAME_LIVE_P (frame))
{
int i;
}
+- (void)dealloc
+{
+ NSTRACE (EmacsScroller_dealloc);
+ if (window)
+ wset_vertical_scroll_bar (window, Qnil);
+ window = 0;
+ [super dealloc];
+}
+
+
- condemn
{
NSTRACE (condemn);
view = (EmacsView *)FRAME_NS_VIEW (frame);
if (view != nil)
view->scrollbarsNeedingUpdate++;
- if (!NILP (win))
- wset_vertical_scroll_bar (XWINDOW (win), Qnil);
- win = Qnil;
[self removeFromSuperview];
[self release];
unblock_input ();
if (portion >= whole)
{
-#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
+#ifdef NS_IMPL_COCOA
[self setKnobProportion: 1.0];
[self setDoubleValue: 1.0];
#else
portion = max ((float)whole*min_portion/pixel_height, portion);
pos = (float)position / (whole - portion);
por = (CGFloat)portion/whole;
-#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
+#ifdef NS_IMPL_COCOA
[self setKnobProportion: por];
[self setDoubleValue: pos];
#else
return self;
}
-/* FIXME: unused at moment (see ns_mouse_position) at the moment because
- drag events will go directly to the EmacsScroller. Leaving in for now. */
--(void)getMouseMotionPart: (int *)part window: (Lisp_Object *)window
- x: (Lisp_Object *)x y: ( Lisp_Object *)y
-{
- *part = last_hit_part;
- *window = win;
- XSETINT (*y, pixel_height);
- if ([self floatValue] > 0.999F)
- XSETINT (*x, pixel_height);
- else
- XSETINT (*x, pixel_height * [self floatValue]);
-}
-
-
/* set up emacs_event */
- (void) sendScrollEventAtLoc: (float)loc fromEvent: (NSEvent *)e
{
+ Lisp_Object win;
if (!emacs_event)
return;
emacs_event->part = last_hit_part;
emacs_event->code = 0;
emacs_event->modifiers = EV_MODIFIERS (e) | down_modifier;
+ XSETWINDOW (win, window);
emacs_event->frame_or_window = win;
emacs_event->timestamp = EV_TIMESTAMP (e);
emacs_event->kind = SCROLL_BAR_CLICK_EVENT;
[scroll_repeat_entry release];
scroll_repeat_entry = nil;
}
- last_hit_part = 0;
+ last_hit_part = scroll_bar_above_handle;
}
#endif
ns_last_use_native_fullscreen = ns_use_native_fullscreen;
+ DEFVAR_BOOL ("ns-use-fullscreen-animation", ns_use_fullscreen_animation,
+ doc: /*Non-nil means use animation on non-native fullscreen.
+For native fullscreen, this does nothing.
+Default is nil. */);
+ ns_use_fullscreen_animation = NO;
+
DEFVAR_BOOL ("ns-use-srgb-colorspace", ns_use_srgb_colorspace,
doc: /*Non-nil means to use sRGB colorspace on OSX >= 10.7.
Note that this does not apply to images.
DEFSYM (Qcocoa, "cocoa");
DEFSYM (Qgnustep, "gnustep");
- syms_of_nsfont ();
#ifdef NS_IMPL_COCOA
Fprovide (Qcocoa, Qnil);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
syms_of_macfont ();
-#endif
#else
Fprovide (Qgnustep, Qnil);
+ syms_of_nsfont ();
#endif
}