/* Generic frame functions.
- Copyright (C) 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+Copyright (C) 1993-1995, 1997, 1999-2011 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <stdio.h>
#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
#include <setjmp.h>
#include "lisp.h"
#include "character.h"
Lisp_Object Qx, Qw32, Qmac, Qpc, Qns;
Lisp_Object Qvisible;
Lisp_Object Qdisplay_type;
-Lisp_Object Qbackground_mode;
+static Lisp_Object Qbackground_mode;
Lisp_Object Qnoelisp;
-Lisp_Object Qx_frame_parameter;
+static Lisp_Object Qx_frame_parameter;
Lisp_Object Qx_resource_name;
Lisp_Object Qterminal;
Lisp_Object Qterminal_live_p;
Lisp_Object Qauto_raise, Qauto_lower;
Lisp_Object Qborder_color, Qborder_width;
Lisp_Object Qcursor_color, Qcursor_type;
-Lisp_Object Qgeometry; /* Not used */
+static Lisp_Object Qgeometry; /* Not used */
Lisp_Object Qheight, Qwidth;
Lisp_Object Qleft, Qright;
Lisp_Object Qicon_left, Qicon_top, Qicon_type, Qicon_name;
Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background;
Lisp_Object Qscreen_gamma;
Lisp_Object Qline_spacing;
-Lisp_Object Quser_position, Quser_size;
+static Lisp_Object Quser_position, Quser_size;
Lisp_Object Qwait_for_wm;
-Lisp_Object Qwindow_id;
+static Lisp_Object Qwindow_id;
#ifdef HAVE_X_WINDOWS
-Lisp_Object Qouter_window_id;
+static Lisp_Object Qouter_window_id;
#endif
Lisp_Object Qparent_id;
Lisp_Object Qtitle, Qname;
-Lisp_Object Qexplicit_name;
+static Lisp_Object Qexplicit_name;
Lisp_Object Qunsplittable;
Lisp_Object Qmenu_bar_lines, Qtool_bar_lines, Qtool_bar_position;
Lisp_Object Qleft_fringe, Qright_fringe;
-Lisp_Object Qbuffer_predicate, Qbuffer_list, Qburied_buffer_list;
+Lisp_Object Qbuffer_predicate;
+static Lisp_Object Qbuffer_list, Qburied_buffer_list;
Lisp_Object Qtty_color_mode;
Lisp_Object Qtty, Qtty_type;
static Lisp_Object Qdelete_frame_functions;
+#ifdef HAVE_WINDOW_SYSTEM
+static void x_report_frame_params (struct frame *, Lisp_Object *);
+#endif
+
\f
static void
set_menu_bar_lines_1 (Lisp_Object window, int n)
if (NILP (mini_window))
{
/* Use default-minibuffer-frame if possible. */
- if (!FRAMEP (kb->Vdefault_minibuffer_frame)
- || ! FRAME_LIVE_P (XFRAME (kb->Vdefault_minibuffer_frame)))
+ if (!FRAMEP (KVAR (kb, Vdefault_minibuffer_frame))
+ || ! FRAME_LIVE_P (XFRAME (KVAR (kb, Vdefault_minibuffer_frame))))
{
Lisp_Object frame_dummy;
XSETFRAME (frame_dummy, f);
GCPRO1 (frame_dummy);
/* If there's no minibuffer frame to use, create one. */
- kb->Vdefault_minibuffer_frame =
+ KVAR (kb, Vdefault_minibuffer_frame) =
call1 (intern ("make-initial-minibuffer-frame"), display);
UNGCPRO;
}
- mini_window = XFRAME (kb->Vdefault_minibuffer_frame)->minibuffer_window;
+ mini_window = XFRAME (KVAR (kb, Vdefault_minibuffer_frame))->minibuffer_window;
}
f->minibuffer_window = mini_window;
/* The default value of menu-bar-mode is t. */
set_menu_bar_lines (f, make_number (1), Qnil);
-#ifdef CANNOT_DUMP
if (!noninteractive)
init_frame_faces (f);
-#endif
return f;
}
-struct frame *
+static struct frame *
make_terminal_frame (struct terminal *terminal)
{
register struct frame *f;
if (!NILP (tty))
{
name = (char *) alloca (SBYTES (tty) + 1);
- strncpy (name, SDATA (tty), SBYTES (tty));
+ strncpy (name, SSDATA (tty), SBYTES (tty));
name[SBYTES (tty)] = 0;
}
if (!NILP (tty_type))
{
type = (char *) alloca (SBYTES (tty_type) + 1);
- strncpy (type, SDATA (tty_type), SBYTES (tty_type));
+ strncpy (type, SSDATA (tty_type), SBYTES (tty_type));
type[SBYTES (tty_type)] = 0;
}
(Lisp_Object event)
{
/* Preserve prefix arg that the command loop just cleared. */
- current_kboard->Vprefix_arg = Vcurrent_prefix_arg;
- call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
+ KVAR (current_kboard, Vprefix_arg) = Vcurrent_prefix_arg;
+ Frun_hooks (1, &Qmouse_leave_buffer_hook);
return do_switch_frame (event, 0, 0, Qnil);
}
= Fcons (list3 (Qrun_hook_with_args, Qdelete_frame_functions, frame),
pending_funcalls);
else
- safe_call2 (Qrun_hook_with_args, Qdelete_frame_functions, frame);
+ {
+#ifdef HAVE_X_WINDOWS
+ /* Also, save clipboard to the the clipboard manager. */
+ x_clipboard_manager_save_frame (frame);
+#endif
+
+ safe_call2 (Qrun_hook_with_args, Qdelete_frame_functions, frame);
+ }
/* The hook may sometimes (indirectly) cause the frame to be deleted. */
if (! FRAME_LIVE_P (f))
/* If we've deleted this keyboard's default_minibuffer_frame, try to
find another one. Prefer minibuffer-only frames, but also notice
frames with other windows. */
- if (kb != NULL && EQ (frame, kb->Vdefault_minibuffer_frame))
+ if (kb != NULL && EQ (frame, KVAR (kb, Vdefault_minibuffer_frame)))
{
Lisp_Object frames;
if (NILP (frame_with_minibuf))
abort ();
- kb->Vdefault_minibuffer_frame = frame_with_minibuf;
+ KVAR (kb, Vdefault_minibuffer_frame) = frame_with_minibuf;
}
else
/* No frames left on this kboard--say no minibuffer either. */
- kb->Vdefault_minibuffer_frame = Qnil;
+ KVAR (kb, Vdefault_minibuffer_frame) = Qnil;
}
/* Cause frame titles to update--necessary if we now have just one frame. */
enum scroll_bar_part party_dummy;
Lisp_Object x, y, retval;
int col, row;
- unsigned long long_dummy;
+ Time long_dummy;
struct gcpro gcpro1;
f = SELECTED_FRAME ();
Lisp_Object lispy_dummy;
enum scroll_bar_part party_dummy;
Lisp_Object x, y;
- unsigned long long_dummy;
+ Time long_dummy;
f = SELECTED_FRAME ();
x = y = Qnil;
w = XWINDOW (window);
if (!NILP (w->buffer))
- XBUFFER (w->buffer)->display_time = Fcurrent_time ();
+ BVAR (XBUFFER (w->buffer), display_time) = Fcurrent_time ();
if (!NILP (w->vchild))
make_frame_visible_1 (w->vchild);
\f
/* Return the value of frame parameter PROP in frame FRAME. */
+#if !HAVE_NS
+static
+#endif
Lisp_Object
get_frame_param (register struct frame *frame, Lisp_Object prop)
{
static int
frame_name_fnn_p (char *str, EMACS_INT len)
{
- if (len > 1 && str[0] == 'F')
+ if (len > 1 && str[0] == 'F' && '0' <= str[1] && str[1] <= '9')
{
- char *end_ptr;
-
- strtol (str + 1, &end_ptr, 10);
-
- if (end_ptr == str + len)
+ char *p = str + 2;
+ while ('0' <= *p && *p <= '9')
+ p++;
+ if (p == str + len)
return 1;
}
return 0;
/* Check for no change needed in this very common case
before we do any consing. */
- if (frame_name_fnn_p (SDATA (f->name),
+ if (frame_name_fnn_p (SSDATA (f->name),
SBYTES (f->name)))
return;
/* Don't allow the user to set the frame name to F<num>, so it
doesn't clash with the names we generate for terminal frames. */
- if (frame_name_fnn_p (SDATA (name), SBYTES (name)))
+ if (frame_name_fnn_p (SSDATA (name), SBYTES (name)))
error ("Frame names of the form F<num> are usurped by Emacs");
}
register Lisp_Object old_alist_elt;
/* The buffer-list parameters are stored in a special place and not
- in the alist. */
+ in the alist. All buffers must be live. */
if (EQ (prop, Qbuffer_list))
{
- f->buffer_list = val;
+ Lisp_Object list = Qnil;
+ for (; CONSP (val); val = XCDR (val))
+ if (!NILP (Fbuffer_live_p (XCAR (val))))
+ list = Fcons (XCAR (val), list);
+ f->buffer_list = Fnreverse (list);
return;
}
if (EQ (prop, Qburied_buffer_list))
{
- f->buried_buffer_list = val;
+ Lisp_Object list = Qnil;
+ for (; CONSP (val); val = XCDR (val))
+ if (!NILP (Fbuffer_live_p (XCAR (val))))
+ list = Fcons (XCAR (val), list);
+ f->buried_buffer_list = Fnreverse (list);
return;
}
elt = Fassq (Qforeground_color, alist);
if (CONSP (elt) && STRINGP (XCDR (elt)))
{
- if (strncmp (SDATA (XCDR (elt)),
+ if (strncmp (SSDATA (XCDR (elt)),
unspecified_bg,
SCHARS (XCDR (elt))) == 0)
store_in_alist (&alist, Qforeground_color, tty_color_name (f, bg));
- else if (strncmp (SDATA (XCDR (elt)),
+ else if (strncmp (SSDATA (XCDR (elt)),
unspecified_fg,
SCHARS (XCDR (elt))) == 0)
store_in_alist (&alist, Qforeground_color, tty_color_name (f, fg));
elt = Fassq (Qbackground_color, alist);
if (CONSP (elt) && STRINGP (XCDR (elt)))
{
- if (strncmp (SDATA (XCDR (elt)),
+ if (strncmp (SSDATA (XCDR (elt)),
unspecified_fg,
SCHARS (XCDR (elt))) == 0)
store_in_alist (&alist, Qbackground_color, tty_color_name (f, fg));
- else if (strncmp (SDATA (XCDR (elt)),
+ else if (strncmp (SSDATA (XCDR (elt)),
unspecified_bg,
SCHARS (XCDR (elt))) == 0)
store_in_alist (&alist, Qbackground_color, tty_color_name (f, bg));
if (EQ (parameter, Qbackground_color))
{
- color_name = SDATA (value);
+ color_name = SSDATA (value);
csz = SCHARS (value);
if (strncmp (color_name, unspecified_bg, csz) == 0)
value = tty_color_name (f, FRAME_BACKGROUND_PIXEL (f));
}
else if (EQ (parameter, Qforeground_color))
{
- color_name = SDATA (value);
+ color_name = SSDATA (value);
csz = SCHARS (value);
if (strncmp (color_name, unspecified_fg, csz) == 0)
value = tty_color_name (f, FRAME_FOREGROUND_PIXEL (f));
}
/* Now process them in reverse of specified order. */
- for (i--; i >= 0; i--)
+ while (--i >= 0)
{
prop = parms[i];
val = values[i];
{"tool-bar-position", &Qtool_bar_position},
};
-#ifdef HAVE_WINDOW_SYSTEM
+#ifdef WINDOWSNT
/* Calculate fullscreen size. Return in *TOP_POS and *LEFT_POS the
wanted positions of the WM window (not Emacs window).
*height = newheight;
}
+#endif /* WINDOWSNT */
+
+#ifdef HAVE_WINDOW_SYSTEM
/* Change the parameters of frame F as specified by ALIST.
If a parameter is not specially recognized, do nothing special;
/* Record in these vectors all the parms specified. */
Lisp_Object *parms;
Lisp_Object *values;
- int i, p;
+ size_t i, p;
int left_no_change = 0, top_no_change = 0;
int icon_left_no_change = 0, icon_top_no_change = 0;
int size_changed = 0;
}
/* Now process them in reverse of specified order. */
- for (i--; i >= 0; i--)
+ while (i-- != 0)
{
Lisp_Object prop, val;
bgcolor = Fassq (Qbackground_color, f->param_alist);
if (CONSP (bgcolor) && (bgcolor = XCDR (bgcolor), STRINGP (bgcolor)))
{
- Lisp_Object index = Fget (Qbackground_color, Qx_frame_parameter);
- if (NATNUMP (index)
- && (XFASTINT (index)
+ Lisp_Object parm_index = Fget (Qbackground_color, Qx_frame_parameter);
+ if (NATNUMP (parm_index)
+ && (XFASTINT (parm_index)
< sizeof (frame_parms)/sizeof (frame_parms[0]))
- && FRAME_RIF (f)->frame_parm_handlers[XFASTINT (index)])
- (*FRAME_RIF (f)->frame_parm_handlers[XFASTINT (index)])
+ && FRAME_RIF (f)->frame_parm_handlers[XFASTINT (parm_index)])
+ (*FRAME_RIF (f)->frame_parm_handlers[XFASTINT (parm_index)])
(f, bgcolor, Qnil);
}
fontset = fs_query_fontset (arg, 0);
if (fontset < 0)
{
- font_object = font_open_by_name (f, SDATA (arg));
+ font_object = font_open_by_name (f, SSDATA (arg));
if (NILP (font_object))
- error ("Font `%s' is not defined", SDATA (arg));
+ error ("Font `%s' is not defined", SSDATA (arg));
arg = AREF (font_object, FONT_NAME_INDEX);
}
else if (fontset > 0)
{
Lisp_Object ascii_font = fontset_ascii (fontset);
- font_object = font_open_by_name (f, SDATA (ascii_font));
+ font_object = font_open_by_name (f, SSDATA (ascii_font));
if (NILP (font_object))
error ("Font `%s' is not defined", SDATA (arg));
arg = AREF (font_object, FONT_NAME_INDEX);
char *p0, *p1;
CHECK_STRING (new_value);
- p0 = p1 = SDATA (new_value);
+ p0 = p1 = SSDATA (new_value);
new_value = Qnil;
while (*p0)
{
return;
/* If name is entirely invalid, or nearly so, use `emacs'. */
- if (good_count == 0
- || (good_count == 1 && bad_count > 0))
+ if (good_count < 2)
{
Vx_resource_name = build_string ("emacs");
return;
/* Start with emacs.FRAMENAME for the name (the specific one)
and with `Emacs' for the class key (the general one). */
- strcpy (name_key, SDATA (Vx_resource_name));
- strcpy (class_key, SDATA (Vx_resource_class));
+ strcpy (name_key, SSDATA (Vx_resource_name));
+ strcpy (class_key, SSDATA (Vx_resource_class));
strcat (class_key, ".");
- strcat (class_key, SDATA (class));
+ strcat (class_key, SSDATA (class));
if (!NILP (component))
{
strcat (class_key, ".");
- strcat (class_key, SDATA (subclass));
+ strcat (class_key, SSDATA (subclass));
strcat (name_key, ".");
- strcat (name_key, SDATA (component));
+ strcat (name_key, SSDATA (component));
}
strcat (name_key, ".");
- strcat (name_key, SDATA (attribute));
+ strcat (name_key, SSDATA (attribute));
value = x_get_string_resource (rdb, name_key, class_key);
class_key = (char *) alloca ((sizeof (EMACS_CLASS) - 1)
+ strlen (class) + 2);
- sprintf (name_key, "%s.%s", SDATA (Vinvocation_name), attribute);
+ sprintf (name_key, "%s.%s", SSDATA (Vinvocation_name), attribute);
sprintf (class_key, "%s.%s", EMACS_CLASS, class);
return x_get_string_resource (FRAME_X_DISPLAY_INFO (sf)->xrdb,
switch (type)
{
case RES_TYPE_NUMBER:
- return make_number (atoi (SDATA (tem)));
+ return make_number (atoi (SSDATA (tem)));
case RES_TYPE_BOOLEAN_NUMBER:
- if (!strcmp (SDATA (tem), "on")
- || !strcmp (SDATA (tem), "true"))
+ if (!strcmp (SSDATA (tem), "on")
+ || !strcmp (SSDATA (tem), "true"))
return make_number (1);
- return make_number (atoi (SDATA (tem)));
+ return make_number (atoi (SSDATA (tem)));
break;
case RES_TYPE_FLOAT:
- return make_float (atof (SDATA (tem)));
+ return make_float (atof (SSDATA (tem)));
case RES_TYPE_BOOLEAN:
tem = Fdowncase (tem);
- if (!strcmp (SDATA (tem), "on")
+ if (!strcmp (SSDATA (tem), "on")
#ifdef HAVE_NS
- || !strcmp(SDATA(tem), "yes")
+ || !strcmp (SSDATA (tem), "yes")
#endif
- || !strcmp (SDATA (tem), "true"))
+ || !strcmp (SSDATA (tem), "true"))
return Qt;
else
return Qnil;
{
Lisp_Object lower;
lower = Fdowncase (tem);
- if (!strcmp (SDATA (lower), "on")
+ if (!strcmp (SSDATA (lower), "on")
#ifdef HAVE_NS
- || !strcmp(SDATA(lower), "yes")
+ || !strcmp (SSDATA (lower), "yes")
#endif
- || !strcmp (SDATA (lower), "true"))
+ || !strcmp (SSDATA (lower), "true"))
return Qt;
- else if (!strcmp (SDATA (lower), "off")
+ else if (!strcmp (SSDATA (lower), "off")
#ifdef HAVE_NS
- || !strcmp(SDATA(lower), "no")
+ || !strcmp (SSDATA (lower), "no")
#endif
- || !strcmp (SDATA (lower), "false"))
+ || !strcmp (SSDATA (lower), "false"))
return Qnil;
else
return Fintern (tem, Qnil);
CHECK_STRING (string);
- geometry = XParseGeometry ((char *) SDATA (string),
+ geometry = XParseGeometry (SSDATA (string),
&x, &y, &width, &height);
result = Qnil;
if (geometry & XValue)
#endif
}
-