/* Functions for the NeXT/Open/GNUstep and MacOSX window system.
-Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2015 Free Software
+Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2016 Free Software
Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "macfont.h"
#endif
-#if 0
-int fns_trace_num = 1;
-#define NSTRACE(x) fprintf (stderr, "%s:%d: [%d] " #x "\n", \
- __FILE__, __LINE__, ++fns_trace_num)
-#else
-#define NSTRACE(x)
-#endif
#ifdef HAVE_NS
x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
NSView *view = FRAME_NS_VIEW (f);
- NSTRACE (x_set_icon_name);
+ NSTRACE ("x_set_icon_name");
/* see if it's changed */
if (STRINGP (arg))
static void
ns_set_name_internal (struct frame *f, Lisp_Object name)
{
- struct gcpro gcpro1;
Lisp_Object encoded_name, encoded_icon_name;
NSString *str;
NSView *view = FRAME_NS_VIEW (f);
- GCPRO1 (name);
+
encoded_name = ENCODE_UTF_8 (name);
- UNGCPRO;
str = [NSString stringWithUTF8String: SSDATA (encoded_name)];
+
/* Don't change the name if it's already NAME. */
if (! [[[view window] title] isEqualToString: str])
[[view window] setTitle: str];
static void
ns_set_name (struct frame *f, Lisp_Object name, int explicit)
{
- NSTRACE (ns_set_name);
+ NSTRACE ("ns_set_name");
/* Make sure that requests from lisp code override requests from
Emacs redisplay code. */
static void
x_explicitly_set_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
- NSTRACE (x_explicitly_set_name);
+ NSTRACE ("x_explicitly_set_name");
ns_set_name (f, arg, 1);
}
void
x_implicitly_set_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
- NSTRACE (x_implicitly_set_name);
+ NSTRACE ("x_implicitly_set_name");
+
+ Lisp_Object frame_title = buffer_local_value
+ (Qframe_title_format, XWINDOW (f->selected_window)->contents);
+ Lisp_Object icon_title = buffer_local_value
+ (Qicon_title_format, XWINDOW (f->selected_window)->contents);
/* Deal with NS specific format t. */
- if (FRAME_NS_P (f) && ((FRAME_ICONIFIED_P (f) && EQ (Vicon_title_format, Qt))
- || EQ (Vframe_title_format, Qt)))
+ if (FRAME_NS_P (f) && ((FRAME_ICONIFIED_P (f) && EQ (icon_title, Qt))
+ || EQ (frame_title, Qt)))
ns_set_name_as_filename (f);
else
ns_set_name (f, arg, 0);
static void
x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
{
- NSTRACE (x_set_title);
+ NSTRACE ("x_set_title");
/* Don't change the title if it's already NAME. */
if (EQ (name, f->title))
return;
Lisp_Object buf = XWINDOW (f->selected_window)->contents;
const char *title;
NSAutoreleasePool *pool;
- struct gcpro gcpro1;
Lisp_Object encoded_name, encoded_filename;
NSString *str;
- NSTRACE (ns_set_name_as_filename);
+ NSTRACE ("ns_set_name_as_filename");
if (f->explicit_name || ! NILP (f->title))
return;
name = build_string ([ns_app_name UTF8String]);
}
- GCPRO1 (name);
encoded_name = ENCODE_UTF_8 (name);
- UNGCPRO;
view = FRAME_NS_VIEW (f);
if (! NILP (filename))
{
- GCPRO1 (filename);
encoded_filename = ENCODE_UTF_8 (filename);
- UNGCPRO;
fstr = [NSString stringWithUTF8String: SSDATA (encoded_filename)];
if (fstr == nil) fstr = @"";
void
x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
{
+ /* Currently, when the tool bar change state, the frame is resized.
+
+ TODO: It would be better if this didn't occur when 1) the frame
+ is full height or maximized or 2) when specified by
+ `frame-inhibit-implied-resize'. */
int nlines;
+ NSTRACE ("x_set_tool_bar_lines");
+
if (FRAME_MINIBUF_ONLY_P (f))
return;
{
free_frame_tool_bar (f);
FRAME_EXTERNAL_TOOL_BAR (f) = 0;
- }
+
+ {
+ EmacsView *view = FRAME_NS_VIEW (f);
+ int fs_state = [view fullscreenState];
+
+ if (fs_state == FULLSCREEN_MAXIMIZED)
+ {
+ [view setFSValue:FULLSCREEN_WIDTH];
+ }
+ else if (fs_state == FULLSCREEN_HEIGHT)
+ {
+ [view setFSValue:FULLSCREEN_NONE];
+ }
+ }
+ }
}
- x_set_window_size (f, 0, f->text_cols, f->text_lines, 0);
+ {
+ int inhibit
+ = ((f->after_make_frame
+ && !f->tool_bar_resized
+ && (EQ (frame_inhibit_implied_resize, Qt)
+ || (CONSP (frame_inhibit_implied_resize)
+ && !NILP (Fmemq (Qtool_bar_lines,
+ frame_inhibit_implied_resize))))
+ && NILP (get_frame_param (f, Qfullscreen)))
+ ? 0
+ : 2);
+
+ NSTRACE_MSG ("inhibit:%d", inhibit);
+
+ frame_size_history_add (f, Qupdate_frame_tool_bar, 0, 0, Qnil);
+ adjust_frame_size (f, -1, -1, inhibit, 0, Qtool_bar_lines);
+ }
}
NSAutoreleasePool *pool;
BOOL setMini = YES;
- NSTRACE (ns_implicitly_set_icon_type);
+ NSTRACE ("ns_implicitly_set_icon_type");
block_input ();
pool = [[NSAutoreleasePool alloc] init];
id image = nil;
BOOL setMini = YES;
- NSTRACE (x_set_icon_type);
+ NSTRACE ("x_set_icon_type");
if (!NILP (arg) && SYMBOLP (arg))
{
x_free_frame_resources (f);
free_glyphs (f);
-#ifdef GLYPH_DEBUG
+#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
/* Check that reference counts are indeed correct. */
eassert (dpyinfo->terminal->image_cache->refcount == image_cache_refcount);
#endif
int minibuffer_only = 0;
long window_prompting = 0;
ptrdiff_t count = specpdl_ptr - specpdl;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
Lisp_Object display;
struct ns_display_info *dpyinfo = NULL;
Lisp_Object parent;
struct kboard *kb;
static int desc_ctr = 1;
+ int x_width = 0, x_height = 0;
/* x_get_arg modifies parms. */
parms = Fcopy_alist (parms);
/* No need to protect DISPLAY because that's not used after passing
it to make_frame_without_minibuffer. */
frame = Qnil;
- GCPRO4 (parms, parent, name, frame);
tem = x_get_arg (dpyinfo, parms, Qminibuffer, "minibuffer", "Minibuffer",
RES_TYPE_SYMBOL);
if (EQ (tem, Qnone) || NILP (tem))
RES_TYPE_STRING);
parms = get_geometry_from_preferences (dpyinfo, parms);
- window_prompting = x_figure_window_size (f, parms, 1);
+ window_prompting = x_figure_window_size (f, parms, true, &x_width, &x_height);
tem = x_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !EQ (tem, Qnil));
= [NSCursor arrowCursor];
f->output_data.ns->current_pointer = f->output_data.ns->text_cursor;
+ f->output_data.ns->in_animation = NO;
+
[[EmacsView alloc] initFrameFromEmacs: f];
x_icon (f, parms);
/* Allow x_set_window_size, now. */
f->can_x_set_window_size = true;
+ if (x_width > 0)
+ SET_FRAME_WIDTH (f, x_width);
+ if (x_height > 0)
+ SET_FRAME_HEIGHT (f, x_height);
+
adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1,
Qx_create_frame_2);
if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
fset_param_alist (f, Fcons (XCAR (tem), f->param_alist));
- UNGCPRO;
-
if (window_prompting & USPosition)
x_set_offset (f, f->left_pos, f->top_pos, 1);
Note: "screen" here is not in Nextstep terminology but in X11's. For
the number of physical monitors, use `(length
-(display-monitor-attributes-list TERMINAL))' instead. */)
+\(display-monitor-attributes-list TERMINAL))' instead. */)
(Lisp_Object terminal)
{
check_ns_display_info (terminal);
}
-DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc,
- Sns_convert_utf8_nfd_to_nfc, 1, 1, 0,
- doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */)
- (Lisp_Object str)
-{
-/* TODO: If GNUstep ever implements precomposedStringWithCanonicalMapping,
- remove this. */
- NSString *utfStr;
- Lisp_Object ret = Qnil;
- NSAutoreleasePool *pool;
-
- CHECK_STRING (str);
- pool = [[NSAutoreleasePool alloc] init];
- utfStr = [NSString stringWithUTF8String: SSDATA (str)];
-#ifdef NS_IMPL_COCOA
- if (utfStr)
- utfStr = [utfStr precomposedStringWithCanonicalMapping];
-#endif
- if (utfStr)
- {
- const char *cstr = [utfStr UTF8String];
- if (cstr)
- ret = build_string (cstr);
- }
-
- [pool release];
- if (NILP (ret))
- error ("Invalid UTF-8");
-
- return ret;
-}
-
-
#ifdef NS_IMPL_COCOA
/* Compile and execute the AppleScript SCRIPT and return the error
(Lisp_Object string, Lisp_Object frame, Lisp_Object parms, Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy)
{
int root_x, root_y;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
ptrdiff_t count = SPECPDL_INDEX ();
struct frame *f;
char *str;
specbind (Qinhibit_redisplay, Qt);
- GCPRO4 (string, parms, frame, timeout);
-
CHECK_STRING (string);
str = SSDATA (string);
f = decode_window_system_frame (frame);
[ns_tooltip showAtX: root_x Y: root_y for: XINT (timeout)];
unblock_input ();
- UNGCPRO;
return unbind_to (count, Qnil);
}
make_number (internal_border_width)));
}
-DEFUN ("x-frame-geometry", Fx_frame_geometry, Sx_frame_geometry, 0, 1, 0,
+DEFUN ("ns-frame-geometry", Fns_frame_geometry, Sns_frame_geometry, 0, 1, 0,
doc: /* Return geometric attributes of FRAME.
FRAME must be a live frame and defaults to the selected one. The return
value is an association list of the attributes listed below. All height
return frame_geometry (frame, Qnil);
}
-DEFUN ("x-frame-edges", Fx_frame_edges, Sx_frame_edges, 0, 2, 0,
+DEFUN ("ns-frame-edges", Fns_frame_edges, Sns_frame_edges, 0, 2, 0,
doc: /* Return edge coordinates of FRAME.
FRAME must be a live frame and defaults to the selected one. The return
value is a list of the form (LEFT, TOP, RIGHT, BOTTOM). All values are
syms_of_nsfns (void)
{
DEFSYM (Qfontsize, "fontsize");
+ DEFSYM (Qframe_title_format, "frame-title-format");
+ DEFSYM (Qicon_title_format, "icon-title-format");
DEFVAR_LISP ("ns-icon-type-alist", Vns_icon_type_alist,
doc: /* Alist of elements (REGEXP . IMAGE) for images of icons associated to frames.
defsubr (&Sx_display_pixel_width);
defsubr (&Sx_display_pixel_height);
defsubr (&Sns_display_monitor_attributes_list);
- defsubr (&Sx_frame_geometry);
- defsubr (&Sx_frame_edges);
+ defsubr (&Sns_frame_geometry);
+ defsubr (&Sns_frame_edges);
defsubr (&Sx_display_mm_width);
defsubr (&Sx_display_mm_height);
defsubr (&Sx_display_screens);
defsubr (&Sns_emacs_info_panel);
defsubr (&Sns_list_services);
defsubr (&Sns_perform_service);
- defsubr (&Sns_convert_utf8_nfd_to_nfc);
defsubr (&Sns_popup_font_panel);
defsubr (&Sns_popup_color_panel);