#ifdef WINDOWSNT
#include "w32term.h"
#endif
-#ifdef MAC_OS
-#include "macterm.h"
-#endif
#ifdef HAVE_NS
#include "nsterm.h"
#endif
#endif
+#ifdef HAVE_NS
+Lisp_Object Qns_parse_geometry;
+#endif
+
Lisp_Object Qframep, Qframe_live_p;
Lisp_Object Qicon, Qmodeline;
Lisp_Object Qonly;
Value is t for a termcap frame (a character-only terminal),
`x' for an Emacs frame that is really an X window,
`w32' for an Emacs frame that is a window on MS-Windows display,
-`mac' for an Emacs frame on a Macintosh Carbon display,
`ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
`pc' for a direct-write MS-DOS frame.
See also `frame-live-p'. */)
if (!NILP (mini_window))
CHECK_LIVE_WINDOW (mini_window);
-#ifdef MULTI_KBOARD
if (!NILP (mini_window)
&& FRAME_KBOARD (XFRAME (XWINDOW (mini_window)->frame)) != kb)
error ("Frame and minibuffer must be on the same terminal");
-#endif
/* Make a frame containing just a root window. */
f = make_frame (0);
f->visible = 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */
f->async_visible = 1; /* Don't let visible be cleared later. */
+ f->terminal = terminal;
+ f->terminal->reference_count++;
#ifdef MSDOS
- f->output_data.x = &the_only_x_display;
+ f->output_data.tty->display_info = &the_only_display_info;
if (!inhibit_window_system
&& (!FRAMEP (selected_frame) || !FRAME_LIVE_P (XFRAME (selected_frame))
|| XFRAME (selected_frame)->output_method == output_msdos_raw))
- {
- f->output_method = output_msdos_raw;
- /* This initialization of foreground and background pixels is
- only important for the initial frame created in temacs. If
- we don't do that, we get black background and foreground in
- the dumped Emacs because the_only_x_display is a static
- variable, hence it is born all-zeroes, and zero is the code
- for the black color. Other frames all inherit their pixels
- from what's already in the_only_x_display. */
- if ((!FRAMEP (selected_frame) || !FRAME_LIVE_P (XFRAME (selected_frame)))
- && FRAME_BACKGROUND_PIXEL (f) == 0
- && FRAME_FOREGROUND_PIXEL (f) == 0)
- {
- FRAME_BACKGROUND_PIXEL (f) = FACE_TTY_DEFAULT_BG_COLOR;
- FRAME_FOREGROUND_PIXEL (f) = FACE_TTY_DEFAULT_FG_COLOR;
- }
- }
+ f->output_method = output_msdos_raw;
else
f->output_method = output_termcap;
#else
{
f->output_method = output_termcap;
- f->terminal = terminal;
- f->terminal->reference_count++;
create_tty_output (f);
FRAME_FOREGROUND_PIXEL (f) = FACE_TTY_DEFAULT_FG_COLOR;
FRAME_BACKGROUND_PIXEL (f) = FACE_TTY_DEFAULT_BG_COLOR;
-
- FRAME_CAN_HAVE_SCROLL_BARS (f) = 0;
- FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_none;
-
- /* Set the top frame to the newly created frame. */
- if (FRAMEP (FRAME_TTY (f)->top_frame)
- && FRAME_LIVE_P (XFRAME (FRAME_TTY (f)->top_frame)))
- XFRAME (FRAME_TTY (f)->top_frame)->async_visible = 2; /* obscured */
-
- FRAME_TTY (f)->top_frame = frame;
}
#ifdef CANNOT_DUMP
#endif
#endif /* MSDOS */
+ FRAME_CAN_HAVE_SCROLL_BARS (f) = 0;
+ FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_none;
+
+ /* Set the top frame to the newly created frame. */
+ if (FRAMEP (FRAME_TTY (f)->top_frame)
+ && FRAME_LIVE_P (XFRAME (FRAME_TTY (f)->top_frame)))
+ XFRAME (FRAME_TTY (f)->top_frame)->async_visible = 2; /* obscured */
+
+ FRAME_TTY (f)->top_frame = frame;
+
if (!noninteractive)
init_frame_faces (f);
abort ();
#else /* not MSDOS */
-#if 0
- /* This can happen for multi-tty when using both terminal frames and
- Carbon frames. */
- if (sf->output_method != output_mac)
- error ("Not running on a Macintosh screen; cannot make a new Macintosh frame");
-#else
#if 0 /* This should work now! */
if (sf->output_method != output_termcap)
error ("Not using an ASCII terminal now; cannot make a new ASCII frame");
#endif
-#endif
#endif /* not MSDOS */
{
terminal = XCDR (terminal);
t = get_terminal (terminal, 1);
}
+#ifdef MSDOS
+ if (t && t != the_only_display_info.terminal)
+ /* msdos.c assumes a single tty_display_info object. */
+ error ("Multiple terminals are not supported on this platform");
+ if (!t)
+ t = the_only_display_info.terminal;
+#endif
}
if (!t)
FOR_DELETION non-zero means that the selected frame is being
deleted, which includes the possibility that the frame's terminal
- is dead. */
+ is dead.
+
+ The value of NORECORD is passed as argument to Fselect_window. */
Lisp_Object
-do_switch_frame (frame, track, for_deletion)
- Lisp_Object frame;
+do_switch_frame (frame, track, for_deletion, norecord)
+ Lisp_Object frame, norecord;
int track, for_deletion;
{
struct frame *sf = SELECTED_FRAME ();
if (!for_deletion && FRAME_HAS_MINIBUF_P (sf))
resize_mini_window (XWINDOW (FRAME_MINIBUF_WINDOW (sf)), 1);
- if (FRAME_TERMCAP_P (XFRAME (frame)))
+ if (FRAME_TERMCAP_P (XFRAME (frame)) || FRAME_MSDOS_P (XFRAME (frame)))
{
if (FRAMEP (FRAME_TTY (XFRAME (frame))->top_frame))
/* Mark previously displayed frame as now obscured. */
if (! FRAME_MINIBUF_ONLY_P (XFRAME (selected_frame)))
last_nonminibuf_frame = XFRAME (selected_frame);
- Fselect_window (XFRAME (frame)->selected_window, Qnil);
+ Fselect_window (XFRAME (frame)->selected_window, norecord);
#ifdef NS_IMPL_COCOA
/* term gets no other notification of this */
return frame;
}
-DEFUN ("select-frame", Fselect_frame, Sselect_frame, 1, 1, "e",
- doc: /* Select the frame FRAME.
+DEFUN ("select-frame", Fselect_frame, Sselect_frame, 1, 2, "e",
+ doc: /* Select FRAME.
Subsequent editing commands apply to its selected window.
+Optional argument NORECORD means to neither change the order of
+recently selected windows nor the buffer list.
+
The selection of FRAME lasts until the next time the user does
-something to select a different frame, or until the next time this
-function is called. If you are using a window system, the previously
-selected frame may be restored as the selected frame after return to
-the command loop, because it still may have the window system's input
-focus. On a text-only terminal, the next redisplay will display FRAME.
+something to select a different frame, or until the next time
+this function is called. If you are using a window system, the
+previously selected frame may be restored as the selected frame
+after return to the command loop, because it still may have the
+window system's input focus. On a text-only terminal, the next
+redisplay will display FRAME.
This function returns FRAME, or nil if FRAME has been deleted. */)
- (frame)
- Lisp_Object frame;
+ (frame, norecord)
+ Lisp_Object frame, norecord;
{
- return do_switch_frame (frame, 1, 0);
+ return do_switch_frame (frame, 1, 0, norecord);
}
/* Preserve prefix arg that the command loop just cleared. */
current_kboard->Vprefix_arg = Vcurrent_prefix_arg;
call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
- return do_switch_frame (event, 0, 0);
+ return do_switch_frame (event, 0, 0, Qnil);
}
DEFUN ("selected-frame", Fselected_frame, Sselected_frame, 0, 0, 0,
DEFUN ("frame-selected-window", Fframe_selected_window,
Sframe_selected_window, 0, 1, 0,
- doc: /* Return the selected window of frame object FRAME.
-If omitted, FRAME defaults to the currently selected frame. */)
+ doc: /* Return the selected window of FRAME.
+FRAME defaults to the currently selected frame. */)
(frame)
Lisp_Object frame;
{
}
DEFUN ("set-frame-selected-window", Fset_frame_selected_window,
- Sset_frame_selected_window, 2, 2, 0,
- doc: /* Set the selected window of frame object FRAME to WINDOW.
-Return WINDOW.
-If FRAME is nil, the selected frame is used.
-If FRAME is the selected frame, this makes WINDOW the selected window. */)
- (frame, window)
- Lisp_Object frame, window;
+ Sset_frame_selected_window, 2, 3, 0,
+ doc: /* Set selected window of FRAME to WINDOW.
+If FRAME is nil, use the selected frame. If FRAME is the
+selected frame, this makes WINDOW the selected window.
+Optional argument NORECORD non-nil means to neither change the
+order of recently selected windows nor the buffer list.
+Return WINDOW. */)
+ (frame, window, norecord)
+ Lisp_Object frame, window, norecord;
{
if (NILP (frame))
frame = selected_frame;
error ("In `set-frame-selected-window', WINDOW is not on FRAME");
if (EQ (frame, selected_frame))
- return Fselect_window (window, Qnil);
+ return Fselect_window (window, norecord);
return XFRAME (frame)->selected_window = window;
}
}
}
- do_switch_frame (frame1, 0, 1);
+ do_switch_frame (frame1, 0, 1, Qnil);
sf = SELECTED_FRAME ();
}
if (FRAME_X_P (f))
x_clear_frame_selections (f);
#endif
-#ifdef MAC_OS
- if (FRAME_MAC_P (f))
- x_clear_frame_selections (f);
-#endif
/* Free glyphs.
This function must be called before the window tree of the
Vframe_list = Fdelq (frame, Vframe_list);
FRAME_SET_VISIBLE (f, 0);
+ f->menu_bar_vector = Qnil;
+
+ free_font_driver_list (f);
xfree (f->namebuf);
xfree (f->decode_mode_spec_buffer);
xfree (FRAME_INSERT_COST (f));
kb = NULL;
Fdelete_terminal (tmp, NILP (force) ? Qt : force);
}
-#ifdef MULTI_KBOARD
else
kb = terminal->kboard;
-#endif
}
/* If we've deleted the last_nonminibuf_frame, then try to find
#if defined (MSDOS) && defined (HAVE_MOUSE)
if (FRAME_MSDOS_P (XFRAME (frame)))
{
- Fselect_frame (frame);
+ Fselect_frame (frame, Qnil);
mouse_moveto (XINT (x), XINT (y));
}
#else
#ifdef HAVE_GPM
{
- Fselect_frame (frame);
+ Fselect_frame (frame, Qnil);
term_mouse_moveto (XINT (x), XINT (y));
}
#endif
#if defined (MSDOS) && defined (HAVE_MOUSE)
if (FRAME_MSDOS_P (XFRAME (frame)))
{
- Fselect_frame (frame);
+ Fselect_frame (frame, Qnil);
mouse_moveto (XINT (x), XINT (y));
}
#else
#ifdef HAVE_GPM
{
- Fselect_frame (frame);
+ Fselect_frame (frame, Qnil);
term_mouse_moveto (XINT (x), XINT (y));
}
#endif
#if 0 /* This isn't logically necessary, and it can do GC. */
/* Don't let the frame remain selected. */
if (EQ (frame, selected_frame))
- do_switch_frame (next_frame (frame, Qt), 0, 0)
+ do_switch_frame (next_frame (frame, Qt), 0, 0, Qnil)
#endif
/* Don't allow minibuf_window to remain on a deleted frame. */
If FRAME is invisible or iconified, make it visible.
If you don't specify a frame, the selected frame is used.
If Emacs is displaying on an ordinary terminal or some other device which
-doesn't support multiple overlapping frames, this function does nothing. */)
+doesn't support multiple overlapping frames, this function selects FRAME. */)
(frame)
Lisp_Object frame;
{
f = XFRAME (frame);
- /* Do like the documentation says. */
- Fmake_frame_visible (frame);
+ if (FRAME_TERMCAP_P (f))
+ /* On a text-only terminal select FRAME. */
+ Fselect_frame (frame, Qnil);
+ else
+ /* Do like the documentation says. */
+ Fmake_frame_visible (frame);
if (FRAME_TERMINAL (f)->frame_raise_lower_hook)
(*FRAME_TERMINAL (f)->frame_raise_lower_hook) (f, 1);
The value of frame parameter FOO can also be accessed
as a frame-local binding for the variable FOO, if you have
-enabled such bindings for that variable with `make-variable-frame-local'. */)
+enabled such bindings for that variable with `make-variable-frame-local'.
+Note that this functionality is obsolete as of Emacs 22.2, and its
+use is not recommended. Explicitly check for a frame-parameter instead. */)
(frame, alist)
Lisp_Object frame, alist;
{
{
int newwidth = FRAME_COLS (f);
int newheight = FRAME_LINES (f);
+ Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
*top_pos = f->top_pos;
*left_pos = f->left_pos;
{
int ph;
- ph = FRAME_X_DISPLAY_INFO (f)->height;
+ ph = x_display_pixel_height (dpyinfo);
newheight = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, ph);
ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, newheight) - f->y_pixels_diff;
newheight = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, ph);
{
int pw;
- pw = FRAME_X_DISPLAY_INFO (f)->width;
+ pw = x_display_pixel_width (dpyinfo);
newwidth = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pw);
pw = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, newwidth) - f->x_pixels_diff;
newwidth = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pw);
&& !CONSP (new_value))
{
char *p0, *p1;
-
+
CHECK_STRING (new_value);
p0 = p1 = SDATA (new_value);
new_value = Qnil;
else
item = arg;
- if (! NILP (item))
- {
- if (FLOATP (item))
- {
- alpha = XFLOAT_DATA (item);
- if (alpha < 0.0 || 1.0 < alpha)
- args_out_of_range (make_float (0.0), make_float (1.0));
- }
- else if (INTEGERP (item))
- {
- ialpha = XINT (item);
- if (ialpha < 0 || 100 < ialpha)
- args_out_of_range (make_number (0), make_number (100));
- else
- alpha = ialpha / 100.0;
- }
- else
- wrong_type_argument (Qnumberp, item);
- }
+ if (NILP (item))
+ alpha = - 1.0;
+ else if (FLOATP (item))
+ {
+ alpha = XFLOAT_DATA (item);
+ if (alpha < 0.0 || 1.0 < alpha)
+ args_out_of_range (make_float (0.0), make_float (1.0));
+ }
+ else if (INTEGERP (item))
+ {
+ ialpha = XINT (item);
+ if (ialpha < 0 || 100 < ialpha)
+ args_out_of_range (make_number (0), make_number (100));
+ else
+ alpha = ialpha / 100.0;
+ }
+ else
+ wrong_type_argument (Qnumberp, item);
newval[i] = alpha;
}
for (i = 0; i < 2; i++)
f->alpha[i] = newval[i];
-#if defined (HAVE_X_WINDOWS) || defined (HAVE_NTGUI)
+#if defined (HAVE_X_WINDOWS) || defined (HAVE_NTGUI) || defined (NS_IMPL_COCOA)
BLOCK_INPUT;
x_set_frame_alpha (f);
UNBLOCK_INPUT;
\f
+#ifdef HAVE_NS
+
+/* We used to define x-parse-geometry directly in ns-win.el, but that
+ confused make-docfile: the documentation string in ns-win.el was
+ used for x-parse-geometry even in non-NS builds.. */
+
+DEFUN ("x-parse-geometry", Fx_parse_geometry, Sx_parse_geometry, 1, 1, 0,
+ doc: /* Parse a Nextstep-style geometry string STRING.
+Returns an alist of the form ((top . TOP), (left . LEFT) ... ).
+The properties returned may include `top', `left', `height', and `width'.
+This works by calling `ns-parse-geometry'. */)
+ (string)
+ Lisp_Object string;
+{
+ call1 (Qns_parse_geometry, string);
+}
+
+#else /* !HAVE_NS */
+
DEFUN ("x-parse-geometry", Fx_parse_geometry, Sx_parse_geometry, 1, 1, 0,
doc: /* Parse an X-style geometry string STRING.
Returns an alist of the form ((top . TOP), (left . LEFT) ... ).
geometry = XParseGeometry ((char *) SDATA (string),
&x, &y, &width, &height);
-
-#if 0
- if (!!(geometry & XValue) != !!(geometry & YValue))
- error ("Must specify both x and y position, or neither");
-#endif
-
result = Qnil;
if (geometry & XValue)
{
return result;
}
+#endif /* HAVE_NS */
+
/* Calculate the desired size and position of frame F.
Return the flags saying which aspects were specified.
Qterminal_live_p = intern ("terminal-live-p");
staticpro (&Qterminal_live_p);
+#ifdef HAVE_NS
+ Qns_parse_geometry = intern ("ns-parse-geometry");
+ staticpro (&Qns_parse_geometry);
+#endif
+
{
int i;
DEFVAR_LISP ("default-frame-scroll-bars", &Vdefault_frame_scroll_bars,
doc: /* Default position of scroll bars on this window-system. */);
#ifdef HAVE_WINDOW_SYSTEM
-#if defined(HAVE_NTGUI) || defined(MAC_OS) || defined(NS_IMPL_COCOA)
+#if defined(HAVE_NTGUI) || defined(NS_IMPL_COCOA)
/* MS-Windows and Mac OS X have scroll bars on the right by default. */
Vdefault_frame_scroll_bars = Qright;
#else
handles focus, since there is no way in general for Emacs to find out
automatically. */);
#ifdef HAVE_WINDOW_SYSTEM
-#if defined(HAVE_NTGUI) || defined(MAC_OS) || defined(HAVE_NS)
+#if defined(HAVE_NTGUI) || defined(HAVE_NS)
focus_follows_mouse = 0;
#else
focus_follows_mouse = 1;