X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/7864a3f729e9bd78f17deefec428a6db41742c82..4458c2551b1a0bd89e5c299b009516e17f255c28:/src/frame.c diff --git a/src/frame.c b/src/frame.c index b299092905..7f97535acb 100644 --- a/src/frame.c +++ b/src/frame.c @@ -1,6 +1,6 @@ /* Generic frame functions. -Copyright (C) 1993-1995, 1997, 1999-2012 Free Software Foundation, Inc. +Copyright (C) 1993-1995, 1997, 1999-2013 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,22 +19,21 @@ along with GNU Emacs. If not, see . */ #include +#define FRAME_INLINE EXTERN_INLINE + #include -#include #include #include -#include + +#include + #include "lisp.h" #include "character.h" -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif -#ifdef WINDOWSNT -#include "w32term.h" -#endif -#ifdef HAVE_NS -#include "nsterm.h" -#endif + +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ + #include "buffer.h" /* These help us bind and responding to switch-frame events. */ #include "commands.h" @@ -54,11 +53,6 @@ along with GNU Emacs. If not, see . */ #include "dosfns.h" #endif - -#ifdef HAVE_WINDOW_SYSTEM - -#endif - #ifdef HAVE_NS Lisp_Object Qns_parse_geometry; #endif @@ -125,6 +119,18 @@ static Lisp_Object Qdelete_frame_functions; static void x_report_frame_params (struct frame *, Lisp_Object *); #endif +/* These setters are used only in this file, so they can be private. */ +static void +fset_buffer_predicate (struct frame *f, Lisp_Object val) +{ + f->buffer_predicate = val; +} +static void +fset_minibuffer_window (struct frame *f, Lisp_Object val) +{ + f->minibuffer_window = val; +} + static void set_menu_bar_lines_1 (Lisp_Object window, int n) @@ -132,8 +138,8 @@ set_menu_bar_lines_1 (Lisp_Object window, int n) struct window *w = XWINDOW (window); w->last_modified = 0; - WSET (w, top_line, make_number (XFASTINT (w->top_line) + n)); - WSET (w, total_lines, make_number (XFASTINT (w->total_lines) - n)); + wset_top_line (w, make_number (XFASTINT (w->top_line) + n)); + wset_total_lines (w, make_number (XFASTINT (w->total_lines) - n)); /* Handle just the top child in a vertical split. */ if (!NILP (w->vchild)) @@ -207,7 +213,7 @@ See also `frame-live-p'. */) case output_ns: return Qns; default: - abort (); + emacs_abort (); } } @@ -269,7 +275,7 @@ make_frame (int mini_p) /* Initialize Lisp data. Note that allocate_frame initializes all Lisp data to nil, so do it only for slots which should not be nil. */ - FSET (f, tool_bar_position, Qtop); + fset_tool_bar_position (f, Qtop); /* Initialize non-Lisp data. Note that allocate_frame zeroes out all non-Lisp data, so do it only for slots which should not be zero. @@ -289,20 +295,20 @@ make_frame (int mini_p) if (mini_p) { mini_window = make_window (); - WSET (XWINDOW (root_window), next, mini_window); - WSET (XWINDOW (mini_window), prev, root_window); + wset_next (XWINDOW (root_window), mini_window); + wset_prev (XWINDOW (mini_window), root_window); XWINDOW (mini_window)->mini = 1; - WSET (XWINDOW (mini_window), frame, frame); - FSET (f, minibuffer_window, mini_window); + wset_frame (XWINDOW (mini_window), frame); + fset_minibuffer_window (f, mini_window); } else { mini_window = Qnil; - WSET (XWINDOW (root_window), next, Qnil); - FSET (f, minibuffer_window, Qnil); + wset_next (XWINDOW (root_window), Qnil); + fset_minibuffer_window (f, Qnil); } - WSET (XWINDOW (root_window), frame, frame); + wset_frame (XWINDOW (root_window), frame); /* 10 is arbitrary, just so that there is "something there." @@ -311,21 +317,21 @@ make_frame (int mini_p) SET_FRAME_COLS (f, 10); FRAME_LINES (f) = 10; - WSET (XWINDOW (root_window), total_cols, make_number (10)); - WSET (XWINDOW (root_window), total_lines, make_number (mini_p ? 9 : 10)); + wset_total_cols (XWINDOW (root_window), make_number (10)); + wset_total_lines (XWINDOW (root_window), make_number (mini_p ? 9 : 10)); if (mini_p) { - WSET (XWINDOW (mini_window), total_cols, make_number (10)); - WSET (XWINDOW (mini_window), top_line, make_number (9)); - WSET (XWINDOW (mini_window), total_lines, make_number (1)); + wset_total_cols (XWINDOW (mini_window), make_number (10)); + wset_top_line (XWINDOW (mini_window), make_number (9)); + wset_total_lines (XWINDOW (mini_window), make_number (1)); } /* Choose a buffer for the frame's root window. */ { Lisp_Object buf; - WSET (XWINDOW (root_window), buffer, Qt); + wset_buffer (XWINDOW (root_window), Qt); buf = Fcurrent_buffer (); /* If buf is a 'hidden' buffer (i.e. one whose name starts with a space), try to find another one. */ @@ -339,12 +345,12 @@ make_frame (int mini_p) etc. Running Lisp functions at this point surely ends in a SEGV. */ set_window_buffer (root_window, buf, 0, 0); - FSET (f, buffer_list, Fcons (buf, Qnil)); + fset_buffer_list (f, Fcons (buf, Qnil)); } if (mini_p) { - WSET (XWINDOW (mini_window), buffer, Qt); + wset_buffer (XWINDOW (mini_window), Qt); set_window_buffer (mini_window, (NILP (Vminibuffer_list) ? get_minibuffer (0) @@ -352,8 +358,8 @@ make_frame (int mini_p) 0, 0); } - FSET (f, root_window, root_window); - FSET (f, selected_window, root_window); + fset_root_window (f, root_window); + fset_selected_window (f, root_window); /* Make sure this window seems more recently used than a newly-created, never-selected window. */ XWINDOW (f->selected_window)->use_time = ++window_select_count; @@ -393,8 +399,8 @@ make_frame_without_minibuffer (register Lisp_Object mini_window, KBOARD *kb, Lis XSETFRAME (frame_dummy, f); GCPRO1 (frame_dummy); /* If there's no minibuffer frame to use, create one. */ - KSET (kb, Vdefault_minibuffer_frame, - call1 (intern ("make-initial-minibuffer-frame"), display)); + kset_default_minibuffer_frame + (kb, call1 (intern ("make-initial-minibuffer-frame"), display)); UNGCPRO; } @@ -402,15 +408,17 @@ make_frame_without_minibuffer (register Lisp_Object mini_window, KBOARD *kb, Lis = XFRAME (KVAR (kb, Vdefault_minibuffer_frame))->minibuffer_window; } - FSET (f, minibuffer_window, mini_window); + fset_minibuffer_window (f, mini_window); /* Make the chosen minibuffer window display the proper minibuffer, unless it is already showing a minibuffer. */ if (NILP (Fmemq (XWINDOW (mini_window)->buffer, Vminibuffer_list))) - Fset_window_buffer (mini_window, - (NILP (Vminibuffer_list) - ? get_minibuffer (0) - : Fcar (Vminibuffer_list)), Qnil); + /* Use set_window_buffer instead of Fset_window_buffer (see + discussion of bug#11984, bug#12025, bug#12026). */ + set_window_buffer (mini_window, + (NILP (Vminibuffer_list) + ? get_minibuffer (0) + : Fcar (Vminibuffer_list)), 0, 0); return f; } @@ -437,18 +445,21 @@ make_minibuffer_frame (void) Avoid infinite looping on the window chain by marking next pointer as nil. */ - mini_window = FSET (f, minibuffer_window, f->root_window); + mini_window = f->root_window; + fset_minibuffer_window (f, mini_window); XWINDOW (mini_window)->mini = 1; - WSET (XWINDOW (mini_window), next, Qnil); - WSET (XWINDOW (mini_window), prev, Qnil); - WSET (XWINDOW (mini_window), frame, frame); + wset_next (XWINDOW (mini_window), Qnil); + wset_prev (XWINDOW (mini_window), Qnil); + wset_frame (XWINDOW (mini_window), frame); /* Put the proper buffer in that window. */ - Fset_window_buffer (mini_window, - (NILP (Vminibuffer_list) - ? get_minibuffer (0) - : Fcar (Vminibuffer_list)), Qnil); + /* Use set_window_buffer instead of Fset_window_buffer (see + discussion of bug#11984, bug#12025, bug#12026). */ + set_window_buffer (mini_window, + (NILP (Vminibuffer_list) + ? get_minibuffer (0) + : Fcar (Vminibuffer_list)), 0, 0); return f; } #endif /* HAVE_WINDOW_SYSTEM */ @@ -478,7 +489,7 @@ make_initial_frame (void) Vframe_list = Fcons (frame, Vframe_list); tty_frame_count = 1; - FSET (f, name, build_pure_c_string ("F1")); + fset_name (f, build_pure_c_string ("F1")); f->visible = 1; f->async_visible = 1; @@ -519,7 +530,7 @@ make_terminal_frame (struct terminal *terminal) XSETFRAME (frame, f); Vframe_list = Fcons (frame, Vframe_list); - FSET (f, name, make_formatted_string (name, "F%"pMd, ++tty_frame_count)); + fset_name (f, make_formatted_string (name, "F%"pMd, ++tty_frame_count)); f->visible = 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */ f->async_visible = 1; /* Don't let visible be cleared later. */ @@ -608,7 +619,7 @@ affects all frames on the same terminal device. */) #ifdef MSDOS if (sf->output_method != output_msdos_raw && sf->output_method != output_termcap) - abort (); + emacs_abort (); #else /* not MSDOS */ #ifdef WINDOWSNT /* This should work now! */ @@ -621,7 +632,7 @@ affects all frames on the same terminal device. */) Lisp_Object terminal; terminal = Fassq (Qterminal, parms); - if (!NILP (terminal)) + if (CONSP (terminal)) { terminal = XCDR (terminal); t = get_terminal (terminal, 1); @@ -689,7 +700,7 @@ affects all frames on the same terminal device. */) /* Make the frame face alist be frame-specific, so that each frame could change its face definitions independently. */ - FSET (f, face_alist, Fcopy_alist (sf->face_alist)); + fset_face_alist (f, Fcopy_alist (sf->face_alist)); /* Simple Fcopy_alist isn't enough, because we need the contents of the vectors which are the CDRs of associations in face_alist to be copied as well. */ @@ -755,7 +766,7 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor Lisp_Object focus; if (!FRAMEP (XCAR (tail))) - abort (); + emacs_abort (); focus = FRAME_FOCUS_FRAME (XFRAME (XCAR (tail))); @@ -843,7 +854,7 @@ to that frame. */) (Lisp_Object event) { /* Preserve prefix arg that the command loop just cleared. */ - KSET (current_kboard, Vprefix_arg, Vcurrent_prefix_arg); + kset_prefix_arg (current_kboard, Vcurrent_prefix_arg); Frun_hooks (1, &Qmouse_leave_buffer_hook); return do_switch_frame (event, 0, 0, Qnil); } @@ -885,7 +896,7 @@ next_frame (Lisp_Object frame, Lisp_Object minibuf) /* There must always be at least one frame in Vframe_list. */ if (! CONSP (Vframe_list)) - abort (); + emacs_abort (); /* If this frame is dead, it won't be in Vframe_list, and we'll loop forever. Forestall that. */ @@ -963,7 +974,7 @@ prev_frame (Lisp_Object frame, Lisp_Object minibuf) /* There must always be at least one frame in Vframe_list. */ if (! CONSP (Vframe_list)) - abort (); + emacs_abort (); prev = Qnil; for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail)) @@ -972,7 +983,7 @@ prev_frame (Lisp_Object frame, Lisp_Object minibuf) f = XCAR (tail); if (!FRAMEP (f)) - abort (); + emacs_abort (); if (EQ (frame, f) && !NILP (prev)) return prev; @@ -1113,7 +1124,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) struct frame *sf = SELECTED_FRAME (); struct kboard *kb; - int minibuffer_selected, tooltip_frame; + int minibuffer_selected, is_tooltip_frame; if (EQ (frame, Qnil)) { @@ -1165,13 +1176,13 @@ delete_frame (Lisp_Object frame, Lisp_Object force) } } - tooltip_frame = !NILP (Fframe_parameter (frame, intern ("tooltip"))); + is_tooltip_frame = !NILP (Fframe_parameter (frame, intern ("tooltip"))); /* Run `delete-frame-functions' unless FORCE is `noelisp' or frame is a tooltip. FORCE is set to `noelisp' when handling a disconnect from the terminal, so we don't dare call Lisp code. */ - if (NILP (Vrun_hooks) || tooltip_frame) + if (NILP (Vrun_hooks) || is_tooltip_frame) ; else if (EQ (force, Qnoelisp)) pending_funcalls @@ -1240,8 +1251,10 @@ delete_frame (Lisp_Object frame, Lisp_Object force) /* Don't allow minibuf_window to remain on a deleted frame. */ if (EQ (f->minibuffer_window, minibuf_window)) { - Fset_window_buffer (sf->minibuffer_window, - XWINDOW (minibuf_window)->buffer, Qnil); + /* Use set_window_buffer instead of Fset_window_buffer (see + discussion of bug#11984, bug#12025, bug#12026). */ + set_window_buffer (sf->minibuffer_window, + XWINDOW (minibuf_window)->buffer, 0, 0); minibuf_window = sf->minibuffer_window; /* If the dying minibuffer window was selected, @@ -1274,7 +1287,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) /* Mark all the windows that used to be on FRAME as deleted, and then remove the reference to them. */ delete_all_child_windows (f->root_window); - FSET (f, root_window, Qnil); + fset_root_window (f, Qnil); Vframe_list = Fdelq (frame, Vframe_list); FRAME_SET_VISIBLE (f, 0); @@ -1283,7 +1296,12 @@ delete_frame (Lisp_Object frame, Lisp_Object force) garbage collection. The frame object itself may not be garbage collected until much later, because recent_keys and other data structures can still refer to it. */ - FSET (f, menu_bar_vector, Qnil); + fset_menu_bar_vector (f, Qnil); + + /* If FRAME's buffer lists contains killed + buffers, this helps GC to reclaim them. */ + fset_buffer_list (f, Qnil); + fset_buried_buffer_list (f, Qnil); free_font_driver_list (f); xfree (f->namebuf); @@ -1371,7 +1389,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) this = XCAR (frames); if (!FRAMEP (this)) - abort (); + emacs_abort (); f1 = XFRAME (this); if (kb == FRAME_KBOARD (f1)) @@ -1407,7 +1425,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) this = XCAR (frames); if (!FRAMEP (this)) - abort (); + emacs_abort (); f1 = XFRAME (this); /* Consider only frames on the same kboard @@ -1433,17 +1451,17 @@ delete_frame (Lisp_Object frame, Lisp_Object force) that is prohibited at the top; you can't delete surrogate minibuffer frames. */ if (NILP (frame_with_minibuf)) - abort (); + emacs_abort (); - KSET (kb, Vdefault_minibuffer_frame, frame_with_minibuf); + kset_default_minibuffer_frame (kb, frame_with_minibuf); } else /* No frames left on this kboard--say no minibuffer either. */ - KSET (kb, Vdefault_minibuffer_frame, Qnil); + kset_default_minibuffer_frame (kb, Qnil); } /* Cause frame titles to update--necessary if we now have just one frame. */ - if (!tooltip_frame) + if (!is_tooltip_frame) update_mode_lines = 1; return Qnil; @@ -1483,10 +1501,7 @@ and returns whatever that function returns. */) { FRAME_PTR f; Lisp_Object lispy_dummy; - enum scroll_bar_part party_dummy; Lisp_Object x, y, retval; - int col, row; - Time long_dummy; struct gcpro gcpro1; f = SELECTED_FRAME (); @@ -1495,14 +1510,19 @@ and returns whatever that function returns. */) #if defined (HAVE_MOUSE) || defined (HAVE_GPM) /* It's okay for the hook to refrain from storing anything. */ if (FRAME_TERMINAL (f)->mouse_position_hook) - (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, -1, - &lispy_dummy, &party_dummy, - &x, &y, - &long_dummy); + { + enum scroll_bar_part party_dummy; + Time time_dummy; + (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, -1, + &lispy_dummy, &party_dummy, + &x, &y, + &time_dummy); + } + if (! NILP (x)) { - col = XINT (x); - row = XINT (y); + int col = XINT (x); + int row = XINT (y); pixel_to_glyph_coords (f, col, row, &col, &row, NULL, 1); XSETINT (x, col); XSETINT (y, row); @@ -1529,9 +1549,7 @@ and nil for X and Y. */) { FRAME_PTR f; Lisp_Object lispy_dummy; - enum scroll_bar_part party_dummy; Lisp_Object x, y; - Time long_dummy; f = SELECTED_FRAME (); x = y = Qnil; @@ -1539,10 +1557,15 @@ and nil for X and Y. */) #if defined (HAVE_MOUSE) || defined (HAVE_GPM) /* It's okay for the hook to refrain from storing anything. */ if (FRAME_TERMINAL (f)->mouse_position_hook) - (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, -1, - &lispy_dummy, &party_dummy, - &x, &y, - &long_dummy); + { + enum scroll_bar_part party_dummy; + Time time_dummy; + (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, -1, + &lispy_dummy, &party_dummy, + &x, &y, + &time_dummy); + } + #endif XSETFRAME (lispy_dummy, f); return Fcons (lispy_dummy, Fcons (x, y)); @@ -1677,7 +1700,7 @@ make_frame_visible_1 (Lisp_Object window) w = XWINDOW (window); if (!NILP (w->buffer)) - BSET (XBUFFER (w->buffer), display_time, Fcurrent_time ()); + bset_display_time (XBUFFER (w->buffer), Fcurrent_time ()); if (!NILP (w->vchild)) make_frame_visible_1 (w->vchild); @@ -1713,8 +1736,10 @@ displayed in the terminal. */) if (EQ (XFRAME (frame)->minibuffer_window, minibuf_window)) { struct frame *sf = XFRAME (selected_frame); - Fset_window_buffer (sf->minibuffer_window, - XWINDOW (minibuf_window)->buffer, Qnil); + /* Use set_window_buffer instead of Fset_window_buffer (see + discussion of bug#11984, bug#12025, bug#12026). */ + set_window_buffer (sf->minibuffer_window, + XWINDOW (minibuf_window)->buffer, 0, 0); minibuf_window = sf->minibuffer_window; } @@ -1747,12 +1772,14 @@ If omitted, FRAME defaults to the currently selected frame. */) Fhandle_switch_frame (next_frame (frame, Qt)); #endif - /* Don't allow minibuf_window to remain on a deleted frame. */ + /* Don't allow minibuf_window to remain on an iconified frame. */ if (EQ (XFRAME (frame)->minibuffer_window, minibuf_window)) { struct frame *sf = XFRAME (selected_frame); - Fset_window_buffer (sf->minibuffer_window, - XWINDOW (minibuf_window)->buffer, Qnil); + /* Use set_window_buffer instead of Fset_window_buffer (see + discussion of bug#11984, bug#12025, bug#12026). */ + set_window_buffer (sf->minibuffer_window, + XWINDOW (minibuf_window)->buffer, 0, 0); minibuf_window = sf->minibuffer_window; } @@ -1907,7 +1934,7 @@ The redirection lasts until `redirect-frame-focus' is called to change it. */) f = XFRAME (frame); - FSET (f, focus_frame, focus_frame); + fset_focus_frame (f, focus_frame); if (FRAME_TERMINAL (f)->frame_rehighlight_hook) (*FRAME_TERMINAL (f)->frame_rehighlight_hook) (f); @@ -1972,10 +1999,10 @@ frames_discard_buffer (Lisp_Object buffer) FOR_EACH_FRAME (tail, frame) { - FSET (XFRAME (frame), buffer_list, - Fdelq (buffer, XFRAME (frame)->buffer_list)); - FSET (XFRAME (frame), buried_buffer_list, - Fdelq (buffer, XFRAME (frame)->buried_buffer_list)); + fset_buffer_list + (XFRAME (frame), Fdelq (buffer, XFRAME (frame)->buffer_list)); + fset_buried_buffer_list + (XFRAME (frame), Fdelq (buffer, XFRAME (frame)->buried_buffer_list)); } } @@ -2042,7 +2069,7 @@ set_term_frame_name (struct frame *f, Lisp_Object name) error ("Frame names of the form F are usurped by Emacs"); } - FSET (f, name, name); + fset_name (f, name); update_mode_lines = 1; } @@ -2059,7 +2086,7 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) for (; CONSP (val); val = XCDR (val)) if (!NILP (Fbuffer_live_p (XCAR (val)))) list = Fcons (XCAR (val), list); - FSET (f, buffer_list, Fnreverse (list)); + fset_buffer_list (f, Fnreverse (list)); return; } if (EQ (prop, Qburied_buffer_list)) @@ -2068,7 +2095,7 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) for (; CONSP (val); val = XCDR (val)) if (!NILP (Fbuffer_live_p (XCAR (val)))) list = Fcons (XCAR (val), list); - FSET (f, buried_buffer_list, Fnreverse (list)); + fset_buried_buffer_list (f, Fnreverse (list)); return; } @@ -2086,11 +2113,11 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) case SYMBOL_PLAINVAL: case SYMBOL_FORWARDED: break; case SYMBOL_LOCALIZED: { struct Lisp_Buffer_Local_Value *blv = sym->val.blv; - if (blv->frame_local && BLV_FOUND (blv) && XFRAME (blv->where) == f) + if (blv->frame_local && blv_found (blv) && XFRAME (blv->where) == f) swap_in_global_binding (sym); break; } - default: abort (); + default: emacs_abort (); } } @@ -2105,7 +2132,7 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) /* Update the frame parameter alist. */ old_alist_elt = Fassq (prop, f->param_alist); if (EQ (old_alist_elt, Qnil)) - FSET (f, param_alist, Fcons (Fcons (prop, val), f->param_alist)); + fset_param_alist (f, Fcons (Fcons (prop, val), f->param_alist)); else Fsetcdr (old_alist_elt, val); @@ -2113,7 +2140,7 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) in addition to the alist. */ if (EQ (prop, Qbuffer_predicate)) - FSET (f, buffer_predicate, val); + fset_buffer_predicate (f, val); if (! FRAME_WINDOW_P (f)) { @@ -2133,7 +2160,7 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) error ("Can't change the surrogate minibuffer of a frame with its own minibuffer"); /* Install the chosen minibuffer window, with proper buffer. */ - FSET (f, minibuffer_window, val); + fset_minibuffer_window (f, val); } } @@ -2447,11 +2474,8 @@ In the Gtk+ version of Emacs, it includes only any window (including the minibuffer or echo area), mode line, and header line. It does not include the tool bar or menu bar. -With the Motif or Lucid toolkits, it also includes the tool bar (but -not the menu bar). - -In a graphical version with no toolkit, it includes both the tool bar -and menu bar. +With other graphical versions, it also includes the tool bar and the +menu bar. For a text terminal, it includes the menu bar. In this case, the result is really in characters rather than pixels (i.e., is identical @@ -2675,7 +2699,7 @@ static const struct frame_parm_table frame_parms[] = {"tool-bar-position", &Qtool_bar_position}, }; -#ifdef WINDOWSNT +#ifdef HAVE_NTGUI /* Calculate fullscreen size. Return in *TOP_POS and *LEFT_POS the wanted positions of the WM window (not Emacs window). @@ -2719,7 +2743,7 @@ x_fullscreen_adjust (struct frame *f, int *width, int *height, int *top_pos, int *height = newheight; } -#endif /* WINDOWSNT */ +#endif /* HAVE_NTGUI */ #ifdef HAVE_WINDOW_SYSTEM @@ -3006,9 +3030,9 @@ x_set_frame_parameters (FRAME_PTR f, Lisp_Object alist) void x_report_frame_params (struct frame *f, Lisp_Object *alistptr) { - char buf[16]; Lisp_Object tem; - unsigned long w; + uprintmax_t w; + char buf[INT_BUFSIZE_BOUND (w)]; /* Represent negative positions (off the top or left screen edge) in a way that Fmodify_frame_parameters will understand correctly. */ @@ -3045,17 +3069,17 @@ x_report_frame_params (struct frame *f, Lisp_Object *alistptr) MS-Windows it returns a value whose type is HANDLE, which is actually a pointer. Explicit casting avoids compiler warnings. */ - w = (unsigned long) FRAME_X_WINDOW (f); + w = (uintptr_t) FRAME_X_WINDOW (f); store_in_alist (alistptr, Qwindow_id, - make_formatted_string (buf, "%lu", w)); + make_formatted_string (buf, "%"pMu, w)); #ifdef HAVE_X_WINDOWS #ifdef USE_X_TOOLKIT /* Tooltip frame may not have this widget. */ if (FRAME_X_OUTPUT (f)->widget) #endif - w = (unsigned long) FRAME_OUTER_WINDOW (f); + w = (uintptr_t) FRAME_OUTER_WINDOW (f); store_in_alist (alistptr, Qouter_window_id, - make_formatted_string (buf, "%lu", w)); + make_formatted_string (buf, "%"pMu, w)); #endif store_in_alist (alistptr, Qicon_name, f->icon_name); FRAME_SAMPLE_VISIBILITY (f); @@ -3215,6 +3239,9 @@ x_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval) Lisp_Object ascii_font = fontset_ascii (fontset); Lisp_Object spec = font_spec_from_name (ascii_font); + if (NILP (spec)) + signal_error ("Invalid font name", ascii_font); + if (! font_match_p (spec, font_object)) fontset = -1; } @@ -3261,7 +3288,7 @@ x_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu new_value = Qnil; while (*p0) { - while (*p1 && ! isspace (*p1) && *p1 != ',') p1++; + while (*p1 && ! c_isspace (*p1) && *p1 != ',') p1++; if (p0 < p1) new_value = Fcons (Fintern (make_string (p0, p1 - p0), Qnil), new_value); @@ -3269,7 +3296,7 @@ x_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu { int c; - while ((c = *++p1) && isspace (c)); + while ((c = *++p1) && c_isspace (c)); } p0 = p1; } @@ -3511,9 +3538,9 @@ x_set_alpha (struct frame *f, Lisp_Object arg, Lisp_Object oldval) f->alpha[i] = newval[i]; #if defined (HAVE_X_WINDOWS) || defined (HAVE_NTGUI) || defined (NS_IMPL_COCOA) - BLOCK_INPUT; + block_input (); x_set_frame_alpha (f); - UNBLOCK_INPUT; + unblock_input (); #endif return; @@ -3817,7 +3844,7 @@ x_get_arg (Display_Info *dpyinfo, Lisp_Object alist, Lisp_Object param, } default: - abort (); + emacs_abort (); } } else @@ -3875,6 +3902,95 @@ x_default_parameter (struct frame *f, Lisp_Object alist, Lisp_Object prop, } +#if !defined (HAVE_X_WINDOWS) && defined (NoValue) + +/* + * XParseGeometry parses strings of the form + * "=x{+-}{+-}", where + * width, height, xoffset, and yoffset are unsigned integers. + * Example: "=80x24+300-49" + * The equal sign is optional. + * It returns a bitmask that indicates which of the four values + * were actually found in the string. For each value found, + * the corresponding argument is updated; for each value + * not found, the corresponding argument is left unchanged. + */ + +static int +XParseGeometry (char *string, + int *x, int *y, + unsigned int *width, unsigned int *height) +{ + int mask = NoValue; + char *strind; + unsigned long int tempWidth, tempHeight; + long int tempX, tempY; + char *nextCharacter; + + if (string == NULL || *string == '\0') + return mask; + if (*string == '=') + string++; /* ignore possible '=' at beg of geometry spec */ + + strind = string; + if (*strind != '+' && *strind != '-' && *strind != 'x') + { + tempWidth = strtoul (strind, &nextCharacter, 10); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= WidthValue; + } + + if (*strind == 'x' || *strind == 'X') + { + strind++; + tempHeight = strtoul (strind, &nextCharacter, 10); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= HeightValue; + } + + if (*strind == '+' || *strind == '-') + { + if (*strind == '-') + mask |= XNegative; + tempX = strtol (strind, &nextCharacter, 10); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= XValue; + if (*strind == '+' || *strind == '-') + { + if (*strind == '-') + mask |= YNegative; + tempY = strtol (strind, &nextCharacter, 10); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= YValue; + } + } + + /* If strind isn't at the end of the string then it's an invalid + geometry specification. */ + + if (*strind != '\0') + return 0; + + if (mask & XValue) + *x = clip_to_bounds (INT_MIN, tempX, INT_MAX); + if (mask & YValue) + *y = clip_to_bounds (INT_MIN, tempY, INT_MAX); + if (mask & WidthValue) + *width = min (tempWidth, UINT_MAX); + if (mask & HeightValue) + *height = min (tempHeight, UINT_MAX); + return mask; +} + +#endif /* !defined (HAVE_X_WINDOWS) && defined (NoValue) */ /* NS used to define x-parse-geometry in ns-win.el, but that confused @@ -3895,15 +4011,16 @@ or a list (- N) meaning -N pixels relative to bottom/right corner. On Nextstep, this just calls `ns-parse-geometry'. */) (Lisp_Object string) { -#ifdef HAVE_NS - return call1 (Qns_parse_geometry, string); -#else int geometry, x, y; unsigned int width, height; Lisp_Object result; CHECK_STRING (string); +#ifdef HAVE_NS + if (strchr (SSDATA (string), ' ') != NULL) + return call1 (Qns_parse_geometry, string); +#endif geometry = XParseGeometry (SSDATA (string), &x, &y, &width, &height); result = Qnil; @@ -3939,7 +4056,6 @@ On Nextstep, this just calls `ns-parse-geometry'. */) result = Fcons (Fcons (Qheight, make_number (height)), result); return result; -#endif /* HAVE_NS */ } @@ -4220,7 +4336,6 @@ syms_of_frame (void) DEFSYM (Qx, "x"); DEFSYM (Qw32, "w32"); DEFSYM (Qpc, "pc"); - DEFSYM (Qmac, "mac"); DEFSYM (Qns, "ns"); DEFSYM (Qvisible, "visible"); DEFSYM (Qbuffer_predicate, "buffer-predicate");