}
#ifdef HAVE_WINDOW_SYSTEM
-
bool
-window_system_available (struct frame *f)
+display_available (void)
{
- return f ? FRAME_WINDOW_P (f) || FRAME_MSDOS_P (f) : x_display_list != NULL;
+ return x_display_list != NULL;
}
-
-#endif /* HAVE_WINDOW_SYSTEM */
+#endif
struct frame *
decode_window_system_frame (Lisp_Object frame)
{
struct frame *f = decode_live_frame (frame);
-
- if (!window_system_available (f))
- error ("Window system frame should be used");
+ check_window_system (f);
+#ifdef HAVE_WINDOW_SYSTEM
return f;
+#endif
}
void
check_window_system (struct frame *f)
{
- if (!window_system_available (f))
- error (f ? "Window system frame should be used"
- : "Window system is not in use or not initialized");
+#ifdef HAVE_WINDOW_SYSTEM
+ if (window_system_available (f))
+ return;
+#endif
+ error (f ? "Window system frame should be used"
+ : "Window system is not in use or not initialized");
}
/* Return the value of frame parameter PROP in frame FRAME. */
block_input ();
#ifdef MSDOS
- /* We only can set screen dimensions to certain values supported
- by our video hardware. Try to find the smallest size greater
- or equal to the requested dimensions. */
- dos_set_window_size (&new_lines, &new_cols);
+ /* We only can set screen dimensions to certain values supported by
+ our video hardware. Try to find the smallest size greater or
+ equal to the requested dimensions, while accounting for the fact
+ that the menu-bar lines are not counted in the frame height. */
+ int dos_new_lines = new_lines + FRAME_TOP_MARGIN (f);
+ dos_set_window_size (&dos_new_lines, &new_cols);
+ new_lines = dos_new_lines - FRAME_TOP_MARGIN (f);
#endif
if (new_windows_width != old_windows_width)
#endif
}
else if (new_cols != old_cols)
- call2 (Qwindow_pixel_to_total, frame, Qt);
+ call2 (Qwindow__pixel_to_total, frame, Qt);
if (new_windows_height != old_windows_height
/* When the top margin has changed we have to recalculate the top
FrameRows (FRAME_TTY (f)) = new_lines + FRAME_TOP_MARGIN (f);
}
else if (new_lines != old_lines)
- call2 (Qwindow_pixel_to_total, frame, Qnil);
+ call2 (Qwindow__pixel_to_total, frame, Qnil);
frame_size_history_add
(f, Qadjust_frame_size_3, new_text_width, new_text_height,
{
Lisp_Object frame;
struct frame *f;
- struct window *rw, *mw IF_LINT (= NULL);
+ struct window *rw, *mw;
Lisp_Object root_window;
Lisp_Object mini_window;
check_minibuf_window (frame, EQ (minibuf_window, selected_window));
/* I think this should be done with a hook. */
-#ifdef HAVE_WINDOW_SYSTEM
if (FRAME_WINDOW_P (f))
+ {
+#ifdef HAVE_WINDOW_SYSTEM
x_iconify_frame (f);
#endif
+ }
/* Make menu bar update for the Buffers and Frames menus. */
windows_or_buffers_changed = 17;
/* Avoid consing in frequent cases. */
if (EQ (parameter, Qname))
value = f->name;
+#ifdef HAVE_WINDOW_SYSTEM
+ /* These are used by vertical motion commands. */
+ else if (EQ (parameter, Qvertical_scroll_bars))
+ value = (f->vertical_scroll_bar_type == vertical_scroll_bar_none
+ ? Qnil
+ : (f->vertical_scroll_bar_type == vertical_scroll_bar_left
+ ? Qleft : Qright));
+ else if (EQ (parameter, Qhorizontal_scroll_bars))
+ value = f->horizontal_scroll_bars ? Qt : Qnil;
+ else if (EQ (parameter, Qline_spacing) && f->extra_line_spacing == 0)
+ /* If this is non-zero, we can't determine whether the user specified
+ an integer or float value without looking through 'param_alist'. */
+ value = make_number (0);
+ else if (EQ (parameter, Qfont) && FRAME_X_P (f))
+ value = FRAME_FONT (f)->props[FONT_NAME_INDEX];
+#endif /* HAVE_WINDOW_SYSTEM */
#ifdef HAVE_X_WINDOWS
else if (EQ (parameter, Qdisplay) && FRAME_X_P (f))
value = XCAR (FRAME_DISPLAY_INFO (f)->name_list_element);
bottom edge of FRAME's display. */)
(Lisp_Object frame, Lisp_Object x, Lisp_Object y)
{
- register struct frame *f = decode_live_frame (frame);
+ struct frame *f = decode_live_frame (frame);
CHECK_TYPE_RANGED_INTEGER (int, x);
CHECK_TYPE_RANGED_INTEGER (int, y);
/* I think this should be done with a hook. */
-#ifdef HAVE_WINDOW_SYSTEM
if (FRAME_WINDOW_P (f))
- x_set_offset (f, XINT (x), XINT (y), 1);
+ {
+#ifdef HAVE_WINDOW_SYSTEM
+ x_set_offset (f, XINT (x), XINT (y), 1);
#endif
+ }
return Qt;
}
/* If both of these parameters are present, it's more efficient to
set them both at once. So we wait until we've looked at the
entire list before we set them. */
- int width IF_LINT (= 0), height IF_LINT (= 0);
+ int width, height;
bool width_change = false, height_change = false;
/* Same here. */
/* Record in these vectors all the parms specified. */
Lisp_Object *parms;
Lisp_Object *values;
- ptrdiff_t i, p;
+ ptrdiff_t i, j, size;
bool left_no_change = 0, top_no_change = 0;
#ifdef HAVE_X_WINDOWS
bool icon_left_no_change = 0, icon_top_no_change = 0;
#endif
- i = 0;
- for (tail = alist; CONSP (tail); tail = XCDR (tail))
- i++;
+ for (size = 0, tail = alist; CONSP (tail); tail = XCDR (tail))
+ size++;
USE_SAFE_ALLOCA;
- SAFE_ALLOCA_LISP (parms, 2 * i);
- values = parms + i;
+ SAFE_ALLOCA_LISP (parms, 2 * size);
+ values = parms + size;
/* Extract parm names and values into those vectors. */
- i = 0;
+ i = 0, j = size - 1;
for (tail = alist; CONSP (tail); tail = XCDR (tail))
{
- Lisp_Object elt;
-
- elt = XCAR (tail);
- parms[i] = Fcar (elt);
- values[i] = Fcdr (elt);
- i++;
- }
- /* TAIL and ALIST are not used again below here. */
- alist = tail = Qnil;
+ Lisp_Object elt = XCAR (tail), prop = Fcar (elt), val = Fcdr (elt);
- top = left = Qunbound;
- icon_left = icon_top = Qunbound;
-
- /* Process foreground_color and background_color before anything else.
- They are independent of other properties, but other properties (e.g.,
- cursor_color) are dependent upon them. */
- /* Process default font as well, since fringe widths depends on it. */
- for (p = 0; p < i; p++)
- {
- Lisp_Object prop, val;
+ /* Some properties are independent of other properties, but other
+ properties are dependent upon them. These special properties
+ are foreground_color, background_color (affects cursor_color)
+ and font (affects fringe widths); they're recorded starting
+ from the end of PARMS and VALUES to process them first by using
+ reverse iteration. */
- prop = parms[p];
- val = values[p];
if (EQ (prop, Qforeground_color)
|| EQ (prop, Qbackground_color)
|| EQ (prop, Qfont))
{
- register Lisp_Object param_index, old_value;
-
- old_value = get_frame_param (f, prop);
- if (NILP (Fequal (val, old_value)))
- {
- store_frame_param (f, prop, val);
-
- param_index = Fget (prop, Qx_frame_parameter);
- if (NATNUMP (param_index)
- && XFASTINT (param_index) < ARRAYELTS (frame_parms)
- && FRAME_RIF (f)->frame_parm_handlers[XINT (param_index)])
- (*(FRAME_RIF (f)->frame_parm_handlers[XINT (param_index)])) (f, val, old_value);
- }
+ parms[j] = prop;
+ values[j] = val;
+ j--;
+ }
+ else
+ {
+ parms[i] = prop;
+ values[i] = val;
+ i++;
}
}
- /* Now process them in reverse of specified order. */
- while (i-- != 0)
+ /* TAIL and ALIST are not used again below here. */
+ alist = tail = Qnil;
+
+ top = left = Qunbound;
+ icon_left = icon_top = Qunbound;
+
+ /* Reverse order is used to make sure that special
+ properties noticed above are processed first. */
+ for (i = size - 1; i >= 0; i--)
{
Lisp_Object prop, val;
fullscreen = val;
fullscreen_change = true;
}
- else if (EQ (prop, Qforeground_color)
- || EQ (prop, Qbackground_color)
- || EQ (prop, Qfont))
- /* Processed above. */
- continue;
else
{
register Lisp_Object param_index, old_value;
x_new_font (f, font_object, fontset);
store_frame_param (f, Qfont, arg);
#ifdef HAVE_X_WINDOWS
- store_frame_param (f, Qfont_param, font_param);
+ store_frame_param (f, Qfont_parameter, font_param);
#endif
/* Recalculate toolbar height. */
f->n_tool_bar_rows = 0;
if (new_width != old_width)
{
- FRAME_LEFT_FRINGE_WIDTH (f) = new_width;
- FRAME_FRINGE_COLS (f) /* Round up. */
+ f->left_fringe_width = new_width;
+ f->fringe_cols /* Round up. */
= (new_width + FRAME_RIGHT_FRINGE_WIDTH (f) + unit - 1) / unit;
if (FRAME_X_WINDOW (f) != 0)
if (new_width != old_width)
{
- FRAME_RIGHT_FRINGE_WIDTH (f) = new_width;
- FRAME_FRINGE_COLS (f) /* Round up. */
+ f->right_fringe_width = new_width;
+ f->fringe_cols /* Round up. */
= (new_width + FRAME_LEFT_FRINGE_WIDTH (f) + unit - 1) / unit;
if (FRAME_X_WINDOW (f) != 0)
x_set_right_divider_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
int old = FRAME_RIGHT_DIVIDER_WIDTH (f);
-
CHECK_TYPE_RANGED_INTEGER (int, arg);
- FRAME_RIGHT_DIVIDER_WIDTH (f) = XINT (arg);
- if (FRAME_RIGHT_DIVIDER_WIDTH (f) < 0)
- FRAME_RIGHT_DIVIDER_WIDTH (f) = 0;
- if (FRAME_RIGHT_DIVIDER_WIDTH (f) != old)
+ int new = max (0, XINT (arg));
+ if (new != old)
{
+ f->right_divider_width = new;
adjust_frame_size (f, -1, -1, 4, 0, Qright_divider_width);
adjust_frame_glyphs (f);
SET_FRAME_GARBAGED (f);
x_set_bottom_divider_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
int old = FRAME_BOTTOM_DIVIDER_WIDTH (f);
-
CHECK_TYPE_RANGED_INTEGER (int, arg);
- FRAME_BOTTOM_DIVIDER_WIDTH (f) = XINT (arg);
- if (FRAME_BOTTOM_DIVIDER_WIDTH (f) < 0)
- FRAME_BOTTOM_DIVIDER_WIDTH (f) = 0;
- if (FRAME_BOTTOM_DIVIDER_WIDTH (f) != old)
+ int new = max (0, XINT (arg));
+ if (new != old)
{
+ f->bottom_divider_width = new;
adjust_frame_size (f, -1, -1, 4, 0, Qbottom_divider_width);
adjust_frame_glyphs (f);
SET_FRAME_GARBAGED (f);
This function does not make the coordinates positive. */
-#define DEFAULT_ROWS 35
+#define DEFAULT_ROWS 36
#define DEFAULT_COLS 80
long
DEFSYM (Qframep, "framep");
DEFSYM (Qframe_live_p, "frame-live-p");
DEFSYM (Qframe_windows_min_size, "frame-windows-min-size");
- DEFSYM (Qwindow_pixel_to_total, "window--pixel-to-total");
+ DEFSYM (Qwindow__pixel_to_total, "window--pixel-to-total");
DEFSYM (Qexplicit_name, "explicit-name");
DEFSYM (Qheight, "height");
DEFSYM (Qicon, "icon");