Mercurial > hg > xemacs-beta
diff src/frame.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | da8ed4261e83 |
line wrap: on
line diff
--- a/src/frame.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/frame.c Mon Aug 13 11:20:41 2007 +0200 @@ -34,7 +34,6 @@ #include "faces.h" #include "frame.h" #include "glyphs.h" -#include "gutter.h" #include "menubar.h" #include "redisplay.h" #include "scrollbar.h" @@ -86,6 +85,7 @@ Lisp_Object Qborder_width; Lisp_Object Qframep, Qframe_live_p; +Lisp_Object Qframe_x_p, Qframe_tty_p; Lisp_Object Qdelete_frame; Lisp_Object Qframe_title_format, Vframe_title_format; @@ -116,22 +116,22 @@ Lisp_Object Qframe_being_created; static void store_minibuf_frame_prop (struct frame *f, Lisp_Object val); -static struct display_line title_string_display_line; -/* Used by generate_title_string. Global because they get used so much that - the dynamic allocation time adds up. */ -static Emchar_dynarr *title_string_emchar_dynarr; + +EXFUN (Fset_frame_properties, 2); static Lisp_Object -mark_frame (Lisp_Object obj) +mark_frame (Lisp_Object obj, void (*markobj) (Lisp_Object)) { struct frame *f = XFRAME (obj); -#define MARKED_SLOT(x) mark_object (f->x) +#define MARKED_SLOT(x) ((void) (markobj (f->x))); #include "frameslots.h" + mark_subwindow_cachels (f->subwindow_cachels, markobj); + if (FRAME_LIVE_P (f)) /* device is nil for a dead frame */ - MAYBE_FRAMEMETH (f, mark_frame, (f)); + MAYBE_FRAMEMETH (f, mark_frame, (f, markobj)); return Qnil; } @@ -155,13 +155,13 @@ } DEFINE_LRECORD_IMPLEMENTATION ("frame", frame, - mark_frame, print_frame, 0, 0, 0, 0, + mark_frame, print_frame, 0, 0, 0, struct frame); static void nuke_all_frame_slots (struct frame *f) { -#define MARKED_SLOT(x) f->x = Qnil +#define MARKED_SLOT(x) f->x = Qnil; #include "frameslots.h" } @@ -206,13 +206,7 @@ f->last_nonminibuf_window = root_window; /* cache of subwindows visible on frame */ - f->subwindow_instance_cache = make_weak_list (WEAK_LIST_SIMPLE); - - /* associated exposure ignore list */ - f->subwindow_exposures = 0; - f->subwindow_exposures_tail = 0; - - FRAME_SET_PAGENUMBER (f, 1); + f->subwindow_cachels = Dynarr_new (subwindow_cachel); /* Choose a buffer for the frame's root window. */ XWINDOW (root_window)->buffer = Qt; @@ -224,7 +218,7 @@ a space), try to find another one. */ if (string_char (XSTRING (Fbuffer_name (buf)), 0) == ' ') buf = Fother_buffer (buf, Qnil, Qnil); - Fset_window_buffer (root_window, buf, Qnil); + Fset_window_buffer (root_window, buf); } return f; @@ -247,7 +241,7 @@ f->has_minibuffer = 1; XWINDOW (mini_window)->buffer = Qt; - Fset_window_buffer (mini_window, Vminibuffer_zero, Qt); + Fset_window_buffer (mini_window, Vminibuffer_zero); } /* Make a frame using a separate minibuffer window on another frame. @@ -268,9 +262,7 @@ FRAME_CONSOLE (XFRAME (XWINDOW (mini_window)->frame)))) error ("frame and minibuffer must be on the same console"); - /* Do not create a default minibuffer frame on printer devices. */ - if (NILP (mini_window) - && DEVICE_DISPLAY_P (XDEVICE (FRAME_DEVICE (f)))) + if (NILP (mini_window)) { struct console *con = XCONSOLE (FRAME_CONSOLE (f)); /* Use default-minibuffer-frame if possible. */ @@ -285,13 +277,8 @@ } /* Install the chosen minibuffer window, with proper buffer. */ - if (!NILP (mini_window)) - { - store_minibuf_frame_prop (f, mini_window); - Fset_window_buffer (mini_window, Vminibuffer_zero, Qt); - } - else - f->minibuffer_window = Qnil; + store_minibuf_frame_prop (f, mini_window); + Fset_window_buffer (mini_window, Vminibuffer_zero); } /* Make a frame containing only a minibuffer window. */ @@ -321,7 +308,7 @@ /* Put the proper buffer in that window. */ - Fset_window_buffer (mini_window, Vminibuffer_zero, Qt); + Fset_window_buffer (mini_window, Vminibuffer_zero); } static Lisp_Object @@ -385,7 +372,7 @@ else name = build_string ("emacs"); - if (!NILP (Fstring_match (make_string ((const Bufbyte *) "\\.", 2), name, + if (!NILP (Fstring_match (make_string ((CONST Bufbyte *) "\\.", 2), name, Qnil, Qnil))) signal_simple_error (". not allowed in frame names", name); @@ -422,7 +409,7 @@ update_frame_window_mirror (f); - if (initialized && !DEVICE_STREAM_P (d)) + if (initialized) { if (!NILP (f->minibuffer_window)) reset_face_cachels (XWINDOW (f->minibuffer_window)); @@ -471,7 +458,7 @@ #endif reset_face_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f))); reset_glyph_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f))); - + reset_subwindow_cachels (f); change_frame_size (f, f->height, f->width, 0); } @@ -504,18 +491,6 @@ MAYBE_FRAMEMETH (f, after_init_frame, (f, first_frame_on_device, first_frame_on_console)); - if (!DEVICE_STREAM_P (d)) - { - /* Now initialise the gutters. This won't change the frame size, - but is needed as input to the layout that change_frame_size - will eventually do. Unfortunately gutter sizing code relies - on the frame in question being visible so we can't do this - earlier. */ - init_frame_gutters (f); - - change_frame_size (f, f->height, f->width, 0); - } - if (first_frame_on_device) { if (first_frame_on_console) @@ -916,13 +891,10 @@ f->selected_window = window; if (!MINI_WINDOW_P (XWINDOW (window)) || FRAME_MINIBUF_ONLY_P (f)) { +#ifdef HAVE_TOOLBARS if (!EQ (f->last_nonminibuf_window, window)) - { -#ifdef HAVE_TOOLBARS - MARK_TOOLBAR_CHANGED; + MARK_TOOLBAR_CHANGED; #endif - MARK_GUTTER_CHANGED; - } f->last_nonminibuf_window = window; } } @@ -1333,9 +1305,7 @@ console = DEVICE_CONSOLE (d); con = XCONSOLE (console); - if (!called_from_delete_device && - !(MAYBE_INT_DEVMETH (d, device_implementation_flags, ()) - & XDEVIMPF_FRAMELESS_OK)) + if (!called_from_delete_device) { /* If we're deleting the only non-minibuffer frame on the device, delete the device. */ @@ -1521,7 +1491,7 @@ next_frame_internal (frame, Qt, device, called_from_delete_device); if (NILP (next_f) || EQ (next_f, frame)) - set_device_selected_frame (d, Qnil); + ; else set_device_selected_frame (d, next_f); } @@ -1536,7 +1506,7 @@ { struct frame *sel_frame = selected_frame (); Fset_window_buffer (sel_frame->minibuffer_window, - XWINDOW (minibuf_window)->buffer, Qt); + XWINDOW (minibuf_window)->buffer); minibuf_window = sel_frame->minibuffer_window; /* If the dying minibuffer window was selected, @@ -1556,13 +1526,6 @@ #ifdef HAVE_TOOLBARS free_frame_toolbars (f); #endif - free_frame_gutters (f); - /* Unfortunately deleting the frame will also delete the parent of - all of the subwindow instances current on the frame. I think this - can lead to bad things when trying to finalize the - instances. Thus we loop over the instance cache calling the - finalize method for each instance. */ - free_frame_subwindow_instance_cache (f); /* This must be done before the window and window_mirror structures are freed. The scrollbar information is attached to them. */ @@ -1574,7 +1537,11 @@ f->root_window = Qnil; /* clear out the cached glyph information */ - f->subwindow_instance_cache = Qnil; + if (f->subwindow_cachels) + { + Dynarr_free (f->subwindow_cachels); + f->subwindow_cachels = 0; + } /* Remove the frame now from the list. This way, any events generated on this frame by the maneuvers below will disperse themselves. */ @@ -1871,7 +1838,7 @@ struct window *w; int pix_x, pix_y; - CHECK_LIVE_WINDOW (window); + CHECK_WINDOW (window); CHECK_INT (x); CHECK_INT (y); @@ -1895,7 +1862,7 @@ { struct window *w; - CHECK_LIVE_WINDOW (window); + CHECK_WINDOW (window); CHECK_INT (x); CHECK_INT (y); @@ -1944,7 +1911,7 @@ if (EQ (f->minibuffer_window, minibuf_window)) { Fset_window_buffer (sel_frame->minibuffer_window, - XWINDOW (minibuf_window)->buffer, Qt); + XWINDOW (minibuf_window)->buffer); minibuf_window = sel_frame->minibuffer_window; } @@ -1970,7 +1937,7 @@ if (EQ (f->minibuffer_window, minibuf_window)) { Fset_window_buffer (sel_frame->minibuffer_window, - XWINDOW (minibuf_window)->buffer, Qt); + XWINDOW (minibuf_window)->buffer); minibuf_window = sel_frame->minibuffer_window; } @@ -2102,31 +2069,6 @@ /* Ben thinks there is no need for `redirect-frame-focus' or `frame-focus', crockish FSFmacs functions. See summary on focus in event-stream.c. */ - -DEFUN ("print-job-page-number", Fprint_job_page_number, 1, 1, 0, /* -Return current page number for the print job FRAME. -*/ - (frame)) -{ - CHECK_PRINTER_FRAME (frame); - return make_int (FRAME_PAGENUMBER (XFRAME (frame))); -} - -DEFUN ("print-job-eject-page", Fprint_job_eject_page, 1, 1, 0, /* -Eject page in the print job FRAME. -*/ - (frame)) -{ - struct frame *f; - - CHECK_PRINTER_FRAME (frame); - f = XFRAME (frame); - FRAMEMETH (f, eject_page, (f)); - FRAME_SET_PAGENUMBER (f, 1 + FRAME_PAGENUMBER (f)); - f->clear = 1; - - return Qnil; -} /***************************************************************************/ @@ -2182,7 +2124,7 @@ Lisp_Object *face_prop_out) { Lisp_Object list = Vbuilt_in_face_specifiers; - Lisp_String *s; + struct Lisp_String *s; if (!SYMBOLP (sym)) return 0; @@ -2192,7 +2134,7 @@ while (!NILP (list)) { Lisp_Object prop = Fcar (list); - Lisp_String *prop_name; + struct Lisp_String *prop_name; if (!SYMBOLP (prop)) continue; @@ -2270,9 +2212,8 @@ minibuffer Gives the minibuffer behavior for this frame. Either t (frame has its own minibuffer), `only' (frame is - a minibuffer-only frame), `none' (frame has no minibuffer) - or a window (frame uses that window, which is on another - frame, as the minibuffer). + a minibuffer-only frame), or a window (frame uses that + window, which is on another frame, as the minibuffer). unsplittable If non-nil, frame cannot be split by `display-buffer'. @@ -2286,13 +2227,7 @@ left-toolbar-visible-p, right-toolbar-visible-p, toolbar-buttons-captioned-p, top-toolbar-border-width, bottom-toolbar-border-width, left-toolbar-border-width, right-toolbar-border-width, - modeline-shadow-thickness, has-modeline-p, - default-gutter, top-gutter, bottom-gutter, left-gutter, right-gutter, - default-gutter-height, default-gutter-width, top-gutter-height, - bottom-gutter-height, left-gutter-width, right-gutter-width, - default-gutter-visible-p, top-gutter-visible-p, bottom-gutter-visible-p, - left-gutter-visible-p, right-gutter-visible-p, top-gutter-border-width, - bottom-gutter-border-width, left-gutter-border-width, right-gutter-border-width, + modeline-shadow-thickness, has-modeline-p [Giving the name of any built-in specifier variable is equivalent to calling `set-specifier' on the specifier, with a locale of FRAME. Giving the name to `frame-property' @@ -2725,8 +2660,8 @@ window = FRAME_SELECTED_WINDOW (f); - egw = max (glyph_width (Vcontinuation_glyph, window), - glyph_width (Vtruncation_glyph, window)); + egw = max (glyph_width (Vcontinuation_glyph, Vdefault_face, 0, window), + glyph_width (Vtruncation_glyph, Vdefault_face, 0, window)); egw = max (egw, cpw); bdr = 2 * f->internal_border_width; obw = FRAME_SCROLLBAR_WIDTH (f) + FRAME_THEORETICAL_LEFT_TOOLBAR_WIDTH (f) + @@ -2901,9 +2836,9 @@ { int adjustment, trunc_width, cont_width; - trunc_width = glyph_width (Vtruncation_glyph, + trunc_width = glyph_width (Vtruncation_glyph, Vdefault_face, 0, FRAME_SELECTED_WINDOW (f)); - cont_width = glyph_width (Vcontinuation_glyph, + cont_width = glyph_width (Vcontinuation_glyph, Vdefault_face, 0, FRAME_SELECTED_WINDOW (f)); adjustment = max (trunc_width, cont_width); adjustment = max (adjustment, font_width); @@ -2917,14 +2852,7 @@ if (new_pixheight) { - /* Adjust for gutters here so that we always get set - properly. */ - new_pixheight -= - (FRAME_TOP_GUTTER_BOUNDS (f) - + FRAME_BOTTOM_GUTTER_BOUNDS (f)); - - XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_top - = FRAME_TOP_BORDER_END (f) + FRAME_TOP_GUTTER_BOUNDS (f); + XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_top = FRAME_TOP_BORDER_END (f); if (FRAME_HAS_MINIBUF_P (f) && ! FRAME_MINIBUF_ONLY_P (f)) @@ -2950,10 +2878,7 @@ new_pixheight - minibuf_height, 0); XWINDOW (FRAME_MINIBUF_WINDOW (f))->pixel_top = - FRAME_TOP_BORDER_END (f) + - FRAME_TOP_GUTTER_BOUNDS (f) + - FRAME_BOTTOM_GUTTER_BOUNDS (f) + - new_pixheight - minibuf_height; + new_pixheight - minibuf_height + FRAME_TOP_BORDER_END (f); set_window_pixheight (FRAME_MINIBUF_WINDOW (f), minibuf_height, 0); } @@ -2968,20 +2893,13 @@ if (new_pixwidth) { - /* Adjust for gutters here so that we always get set - properly. */ - new_pixwidth -= - (FRAME_LEFT_GUTTER_BOUNDS (f) - + FRAME_RIGHT_GUTTER_BOUNDS (f)); - - XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_left = - FRAME_LEFT_BORDER_END (f) + FRAME_LEFT_GUTTER_BOUNDS (f); + XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_left = FRAME_LEFT_BORDER_END (f); set_window_pixwidth (FRAME_ROOT_WINDOW (f), new_pixwidth, 0); if (FRAME_HAS_MINIBUF_P (f)) { XWINDOW (FRAME_MINIBUF_WINDOW (f))->pixel_left = - FRAME_LEFT_BORDER_END (f) + FRAME_LEFT_GUTTER_BOUNDS (f); + FRAME_LEFT_BORDER_END (f); set_window_pixwidth (FRAME_MINIBUF_WINDOW (f), new_pixwidth, 0); } @@ -3000,7 +2918,6 @@ } MARK_FRAME_TOOLBARS_CHANGED (f); - MARK_FRAME_GUTTERS_CHANGED (f); MARK_FRAME_CHANGED (f); f->echo_area_garbaged = 1; } @@ -3036,37 +2953,6 @@ } -/* The caller is responsible for freeing the returned string. */ -static Bufbyte * -generate_title_string (struct window *w, Lisp_Object format_str, - face_index findex, int type) -{ - struct display_line *dl; - struct display_block *db; - int elt = 0; - - dl = &title_string_display_line; - db = get_display_block_from_line (dl, TEXT); - Dynarr_reset (db->runes); - - generate_formatted_string_db (format_str, Qnil, w, dl, db, findex, 0, - -1, type); - - Dynarr_reset (title_string_emchar_dynarr); - while (elt < Dynarr_length (db->runes)) - { - if (Dynarr_atp (db->runes, elt)->type == RUNE_CHAR) - Dynarr_add (title_string_emchar_dynarr, - Dynarr_atp (db->runes, elt)->object.chr.ch); - elt++; - } - - return - convert_emchar_string_into_malloced_string - (Dynarr_atp (title_string_emchar_dynarr, 0), - Dynarr_length (title_string_emchar_dynarr), 0); -} - void update_frame_title (struct frame *f) { @@ -3090,8 +2976,8 @@ if (HAS_FRAMEMETH_P (f, set_title_from_bufbyte)) { - title = generate_title_string (w, title_format, - DEFAULT_INDEX, CURRENT_DISP); + title = generate_formatted_string (w, title_format, Qnil, + DEFAULT_INDEX, CURRENT_DISP); FRAMEMETH (f, set_title_from_bufbyte, (f, title)); } @@ -3102,8 +2988,8 @@ if (title) xfree (title); - title = generate_title_string (w, icon_format, - DEFAULT_INDEX, CURRENT_DISP); + title = generate_formatted_string (w, icon_format, Qnil, + DEFAULT_INDEX, CURRENT_DISP); } FRAMEMETH (f, set_icon_name_from_bufbyte, (f, title)); } @@ -3162,29 +3048,9 @@ } -/***************************************************************************/ -/* */ -/* initialization */ -/* */ -/***************************************************************************/ - -void -init_frame (void) -{ -#ifndef PDUMP - if (!initialized) -#endif - { - title_string_emchar_dynarr = Dynarr_new (Emchar); - xzero (title_string_display_line); - } -} - void syms_of_frame (void) { - INIT_LRECORD_IMPLEMENTATION (frame); - defsymbol (&Qdelete_frame_hook, "delete-frame-hook"); defsymbol (&Qselect_frame_hook, "select-frame-hook"); defsymbol (&Qdeselect_frame_hook, "deselect-frame-hook"); @@ -3197,6 +3063,8 @@ defsymbol (&Qframep, "framep"); defsymbol (&Qframe_live_p, "frame-live-p"); + defsymbol (&Qframe_x_p, "frame-x-p"); + defsymbol (&Qframe_tty_p, "frame-tty-p"); defsymbol (&Qdelete_frame, "delete-frame"); defsymbol (&Qsynchronize_minibuffers, "synchronize-minibuffers"); defsymbol (&Qbuffer_predicate, "buffer-predicate"); @@ -3295,8 +3163,6 @@ DEFSUBR (Fset_frame_size); DEFSUBR (Fset_frame_position); DEFSUBR (Fset_frame_pointer); - DEFSUBR (Fprint_job_page_number); - DEFSUBR (Fprint_job_eject_page); } void @@ -3410,34 +3276,27 @@ Vsynchronize_minibuffers = Qnil; DEFVAR_LISP ("frame-title-format", &Vframe_title_format /* -Controls the title of the window-system window of the selected frame. +Controls the title of the X window corresponding to the selected frame. This is the same format as `modeline-format' with the exception that %- is ignored. */ ); -/* #### I would change this unilaterally but for the wrath of the Kyles -of the world. */ -#ifdef WIN32_NATIVE - Vframe_title_format = build_string ("%b - XEmacs"); -#else - Vframe_title_format = build_string ("%S: %b"); -#endif + Vframe_title_format = Fpurecopy (build_string ("%S: %b")); DEFVAR_LISP ("frame-icon-title-format", &Vframe_icon_title_format /* Controls the title of the icon corresponding to the selected frame. See also the variable `frame-title-format'. */ ); - Vframe_icon_title_format = build_string ("%b"); + Vframe_icon_title_format = Fpurecopy (build_string ("%b")); DEFVAR_LISP ("default-frame-name", &Vdefault_frame_name /* The default name to assign to newly-created frames. -This can be overridden by arguments to `make-frame'. This must be a string. -This is used primarily for picking up X resources, and is *not* the title -of the frame. (See `frame-title-format'.) +This can be overridden by arguments to `make-frame'. +This must be a string. */ ); #ifndef INFODOCK - Vdefault_frame_name = build_string ("emacs"); + Vdefault_frame_name = Fpurecopy (build_string ("emacs")); #else - Vdefault_frame_name = build_string ("InfoDock"); + Vdefault_frame_name = Fpurecopy (build_string ("InfoDock")); #endif DEFVAR_LISP ("default-frame-plist", &Vdefault_frame_plist /*