Lisp_Object Qalt, Qcontrol, Qhyper, Qmeta, Qsuper;
extern Lisp_Object Qcursor_color, Qcursor_type, Qns;
-
-/* Some preferences equivalent to those set by X resources under X are
- managed through the OpenStep defaults system. We depart from X
- behavior and refuse to read defaults when started under these
- options. */
-
-/* Set in emacs.c. */
-char ns_no_defaults;
-
/* Specifies which emacs modifier should be generated when NS receives
the Alternate modifer. May be Qnone or any of the modifier lisp symbols. */
Lisp_Object ns_alternate_modifier;
no way to control this behavior. */
float ns_antialias_threshold;
-/* Controls use of an undocumented CG function to do Quickdraw-style font
- smoothing (less heavy) instead of regular Quartz smoothing. */
-Lisp_Object ns_use_qd_smoothing;
-
/* Used to pick up AppleHighlightColor on OS X */
NSString *ns_selection_color;
Lisp_Object ns_confirm_quit;
NSArray *ns_send_types =0, *ns_return_types =0, *ns_drag_types =0;
+NSString *ns_app_name = @"Emacs"; /* default changed later */
/* Display variables */
struct ns_display_info *x_display_list; /* Chain of existing displays */
struct nsfont_info *ns_tmp_font; /* FIXME */
/*static int debug_lock = 0; */
-#ifdef NS_IMPL_COCOA
-/* This undocumented Quartz function controls how fonts are anti-aliased.
- (Found from code in Mac wxWindows impl, discovered by running `nm' on
- the "QD" framework.)
- Mode 0 is normal anti-aliasing, mode 1 is no anti-aliasing, and mode 2 is
- 4-bit pixel-aligned anti-aliasing (the old QuickDraw standard). */
-extern void CGContextSetFontRenderingMode (CGContextRef cg, int v);
-#endif
-
-
/* event loop */
static BOOL send_appdefined = YES;
static NSEvent *last_appdefined_event = 0;
[e buttonNumber] - 1)
/* Convert the time field to a timestamp in milliseconds. */
-#ifdef NS_IMPL_GNUSTEP
-/* Apple says timestamp is in seconds, but GNUstep seems to be returning msec */
-#define EV_TIMESTAMP(e) ([e timestamp])
-#else
#define EV_TIMESTAMP(e) ([e timestamp] * 1000)
-#endif /* not gnustep */
/* This is a piece of code which is common to all the event handling
methods. Maybe it should even be a function. */
}
if ([resourcePaths length] > 0)
setenv ("EMACSLOADPATH", [resourcePaths UTF8String], 1);
-/*NSLog (@"loadPath: '%s'\n", resourcePaths); */
+/*NSLog (@"loadPath: '%@'\n", resourcePaths); */
}
if (!getenv ("EMACSPATH"))
NSTRACE (ns_reset_terminal_modes);
}
+
static void
ns_set_terminal_modes (struct terminal *terminal)
/* Externally called as hook */
if (xoff < 100)
f->left_pos = 100; /* don't overlap menu */
#endif
+
if (view != nil && (screen = [[view window] screen]))
[[view window] setFrameTopLeftPoint:
NSMakePoint (SCREENMAXBOUND (f->left_pos),
/* If we have a toolbar, take its height into account. */
if (tb)
+ /* NOTE: previously this would generate wrong result if toolbar not
+ yet displayed and fixing toolbar_height=32 helped, but
+ now (200903) seems no longer needed */
FRAME_NS_TOOLBAR_HEIGHT (f) =
- /* XXX: GNUstep has not yet implemented the first method below, added
- in Panther, however the second is incorrect under Cocoa. */
-#ifdef NS_IMPL_COCOA
NSHeight ([window frameRectForContentRect: NSMakeRect (0, 0, 0, 0)])
- /* NOTE: previously this would generate wrong result if toolbar not
- yet displayed and fixing toolbar_height=32 helped, but
- now (200903) seems no longer needed */
-#else
- NSHeight ([NSWindow frameRectForContentRect: NSMakeRect (0, 0, 0, 0)
- styleMask: [window styleMask]])
-#endif
- - FRAME_NS_TITLEBAR_HEIGHT (f);
+ - FRAME_NS_TITLEBAR_HEIGHT (f);
else
FRAME_NS_TOOLBAR_HEIGHT (f) = 0;
ns_get_color (const char *name, NSColor **col)
/* --------------------------------------------------------------------------
Parse a color name
-/* --------------------------------------------------------------------------
+ -------------------------------------------------------------------------- */
/* On *Step, we attempt to mimic the X11 platform here, down to installing an
X11 rgb.txt-compatible color list in Emacs.clr (see ns_term_init()).
See: http://thread.gmane.org/gmane.emacs.devel/113050/focus=113272). */
else if (!strncmp(name, "rgb:", 4)) /* A newer X11 format -- rgb:r/g/b */
{
strcpy(hex, name + 4);
- scaling = (strlen(hex) - 2) / 4;
+ scaling = (strlen(hex) - 2) / 3;
}
else if (name[0] == '#') /* An old X11 format; convert to newer */
{
Convert a color to a lisp string with the RGB equivalent
-------------------------------------------------------------------------- */
{
- float red, green, blue, alpha, gray;
+ CGFloat red, green, blue, alpha, gray;
char buf[1024];
const char *str;
NSTRACE (ns_color_to_lisp);
{
[[col colorUsingColorSpaceName: NSCalibratedWhiteColorSpace]
getWhite: &gray alpha: &alpha];
- snprintf (buf, sizeof (buf), "#%02.2lx%02.2lx%02.2lx",
+ snprintf (buf, sizeof (buf), "#%2.2lx%2.2lx%2.2lx",
lrint (gray * 0xff), lrint (gray * 0xff), lrint (gray * 0xff));
UNBLOCK_INPUT;
return build_string (buf);
}
- snprintf (buf, sizeof (buf), "#%02.2lx%02.2lx%02.2lx",
+ snprintf (buf, sizeof (buf), "#%2.2lx%2.2lx%2.2lx",
lrint (red*0xff), lrint (green*0xff), lrint (blue*0xff));
UNBLOCK_INPUT;
and set color_def pixel to the resulting index.
-------------------------------------------------------------------------- */
{
- float r, g, b, a;
+ CGFloat r, g, b, a;
[((NSColor *)col) getRed: &r green: &g blue: &b alpha: &a];
color_def->red = r * 65535;
If we're being called outside of that, it's also OK to return quickly
after one iteration through the event loop, since other terms do
this and emacs expects it. */
- if (!(inNsSelect && expected)) // (!inNsSelect || !expected)
+ if (!(inNsSelect && expected))
{
/* Post an application defined event on the event queue. When this is
received the [NXApp run] will return, thus having processed all
ns_function_modifier = Qnone;
ns_antialias_text = Qt;
ns_antialias_threshold = 10.0; /* not exposed to lisp side */
- ns_use_qd_smoothing = Qnil;
ns_confirm_quit = Qnil;
}
/* Read various user defaults. */
ns_set_default_prefs ();
- if (!ns_no_defaults)
+ if (!inhibit_x_resources)
{
ns_default ("GSFontAntiAlias", &ns_antialias_text,
Qt, Qnil, NO, NO);
delete_keyboard_wait_descriptor (0);
+ ns_app_name = [[NSProcessInfo processInfo] processName];
+
/* Set up OS X app menu */
#ifdef NS_IMPL_COCOA
{
keyEquivalent: @""
atIndex: 4];
[appMenu setSubmenu: svcsMenu forItem: item];
-/* [svcsMenu setSupercell: item]; */
[appMenu insertItem: [NSMenuItem separatorItem] atIndex: 5];
[appMenu insertItemWithTitle: @"Hide Emacs"
action: @selector (hide:)
keyEquivalent: @"q"
atIndex: 9];
- item = [mainMenu insertItemWithTitle: @"Emacs"
+ item = [mainMenu insertItemWithTitle: ns_app_name
action: @selector (menuDown:)
keyEquivalent: @""
atIndex: 0];
if (NILP (ns_confirm_quit)) // || ns_shutdown_properly --> TO DO
return NSTerminateNow;
- ret = NSRunAlertPanel([[NSProcessInfo processInfo] processName],
+ ret = NSRunAlertPanel(ns_app_name,
[NSString stringWithUTF8String:"Exit requested. Would you like to Save Buffers and Exit, or Cancel the request?"],
@"Save Buffers and Exit", @"Cancel", nil);
while ((file = [files nextObject]) != nil)
[ns_pending_files addObject: file];
-/* TODO: when GNUstep implements this (and we require that version of
- GNUstep), remove. */
-#ifndef NS_IMPL_GNUSTEP
[self replyToOpenOrPrint: NSApplicationDelegateReplySuccess];
-#endif /* !NS_IMPL_GNUSTEP */
}
return NSMakeRange (NSNotFound, 0);
}
-- (unsigned int)characterIndexForPoint: (NSPoint)thePoint
+- (NSUInteger)characterIndexForPoint: (NSPoint)thePoint
{
if (NS_KEYLOG)
NSLog (@"characterIndexForPoint request");
}
#endif /* NS_IMPL_COCOA */
- // Calling x_set_window_size tends to get us into inf-loops
- // (x_set_window_size causes a resize which causes
- // a "windowDidResize" which calls x_set_window_size).
- // At least with GNUStep, don't know about MacOSX. --Stef
+ /* Avoid loop under GNUstep due to call at beginning of this function.
+ (x_set_window_size causes a resize which causes
+ a "windowDidResize" which calls x_set_window_size). */
#ifndef NS_IMPL_GNUSTEP
if (cols > 0 && rows > 0)
x_set_window_size (emacsframe, 0, cols, rows);
r = NSMakeRect (0, 0, FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, f->text_cols),
FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, f->text_lines));
[self initWithFrame: r];
+ [self setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];
FRAME_NS_VIEW (f) = self;
emacsframe = f;
NSWindow *win = [self window];
NSRect r = [win frame];
NSScreen *screen = [win screen];
- NSRect sr = [screen frame];
NSTRACE (windowDidMove);
return;
if (screen != nil)
{
- emacsframe->left_pos = r.origin.x; /* - sr.origin.x; */
- emacsframe->top_pos = sr.size.height -
- (r.origin.y + r.size.height); /* + sr.origin.y; */
+ emacsframe->left_pos = r.origin.x;
+ emacsframe->top_pos =
+ [screen frame].size.height - (r.origin.y + r.size.height);
}
}
-#ifdef NS_IMPL_COCOA
-/* if we don't do this manually, the window will resize but not move */
+
+/* Called AFTER method below, but before our windowWillResize call there leads
+ to windowDidResize -> x_set_window_size. Update emacs' notion of frame
+ location so set_window_size moves the frame. */
- (BOOL)windowShouldZoom: (NSWindow *)sender toFrame: (NSRect)newFrame
{
NSTRACE (windowShouldZoom);
- [[self window] setFrame: newFrame display: NO];
+ emacsframe->left_pos = (int)newFrame.origin.x;
+ emacsframe->top_pos = [[sender screen] frame].size.height
+ - (newFrame.origin.y+newFrame.size.height);
return YES;
}
-#endif
/* Override to do something slightly nonstandard, but nice. First click on
defaultFrame:(NSRect)defaultFrame
{
NSRect result = [sender frame];
+ static NSRect ns_userRect = { 0, 0, 0, 0 };
+
NSTRACE (windowWillUseStandardFrame);
- if (result.size.height == defaultFrame.size.height) {
- result = defaultFrame;
- } else {
- result.size.height = defaultFrame.size.height;
- result.origin.y = defaultFrame.origin.y;
- }
+ if (abs (defaultFrame.size.height - result.size.height)
+ > FRAME_LINE_HEIGHT (emacsframe))
+ {
+ /* first click */
+ ns_userRect = result;
+ result.size.height = defaultFrame.size.height;
+ result.origin.y = defaultFrame.origin.y;
+ }
+ else
+ {
+ if (abs (defaultFrame.size.width - result.size.width)
+ > FRAME_COLUMN_WIDTH (emacsframe))
+ result = defaultFrame; /* second click */
+ else
+ result = ns_userRect.size.height ? ns_userRect : result; /* restore */
+ }
- /* A windowWillResize does not get generated at least on Tiger. */
[self windowWillResize: sender toSize: result.size];
return result;
}
/* NSDraggingDestination protocol methods. Actually this is not really a
protocol, but a category of Object. O well... */
--(unsigned int) draggingEntered: (id <NSDraggingInfo>) sender
+-(NSUInteger) draggingEntered: (id <NSDraggingInfo>) sender
{
NSTRACE (draggingEntered);
return NSDragOperationGeneric;
#define SCROLL_BAR_FIRST_DELAY 0.5
#define SCROLL_BAR_CONTINUOUS_DELAY (1.0 / 15)
-+ (float) scrollerWidth
++ (CGFloat) scrollerWidth
{
/* TODO: if we want to allow variable widths, this is the place to do it,
however neither GNUstep nor Cocoa support it very well */
[self setEnabled: YES];
/* Ensure auto resizing of scrollbars occurs within the emacs frame's view
- locked against the right, top and bottom edges. */
+ locked against the top and bottom edges, and right edge on OS X, where
+ scrollers are on right. */
+#ifdef NS_IMPL_GNUSTEP
+ [self setAutoresizingMask: NSViewMaxXMargin | NSViewHeightSizable];
+#else
[self setAutoresizingMask: NSViewMinXMargin | NSViewHeightSizable];
+#endif
win = nwin;
condemned = NO;
por = (float)portion/whole;
[self setFloatValue: pos knobProportion: por];
}
-#ifdef NS_IMPL_GNUSTEP
- [self display];
-#endif
return self;
}
case NSScrollerKnobSlot: /* GNUstep-only */
last_hit_part = scroll_bar_move_ratio; break;
default: /* NSScrollerNoPart? */
- fprintf (stderr, "EmacsScoller-mouseDown: unexpected part %d\n", part);
+ fprintf (stderr, "EmacsScoller-mouseDown: unexpected part %ld\n",
+ (long) part);
return;
}
/* set a timer to repeat, as we can't let superclass do this modally */
scroll_repeat_entry
- = [[NSTimer scheduledTimerWithTimeInterval: 0.5
+ = [[NSTimer scheduledTimerWithTimeInterval: SCROLL_BAR_FIRST_DELAY
target: self
selector: @selector (repeatScroll:)
userInfo: 0
DEFVAR_LISP ("ns-antialias-text", &ns_antialias_text,
"Non-nil (the default) means to render text antialiased. Only has an effect on OS X Panther and above.");
- DEFVAR_LISP ("ns-use-qd-smoothing", &ns_use_qd_smoothing,
- "Whether to render text using QuickDraw (less heavy) antialiasing. Only has an effect on OS X Panther and above. Default is nil (use Quartz smoothing).");
-
DEFVAR_LISP ("ns-confirm-quit", &ns_confirm_quit,
"Whether to confirm application quit using dialog.");