/* NeXT/Open/GNUstep / MacOSX communication module.
-Copyright (C) 1989, 1993-1994, 2005-2006, 2008-2013
- Free Software Foundation, Inc.
+Copyright (C) 1989, 1993-1994, 2005-2006, 2008-2014 Free Software
+Foundation, Inc.
This file is part of GNU Emacs.
#define NSTRACE(x)
#endif
+/* Detailed tracing. "S" means "size" and "LL" stands for "lower left". */
+#if 0
+int term_trace_num = 0;
+#define NSTRACE_SIZE(str,size) fprintf (stderr, \
+ "%s:%d: [%d] " str \
+ " (S:%.0f x %.0f)\n", \
+ __FILE__, __LINE__, ++term_trace_num,\
+ size.height, \
+ size.width)
+#define NSTRACE_RECT(s,r) fprintf (stderr, \
+ "%s:%d: [%d] " s \
+ " (LL:%.0f x %.0f -> S:%.0f x %.0f)\n", \
+ __FILE__, __LINE__, ++term_trace_num,\
+ r.origin.x, \
+ r.origin.y, \
+ r.size.height, \
+ r.size.width)
+#else
+#define NSTRACE_SIZE(str,size)
+#define NSTRACE_RECT(s,r)
+#endif
+
extern NSString *NSMenuDidBeginTrackingNotification;
+/* ==========================================================================
+
+ NSColor, EmacsColor category.
+
+ ========================================================================== */
+@implementation NSColor (EmacsColor)
++ (NSColor *)colorForEmacsRed:(CGFloat)red green:(CGFloat)green
+ blue:(CGFloat)blue alpha:(CGFloat)alpha
+{
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+ if (ns_use_srgb_colorspace)
+ return [NSColor colorWithSRGBRed: red
+ green: green
+ blue: blue
+ alpha: alpha];
+#endif
+#endif
+ return [NSColor colorWithCalibratedRed: red
+ green: green
+ blue: blue
+ alpha: alpha];
+}
+
+- (NSColor *)colorUsingDefaultColorSpace
+{
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+ if (ns_use_srgb_colorspace)
+ return [self colorUsingColorSpace: [NSColorSpace sRGBColorSpace]];
+#endif
+#endif
+ return [self colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
+}
+
+@end
+
/* ==========================================================================
Local declarations
static Lisp_Object QUTF8_STRING;
static Lisp_Object Qcocoa, Qgnustep;
+static Lisp_Object Qfile, Qurl;
/* On OS X picks up the default NSGlobalDomain AppleAntiAliasingThreshold,
the maximum font size to NOT antialias. On GNUstep there is currently
#define NSRightCommandKeyMask (0x000010 | NSCommandKeyMask)
#define NSLeftAlternateKeyMask (0x000020 | NSAlternateKeyMask)
#define NSRightAlternateKeyMask (0x000040 | NSAlternateKeyMask)
-#define EV_MODIFIERS(e) \
- ((([e modifierFlags] & NSHelpKeyMask) ? \
+#define EV_MODIFIERS2(flags) \
+ (((flags & NSHelpKeyMask) ? \
hyper_modifier : 0) \
| (!EQ (ns_right_alternate_modifier, Qleft) && \
- (([e modifierFlags] & NSRightAlternateKeyMask) \
+ ((flags & NSRightAlternateKeyMask) \
== NSRightAlternateKeyMask) ? \
parse_solitary_modifier (ns_right_alternate_modifier) : 0) \
- | (([e modifierFlags] & NSAlternateKeyMask) ? \
+ | ((flags & NSAlternateKeyMask) ? \
parse_solitary_modifier (ns_alternate_modifier) : 0) \
- | (([e modifierFlags] & NSShiftKeyMask) ? \
+ | ((flags & NSShiftKeyMask) ? \
shift_modifier : 0) \
| (!EQ (ns_right_control_modifier, Qleft) && \
- (([e modifierFlags] & NSRightControlKeyMask) \
+ ((flags & NSRightControlKeyMask) \
== NSRightControlKeyMask) ? \
parse_solitary_modifier (ns_right_control_modifier) : 0) \
- | (([e modifierFlags] & NSControlKeyMask) ? \
+ | ((flags & NSControlKeyMask) ? \
parse_solitary_modifier (ns_control_modifier) : 0) \
- | (([e modifierFlags] & NS_FUNCTION_KEY_MASK) ? \
+ | ((flags & NS_FUNCTION_KEY_MASK) ? \
parse_solitary_modifier (ns_function_modifier) : 0) \
| (!EQ (ns_right_command_modifier, Qleft) && \
- (([e modifierFlags] & NSRightCommandKeyMask) \
+ ((flags & NSRightCommandKeyMask) \
== NSRightCommandKeyMask) ? \
parse_solitary_modifier (ns_right_command_modifier) : 0) \
- | (([e modifierFlags] & NSCommandKeyMask) ? \
+ | ((flags & NSCommandKeyMask) ? \
parse_solitary_modifier (ns_command_modifier):0))
+#define EV_MODIFIERS(e) EV_MODIFIERS2 ([e modifierFlags])
#define EV_UDMODIFIERS(e) \
((([e type] == NSLeftMouseDown) ? down_modifier : 0) \
NSView *view = FRAME_NS_VIEW (f);
/* This no-op will trigger the default window placing
* constraint system. */
- f->output_data.ns->dont_constrain = 0;
[[view window] setFrameOrigin:[[view window] frame].origin];
}
}
block_input ();
free_frame_menubar (f);
-
- if (FRAME_FACE_CACHE (f))
- free_frame_faces (f);
+ free_frame_faces (f);
if (f == dpyinfo->x_focus_frame)
dpyinfo->x_focus_frame = 0;
#endif
/* Constrain the setFrameTopLeftPoint so we don't move behind the
menu bar. */
- f->output_data.ns->dont_constrain = 0;
[[view window] setFrameTopLeftPoint:
NSMakePoint (SCREENMAXBOUND (f->left_pos),
SCREENMAXBOUND ([fscreen frame].size.height
check_frame_size (f, &width, &height, pixelwise);
- f->scroll_bar_actual_width = NS_SCROLL_BAR_WIDTH (f);
compute_fringe_widths (f, 0);
if (pixelwise)
#endif
if ((new = [NSColor selectedTextBackgroundColor]) != nil)
{
- *col = [new colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
+ *col = [new colorUsingDefaultColorSpace];
unblock_input ();
return 0;
}
*/
if ((new = [NSColor selectedTextColor]) != nil)
{
- *col = [new colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
+ *col = [new colorUsingDefaultColorSpace];
unblock_input ();
return 0;
}
if (r >= 0.0F)
{
- *col = [NSColor colorWithCalibratedRed: r green: g blue: b alpha: 1.0];
+ *col = [NSColor colorForEmacsRed: r green: g blue: b alpha: 1.0];
unblock_input ();
return 0;
}
}
if (new)
- *col = [new colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
+ *col = [new colorUsingDefaultColorSpace];
unblock_input ();
return new ? 0 : 1;
}
return build_string ((char *)str);
}
- [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace]
+ [[col colorUsingDefaultColorSpace]
getRed: &red green: &green blue: &blue alpha: &alpha];
- if (red ==green && red ==blue)
+ if (red == green && red == blue)
{
[[col colorUsingColorSpaceName: NSCalibratedWhiteColorSpace]
getWhite: &gray alpha: &alpha];
/*NSTRACE (ns_send_appdefined); */
#ifdef NS_IMPL_GNUSTEP
- // GNUStep needs postEvent to happen on the main thread.
+ // GNUstep needs postEvent to happen on the main thread.
if (! [[NSThread currentThread] isMainThread])
{
EmacsApp *app = (EmacsApp *)NSApp;
if (FRAME_NS_P (f))
{
EmacsView *view = FRAME_NS_VIEW (f);
- [view updateCollectionBehaviour];
+ [view updateCollectionBehavior];
}
}
}
#endif
-/* GNUStep and OSX <= 10.4 does not have cancelTracking. */
+/* 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
-/* Check if menu open should be cancelled or continued as normal. */
+/* Check if menu open should be canceled or continued as normal. */
void
ns_check_menu_open (NSMenu *menu)
{
name = SSDATA (XCAR (color));
c = XINT (XCDR (color));
[cl setColor:
- [NSColor colorWithCalibratedRed: RED_FROM_ULONG (c) / 255.0
- green: GREEN_FROM_ULONG (c) / 255.0
- blue: BLUE_FROM_ULONG (c) / 255.0
- alpha: 1.0]
+ [NSColor colorForEmacsRed: RED_FROM_ULONG (c) / 255.0
+ green: GREEN_FROM_ULONG (c) / 255.0
+ blue: BLUE_FROM_ULONG (c) / 255.0
+ alpha: 1.0]
forKey: [NSString stringWithUTF8String: name]];
}
[cl writeToFile: nil];
NSStringPboardType,
NSTabularTextPboardType,
NSFilenamesPboardType,
- NSURLPboardType,
- NSColorPboardType,
- NSFontPboardType, nil] retain];
+ NSURLPboardType, nil] retain];
/* If fullscreen is in init/default-frame-alist, focus isn't set
right for fullscreen windows, so set this. */
/* (Carbon way: [theEvent keyCode]) */
/* is it a "function key"? */
- fnKeysym = (code < 0x00ff && (flags&NSNumericPadKeyMask))
- ? ns_convert_key ([theEvent keyCode] | NSNumericPadKeyMask)
- : ns_convert_key (code);
+ /* Note: Sometimes a plain key will have the NSNumericPadKeyMask
+ flag set (this is probably a bug in the OS).
+ */
+ if (code < 0x00ff && (flags&NSNumericPadKeyMask))
+ {
+ fnKeysym = ns_convert_key ([theEvent keyCode] | NSNumericPadKeyMask);
+ }
+ if (fnKeysym == 0)
+ {
+ fnKeysym = ns_convert_key (code);
+ }
if (fnKeysym)
{
CGFloat delta = [theEvent deltaY];
/* Mac notebooks send wheel events w/delta =0 when trackpad scrolling */
if (delta == 0)
- return;
- emacs_event->kind = WHEEL_EVENT;
+ {
+ delta = [theEvent deltaX];
+ if (delta == 0)
+ {
+ NSTRACE (deltaIsZero);
+ return;
+ }
+ emacs_event->kind = HORIZ_WHEEL_EVENT;
+ }
+ else
+ emacs_event->kind = WHEEL_EVENT;
+
emacs_event->code = 0;
emacs_event->modifiers = EV_MODIFIERS (theEvent) |
((delta > 0) ? up_modifier : down_modifier);
NSRect wr = [window frame];
int extra = 0;
int oldc = cols, oldr = rows;
- int oldw = FRAME_PIXEL_WIDTH (emacsframe),
- oldh = FRAME_PIXEL_HEIGHT (emacsframe);
+ int oldw = FRAME_PIXEL_WIDTH (emacsframe);
+ int oldh = FRAME_PIXEL_HEIGHT (emacsframe);
int neww, newh;
+ NSTRACE (updateFrameSize);
+ NSTRACE_SIZE ("Original size", NSMakeSize (oldw, oldh));
+
if (! [self isFullscreen])
{
#ifdef NS_IMPL_GNUSTEP
- // GNUStep does not always update the tool bar height. Force it.
+ // GNUstep does not always update the tool bar height. Force it.
if (toolbar) update_frame_tool_bar (emacsframe);
#endif
+ FRAME_TOOLBAR_HEIGHT (emacsframe);
}
+ if (wait_for_tool_bar)
+ {
+ if (FRAME_TOOLBAR_HEIGHT (emacsframe) == 0)
+ return;
+ wait_for_tool_bar = NO;
+ }
+
neww = (int)wr.size.width - emacsframe->border_width;
newh = (int)wr.size.height - extra;
sz.width = FRAME_COLUMN_WIDTH (emacsframe);
sz.height = FRAME_LINE_HEIGHT (emacsframe);
[win setResizeIncrements: sz];
+
+ NSTRACE_SIZE ("New size", NSMakeSize (neww, newh));
}
[view setFrame: NSMakeRect (0, 0, neww, newh)];
int extra = 0;
NSTRACE (windowWillResize);
+ NSTRACE_SIZE ("Original size", frameSize);
/*fprintf (stderr,"Window will resize: %.0f x %.0f\n",frameSize.width,frameSize.height); */
if (fs_state == FULLSCREEN_MAXIMIZED
if (is_focus_frame)
dpyinfo->x_focus_frame = 0;
+ emacsframe->mouse_moved = 0;
ns_frame_rehighlight (emacsframe);
/* FIXME: for some reason needed on second and subsequent clicks away
ns_window_num]];
[win setToolbar: toolbar];
[toolbar setVisible: NO];
+
+ /* Don't set frame garbaged until tool bar is up to date?
+ This avoids an extra clear and redraw (flicker) at frame creation. */
+ if (FRAME_EXTERNAL_TOOL_BAR (f)) wait_for_tool_bar = YES;
+ else wait_for_tool_bar = NO;
+
+
#ifdef NS_IMPL_COCOA
{
NSButton *toggleButton;
[self setFSValue: fs_before_fs];
fs_before_fs = -1;
#ifdef HAVE_NATIVE_FS
- [self updateCollectionBehaviour];
+ [self updateCollectionBehavior];
#endif
if (FRAME_EXTERNAL_TOOL_BAR (emacsframe))
{
}
#ifdef HAVE_NATIVE_FS
-- (void)updateCollectionBehaviour
+- (void)updateCollectionBehavior
{
if (! [self isFullscreen])
{
if (fs_state != FULLSCREEN_BOTH)
{
+ NSScreen *screen = [w screen];
+
+#if defined (NS_IMPL_COCOA) && \
+ MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
+ /* Hide ghost menu bar on secondary monitor? */
+ if (! onFirstScreen)
+ onFirstScreen = [NSScreen screensHaveSeparateSpaces];
+#endif
/* Hide dock and menubar if we are on the primary screen. */
if (onFirstScreen)
{
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:YES
- screen:[w screen]];
+ screen:screen];
[fw setContentView:[w contentView]];
[fw setTitle:[w title]];
[fw makeKeyAndOrderFront:NSApp];
[fw makeFirstResponder:self];
[w orderOut:self];
- r = [fw frameRectForContentRect:[[fw screen] frame]];
+ r = [fw frameRectForContentRect:[screen frame]];
[fw setFrame: r display:YES animate:YES];
[self windowDidEnterFullScreen:nil];
[fw display];
NSString *type;
NSEvent *theEvent = [[self window] currentEvent];
NSPoint position;
+ NSDragOperation op = [sender draggingSourceOperationMask];
+ int modifiers = 0;
NSTRACE (performDragOperation);
pb = [sender draggingPasteboard];
type = [pb availableTypeFromArray: ns_drag_types];
+
+ if (! (op & (NSDragOperationMove|NSDragOperationDelete)) &&
+ // URL drags contain all operations (0xf), don't allow all to be set.
+ (op & 0xf) != 0xf)
+ {
+ if (op & NSDragOperationLink)
+ modifiers |= NSControlKeyMask;
+ if (op & NSDragOperationCopy)
+ modifiers |= NSAlternateKeyMask;
+ if (op & NSDragOperationGeneric)
+ modifiers |= NSCommandKeyMask;
+ }
+
+ modifiers = EV_MODIFIERS2 (modifiers);
if (type == 0)
{
return NO;
fenum = [files objectEnumerator];
while ( (file = [fenum nextObject]) )
{
- emacs_event->kind = NS_NONKEY_EVENT;
- emacs_event->code = KEY_NS_DRAG_FILE;
+ emacs_event->kind = DRAG_N_DROP_EVENT;
XSETINT (emacs_event->x, x);
XSETINT (emacs_event->y, y);
ns_input_file = append2 (ns_input_file,
build_string ([file UTF8String]));
- emacs_event->modifiers = EV_MODIFIERS (theEvent);
+ emacs_event->modifiers = modifiers;
+ emacs_event->arg = list2 (Qfile, build_string ([file UTF8String]));
EV_TRAILER (theEvent);
}
return YES;
}
else if ([type isEqualToString: NSURLPboardType])
{
- NSString *file;
- NSURL *fileURL;
+ NSURL *url = [NSURL URLFromPasteboard: pb];
+ if (url == nil) return NO;
- if (!(fileURL = [NSURL URLFromPasteboard: pb]) ||
- [fileURL isFileURL] == NO)
- return NO;
-
- file = [fileURL path];
- emacs_event->kind = NS_NONKEY_EVENT;
- emacs_event->code = KEY_NS_DRAG_FILE;
+ emacs_event->kind = DRAG_N_DROP_EVENT;
XSETINT (emacs_event->x, x);
XSETINT (emacs_event->y, y);
- ns_input_file = append2 (ns_input_file, build_string ([file UTF8String]));
- emacs_event->modifiers = EV_MODIFIERS (theEvent);
+ emacs_event->modifiers = modifiers;
+ emacs_event->arg = list2 (Qurl,
+ build_string ([[url absoluteString]
+ UTF8String]));
EV_TRAILER (theEvent);
+
+ if ([url isFileURL] != NO)
+ {
+ NSString *file = [url path];
+ ns_input_file = append2 (ns_input_file,
+ build_string ([file UTF8String]));
+ }
return YES;
}
else if ([type isEqualToString: NSStringPboardType]
if (! (data = [pb stringForType: type]))
return NO;
- emacs_event->kind = NS_NONKEY_EVENT;
- emacs_event->code = KEY_NS_DRAG_TEXT;
+ emacs_event->kind = DRAG_N_DROP_EVENT;
XSETINT (emacs_event->x, x);
XSETINT (emacs_event->y, y);
- ns_input_text = build_string ([data UTF8String]);
- emacs_event->modifiers = EV_MODIFIERS (theEvent);
- EV_TRAILER (theEvent);
- return YES;
- }
- else if ([type isEqualToString: NSColorPboardType])
- {
- NSColor *c = [NSColor colorFromPasteboard: pb];
- emacs_event->kind = NS_NONKEY_EVENT;
- emacs_event->code = KEY_NS_DRAG_COLOR;
- XSETINT (emacs_event->x, x);
- XSETINT (emacs_event->y, y);
- ns_input_color = ns_color_to_lisp (c);
- emacs_event->modifiers = EV_MODIFIERS (theEvent);
- EV_TRAILER (theEvent);
- return YES;
- }
- else if ([type isEqualToString: NSFontPboardType])
- {
- /* impl based on GNUstep NSTextView.m */
- NSData *data = [pb dataForType: NSFontPboardType];
- NSDictionary *dict = [NSUnarchiver unarchiveObjectWithData: data];
- NSFont *font = [dict objectForKey: NSFontAttributeName];
- char fontSize[10];
-
- if (font == nil)
- return NO;
-
- emacs_event->kind = NS_NONKEY_EVENT;
- emacs_event->code = KEY_NS_CHANGE_FONT;
- XSETINT (emacs_event->x, x);
- XSETINT (emacs_event->y, y);
- ns_input_font = build_string ([[font fontName] UTF8String]);
- snprintf (fontSize, 10, "%f", [font pointSize]);
- ns_input_fontsize = build_string (fontSize);
- emacs_event->modifiers = EV_MODIFIERS (theEvent);
+ emacs_event->modifiers = modifiers;
+ emacs_event->arg = list2 (Qnil, build_string ([data UTF8String]));
EV_TRAILER (theEvent);
return YES;
}
else
{
- error ("Invalid data type in dragging pasteboard.");
+ error ("Invalid data type in dragging pasteboard");
return NO;
}
}
{
/* When making the frame visible for the first time or if there is just
one screen, we want to constrain. Other times not. */
- NSUInteger nr_screens = [[NSScreen screens] count];
+ NSArray *screens = [NSScreen screens];
+ NSUInteger nr_screens = [screens count], nr_eff_screens = 0, i;
struct frame *f = ((EmacsView *)[self delegate])->emacsframe;
NSTRACE (constrainFrameRect);
+ NSTRACE_RECT ("input", frameRect);
+
+ if (ns_menu_bar_should_be_hidden ())
+ return frameRect;
if (nr_screens == 1)
+ return [super constrainFrameRect:frameRect toScreen:screen];
+
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
+ // If separate spaces is on, it is like each screen is independent. There is
+ // no spanning of frames across screens.
+ if ([NSScreen screensHaveSeparateSpaces])
+ return [super constrainFrameRect:frameRect toScreen:screen];
+#endif
+#endif
+
+ for (i = 0; i < nr_screens; ++i)
{
- NSRect r = [super constrainFrameRect:frameRect toScreen:screen];
- return r;
+ NSScreen *s = [screens objectAtIndex: i];
+ NSRect scrrect = [s frame];
+ NSRect intersect = NSIntersectionRect (frameRect, scrrect);
+
+ if (intersect.size.width > 0 || intersect.size.height > 0)
+ ++nr_eff_screens;
}
- if (f->output_data.ns->dont_constrain
- || ns_menu_bar_should_be_hidden ())
- return frameRect;
+ if (nr_eff_screens == 1)
+ return [super constrainFrameRect:frameRect toScreen:screen];
+
+ /* The default implementation does two things 1) ensure that the top
+ of the rectangle is below the menu bar (or below the top of the
+ screen) and 2) resizes windows larger than the screen. As we
+ don't want the latter, a smaller rectangle is used. */
+#define FAKE_HEIGHT 64
+ float old_top = frameRect.origin.y + frameRect.size.height;
+ NSRect r;
+ r.size.height = FAKE_HEIGHT;
+ r.size.width = frameRect.size.width;
+ r.origin.x = frameRect.origin.x;
+ r.origin.y = old_top - FAKE_HEIGHT;
+
+ NSTRACE_RECT ("input to super", r);
+
+ r = [super constrainFrameRect:r toScreen:screen];
- f->output_data.ns->dont_constrain = 1;
- return [super constrainFrameRect:frameRect toScreen:screen];
+ NSTRACE_RECT ("output from super", r);
+
+ float new_top = r.origin.y + FAKE_HEIGHT;
+ if (new_top < old_top)
+ {
+ frameRect.origin.y = new_top - frameRect.size.height;
+ }
+
+ NSTRACE_RECT ("output", frameRect);
+
+ return frameRect;
+#undef FAKE_HEIGHT
}
@end /* EmacsWindow */
DEFSYM (Qcontrol, "control");
DEFSYM (QUTF8_STRING, "UTF8_STRING");
+ DEFSYM (Qfile, "file");
+ DEFSYM (Qurl, "url");
+
Fput (Qalt, Qmodifier_value, make_number (alt_modifier));
Fput (Qhyper, Qmodifier_value, make_number (hyper_modifier));
Fput (Qmeta, Qmodifier_value, make_number (meta_modifier));
"The file specified in the last NS event.");
ns_input_file =Qnil;
- DEFVAR_LISP ("ns-input-text", ns_input_text,
- "The data received in the last NS text drag event.");
- ns_input_text =Qnil;
-
DEFVAR_LISP ("ns-working-text", ns_working_text,
"String for visualizing working composition sequence.");
ns_working_text =Qnil;
"The line specified in the last NS event.");
ns_input_line =Qnil;
- DEFVAR_LISP ("ns-input-color", ns_input_color,
- "The color specified in the last NS event.");
- ns_input_color =Qnil;
-
DEFVAR_LISP ("ns-input-spi-name", ns_input_spi_name,
"The service name specified in the last NS event.");
ns_input_spi_name =Qnil;
doc: /*Non-nil means to use native fullscreen on OSX >= 10.7.
Nil means use fullscreen the old (< 10.7) way. The old way works better with
multiple monitors, but lacks tool bar. This variable is ignored on OSX < 10.7.
-Default is t for OSX >= 10.7, nil otherwise. */);
+Default is t for OSX >= 10.7, nil otherwise. */);
#ifdef HAVE_NATIVE_FS
ns_use_native_fullscreen = YES;
#else
#endif
ns_last_use_native_fullscreen = ns_use_native_fullscreen;
+ 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.
+This variable is ignored on OSX < 10.7 and GNUstep. */);
+ ns_use_srgb_colorspace = YES;
+
/* TODO: move to common code */
DEFVAR_LISP ("x-toolkit-scroll-bars", Vx_toolkit_scroll_bars,
doc: /* Which toolkit scroll bars Emacs uses, if any.