# HG changeset patch # User Jim Blandy # Date 713629983 0 # Node ID 4f88a1b78a46c1020556593e066512aa7e0fd3a2 # Parent 52267046b14408893bf34c5bf1d44192180a0932 * xfns.c (x_get_arg): Return Qunbound for an unspecified resource, not nil. That way, we can tell the difference between a false resource and an unspecified resource. (x_default_error): Use DEFLT if x_get_arg returns Qunbound, not Qnil. (x_figure_window_size, x_icon, Fx_create_frame): Deal with Qunbound and Qnil properly. * xfns.c (Fx_create_frame): Pass the correct number of arguments to x_set_font. * xfns.c [not HAVE_X11] (Fx_create_frame): Delete section that's only included if we *do* have X11. Blind patching. * xfns.c (x_icon): Rewritten to call x_wm_set_icon_position and x_wm_set_window_state instead of calling XSetWMHints directly. (x_wm_set_window_state, x_wm_set_icon_pixmap, x_wm_set_icon_position): Use x_wm_hints. (x_term_init): Set the `input' field of x_wm_hints, and its flag. * xfns.c (x_default_parameter): Don't call store_frame_param here; it's already taken care of by x_set_frame_parameters. * xfns.c (Fx_create_frame): Check for the `icon-type', `auto-raise', and `auto-lower' parameters. Have `icon-type' default to t, indicating that we want the nifty gnu in our icons. (Qauto_lower): New symbol. * xfns.c (x_set_icon_type): UNBLOCK_INPUT before reporting the error, not after. error doesn't return, sklitch-brain. * xfns.c (x_set_frame_parameters): Properly recognize changes to the height of the frame. Recognize changes of the frame's position. * xfns.c (x_set_frame_parameters): Iterate over ALIST while the current element is cons, not while it's non-nil. (syms_of_xfns): Call init_x_parm_symbols after interning all the other atoms; init_x_parm_symbols expects Qx_frame_parameter to be initialized. * xfns.c (Qbackground_color, Qborder_color, Qborder_width, Qcursor_color, Qfont, Qforeground_color, Qgeometry, Qhorizontal_scroll_bar, Qicon_left, Qicon_top, Qiconic_startup, Qinternal_border_width, Qleft, Qmouse_color, Qparent_id, Qsuppress_icon, Qsuppress_initial_map, Qtop, Qundefined_color, Qvertical_scroll_bar, Qwindow_id, Qx_frame_parameter): New symbols, with lisp code to rebuild syms_of_xfns. (syms_of_xfns): Initialize and staticpro them. (Qheight, Qminibuffer, Qname, Qnone, Qonly, Qwidth, Qunsplittable): Add extern declaration for these. (x_init_parm_symbols): Don't initialize Qx_frame_parameter here; it's done in syms_of_xfns. (x_default_parameter): Change the argument char *PROPNAME into a Lisp_Object PROP; let the caller take care of interning the atom. (Fx_geometry, x_figure_window_size, x_icon, Fx_create_frame): Use the new Q... variables, instead of interning things. * xfns.c (x_set_frame_param): Replaced by x_set_frame_parameters. (x_set_frame_parameters): Process the alist of parameters here. Notice `width', `height', `top', and `left' parameters. Hold off changing the frame size and position until the end, so we can do both parameters at once when they are both specified. (x_default_parameter): Call x_set_frame_parameters, not x_set_frame_param. * xfns.c (x_figure_window_size): Indicate that this function returns an int, rather than just leaving it unstated. * xfns.c (Fx_create_frame): Call change_frame_size with a DELAY of 0. diff -r 52267046b144 -r 4f88a1b78a46 src/xfns.c --- a/src/xfns.c Wed Aug 12 14:30:09 1992 +0000 +++ b/src/xfns.c Wed Aug 12 14:33:03 1992 +0000 @@ -38,8 +38,6 @@ #ifdef HAVE_X_WINDOWS extern void abort (); -void x_set_frame_param (); - #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -193,9 +191,71 @@ /* The last 23 bits of the timestamp of the last mouse button event. */ Time mouse_timestamp; +/* Evaluate this expression to rebuild the section of syms_of_xfns + that initializes and staticpros the symbols declared below. Note + that Emacs 18 has a bug that keeps C-x C-e from being able to + evaluate this expression. + +(progn + ;; Accumulate a list of the symbols we want to initialize from the + ;; declarations at the top of the file. + (goto-char (point-min)) + (search-forward "/\*&&& symbols declared here &&&*\/\n") + (let (symbol-list) + (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)") + (setq symbol-list + (cons (buffer-substring (match-beginning 1) (match-end 1)) + symbol-list)) + (forward-line 1)) + (setq symbol-list (nreverse symbol-list)) + ;; Delete the section of syms_of_... where we initialize the symbols. + (search-forward "\n /\*&&& init symbols here &&&*\/\n") + (let ((start (point))) + (while (looking-at "^ Q") + (forward-line 2)) + (kill-region start (point))) + ;; Write a new symbol initialization section. + (while symbol-list + (insert (format " %s = intern (\"" (car symbol-list))) + (let ((start (point))) + (insert (substring (car symbol-list) 1)) + (subst-char-in-region start (point) ?_ ?-)) + (insert (format "\");\n staticpro (&%s);\n" (car symbol-list))) + (setq symbol-list (cdr symbol-list))))) + + */ + +/*&&& symbols declared here &&&*/ +Lisp_Object Qauto_raise; +Lisp_Object Qauto_lower; +Lisp_Object Qbackground_color; +Lisp_Object Qborder_color; +Lisp_Object Qborder_width; +Lisp_Object Qcursor_color; +Lisp_Object Qfont; +Lisp_Object Qforeground_color; +Lisp_Object Qgeometry; +Lisp_Object Qhorizontal_scroll_bar; +Lisp_Object Qicon_left; +Lisp_Object Qicon_top; +Lisp_Object Qicon_type; +Lisp_Object Qiconic_startup; +Lisp_Object Qinternal_border_width; +Lisp_Object Qleft; +Lisp_Object Qmouse_color; +Lisp_Object Qparent_id; +Lisp_Object Qsuppress_icon; +Lisp_Object Qsuppress_initial_map; +Lisp_Object Qtop; Lisp_Object Qundefined_color; +Lisp_Object Qvertical_scroll_bar; +Lisp_Object Qwindow_id; Lisp_Object Qx_frame_parameter; +/* The below are defined in frame.c. */ +extern Lisp_Object Qheight, Qminibuffer, Qname, Qnone, Qonly, Qwidth; +extern Lisp_Object Qunsplittable; + extern Lisp_Object Vwindow_system_version; /* Mouse map for clicks in windows. */ @@ -374,13 +434,80 @@ { int i; - Qx_frame_parameter = intern ("x-frame-parameter"); - for (i = 0; i < sizeof (x_frame_parms)/sizeof (x_frame_parms[0]); i++) Fput (intern (x_frame_parms[i].name), Qx_frame_parameter, make_number (i)); } +#if 1 +/* Change the parameters of FRAME as specified by ALIST. + If a parameter is not specially recognized, do nothing; + otherwise call the `x_set_...' function for that parameter. */ +void +x_set_frame_parameters (f, alist) + FRAME_PTR f; + Lisp_Object alist; +{ + Lisp_Object tail; + + /* 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. */ + Lisp_Object width, height; + + /* Same here. */ + Lisp_Object left, top; + + XSET (width, Lisp_Int, FRAME_WIDTH (f)); + XSET (height, Lisp_Int, FRAME_HEIGHT (f)); + + XSET (top, Lisp_Int, f->display.x->top_pos); + XSET (left, Lisp_Int, f->display.x->left_pos); + + for (tail = alist; CONSP (tail); tail = Fcdr (tail)) + { + Lisp_Object elt, prop, val; + + elt = Fcar (tail); + prop = Fcar (elt); + val = Fcdr (elt); + + if (EQ (prop, Qwidth)) + width = val; + else if (EQ (prop, Qheight)) + height = val; + else if (EQ (prop, Qtop)) + top = val; + else if (EQ (prop, Qleft)) + left = val; + else + { + register Lisp_Object tem; + tem = Fget (prop, Qx_frame_parameter); + if (XTYPE (tem) == Lisp_Int + && XINT (tem) >= 0 + && XINT (tem) < sizeof (x_frame_parms)/sizeof (x_frame_parms[0])) + (*x_frame_parms[XINT (tem)].setter)(f, val, + get_frame_param (f, prop)); + store_frame_param (f, prop, val); + } + } + + /* Don't call these unless they've changed; the window may not actually + exist yet. */ + { + Lisp_Object frame; + + XSET (frame, Lisp_Frame, f); + if (XINT (width) != FRAME_WIDTH (f) + || XINT (height) != FRAME_HEIGHT (f)) + Fset_frame_size (frame, width, height); + if (XINT (left) != f->display.x->left_pos + || XINT (top) != f->display.x->top_pos) + Fset_frame_position (frame, left, top); + } +} +#else /* Report to X that a frame parameter of frame F is being set or changed. PARAM is the symbol that says which parameter. VAL is the new value. @@ -402,7 +529,7 @@ && XINT (tem) < sizeof (x_frame_parms)/sizeof (x_frame_parms[0])) (*x_frame_parms[XINT (tem)].setter)(f, val, oldval); } - +#endif /* Insert a description of internally-recorded parameters of frame X into the parameter alist *ALISTPTR that is to be given to the user. Only parameters that are specific to the X window system @@ -415,14 +542,14 @@ { char buf[16]; - store_in_alist (alistptr, "left", make_number (f->display.x->left_pos)); - store_in_alist (alistptr, "top", make_number (f->display.x->top_pos)); - store_in_alist (alistptr, "border-width", + store_in_alist (alistptr, Qleft, make_number (f->display.x->left_pos)); + store_in_alist (alistptr, Qtop, make_number (f->display.x->top_pos)); + store_in_alist (alistptr, Qborder_width, make_number (f->display.x->border_width)); - store_in_alist (alistptr, "internal-border-width", + store_in_alist (alistptr, Qinternal_border_width, make_number (f->display.x->internal_border_width)); sprintf (buf, "%d", f->display.x->window_desc); - store_in_alist (alistptr, "window-id", + store_in_alist (alistptr, Qwindow_id, build_string (buf)); } @@ -838,7 +965,8 @@ else fore_pixel = f->display.x->background_pixel; f->display.x->cursor_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT); - /* No invisible cursors */ + + /* Make sure that the cursor color differs from the background color. */ if (f->display.x->cursor_pixel == f->display.x->background_pixel) { f->display.x->cursor_pixel == f->display.x->mouse_pixel; @@ -959,8 +1087,8 @@ if (result) { + UNBLOCK_INPUT; error ("No icon window available."); - UNBLOCK_INPUT; } /* If the window was unmapped (and its icon was mapped), @@ -1390,7 +1518,7 @@ #else /* X10 */ DEFUN ("x-get-default", Fx_get_default, Sx_get_default, 1, 1, 0, - "Get X default ATTRIBUTE from the system, or nil if no default.\n\ + "Get X default ATTRIBUTE from the system, or nil if no default.\n\ Value is a string (when not nil) and ATTRIBUTE is also a string.\n\ The defaults are specified in the file `~/.Xdefaults'.") (arg) @@ -1431,7 +1559,9 @@ Convert the resource to the type specified by desired_type. - If no default is specified, return nil. */ + If no default is specified, return Qunbound. If you call + x_get_arg, make sure you deal with Qunbound in a reasonable way, + and don't let it get stored in any lisp-visible variables! */ static Lisp_Object x_get_arg (alist, param, attribute, type) @@ -1444,32 +1574,38 @@ tem = Fassq (param, alist); if (EQ (tem, Qnil)) tem = Fassq (param, Vdefault_frame_alist); - if (EQ (tem, Qnil) && attribute) + if (EQ (tem, Qnil)) { - tem = Fx_get_resource (build_string (attribute), Qnil, Qnil); - - if (NILP (tem)) - return Qnil; - - switch (type) + + if (attribute) { - case number: - return make_number (atoi (XSTRING (tem)->data)); - - case boolean: - tem = Fdowncase (tem); - if (!strcmp (XSTRING (tem)->data, "on") - || !strcmp (XSTRING (tem)->data, "true")) - return Qt; - else - return Qnil; - - case string: - return tem; - - default: - abort (); + tem = Fx_get_resource (build_string (attribute), Qnil, Qnil); + + if (NILP (tem)) + return Qunbound; + + switch (type) + { + case number: + return make_number (atoi (XSTRING (tem)->data)); + + case boolean: + tem = Fdowncase (tem); + if (!strcmp (XSTRING (tem)->data, "on") + || !strcmp (XSTRING (tem)->data, "true")) + return Qt; + else + return Qnil; + + case string: + return tem; + + default: + abort (); + } } + else + return Qunbound; } return Fcdr (tem); } @@ -1481,22 +1617,20 @@ If that is not found either, use the value DEFLT. */ static Lisp_Object -x_default_parameter (f, alist, propname, deflt, xprop, type) +x_default_parameter (f, alist, prop, deflt, xprop, type) struct frame *f; Lisp_Object alist; - char *propname; + Lisp_Object prop; Lisp_Object deflt; char *xprop; enum resource_types type; { - Lisp_Object propsym = intern (propname); Lisp_Object tem; - tem = x_get_arg (alist, propsym, xprop, type); - if (EQ (tem, Qnil)) + tem = x_get_arg (alist, prop, xprop, type); + if (EQ (tem, Qunbound)) tem = deflt; - store_frame_param (f, propsym, tem); - x_set_frame_param (f, propsym, tem, Qnil); + x_set_frame_parameters (f, Fcons (Fcons (prop, tem), Qnil)); return tem; } @@ -1523,14 +1657,14 @@ x = -1; if (y == 0 && (geometry & YNegative)) y = -1; - values[0] = Fcons (intern ("left"), make_number (x)); - values[1] = Fcons (intern ("top"), make_number (y)); + values[0] = Fcons (Qleft, make_number (x)); + values[1] = Fcons (Qtop, make_number (y)); return Flist (2, values); break; case (WidthValue | HeightValue): - values[0] = Fcons (intern ("width"), make_number (width)); - values[1] = Fcons (intern ("height"), make_number (height)); + values[0] = Fcons (Qwidth, make_number (width)); + values[1] = Fcons (Qheight, make_number (height)); return Flist (2, values); break; @@ -1539,10 +1673,10 @@ x = -1; if (y == 0 && (geometry & YNegative)) y = -1; - values[0] = Fcons (intern ("width"), make_number (width)); - values[1] = Fcons (intern ("height"), make_number (height)); - values[2] = Fcons (intern ("left"), make_number (x)); - values[3] = Fcons (intern ("top"), make_number (y)); + values[0] = Fcons (Qwidth, make_number (width)); + values[1] = Fcons (Qheight, make_number (height)); + values[2] = Fcons (Qleft, make_number (x)); + values[3] = Fcons (Qtop, make_number (y)); return Flist (4, values); break; @@ -1561,7 +1695,7 @@ #define DEFAULT_ROWS 40 #define DEFAULT_COLS 80 -static +static int x_figure_window_size (f, parms) struct frame *f; Lisp_Object parms; @@ -1579,9 +1713,9 @@ f->display.x->top_pos = 1; f->display.x->left_pos = 1; - tem0 = x_get_arg (parms, intern ("height"), 0, 0); - tem1 = x_get_arg (parms, intern ("width"), 0, 0); - if (! EQ (tem0, Qnil) && ! EQ (tem1, Qnil)) + tem0 = x_get_arg (parms, Qheight, 0, 0); + tem1 = x_get_arg (parms, Qwidth, 0, 0); + if (! EQ (tem0, Qunbound) && ! EQ (tem1, Qunbound)) { CHECK_NUMBER (tem0, 0); CHECK_NUMBER (tem1, 0); @@ -1589,7 +1723,7 @@ f->width = XINT (tem1); window_prompting |= USSize; } - else if (! EQ (tem0, Qnil) || ! EQ (tem1, Qnil)) + else if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound)) error ("Must specify *both* height and width"); f->display.x->pixel_width = (FONT_WIDTH (f->display.x->font) * f->width @@ -1597,9 +1731,9 @@ f->display.x->pixel_height = (FONT_HEIGHT (f->display.x->font) * f->height + 2 * f->display.x->internal_border_width); - tem0 = x_get_arg (parms, intern ("top"), 0, 0); - tem1 = x_get_arg (parms, intern ("left"), 0, 0); - if (! EQ (tem0, Qnil) && ! EQ (tem1, Qnil)) + tem0 = x_get_arg (parms, Qtop, 0, 0); + tem1 = x_get_arg (parms, Qleft, 0, 0); + if (! EQ (tem0, Qunbound) && ! EQ (tem1, Qunbound)) { CHECK_NUMBER (tem0, 0); CHECK_NUMBER (tem1, 0); @@ -1608,7 +1742,7 @@ x_calc_absolute_position (f); window_prompting |= USPosition; } - else if (! EQ (tem0, Qnil) || ! EQ (tem1, Qnil)) + else if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound)) error ("Must specify *both* top and left corners"); switch (window_prompting) @@ -1703,39 +1837,34 @@ struct frame *f; Lisp_Object parms; { - register Lisp_Object tem0,tem1; - XWMHints hints; + Lisp_Object icon_x, icon_y; /* Set the position of the icon. Note that twm groups all icons in an icon window. */ - tem0 = x_get_arg (parms, intern ("icon-left"), 0, 0); - tem1 = x_get_arg (parms, intern ("icon-top"), 0, 0); - if (!EQ (tem0, Qnil) && !EQ (tem1, Qnil)) + icon_x = x_get_arg (parms, Qicon_left, 0, 0); + icon_y = x_get_arg (parms, Qicon_top, 0, 0); + if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound)) { - CHECK_NUMBER (tem0, 0); - CHECK_NUMBER (tem1, 0); - hints.icon_x = XINT (tem0); - hints.icon_x = XINT (tem0); + CHECK_NUMBER (icon_x, 0); + CHECK_NUMBER (icon_y, 0); } - else if (!EQ (tem0, Qnil) || !EQ (tem1, Qnil)) + else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound)) error ("Both left and top icon corners of icon must be specified"); else { - hints.icon_x = f->display.x->left_pos; - hints.icon_y = f->display.x->top_pos; + XSET (icon_x, Lisp_Int, f->display.x->left_pos); + XSET (icon_y, Lisp_Int, f->display.x->top_pos); } + BLOCK_INPUT; + + x_wm_set_icon_position (f, XINT (icon_x), XINT (icon_y)); + /* Start up iconic or window? */ - tem0 = x_get_arg (parms, intern ("iconic-startup"), 0, 0); - if (!EQ (tem0, Qnil)) - hints.initial_state = IconicState; - else - hints.initial_state = NormalState; /* the default, actually. */ - hints.input = False; - - BLOCK_INPUT; - hints.flags = StateHint | IconPositionHint | InputHint; - XSetWMHints (x_current_display, f->display.x->window_desc, &hints); + x_wm_set_window_state (f, (EQ (x_get_arg (parms, Qiconic_startup, 0, 0), Qt) + ? IconicState + : NormalState)); + UNBLOCK_INPUT; } @@ -1849,24 +1978,24 @@ if (x_current_display == 0) error ("X windows are not in use or not initialized"); - name = x_get_arg (parms, intern ("name"), "Title", string); - if (NILP (name)) + name = x_get_arg (parms, Qname, "Title", string); + if (EQ (name, Qunbound) || NILP (name)) name = build_string (x_id_name); if (XTYPE (name) != Lisp_String) error ("x-create-frame: name parameter must be a string"); - tem = x_get_arg (parms, intern ("minibuffer"), 0, 0); - if (EQ (tem, intern ("none"))) + tem = x_get_arg (parms, Qminibuffer, 0, 0); + if (EQ (tem, Qnone) || NILP (tem)) f = make_frame_without_minibuffer (Qnil); - else if (EQ (tem, intern ("only"))) + else if (EQ (tem, Qonly)) { f = make_minibuffer_frame (); minibuffer_only = 1; } - else if (EQ (tem, Qnil) || EQ (tem, Qt)) + else if (XTYPE (tem) == Lisp_Window) + f = make_frame_without_minibuffer (tem); + else f = make_frame (1); - else - f = make_frame_without_minibuffer (tem); /* Set the name; the functions to which we pass f expect the name to be set. */ @@ -1882,28 +2011,26 @@ /* Extract the window parameters from the supplied values that are needed to determine window geometry. */ - x_default_parameter (f, parms, "font", + x_default_parameter (f, parms, Qfont, build_string ("9x15"), "font", string); - x_default_parameter (f, parms, "background-color", + x_default_parameter (f, parms, Qbackground_color, build_string ("white"), "background", string); - x_default_parameter (f, parms, "border-width", + x_default_parameter (f, parms, Qborder_width, make_number (2), "BorderWidth", number); /* This defaults to 2 in order to match XTerms. */ - x_default_parameter (f, parms, "internal-border-width", + x_default_parameter (f, parms, Qinternal_border_width, make_number (2), "InternalBorderWidth", number); /* Also do the stuff which must be set before the window exists. */ - x_default_parameter (f, parms, "foreground-color", + x_default_parameter (f, parms, Qforeground_color, build_string ("black"), "foreground", string); - x_default_parameter (f, parms, "mouse-color", + x_default_parameter (f, parms, Qmouse_color, build_string ("black"), "mouse", string); - x_default_parameter (f, parms, "cursor-color", + x_default_parameter (f, parms, Qcursor_color, build_string ("black"), "cursor", string); - x_default_parameter (f, parms, "border-color", + x_default_parameter (f, parms, Qborder_color, build_string ("black"), "border", string); - /* Need to do icon type, auto-raise, auto-lower. */ - f->display.x->parent_desc = ROOT_WINDOW; window_prompting = x_figure_window_size (f, parms); @@ -1911,28 +2038,35 @@ x_icon (f, parms); x_make_gc (f); + /* We need to do this after creating the X window, so that the + icon-creation functions can say whose icon they're describing. */ + x_default_parameter (f, parms, Qicon_type, Qt, "IconType", boolean); + + x_default_parameter (f, parms, Qauto_raise, Qnil, "AutoRaise", boolean); + x_default_parameter (f, parms, Qauto_lower, Qnil, "AutoLower", boolean); + /* Dimensions, especially f->height, must be done via change_frame_size. Change will not be effected unless different from the current f->height. */ width = f->width; height = f->height; f->height = f->width = 0; - change_frame_size (f, height, width, 1); + change_frame_size (f, height, width, 1, 0); BLOCK_INPUT; x_wm_set_size_hint (f, window_prompting); UNBLOCK_INPUT; - tem = x_get_arg (parms, intern ("unsplittable"), 0, 0); + tem = x_get_arg (parms, Qunsplittable, 0, 0); f->no_split = minibuffer_only || EQ (tem, Qt); /* Now handle the rest of the parameters. */ - x_default_parameter (f, parms, "horizontal-scroll-bar", + x_default_parameter (f, parms, Qhorizontal_scroll_bar, Qnil, "?HScrollBar", string); - x_default_parameter (f, parms, "vertical-scroll-bar", + x_default_parameter (f, parms, Qvertical_scroll_bar, Qnil, "?VScrollBar", string); /* Make the window appear on the frame and enable display. */ - if (!EQ (x_get_arg (parms, intern ("suppress-initial-map"), 0, 0), Qt)) + if (!EQ (x_get_arg (parms, Qsuppress_initial_map, 0, 0), Qt)) x_make_frame_visible (f); return frame; @@ -1951,20 +2085,22 @@ if (x_current_display == 0) error ("X windows are not in use or not initialized"); - name = Fassq (intern ("name"), parms); - - tem = x_get_arg (parms, intern ("minibuffer"), 0, 0); - if (EQ (tem, intern ("none"))) + name = Fassq (Qname, parms); + + tem = x_get_arg (parms, Qminibuffer, 0, string); + if (XTYPE (tem) == Lisp_String) + tem = Fintern (tem, Qnil); + if (EQ (tem, Qnone)) f = make_frame_without_minibuffer (Qnil); - else if (EQ (tem, intern ("only"))) + else if (EQ (tem, Qonly)) { f = make_minibuffer_frame (); minibuffer_only = 1; } - else if (! EQ (tem, Qnil)) + else if (EQ (tem, Qnil) || EQ (tem, Qunbound)) + f = make_frame (1); + else f = make_frame_without_minibuffer (tem); - else - f = make_frame (1); parent = ROOT_WINDOW; @@ -1990,42 +2126,42 @@ /* Extract some window parameters from the supplied values. These are the parameters that affect window geometry. */ - tem = x_get_arg (parms, intern ("font"), "BodyFont", string); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qfont, "BodyFont", string); + if (EQ (tem, Qunbound)) tem = build_string ("9x15"); - x_set_font (f, tem); - x_default_parameter (f, parms, "border-color", + x_set_font (f, tem, Qnil); + x_default_parameter (f, parms, Qborder_color, build_string ("black"), "Border", string); - x_default_parameter (f, parms, "background-color", + x_default_parameter (f, parms, Qbackground_color, build_string ("white"), "Background", string); - x_default_parameter (f, parms, "foreground-color", + x_default_parameter (f, parms, Qforeground_color, build_string ("black"), "Foreground", string); - x_default_parameter (f, parms, "mouse-color", + x_default_parameter (f, parms, Qmouse_color, build_string ("black"), "Mouse", string); - x_default_parameter (f, parms, "cursor-color", + x_default_parameter (f, parms, Qcursor_color, build_string ("black"), "Cursor", string); - x_default_parameter (f, parms, "border-width", + x_default_parameter (f, parms, Qborder_width, make_number (2), "BorderWidth", number); - x_default_parameter (f, parms, "internal-border-width", + x_default_parameter (f, parms, Qinternal_border_width, make_number (4), "InternalBorderWidth", number); - x_default_parameter (f, parms, "auto-raise", + x_default_parameter (f, parms, Qauto_raise, Qnil, "AutoRaise", boolean); - hscroll = x_get_arg (parms, intern ("horizontal-scroll-bar"), 0, 0); - vscroll = x_get_arg (parms, intern ("vertical-scroll-bar"), 0, 0); + hscroll = EQ (x_get_arg (parms, Qhorizontal_scroll_bar, 0, boolean), Qt); + vscroll = EQ (x_get_arg (parms, Qvertical_scroll_bar, 0, boolean), Qt); if (f->display.x->internal_border_width < 0) f->display.x->internal_border_width = 0; - tem = x_get_arg (parms, intern ("window-id"), 0, 0); - if (!EQ (tem, Qnil)) + tem = x_get_arg (parms, Qwindow_id, 0, number); + if (!EQ (tem, Qunbound)) { WINDOWINFO_TYPE wininfo; int nchildren; Window *children, root; - CHECK_STRING (tem, 0); - f->display.x->window_desc = (Window) atoi (XSTRING (tem)->data); + CHECK_NUMBER (tem, 0); + f->display.x->window_desc = (Window) XINT (tem); BLOCK_INPUT; XGetWindowInfo (f->display.x->window_desc, &wininfo); @@ -2045,29 +2181,29 @@ } else { - tem = x_get_arg (parms, intern ("parent-id"), 0, 0); - if (!EQ (tem, Qnil)) + tem = x_get_arg (parms, Qparent_id, 0, 0); + if (!EQ (tem, Qunbound)) { - CHECK_STRING (tem, 0); - parent = (Window) atoi (XSTRING (tem)->data); + CHECK_NUMBER (tem, 0); + parent = (Window) XINT (tem); } f->display.x->parent_desc = parent; - tem = x_get_arg (parms, intern ("height"), 0, 0); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qheight, 0, 0); + if (EQ (tem, Qunbound)) { - tem = x_get_arg (parms, intern ("width"), 0, 0); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qwidth, 0, 0); + if (EQ (tem, Qunbound)) { - tem = x_get_arg (parms, intern ("top"), 0, 0); - if (EQ (tem, Qnil)) - tem = x_get_arg (parms, intern ("left"), 0, 0); + tem = x_get_arg (parms, Qtop, 0, 0); + if (EQ (tem, Qunbound)) + tem = x_get_arg (parms, Qleft, 0, 0); } } - /* Now TEM is nil if no edge or size was specified. + /* Now TEM is Qunbound if no edge or size was specified. In that case, we must do rubber-banding. */ - if (EQ (tem, Qnil)) + if (EQ (tem, Qunbound)) { - tem = x_get_arg (parms, intern ("geometry"), 0, 0); + tem = x_get_arg (parms, Qgeometry, 0, 0); x_rubber_band (f, &f->display.x->left_pos, &f->display.x->top_pos, &width, &height, @@ -2080,26 +2216,26 @@ { /* Here if at least one edge or size was specified. Demand that they all were specified, and use them. */ - tem = x_get_arg (parms, intern ("height"), 0, 0); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qheight, 0, 0); + if (EQ (tem, Qunbound)) error ("Height not specified"); CHECK_NUMBER (tem, 0); height = XINT (tem); - tem = x_get_arg (parms, intern ("width"), 0, 0); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qwidth, 0, 0); + if (EQ (tem, Qunbound)) error ("Width not specified"); CHECK_NUMBER (tem, 0); width = XINT (tem); - tem = x_get_arg (parms, intern ("top"), 0, 0); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qtop, 0, 0); + if (EQ (tem, Qunbound)) error ("Top position not specified"); CHECK_NUMBER (tem, 0); f->display.x->left_pos = XINT (tem); - tem = x_get_arg (parms, intern ("left"), 0, 0); - if (EQ (tem, Qnil)) + tem = x_get_arg (parms, Qleft, 0, 0); + if (EQ (tem, Qunbound)) error ("Left position not specified"); CHECK_NUMBER (tem, 0); f->display.x->top_pos = XINT (tem); @@ -2127,38 +2263,26 @@ /* Install the now determined height and width in the windows and in phys_lines and desired_lines. */ - /* ??? jla version had 1 here instead of 0. */ - change_frame_size (f, height, width, 1); + change_frame_size (f, height, width, 1, 0); XSelectInput (f->display.x->window_desc, KeyPressed | ExposeWindow | ButtonPressed | ButtonReleased | ExposeRegion | ExposeCopy | EnterWindow | LeaveWindow | UnmapWindow ); x_set_resize_hint (f); /* Tell the server the window's default name. */ -#ifdef HAVE_X11 - { - XTextProperty prop; - prop.value = XSTRING (f->name)->data; - prop.encoding = XA_STRING; - prop.format = 8; - prop.nitems = XSTRING (f->name)->size; - XSetWMName (XDISPLAY f->display.x->window_desc, &prop); - } -#else XStoreName (XDISPLAY f->display.x->window_desc, XSTRING (f->name)->data); -#endif /* Now override the defaults with all the rest of the specified parms. */ - tem = x_get_arg (parms, intern ("unsplittable"), 0, 0); + tem = x_get_arg (parms, Qunsplittable, 0, 0); f->no_split = minibuffer_only || EQ (tem, Qt); /* Do not create an icon window if the caller says not to */ - if (!EQ (x_get_arg (parms, intern ("suppress-icon"), 0, 0), Qt) + if (!EQ (x_get_arg (parms, Qsuppress_icon, 0, 0), Qt) || f->display.x->parent_desc != ROOT_WINDOW) { x_text_icon (f, iconidentity); - x_default_parameter (f, parms, "icon-type", Qnil, + x_default_parameter (f, parms, Qicon_type, Qnil, "BitmapIcon", boolean); } @@ -2184,7 +2308,7 @@ /* Make the window appear on the frame and enable display. */ - if (!EQ (x_get_arg (parms, intern ("suppress-initial-map"), 0, 0), Qt)) + if (!EQ (x_get_arg (parms, Qsuppress_initial_map, 0, 0), Qt)) x_make_window_visible (f); FRAME_GARBAGED (f); @@ -2199,7 +2323,7 @@ { CHECK_LIVE_FRAME (frame, 0); - if (FRAME_IS_X (XFRAME (frame))) + if (FRAME_X_P (XFRAME (frame))) { BLOCK_INPUT; x_focus_on_frame (XFRAME (frame)); @@ -2711,7 +2835,7 @@ int chars_in_buffer, buffer_size; struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); - if (! FRAME_IS_X (f)) + if (! FRAME_X_P (f)) return; if (f->display.x->v_scrollbar != 0) @@ -3443,7 +3567,7 @@ obj = read_char (-1); if ((XTYPE (obj) != Lisp_Cons) || (! EQ (Fcar (Fcdr (Fcdr (obj))), - intern ("vertical-scroll-bar"))) + Qvertical_scroll_bar)) || x_mouse_grabbed) { BLOCK_INPUT; @@ -3927,7 +4051,7 @@ int mask; CHECK_STRING (string, 1); - if (! FRAME_IS_X (selected_frame)) + if (! FRAME_X_P (selected_frame)) error ("Selected frame does not understand X protocol."); BLOCK_INPUT; @@ -4318,17 +4442,71 @@ syms_of_xfns () { - init_x_parm_symbols (); - /* This is zero if not using X windows. */ x_current_display = 0; + /* The section below is built by the lisp expression at the top of the file, + just above where these variables are declared. */ + /*&&& init symbols here &&&*/ + Qauto_raise = intern ("auto-raise"); + staticpro (&Qauto_raise); + Qauto_lower = intern ("auto-lower"); + staticpro (&Qauto_lower); + Qbackground_color = intern ("background-color"); + staticpro (&Qbackground_color); + Qborder_color = intern ("border-color"); + staticpro (&Qborder_color); + Qborder_width = intern ("border-width"); + staticpro (&Qborder_width); + Qcursor_color = intern ("cursor-color"); + staticpro (&Qcursor_color); + Qfont = intern ("font"); + staticpro (&Qfont); + Qforeground_color = intern ("foreground-color"); + staticpro (&Qforeground_color); + Qgeometry = intern ("geometry"); + staticpro (&Qgeometry); + Qhorizontal_scroll_bar = intern ("horizontal-scroll-bar"); + staticpro (&Qhorizontal_scroll_bar); + Qicon_left = intern ("icon-left"); + staticpro (&Qicon_left); + Qicon_top = intern ("icon-top"); + staticpro (&Qicon_top); + Qicon_type = intern ("icon-type"); + staticpro (&Qicon_type); + Qiconic_startup = intern ("iconic-startup"); + staticpro (&Qiconic_startup); + Qinternal_border_width = intern ("internal-border-width"); + staticpro (&Qinternal_border_width); + Qleft = intern ("left"); + staticpro (&Qleft); + Qmouse_color = intern ("mouse-color"); + staticpro (&Qmouse_color); + Qparent_id = intern ("parent-id"); + staticpro (&Qparent_id); + Qsuppress_icon = intern ("suppress-icon"); + staticpro (&Qsuppress_icon); + Qsuppress_initial_map = intern ("suppress-initial-map"); + staticpro (&Qsuppress_initial_map); + Qtop = intern ("top"); + staticpro (&Qtop); Qundefined_color = intern ("undefined-color"); + staticpro (&Qundefined_color); + Qvertical_scroll_bar = intern ("vertical-scroll-bar"); + staticpro (&Qvertical_scroll_bar); + Qwindow_id = intern ("window-id"); + staticpro (&Qwindow_id); + Qx_frame_parameter = intern ("x-frame-parameter"); + staticpro (&Qx_frame_parameter); + /* This is the end of symbol initialization. */ + Fput (Qundefined_color, Qerror_conditions, Fcons (Qundefined_color, Fcons (Qerror, Qnil))); Fput (Qundefined_color, Qerror_message, build_string ("Undefined color")); + init_x_parm_symbols (); + DEFVAR_INT ("mouse-x-position", &x_mouse_x, "The X coordinate of the mouse position, in characters."); x_mouse_x = Qnil;