/* Functions for the NeXT/Open/GNUstep and MacOSX window system.
-Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2013 Free Software
+Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2015 Free Software
Foundation, Inc.
This file is part of GNU Emacs.
if (!NILP (Fstring_equal (XCAR (dpyinfo->name_list_element), name)))
return dpyinfo;
- error ("Emacs for OpenStep does not yet support multi-display.");
+ error ("Emacs for Nextstep does not yet support multi-display");
Fx_open_connection (name, Qnil, Qnil);
dpyinfo = x_display_list;
if (dpyinfo == 0)
- error ("OpenStep on %s not responding.\n", SDATA (name));
+ error ("Display on %s not responding.\n", SDATA (name));
return dpyinfo;
}
NSColor *col;
EmacsCGFloat r, g, b, alpha;
+ /* Must block_input, because ns_lisp_to_color does block/unblock_input
+ which means that col may be deallocated in its unblock_input if there
+ is user input, unless we also block_input. */
+ block_input ();
if (ns_lisp_to_color (arg, &col))
{
store_frame_param (f, Qforeground_color, oldval);
+ unblock_input ();
error ("Unknown color");
}
update_face_from_frame_parameter (f, Qforeground_color, arg);
/*recompute_basic_faces (f); */
if (FRAME_VISIBLE_P (f))
- redraw_frame (f);
+ SET_FRAME_GARBAGED (f);
}
+ unblock_input ();
}
NSView *view = FRAME_NS_VIEW (f);
EmacsCGFloat r, g, b, alpha;
+ block_input ();
if (ns_lisp_to_color (arg, &col))
{
store_frame_param (f, Qbackground_color, oldval);
+ unblock_input ();
error ("Unknown color");
}
}
if (FRAME_VISIBLE_P (f))
- redraw_frame (f);
+ SET_FRAME_GARBAGED (f);
}
+ unblock_input ();
}
{
NSColor *col;
+ block_input ();
if (ns_lisp_to_color (arg, &col))
{
store_frame_param (f, Qcursor_color, oldval);
+ unblock_input ();
error ("Unknown color");
}
x_update_cursor (f, 1);
}
update_face_from_frame_parameter (f, Qcursor_color, arg);
+ unblock_input ();
}
if (!NILP (f->title))
arg = f->title;
else
- /* explicit name and no icon-name -> explicit_name */
+ /* Explicit name and no icon-name -> explicit_name. */
if (f->explicit_name)
arg = f->name;
else
{
- /* no explicit name and no icon-name ->
- name has to be rebuild from icon_title_format */
- windows_or_buffers_changed++;
+ /* No explicit name and no icon-name ->
+ name has to be rebuild from icon_title_format. */
+ windows_or_buffers_changed = 62;
return;
}
}
/* Don't change the name if it's already NAME. */
- if ([[view window] miniwindowTitle] &&
- ([[[view window] miniwindowTitle]
+ if ([[view window] miniwindowTitle]
+ && ([[[view window] miniwindowTitle]
isEqualToString: [NSString stringWithUTF8String:
- SSDATA (arg)]]))
+ SSDATA (arg)]]))
return;
[[view window] setMiniwindowTitle:
str = [NSString stringWithUTF8String: SSDATA (encoded_icon_name)];
- if ([[view window] miniwindowTitle] &&
- ! [[[view window] miniwindowTitle] isEqualToString: str])
+ if ([[view window] miniwindowTitle]
+ && ! [[[view window] miniwindowTitle] isEqualToString: str])
[[view window] setMiniwindowTitle: str];
}
/* If we're switching from explicit to implicit, we had better
update the mode lines and thereby update the title. */
if (f->explicit_name && NILP (name))
- update_mode_lines = 1;
+ update_mode_lines = 21;
f->explicit_name = ! NILP (name);
}
return;
if (NILP (name))
- name = build_string([ns_app_name UTF8String]);
+ name = build_string ([ns_app_name UTF8String]);
else
CHECK_STRING (name);
fset_name (f, name);
- /* title overrides explicit name */
+ /* Title overrides explicit name. */
if (! NILP (f->title))
name = f->title;
if (EQ (name, f->title))
return;
- update_mode_lines = 1;
+ update_mode_lines = 22;
fset_title (f, name);
fstr = [NSString stringWithUTF8String: SSDATA (encoded_filename)];
if (fstr == nil) fstr = @"";
-#ifdef NS_IMPL_COCOA
- /* work around a bug observed on 10.3 and later where
- setTitleWithRepresentedFilename does not clear out previous state
- if given filename does not exist */
- if (! [[NSFileManager defaultManager] fileExistsAtPath: fstr])
- [[view window] setRepresentedFilename: @""];
-#endif
}
else
fstr = @"";
- [[view window] setRepresentedFilename: fstr];
+ ns_set_represented_filename (fstr, f);
[[view window] setTitle: str];
fset_name (f, name);
}
void
-ns_set_doc_edited (struct frame *f, Lisp_Object arg)
+ns_set_doc_edited (void)
{
- NSView *view = FRAME_NS_VIEW (f);
NSAutoreleasePool *pool;
- if (!MINI_WINDOW_P (XWINDOW (f->selected_window)))
+ Lisp_Object tail, frame;
+ block_input ();
+ pool = [[NSAutoreleasePool alloc] init];
+ FOR_EACH_FRAME (tail, frame)
{
- block_input ();
- pool = [[NSAutoreleasePool alloc] init];
- [[view window] setDocumentEdited: !NILP (arg)];
- [pool release];
- unblock_input ();
+ BOOL edited = NO;
+ struct frame *f = XFRAME (frame);
+ struct window *w;
+ NSView *view;
+
+ if (! FRAME_NS_P (f)) continue;
+ w = XWINDOW (FRAME_SELECTED_WINDOW (f));
+ view = FRAME_NS_VIEW (f);
+ if (!MINI_WINDOW_P (w))
+ edited = ! NILP (Fbuffer_modified_p (w->contents)) &&
+ ! NILP (Fbuffer_file_name (w->contents));
+ [[view window] setDocumentEdited: edited];
}
+
+ [pool release];
+ unblock_input ();
}
}
}
- x_set_window_size (f, 0, f->text_cols, f->text_lines);
+ x_set_window_size (f, 0, f->text_cols, f->text_lines, 0);
}
Lisp_Object icon_x, icon_y;
struct ns_display_info *dpyinfo = check_ns_display_info (Qnil);
- f->output_data.ns->icon_top = Qnil;
- f->output_data.ns->icon_left = Qnil;
+ f->output_data.ns->icon_top = -1;
+ f->output_data.ns->icon_left = -1;
/* Set the position of the icon. */
icon_x = x_get_arg (dpyinfo, parms, Qicon_left, 0, 0, RES_TYPE_NUMBER);
{
CHECK_NUMBER (icon_x);
CHECK_NUMBER (icon_y);
- f->output_data.ns->icon_top = icon_y;
- f->output_data.ns->icon_left = icon_x;
+ f->output_data.ns->icon_top = XINT (icon_y);
+ f->output_data.ns->icon_left = XINT (icon_x);
}
else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
error ("Both left and top icon corners of icon must be specified");
x_set_icon_name,
x_set_icon_type,
x_set_internal_border_width, /* generic OK */
+ 0, /* x_set_right_divider_width */
+ 0, /* x_set_bottom_divider_width */
x_set_menu_bar_lines,
x_set_mouse_color,
x_explicitly_set_name,
x_default_parameter (f, parms, Qfont,
build_string (fontname),
"font", "Font", RES_TYPE_STRING);
+ xfree (fontname);
}
unblock_input ();
init_frame_faces (f);
+ /* Read comment about this code in corresponding place in xfns.c. */
+ width = FRAME_TEXT_WIDTH (f);
+ height = FRAME_TEXT_HEIGHT (f);
+ FRAME_TEXT_HEIGHT (f) = 0;
+ SET_FRAME_WIDTH (f, 0);
+ change_frame_size (f, width, height, 1, 0, 0, 1);
+
/* The resources controlling the menu-bar and tool-bar are
processed specially at startup, and reflected in the mode
variables; ignore them here. */
f->output_data.ns->hand_cursor = [NSCursor pointingHandCursor];
f->output_data.ns->hourglass_cursor = [NSCursor disappearingItemCursor];
f->output_data.ns->horizontal_drag_cursor = [NSCursor resizeLeftRightCursor];
+ f->output_data.ns->vertical_drag_cursor = [NSCursor resizeUpDownCursor];
FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor
= [NSCursor arrowCursor];
f->output_data.ns->current_pointer = f->output_data.ns->text_cursor;
x_default_parameter (f, parms, Qfullscreen, Qnil,
"fullscreen", "Fullscreen", RES_TYPE_SYMBOL);
- width = FRAME_COLS (f);
- height = FRAME_LINES (f);
-
- SET_FRAME_COLS (f, 0);
- FRAME_LINES (f) = 0;
- change_frame_size (f, height, width, 1, 0, 0);
+ width = FRAME_TEXT_WIDTH (f);
+ height = FRAME_TEXT_HEIGHT (f);
+ FRAME_TEXT_HEIGHT (f) = 0;
+ SET_FRAME_WIDTH (f, 0);
+ change_frame_size (f, width, height, 1, 0, 0, 1);
if (! f->output_data.ns->explicit_parent)
{
if (dpyinfo == 0)
{
if (!NILP (must_succeed))
- fatal ("OpenStep on %s not responding.\n",
+ fatal ("Display on %s not responding.\n",
SSDATA (display));
else
- error ("OpenStep on %s not responding.\n",
+ error ("Display on %s not responding.\n",
SSDATA (display));
}
check_window_system (NULL);
CHECK_STRING (color);
+ block_input ();
if (ns_lisp_to_color (color, &col))
- return Qnil;
+ {
+ unblock_input ();
+ return Qnil;
+ }
- [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace]
+ [[col colorUsingDefaultColorSpace]
getRed: &red green: &green blue: &blue alpha: &alpha];
+ unblock_input ();
return list3i (lrint (red * 65280), lrint (green * 65280),
lrint (blue * 65280));
}
}
#ifdef NS_IMPL_COCOA
-/* Returns the name for the screen that DICT came from, or NULL.
+
+/* Returns the name for the screen that OBJ represents, or NULL.
Caller must free return value.
*/
static char *
-ns_screen_name (CGDirectDisplayID did)
+ns_get_name_from_ioreg (io_object_t obj)
{
char *name = NULL;
+
NSDictionary *info = (NSDictionary *)
- IODisplayCreateInfoDictionary (CGDisplayIOServicePort (did),
- kIODisplayOnlyPreferredName);
- NSDictionary *names
- = [info objectForKey:
- [NSString stringWithUTF8String:kDisplayProductName]];
-
- if ([names count] > 0) {
- NSString *n = [names objectForKey: [[names allKeys] objectAtIndex:0]];
- if (n != nil)
- name = xstrdup ([n UTF8String]);
- }
+ IODisplayCreateInfoDictionary (obj, kIODisplayOnlyPreferredName);
+ NSDictionary *names = [info objectForKey:
+ [NSString stringWithUTF8String:
+ kDisplayProductName]];
+
+ if ([names count] > 0)
+ {
+ NSString *n = [names objectForKey: [[names allKeys]
+ objectAtIndex:0]];
+ if (n != nil) name = xstrdup ([n UTF8String]);
+ }
[info release];
+
+ return name;
+}
+
+/* Returns the name for the screen that DID came from, or NULL.
+ Caller must free return value.
+*/
+
+static char *
+ns_screen_name (CGDirectDisplayID did)
+{
+ char *name = NULL;
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
+ mach_port_t masterPort;
+ io_iterator_t it;
+ io_object_t obj;
+
+ // CGDisplayIOServicePort is deprecated. Do it another (harder) way.
+
+ if (IOMasterPort (MACH_PORT_NULL, &masterPort) != kIOReturnSuccess
+ || IOServiceGetMatchingServices (masterPort,
+ IOServiceMatching ("IONDRVDevice"),
+ &it) != kIOReturnSuccess)
+ return name;
+
+ /* Must loop until we find a name. Many devices can have the same unit
+ number (represents different GPU parts), but only one has a name. */
+ while (! name && (obj = IOIteratorNext (it)))
+ {
+ CFMutableDictionaryRef props;
+ const void *val;
+
+ if (IORegistryEntryCreateCFProperties (obj,
+ &props,
+ kCFAllocatorDefault,
+ kNilOptions) == kIOReturnSuccess
+ && props != nil
+ && (val = CFDictionaryGetValue(props, @"IOFBDependentIndex")))
+ {
+ unsigned nr = [(NSNumber *)val unsignedIntegerValue];
+ if (nr == CGDisplayUnitNumber (did))
+ name = ns_get_name_from_ioreg (obj);
+ }
+
+ CFRelease (props);
+ IOObjectRelease (obj);
+ }
+
+ IOObjectRelease (it);
+
+#else
+
+ name = ns_get_name_from_ioreg (CGDisplayIOServicePort (did));
+
+#endif
return name;
}
#endif