mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-03 22:20:52 -08:00
Initial child frames based on master
This is based on a diff from 2024-10-15 which still applied. Since then, I've inadvertantly modified the igc branch so that it is no longer possible to get a clean diff of what has changed since I created the branch.
This commit is contained in:
parent
1854f2751e
commit
414de92a56
20 changed files with 1672 additions and 618 deletions
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
;;; Code:
|
||||
|
||||
(put 'display-table 'char-table-extra-slots 6)
|
||||
(put 'display-table 'char-table-extra-slots 12)
|
||||
|
||||
;;;###autoload
|
||||
(defun make-display-table ()
|
||||
|
|
@ -46,13 +46,21 @@
|
|||
(put 'control 'display-table-slot 3)
|
||||
(put 'selective-display 'display-table-slot 4)
|
||||
(put 'vertical-border 'display-table-slot 5)
|
||||
(put 'box-vertical 'display-table-slot 6)
|
||||
(put 'box-horizontal 'display-table-slot 7)
|
||||
(put 'box-down-right 'display-table-slot 8)
|
||||
(put 'box-down-left 'display-table-slot 9)
|
||||
(put 'box-up-right 'display-table-slot 10)
|
||||
(put 'box-up-left 'display-table-slot 11)
|
||||
|
||||
;;;###autoload
|
||||
(defun display-table-slot (display-table slot)
|
||||
"Return the value of the extra slot in DISPLAY-TABLE named SLOT.
|
||||
SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
|
||||
SLOT may be a number from 0 to 11 inclusive, or a slot name (symbol).
|
||||
Valid symbols are `truncation', `wrap', `escape', `control',
|
||||
`selective-display', and `vertical-border'."
|
||||
`selective-display', `vertical-border', `box-vertical',
|
||||
`box-horizontal', `box-down-right', `box-down-left', `box-up-right',
|
||||
and `box-up-left'."
|
||||
(let ((slot-number
|
||||
(if (numberp slot) slot
|
||||
(or (get slot 'display-table-slot)
|
||||
|
|
@ -62,9 +70,11 @@ Valid symbols are `truncation', `wrap', `escape', `control',
|
|||
;;;###autoload
|
||||
(defun set-display-table-slot (display-table slot value)
|
||||
"Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
|
||||
SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
|
||||
SLOT may be a number from 0 to 11 inclusive, or a name (symbol).
|
||||
Valid symbols are `truncation', `wrap', `escape', `control',
|
||||
`selective-display', and `vertical-border'."
|
||||
`selective-display', `vertical-border', `box-vertical',
|
||||
`box-horizontal', `box-down-right', `box-down-left', `box-up-right',
|
||||
and `box-up-left'."
|
||||
(let ((slot-number
|
||||
(if (numberp slot) slot
|
||||
(or (get slot 'display-table-slot)
|
||||
|
|
@ -87,6 +97,18 @@ Valid symbols are `truncation', `wrap', `escape', `control',
|
|||
(prin1 (display-table-slot dt 'selective-display))
|
||||
(princ "\nVertical window border glyph: ")
|
||||
(prin1 (display-table-slot dt 'vertical-border))
|
||||
(princ "\nBox vertical line glyph: ")
|
||||
(prin1 (display-table-slot dt 'box-vertical))
|
||||
(princ "\nBox horizonal line glyph: ")
|
||||
(prin1 (display-table-slot dt 'box-horizontal))
|
||||
(princ "\nBox upper left corner glyph: ")
|
||||
(prin1 (display-table-slot dt 'box-down-right))
|
||||
(princ "\nBox upper right corner glyph: ")
|
||||
(prin1 (display-table-slot dt 'box-down-left))
|
||||
(princ "\nBox lower left corner glyph: ")
|
||||
(prin1 (display-table-slot dt 'box-up-right))
|
||||
(princ "\nBox lower right corner glyph: ")
|
||||
(prin1 (display-table-slot dt 'box-up-left))
|
||||
(princ "\nCharacter display glyph sequences:\n")
|
||||
(with-current-buffer standard-output
|
||||
(let ((vector (make-vector 256 nil))
|
||||
|
|
@ -126,6 +148,28 @@ Valid symbols are `truncation', `wrap', `escape', `control',
|
|||
(describe-display-table disptab)
|
||||
(message "No display table"))))
|
||||
|
||||
;;;###autoload
|
||||
(defun standard-display-unicode-special-glyphs ()
|
||||
"Display some glyps using Unicode characters.
|
||||
The glyphs being changed by this function are `vertical-border',
|
||||
`box-vertical', `box-horizontal', `box-down-right', `box-down-left',
|
||||
`box-up-right', and `box-up-left'."
|
||||
(interactive)
|
||||
(set-display-table-slot standard-display-table
|
||||
'vertical-border (make-glyph-code #x2502))
|
||||
(set-display-table-slot standard-display-table
|
||||
'box-vertical (make-glyph-code #x2502))
|
||||
(set-display-table-slot standard-display-table
|
||||
'box-horizontal (make-glyph-code #x2500))
|
||||
(set-display-table-slot standard-display-table
|
||||
'box-down-right (make-glyph-code #x250c))
|
||||
(set-display-table-slot standard-display-table
|
||||
'box-down-left (make-glyph-code #x2510))
|
||||
(set-display-table-slot standard-display-table
|
||||
'box-up-right (make-glyph-code #x2514))
|
||||
(set-display-table-slot standard-display-table
|
||||
'box-up-left (make-glyph-code #x2518)))
|
||||
|
||||
;;;###autoload
|
||||
(defun standard-display-8bit (l h)
|
||||
"Display characters representing raw bytes in the range L to H literally.
|
||||
|
|
|
|||
|
|
@ -1495,6 +1495,13 @@ FRAME defaults to the selected frame."
|
|||
(let ((edges (frame-edges frame 'outer-edges)))
|
||||
(- (nth 3 edges) (nth 1 edges))))
|
||||
|
||||
(defun frame-at (x y)
|
||||
"Return frame containing pixel position X, Y."
|
||||
(cl-loop for frame in (frame-list-z-order)
|
||||
as (x0 y0 x1 y1) = (frame-edges frame)
|
||||
when (and (<= x0 x (1- x1)) (<= y0 y (1- y1)))
|
||||
return frame))
|
||||
|
||||
(declare-function x-list-fonts "xfaces.c"
|
||||
(pattern &optional face frame maximum width))
|
||||
|
||||
|
|
@ -1722,6 +1729,7 @@ live frame and defaults to the selected one."
|
|||
(declare-function pgtk-frame-geometry "pgtkfns.c" (&optional frame))
|
||||
(declare-function haiku-frame-geometry "haikufns.c" (&optional frame))
|
||||
(declare-function android-frame-geometry "androidfns.c" (&optional frame))
|
||||
(declare-function tty-frame-geometry "term.c" (&optional frame))
|
||||
|
||||
(defun frame-geometry (&optional frame)
|
||||
"Return geometric attributes of FRAME.
|
||||
|
|
@ -1778,24 +1786,7 @@ and width values are in pixels.
|
|||
((eq frame-type 'android)
|
||||
(android-frame-geometry frame))
|
||||
(t
|
||||
(list
|
||||
'(outer-position 0 . 0)
|
||||
(cons 'outer-size (cons (frame-width frame) (frame-height frame)))
|
||||
'(external-border-size 0 . 0)
|
||||
'(outer-border-width . 0)
|
||||
'(title-bar-size 0 . 0)
|
||||
'(menu-bar-external . nil)
|
||||
(let ((menu-bar-lines (frame-parameter frame 'menu-bar-lines)))
|
||||
(cons 'menu-bar-size
|
||||
(if menu-bar-lines
|
||||
(cons (frame-width frame) 1)
|
||||
1 0)))
|
||||
'(tool-bar-external . nil)
|
||||
'(tool-bar-position . nil)
|
||||
'(tool-bar-size 0 . 0)
|
||||
'(tab-bar-size 0 . 0)
|
||||
(cons 'internal-border-width
|
||||
(frame-parameter frame 'internal-border-width)))))))
|
||||
(tty-frame-geometry frame)))))
|
||||
|
||||
(defun frame--size-history (&optional frame)
|
||||
"Print history of resize operations for FRAME.
|
||||
|
|
@ -1904,6 +1895,7 @@ of frames like calls to map a frame or change its visibility."
|
|||
(declare-function pgtk-frame-edges "pgtkfns.c" (&optional frame type))
|
||||
(declare-function haiku-frame-edges "haikufns.c" (&optional frame type))
|
||||
(declare-function android-frame-edges "androidfns.c" (&optional frame type))
|
||||
(declare-function tty-frame-edges "term.c" (&optional frame type))
|
||||
|
||||
(defun frame-edges (&optional frame type)
|
||||
"Return coordinates of FRAME's edges.
|
||||
|
|
@ -1934,7 +1926,7 @@ FRAME."
|
|||
((eq frame-type 'android)
|
||||
(android-frame-edges frame type))
|
||||
(t
|
||||
(list 0 0 (frame-width frame) (frame-height frame))))))
|
||||
(tty-frame-edges frame type)))))
|
||||
|
||||
(declare-function w32-mouse-absolute-pixel-position "w32fns.c")
|
||||
(declare-function x-mouse-absolute-pixel-position "xfns.c")
|
||||
|
|
@ -2087,6 +2079,7 @@ workarea attribute."
|
|||
;; (declare-function pgtk-frame-list-z-order "pgtkfns.c" (&optional display))
|
||||
(declare-function haiku-frame-list-z-order "haikufns.c" (&optional display))
|
||||
(declare-function android-frame-list-z-order "androidfns.c" (&optional display))
|
||||
(declare-function tty-frame-list-z-order "term.c" (&optional display))
|
||||
|
||||
(defun frame-list-z-order (&optional display)
|
||||
"Return list of Emacs's frames, in Z (stacking) order.
|
||||
|
|
@ -2114,7 +2107,9 @@ Return nil if DISPLAY contains no Emacs frame."
|
|||
((eq frame-type 'haiku)
|
||||
(haiku-frame-list-z-order display))
|
||||
((eq frame-type 'android)
|
||||
(android-frame-list-z-order display)))))
|
||||
(android-frame-list-z-order display))
|
||||
(t
|
||||
(tty-frame-list-z-order display)))))
|
||||
|
||||
(declare-function x-frame-restack "xfns.c" (frame1 frame2 &optional above))
|
||||
(declare-function w32-frame-restack "w32fns.c" (frame1 frame2 &optional above))
|
||||
|
|
@ -2123,6 +2118,7 @@ Return nil if DISPLAY contains no Emacs frame."
|
|||
(declare-function haiku-frame-restack "haikufns.c" (frame1 frame2 &optional above))
|
||||
(declare-function android-frame-restack "androidfns.c" (frame1 frame2
|
||||
&optional above))
|
||||
(declare-function tty-frame-restack "term.c" (frame1 frame2 &optional above))
|
||||
|
||||
(defun frame-restack (frame1 frame2 &optional above)
|
||||
"Restack FRAME1 below FRAME2.
|
||||
|
|
@ -2158,7 +2154,9 @@ Some window managers may refuse to restack windows."
|
|||
((eq frame-type 'pgtk)
|
||||
(pgtk-frame-restack frame1 frame2 above))
|
||||
((eq frame-type 'android)
|
||||
(android-frame-restack frame1 frame2 above))))
|
||||
(android-frame-restack frame1 frame2 above))
|
||||
(t
|
||||
(tty-frame-restack frame1 frame2 above))))
|
||||
(error "Cannot restack frames")))
|
||||
|
||||
(defun frame-size-changed-p (&optional frame)
|
||||
|
|
@ -2311,6 +2309,7 @@ If DISPLAY is omitted or nil, it defaults to the selected frame's display."
|
|||
1))))
|
||||
|
||||
(declare-function x-display-pixel-height "xfns.c" (&optional terminal))
|
||||
(declare-function tty-display-pixel-height "term.c" (&optional terminal))
|
||||
|
||||
(defun display-pixel-height (&optional display)
|
||||
"Return the height of DISPLAY's screen in pixels.
|
||||
|
|
@ -2328,9 +2327,10 @@ with DISPLAY. To get information for each physical monitor, use
|
|||
((memq frame-type '(x w32 ns haiku pgtk android))
|
||||
(x-display-pixel-height display))
|
||||
(t
|
||||
(frame-height (if (framep display) display (selected-frame)))))))
|
||||
(tty-display-pixel-height display)))))
|
||||
|
||||
(declare-function x-display-pixel-width "xfns.c" (&optional terminal))
|
||||
(declare-function tty-display-pixel-width "term.c" (&optional terminal))
|
||||
|
||||
(defun display-pixel-width (&optional display)
|
||||
"Return the width of DISPLAY's screen in pixels.
|
||||
|
|
@ -2348,7 +2348,7 @@ with DISPLAY. To get information for each physical monitor, use
|
|||
((memq frame-type '(x w32 ns haiku pgtk android))
|
||||
(x-display-pixel-width display))
|
||||
(t
|
||||
(frame-width (if (framep display) display (selected-frame)))))))
|
||||
(tty-display-pixel-width display)))))
|
||||
|
||||
(defcustom display-mm-dimensions-alist nil
|
||||
"Alist for specifying screen dimensions in millimeters.
|
||||
|
|
|
|||
|
|
@ -133,7 +133,8 @@ https://invisible-island.net/xterm/ctlseqs/ctlseqs.html)."
|
|||
|
||||
(defun xterm-mouse--handle-mouse-movement ()
|
||||
"Handle mouse motion that was just generated for XTerm mouse."
|
||||
(display--update-for-mouse-movement (terminal-parameter nil 'xterm-mouse-x)
|
||||
(display--update-for-mouse-movement (terminal-parameter nil 'xterm-mouse-frame)
|
||||
(terminal-parameter nil 'xterm-mouse-x)
|
||||
(terminal-parameter nil 'xterm-mouse-y)))
|
||||
|
||||
;; These two variables have been converted to terminal parameters.
|
||||
|
|
@ -293,7 +294,16 @@ which is the \"1006\" extension implemented in Xterm >= 277."
|
|||
(progn (setq xt-mouse-epoch (float-time)) 0)
|
||||
(car (time-convert (time-since xt-mouse-epoch)
|
||||
1000))))
|
||||
(w (window-at x y))
|
||||
(frame (frame-at x y))
|
||||
;;(_ (message (format "*** %S" frame)))
|
||||
(frame-pos (frame-position frame))
|
||||
;;(_ (message (format "*** %S" frame-pos)))
|
||||
(x (- x (car frame-pos)))
|
||||
(y (- y (cdr frame-pos)))
|
||||
;;(_ (message (format "*** %S %S" x y)))
|
||||
(w (window-at x y frame))
|
||||
;;(_ (message (format "*** %S" w)))
|
||||
|
||||
(ltrb (window-edges w))
|
||||
(left (nth 0 ltrb))
|
||||
(top (nth 1 ltrb))
|
||||
|
|
@ -345,6 +355,7 @@ which is the \"1006\" extension implemented in Xterm >= 277."
|
|||
|
||||
(set-terminal-parameter nil 'xterm-mouse-x x)
|
||||
(set-terminal-parameter nil 'xterm-mouse-y y)
|
||||
(set-terminal-parameter nil 'xterm-mouse-frame frame)
|
||||
(setq last-input-event event)))))
|
||||
|
||||
;;;###autoload
|
||||
|
|
|
|||
|
|
@ -6853,9 +6853,11 @@ mark_glyph_matrix (struct glyph_matrix *matrix)
|
|||
struct glyph *end_glyph = glyph + row->used[area];
|
||||
|
||||
for (; glyph < end_glyph; ++glyph)
|
||||
if (STRINGP (glyph->object)
|
||||
&& !string_marked_p (XSTRING (glyph->object)))
|
||||
mark_object (glyph->object);
|
||||
{
|
||||
if (STRINGP (glyph->object)
|
||||
&& !string_marked_p (XSTRING (glyph->object)))
|
||||
mark_object (glyph->object);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,8 +122,6 @@ the char-table has no extra slot. */)
|
|||
else
|
||||
{
|
||||
CHECK_FIXNAT (n);
|
||||
if (XFIXNUM (n) > 10)
|
||||
args_out_of_range (n, Qnil);
|
||||
n_extras = XFIXNUM (n);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -482,6 +482,11 @@ struct glyph
|
|||
continuation glyphs, or the overlay-arrow glyphs on TTYs. */
|
||||
Lisp_Object object;
|
||||
|
||||
/* Frame on which the glyph was produced. The face_id of this glyph
|
||||
refers to the face_cache of this frame. This is used on tty frames
|
||||
only. */
|
||||
struct frame *frame;
|
||||
|
||||
/* Width in pixels. */
|
||||
short pixel_width;
|
||||
|
||||
|
|
@ -626,10 +631,12 @@ struct glyph
|
|||
|
||||
#define FONT_TYPE_UNKNOWN 0
|
||||
|
||||
/* Is GLYPH a space? */
|
||||
/* Is GLYPH a space in default face on frame FRAME? */
|
||||
|
||||
#define CHAR_GLYPH_SPACE_P(GLYPH) \
|
||||
((GLYPH).u.ch == SPACEGLYPH && (GLYPH).face_id == DEFAULT_FACE_ID)
|
||||
# define CHAR_GLYPH_SPACE_P(FRAME, GLYPH) \
|
||||
((GLYPH).u.ch == SPACEGLYPH \
|
||||
&& (GLYPH).face_id == DEFAULT_FACE_ID \
|
||||
&& (GLYPH).frame == (FRAME))
|
||||
|
||||
/* Are glyph slices of glyphs *X and *Y equal? It assumes that both
|
||||
glyphs have the same type.
|
||||
|
|
@ -654,6 +661,7 @@ struct glyph
|
|||
&& (X)->u.val == (Y)->u.val \
|
||||
&& GLYPH_SLICE_EQUAL_P (X, Y) \
|
||||
&& (X)->face_id == (Y)->face_id \
|
||||
&& (X)->frame == (Y)->frame \
|
||||
&& (X)->padding_p == (Y)->padding_p \
|
||||
&& (X)->left_box_line_p == (Y)->left_box_line_p \
|
||||
&& (X)->right_box_line_p == (Y)->right_box_line_p \
|
||||
|
|
@ -665,16 +673,18 @@ struct glyph
|
|||
#define GLYPH_CHAR_AND_FACE_EQUAL_P(X, Y) \
|
||||
((X)->u.ch == (Y)->u.ch \
|
||||
&& (X)->face_id == (Y)->face_id \
|
||||
&& (X)->frame == (Y)->frame \
|
||||
&& (X)->padding_p == (Y)->padding_p)
|
||||
|
||||
/* Fill a character glyph GLYPH. CODE, FACE_ID, PADDING_P correspond
|
||||
to the bits defined for the typedef `GLYPH' in lisp.h. */
|
||||
|
||||
#define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P) \
|
||||
#define SET_CHAR_GLYPH(FRAME, GLYPH, CODE, FACE_ID, PADDING_P) \
|
||||
do \
|
||||
{ \
|
||||
(GLYPH).u.ch = (CODE); \
|
||||
(GLYPH).face_id = (FACE_ID); \
|
||||
(GLYPH).frame = (FRAME); \
|
||||
(GLYPH).padding_p = (PADDING_P); \
|
||||
} \
|
||||
while (false)
|
||||
|
|
@ -682,11 +692,9 @@ struct glyph
|
|||
/* Fill a character type glyph GLYPH from a glyph typedef FROM as
|
||||
defined in lisp.h. */
|
||||
|
||||
#define SET_CHAR_GLYPH_FROM_GLYPH(GLYPH, FROM) \
|
||||
SET_CHAR_GLYPH (GLYPH, \
|
||||
GLYPH_CHAR (FROM), \
|
||||
GLYPH_FACE (FROM), \
|
||||
false)
|
||||
#define SET_CHAR_GLYPH_FROM_GLYPH(FRAME, GLYPH, FROM) \
|
||||
SET_CHAR_GLYPH (FRAME, GLYPH, GLYPH_CHAR (FROM), \
|
||||
GLYPH_FACE (FROM), false)
|
||||
|
||||
/* Construct a glyph code from a character glyph GLYPH. If the
|
||||
character is multibyte, return -1 as we can't use glyph table for a
|
||||
|
|
@ -3805,7 +3813,7 @@ extern void adjust_frame_glyphs (struct frame *);
|
|||
void free_glyphs (struct frame *);
|
||||
void free_window_matrices (struct window *);
|
||||
void check_glyph_memory (void);
|
||||
void mirrored_line_dance (struct glyph_matrix *, int, int, int *, char *);
|
||||
void mirrored_line_dance (struct frame *f, int, int, int *, char *);
|
||||
void clear_glyph_matrix (struct glyph_matrix *);
|
||||
void clear_current_matrices (struct frame *f);
|
||||
void clear_desired_matrices (struct frame *);
|
||||
|
|
@ -3829,7 +3837,7 @@ extern bool frame_size_change_delayed (struct frame *);
|
|||
void init_display (void);
|
||||
void syms_of_display (void);
|
||||
extern void spec_glyph_lookup_face (struct window *, GLYPH *);
|
||||
extern void fill_up_frame_row_with_spaces (struct glyph_row *, int);
|
||||
extern void fill_up_frame_row_with_spaces (struct frame *, struct glyph_row *, int);
|
||||
|
||||
/* Defined in terminal.c. */
|
||||
|
||||
|
|
@ -3911,6 +3919,16 @@ extern void gui_redo_mouse_highlight (Display_Info *);
|
|||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
struct frame *root_frame (struct frame *f);
|
||||
Lisp_Object frames_in_reverse_z_order (struct frame *f, bool visible);
|
||||
bool is_tty_frame (struct frame *f);
|
||||
bool is_tty_child_frame (struct frame *f);
|
||||
bool is_tty_root_frame (struct frame *f);
|
||||
bool combine_updates (Lisp_Object root_frames, bool force_p, bool inhibit_id_p);
|
||||
bool combine_updates_for_frame (struct frame *f, bool force_p, bool inhibit_id_p);
|
||||
void tty_raise_lower_frame (struct frame *f, bool raise);
|
||||
int max_child_z_order (struct frame *parent);
|
||||
|
||||
INLINE_HEADER_END
|
||||
|
||||
#endif /* not DISPEXTERN_H_INCLUDED */
|
||||
|
|
|
|||
1192
src/dispnew.c
1192
src/dispnew.c
File diff suppressed because it is too large
Load diff
|
|
@ -28,7 +28,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
&& EQ (XCHAR_TABLE (obj)->purpose, Qdisplay_table) \
|
||||
&& CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (obj)) == DISP_TABLE_EXTRA_SLOTS)
|
||||
|
||||
#define DISP_TABLE_EXTRA_SLOTS 6
|
||||
#define DISP_TABLE_EXTRA_SLOTS 12
|
||||
#define DISP_TRUNC_GLYPH(dp) ((dp)->extras[0])
|
||||
#define DISP_CONTINUE_GLYPH(dp) ((dp)->extras[1])
|
||||
#define DISP_ESCAPE_GLYPH(dp) ((dp)->extras[2])
|
||||
|
|
@ -36,6 +36,16 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
#define DISP_INVIS_VECTOR(dp) ((dp)->extras[4])
|
||||
#define DISP_BORDER_GLYPH(dp) ((dp)->extras[5])
|
||||
|
||||
enum box
|
||||
{
|
||||
BOX_VERTICAL = 6,
|
||||
BOX_HORIZONTAL,
|
||||
BOX_DOWN_RIGHT,
|
||||
BOX_DOWN_LEFT,
|
||||
BOX_UP_RIGHT,
|
||||
BOX_UP_LEFT
|
||||
};
|
||||
|
||||
extern Lisp_Object disp_char_vector (struct Lisp_Char_Table *, int);
|
||||
|
||||
#define DISP_CHAR_VECTOR(dp, c) \
|
||||
|
|
|
|||
452
src/frame.c
452
src/frame.c
|
|
@ -130,6 +130,14 @@ decode_window_system_frame (Lisp_Object frame)
|
|||
#endif
|
||||
}
|
||||
|
||||
struct frame *
|
||||
decode_tty_frame (Lisp_Object frame)
|
||||
{
|
||||
struct frame *f = decode_live_frame (frame);
|
||||
check_tty (f);
|
||||
return f;
|
||||
}
|
||||
|
||||
void
|
||||
check_window_system (struct frame *f)
|
||||
{
|
||||
|
|
@ -141,6 +149,13 @@ check_window_system (struct frame *f)
|
|||
: "Window system is not in use or not initialized");
|
||||
}
|
||||
|
||||
void
|
||||
check_tty (struct frame *f)
|
||||
{
|
||||
if (!f || !FRAME_TERMCAP_P (f))
|
||||
error ("tty frame should be used");
|
||||
}
|
||||
|
||||
/* Return the value of frame parameter PROP in frame FRAME. */
|
||||
|
||||
Lisp_Object
|
||||
|
|
@ -182,6 +197,17 @@ set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
|
|||
int olines = FRAME_MENU_BAR_LINES (f);
|
||||
int nlines = TYPE_RANGED_FIXNUMP (int, value) ? XFIXNUM (value) : 0;
|
||||
|
||||
/* Menu bars on child frames don't work on all platforms,
|
||||
which is the reason why prepare_menu_bar does not update_menu_bar
|
||||
for child frames (info from Martin Rudalics). This could be
|
||||
implemented in ttys, but it's probaly not worth it. */
|
||||
if (is_tty_child_frame (f))
|
||||
{
|
||||
FRAME_MENU_BAR_LINES (f) = 0;
|
||||
FRAME_MENU_BAR_HEIGHT (f) = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Right now, menu bars don't work properly in minibuf-only frames;
|
||||
most of the commands try to apply themselves to the minibuffer
|
||||
frame itself, and get an error because you can't switch buffers
|
||||
|
|
@ -370,17 +396,17 @@ frame_windows_min_size (Lisp_Object frame, Lisp_Object horizontal,
|
|||
}
|
||||
else
|
||||
retval = XFIXNUM (call4 (Qframe_windows_min_size, frame, horizontal,
|
||||
ignore, pixelwise));
|
||||
ignore, pixelwise));
|
||||
|
||||
/* Don't allow too small height of text-mode frames, or else cm.c
|
||||
might abort in cmcheckmagic. */
|
||||
if ((FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f)) && NILP (horizontal))
|
||||
{
|
||||
int min_height = (FRAME_MENU_BAR_LINES (f)
|
||||
+ FRAME_TAB_BAR_LINES (f)
|
||||
int min_height = (FRAME_MENU_BAR_LINES (f) + FRAME_TAB_BAR_LINES (f)
|
||||
+ FRAME_WANTS_MODELINE_P (f)
|
||||
+ 2); /* one text line and one echo-area line */
|
||||
|
||||
+ FRAME_HAS_MINIBUF_P (f));
|
||||
if (min_height == 0)
|
||||
min_height = 1;
|
||||
if (retval < min_height)
|
||||
retval = min_height;
|
||||
}
|
||||
|
|
@ -389,7 +415,6 @@ frame_windows_min_size (Lisp_Object frame, Lisp_Object horizontal,
|
|||
}
|
||||
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/**
|
||||
* keep_ratio:
|
||||
*
|
||||
|
|
@ -508,7 +533,6 @@ keep_ratio (struct frame *f, struct frame *p, int old_width, int old_height,
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
|
|
@ -833,8 +857,9 @@ adjust_frame_size (struct frame *f, int new_text_width, int new_text_height,
|
|||
|
||||
/* MSDOS frames cannot PRETEND, as they change frame size by
|
||||
manipulating video hardware. */
|
||||
if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
|
||||
FrameCols (FRAME_TTY (f)) = new_text_cols;
|
||||
if (is_tty_root_frame (f))
|
||||
if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
|
||||
FrameCols (FRAME_TTY (f)) = new_text_cols;
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM)
|
||||
if (WINDOWP (f->tab_bar_window))
|
||||
|
|
@ -866,9 +891,10 @@ adjust_frame_size (struct frame *f, int new_text_width, int new_text_height,
|
|||
resize_frame_windows (f, new_inner_height, false);
|
||||
|
||||
/* MSDOS frames cannot PRETEND, as they change frame size by
|
||||
manipulating video hardware. */
|
||||
if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
|
||||
FrameRows (FRAME_TTY (f)) = new_text_lines + FRAME_TOP_MARGIN (f);
|
||||
manipulating video hardware. */
|
||||
if (is_tty_root_frame (f))
|
||||
if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
|
||||
FrameRows (FRAME_TTY (f)) = new_text_lines + FRAME_TOP_MARGIN (f);
|
||||
}
|
||||
else if (new_text_lines != old_text_lines)
|
||||
call2 (Qwindow__pixel_to_total, frame, Qnil);
|
||||
|
|
@ -898,6 +924,9 @@ adjust_frame_size (struct frame *f, int new_text_width, int new_text_height,
|
|||
adjust_frame_glyphs (f);
|
||||
calculate_costs (f);
|
||||
SET_FRAME_GARBAGED (f);
|
||||
if (is_tty_child_frame (f))
|
||||
SET_FRAME_GARBAGED (root_frame (f));
|
||||
|
||||
/* We now say here that F was resized instead of using the old
|
||||
condition below. Some resizing must have taken place and if it was
|
||||
only shifting the root window's position (paranoia?). */
|
||||
|
|
@ -910,7 +939,6 @@ adjust_frame_size (struct frame *f, int new_text_width, int new_text_height,
|
|||
|
||||
unblock_input ();
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
{
|
||||
/* Adjust size of F's child frames. */
|
||||
Lisp_Object frames, frame1;
|
||||
|
|
@ -920,7 +948,6 @@ adjust_frame_size (struct frame *f, int new_text_width, int new_text_height,
|
|||
keep_ratio (XFRAME (frame1), f, old_native_width, old_native_height,
|
||||
new_native_width, new_native_height);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Allocate basically initialized frame. */
|
||||
|
|
@ -967,12 +994,12 @@ make_frame (bool mini_p)
|
|||
f->line_height = 1; /* !FRAME_WINDOW_P value. */
|
||||
f->new_width = -1;
|
||||
f->new_height = -1;
|
||||
f->no_special_glyphs = false;
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
f->vertical_scroll_bar_type = vertical_scroll_bar_none;
|
||||
f->horizontal_scroll_bars = false;
|
||||
f->want_fullscreen = FULLSCREEN_NONE;
|
||||
f->undecorated = false;
|
||||
f->no_special_glyphs = false;
|
||||
#ifndef HAVE_NTGUI
|
||||
f->override_redirect = false;
|
||||
#endif
|
||||
|
|
@ -1089,7 +1116,6 @@ make_frame (bool mini_p)
|
|||
return f;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/* Make a frame using a separate minibuffer window on another frame.
|
||||
MINI_WINDOW is the minibuffer window to use. nil means use the
|
||||
default (the global minibuffer). */
|
||||
|
|
@ -1183,7 +1209,7 @@ make_minibuffer_frame (void)
|
|||
: Fcar (Vminibuffer_list)), 0, 0);
|
||||
return f;
|
||||
}
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
|
||||
/* Construct a frame that refers to a terminal. */
|
||||
|
||||
|
|
@ -1209,7 +1235,7 @@ make_initial_frame (void)
|
|||
tty_frame_count = 1;
|
||||
fset_name (f, build_pure_c_string ("F1"));
|
||||
|
||||
SET_FRAME_VISIBLE (f, 1);
|
||||
SET_FRAME_VISIBLE (f, true);
|
||||
|
||||
f->output_method = terminal->type;
|
||||
f->terminal = terminal;
|
||||
|
|
@ -1246,23 +1272,55 @@ make_initial_frame (void)
|
|||
#ifndef HAVE_ANDROID
|
||||
|
||||
static struct frame *
|
||||
make_terminal_frame (struct terminal *terminal)
|
||||
make_terminal_frame (struct terminal *terminal, Lisp_Object parent,
|
||||
Lisp_Object params)
|
||||
{
|
||||
register struct frame *f;
|
||||
Lisp_Object frame;
|
||||
char name[sizeof "F" + INT_STRLEN_BOUND (tty_frame_count)];
|
||||
|
||||
if (!terminal->name)
|
||||
error ("Terminal is not live, can't create new frames on it");
|
||||
|
||||
f = make_frame (1);
|
||||
struct frame *f;
|
||||
if (NILP (parent))
|
||||
f = make_frame (true);
|
||||
else
|
||||
{
|
||||
CHECK_FRAME (parent);
|
||||
|
||||
f = NULL;
|
||||
Lisp_Object mini = Fassq (Qminibuffer, params);
|
||||
if (CONSP (mini))
|
||||
{
|
||||
mini = Fcdr (mini);
|
||||
struct kboard *kb = FRAME_KBOARD (XFRAME (parent));
|
||||
if (EQ (mini, Qnone) || NILP (mini))
|
||||
f = make_frame_without_minibuffer (Qnil, kb, Qnil);
|
||||
else if (EQ (mini, Qonly))
|
||||
{
|
||||
# if 0 /* No interest in this feature at the moment, */
|
||||
f = make_minibuffer_frame ();
|
||||
/* Not sure about this plus the unsplittable frame
|
||||
paran. */
|
||||
f->no_split = true;
|
||||
# endif
|
||||
}
|
||||
else if (WINDOWP (mini))
|
||||
f = make_frame_without_minibuffer (mini, kb, Qnil);
|
||||
}
|
||||
|
||||
if (f == NULL)
|
||||
f = make_frame (true);
|
||||
f->parent_frame = parent;
|
||||
f->z_order = 1 + max_child_z_order (XFRAME (parent));
|
||||
}
|
||||
|
||||
Lisp_Object frame;
|
||||
XSETFRAME (frame, f);
|
||||
Vframe_list = Fcons (frame, Vframe_list);
|
||||
|
||||
fset_name (f, make_formatted_string (name, "F%"PRIdMAX, ++tty_frame_count));
|
||||
|
||||
SET_FRAME_VISIBLE (f, 1);
|
||||
SET_FRAME_VISIBLE (f, true);
|
||||
|
||||
f->terminal = terminal;
|
||||
f->terminal->reference_count++;
|
||||
|
|
@ -1287,7 +1345,15 @@ make_terminal_frame (struct terminal *terminal)
|
|||
f->horizontal_scroll_bars = false;
|
||||
#endif
|
||||
|
||||
FRAME_MENU_BAR_LINES (f) = NILP (Vmenu_bar_mode) ? 0 : 1;
|
||||
/* Menu bars on child frames don't work on all platforms,
|
||||
which is the reason why prepare_menu_bar does not update_menu_bar
|
||||
for child frames (info from Martin Rudalics). This could be
|
||||
implemented in ttys, but it's unclear if it is worth it. */
|
||||
if (NILP (parent))
|
||||
FRAME_MENU_BAR_LINES (f) = NILP (Vmenu_bar_mode) ? 0 : 1;
|
||||
else
|
||||
FRAME_MENU_BAR_LINES (f) = 0;
|
||||
|
||||
FRAME_TAB_BAR_LINES (f) = NILP (Vtab_bar_mode) ? 0 : 1;
|
||||
FRAME_LINES (f) = FRAME_LINES (f) - FRAME_MENU_BAR_LINES (f)
|
||||
- FRAME_TAB_BAR_LINES (f);
|
||||
|
|
@ -1296,16 +1362,19 @@ make_terminal_frame (struct terminal *terminal)
|
|||
FRAME_TEXT_HEIGHT (f) = FRAME_TEXT_HEIGHT (f) - FRAME_MENU_BAR_HEIGHT (f)
|
||||
- FRAME_TAB_BAR_HEIGHT (f);
|
||||
|
||||
/* Mark current topmost frame obscured if we make a new root frame.
|
||||
Child frames don't completely obscure other frames. */
|
||||
if (NILP (parent) && FRAMEP (FRAME_TTY (f)->top_frame))
|
||||
{
|
||||
struct frame *top = XFRAME (FRAME_TTY (f)->top_frame);
|
||||
struct frame *root = root_frame (top);
|
||||
if (FRAME_LIVE_P (root))
|
||||
SET_FRAME_VISIBLE (root, false);
|
||||
}
|
||||
|
||||
/* Set the top frame to the newly created frame. */
|
||||
if (FRAMEP (FRAME_TTY (f)->top_frame)
|
||||
&& FRAME_LIVE_P (XFRAME (FRAME_TTY (f)->top_frame)))
|
||||
SET_FRAME_VISIBLE (XFRAME (FRAME_TTY (f)->top_frame), 2); /* obscured */
|
||||
|
||||
FRAME_TTY (f)->top_frame = frame;
|
||||
|
||||
if (!noninteractive)
|
||||
init_frame_faces (f);
|
||||
|
||||
if (!FRAME_PARENT_FRAME (f))
|
||||
FRAME_TTY (f)->top_frame = frame;
|
||||
return f;
|
||||
}
|
||||
|
||||
|
|
@ -1335,6 +1404,62 @@ get_future_frame_param (Lisp_Object parameter,
|
|||
|
||||
#endif
|
||||
|
||||
static int
|
||||
tty_child_pos_param (struct frame *child, Lisp_Object key,
|
||||
Lisp_Object params, int dflt)
|
||||
{
|
||||
Lisp_Object val = Fassq (key, params);
|
||||
if (CONSP (val))
|
||||
{
|
||||
val = XCDR (val);
|
||||
if (FIXNUMP (val))
|
||||
return XFIXNUM (val);
|
||||
}
|
||||
return dflt;
|
||||
}
|
||||
|
||||
static int
|
||||
tty_child_size_param (struct frame *child, Lisp_Object key,
|
||||
Lisp_Object params, int dflt)
|
||||
{
|
||||
Lisp_Object val = Fassq (key, params);
|
||||
if (CONSP (val))
|
||||
{
|
||||
val = XCDR (val);
|
||||
if (CONSP (val))
|
||||
{
|
||||
/* Width and height may look like (width text-pixels
|
||||
. PIXELS) on window systems. Mimic that. */
|
||||
val = XCDR (val);
|
||||
if (EQ (val, Qtext_pixels))
|
||||
val = XCDR (val);
|
||||
}
|
||||
else if (FLOATP (val))
|
||||
{
|
||||
/* Width and height may be a float, in which case
|
||||
it's a multiple of the parent's value. */
|
||||
struct frame *parent = FRAME_PARENT_FRAME (child);
|
||||
int sz = (EQ (key, Qwidth) ? FRAME_TOTAL_COLS (parent)
|
||||
: FRAME_TOTAL_LINES (parent));
|
||||
val = make_fixnum (XFLOAT_DATA (val) * sz);
|
||||
}
|
||||
|
||||
if (FIXNUMP (val) && XFIXNUM (val) > 0)
|
||||
return XFIXNUM (val);
|
||||
}
|
||||
return dflt;
|
||||
}
|
||||
|
||||
static void
|
||||
child_frame_rect (struct frame *f, Lisp_Object params,
|
||||
int *x, int *y, int *w, int *h)
|
||||
{
|
||||
*x = tty_child_pos_param (f, Qleft, params, 0);
|
||||
*y = tty_child_pos_param (f, Qtop, params, 0);
|
||||
*w = tty_child_size_param (f, Qwidth, params, FRAME_TOTAL_COLS (f));
|
||||
*h = tty_child_size_param (f, Qheight, params, FRAME_TOTAL_LINES (f));
|
||||
}
|
||||
|
||||
DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
|
||||
1, 1, 0,
|
||||
doc: /* Create an additional terminal frame, possibly on another terminal.
|
||||
|
|
@ -1358,9 +1483,7 @@ affects all frames on the same terminal device. */)
|
|||
error ("Text terminals are not supported on this platform");
|
||||
return Qnil;
|
||||
#else
|
||||
struct frame *f;
|
||||
struct terminal *t = NULL;
|
||||
Lisp_Object frame;
|
||||
struct frame *sf = SELECTED_FRAME ();
|
||||
|
||||
#ifdef MSDOS
|
||||
|
|
@ -1390,7 +1513,7 @@ affects all frames on the same terminal device. */)
|
|||
error ("Multiple terminals are not supported on this platform");
|
||||
if (!t)
|
||||
t = the_only_display_info.terminal;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
if (!t)
|
||||
|
|
@ -1417,19 +1540,67 @@ affects all frames on the same terminal device. */)
|
|||
SAFE_FREE ();
|
||||
}
|
||||
|
||||
f = make_terminal_frame (t);
|
||||
/* Make a new frame. We need to know upfront if if a parent frame is
|
||||
specified because we behave differently in this case, e.g. child
|
||||
frames don't obscure other frames. */
|
||||
Lisp_Object parent = Fcdr (Fassq (Qparent_frame, parms));
|
||||
struct frame *f = make_terminal_frame (t, parent, parms);
|
||||
|
||||
{
|
||||
int width, height;
|
||||
if (!noninteractive)
|
||||
init_frame_faces (f);
|
||||
|
||||
/* Visibility of root frames cannot be set with a frame parameter.
|
||||
Their visibility solely depends on whether or not they are the
|
||||
top_frame on the terminal. */
|
||||
if (FRAME_PARENT_FRAME (f))
|
||||
{
|
||||
Lisp_Object visible = Fassq (Qvisibility, parms);
|
||||
if (CONSP (visible))
|
||||
SET_FRAME_VISIBLE (f, !NILP (visible));
|
||||
|
||||
/* FIXME/tty: The only way to get borders on a tty is
|
||||
to allow decorations for now. */
|
||||
Lisp_Object undecorated = Fassq (Qundecorated, parms);
|
||||
if (CONSP (undecorated) && !NILP (XCDR (undecorated)))
|
||||
f->undecorated = true;
|
||||
|
||||
/* FIXME/tty: The only way to get borders on a tty is
|
||||
to allow decorations for now. */
|
||||
Lisp_Object no_focus = Fassq (Qno_accept_focus, parms);
|
||||
if (CONSP (no_focus) && !NILP (XCDR (no_focus)))
|
||||
f->no_accept_focus = true;
|
||||
|
||||
/* FIXME/tty: The only way to get borders on a tty is
|
||||
to allow decorations for now. */
|
||||
Lisp_Object no_split = Fassq (Qunsplittable, parms);
|
||||
if (CONSP (no_split) && !NILP (XCDR (no_split)))
|
||||
f->no_split = true;
|
||||
}
|
||||
|
||||
/* Determine width and height of the frame. For root frames use the
|
||||
width/height of the terminal. For child frames, take it from frame
|
||||
parameters. Note that a default (80x25) has been set in
|
||||
make_frame. We handle root frames in this way because otherwise we
|
||||
would end up needing glyph matrices for the terminal, which is both
|
||||
more work and has its downsides (think of clipping frames to the
|
||||
terminal size). */
|
||||
int x = 0, y = 0, width, height;
|
||||
if (FRAME_PARENT_FRAME (f))
|
||||
child_frame_rect (f, parms, &x, &y, &width, &height);
|
||||
else
|
||||
get_tty_size (fileno (FRAME_TTY (f)->input), &width, &height);
|
||||
/* With INHIBIT 5 pass correct text height to adjust_frame_size. */
|
||||
adjust_frame_size (f, width, height - FRAME_TOP_MARGIN (f),
|
||||
5, 0, Qterminal_frame);
|
||||
}
|
||||
|
||||
adjust_frame_size (f, width, height - FRAME_TOP_MARGIN (f), 5, 0,
|
||||
Qterminal_frame);
|
||||
adjust_frame_glyphs (f);
|
||||
|
||||
calculate_costs (f);
|
||||
XSETFRAME (frame, f);
|
||||
|
||||
f->left_pos = x;
|
||||
f->top_pos = y;
|
||||
store_in_alist (&parms, Qleft, make_fixnum (x));
|
||||
store_in_alist (&parms, Qtop, make_fixnum (y));
|
||||
store_in_alist (&parms, Qwidth, make_fixnum (width));
|
||||
store_in_alist (&parms, Qheight, make_fixnum (height));
|
||||
|
||||
store_in_alist (&parms, Qtty_type, build_string (t->display_info.tty->type));
|
||||
store_in_alist (&parms, Qtty,
|
||||
|
|
@ -1451,7 +1622,11 @@ affects all frames on the same terminal device. */)
|
|||
/* On terminal frames the `minibuffer' frame parameter is always
|
||||
virtually t. Avoid that a different value in parms causes
|
||||
complaints, see Bug#24758. */
|
||||
store_in_alist (&parms, Qminibuffer, Qt);
|
||||
if (!FRAME_PARENT_FRAME (f))
|
||||
store_in_alist (&parms, Qminibuffer, Qt);
|
||||
|
||||
Lisp_Object frame;
|
||||
XSETFRAME (frame, f);
|
||||
Fmodify_frame_parameters (frame, parms);
|
||||
|
||||
f->can_set_window_size = true;
|
||||
|
|
@ -1480,8 +1655,6 @@ affects all frames on the same terminal device. */)
|
|||
Lisp_Object
|
||||
do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object norecord)
|
||||
{
|
||||
struct frame *sf = SELECTED_FRAME (), *f;
|
||||
|
||||
/* If FRAME is a switch-frame event, extract the frame we should
|
||||
switch to. */
|
||||
if (CONSP (frame)
|
||||
|
|
@ -1493,7 +1666,9 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
|
|||
a switch-frame event to arrive after a frame is no longer live,
|
||||
especially when deleting the initial frame during startup. */
|
||||
CHECK_FRAME (frame);
|
||||
f = XFRAME (frame);
|
||||
struct frame *f = XFRAME (frame);
|
||||
struct frame *sf = SELECTED_FRAME ();
|
||||
|
||||
/* Silently ignore dead and tooltip frames (Bug#47207). */
|
||||
if (!FRAME_LIVE_P (f) || FRAME_TOOLTIP_P (f))
|
||||
return Qnil;
|
||||
|
|
@ -1546,24 +1721,37 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
|
|||
struct tty_display_info *tty = FRAME_TTY (f);
|
||||
Lisp_Object top_frame = tty->top_frame;
|
||||
|
||||
/* Don't mark the frame garbaged and/or obscured if we are
|
||||
switching to the frame that is already the top frame of that
|
||||
TTY. */
|
||||
/* Don't mark the frame garbaged if we are switching to the frame
|
||||
that is already the top frame of that TTY. */
|
||||
if (!EQ (frame, top_frame))
|
||||
{
|
||||
struct frame *new_root = root_frame (f);
|
||||
SET_FRAME_VISIBLE (new_root, true);
|
||||
SET_FRAME_VISIBLE (f, true);
|
||||
|
||||
/* Mark previously displayed frame as no longer visible. */
|
||||
if (FRAMEP (top_frame))
|
||||
/* Mark previously displayed frame as now obscured. */
|
||||
SET_FRAME_VISIBLE (XFRAME (top_frame), 2);
|
||||
SET_FRAME_VISIBLE (f, 1);
|
||||
/* If the new TTY frame changed dimensions, we need to
|
||||
resync term.c's idea of the frame size with the new
|
||||
frame's data. */
|
||||
if (FRAME_COLS (f) != FrameCols (tty))
|
||||
FrameCols (tty) = FRAME_COLS (f);
|
||||
if (FRAME_TOTAL_LINES (f) != FrameRows (tty))
|
||||
FrameRows (tty) = FRAME_TOTAL_LINES (f);
|
||||
{
|
||||
struct frame *top = XFRAME (top_frame);
|
||||
struct frame *old_root = root_frame (top);
|
||||
if (old_root != new_root)
|
||||
SET_FRAME_VISIBLE (old_root, false);
|
||||
}
|
||||
|
||||
tty->top_frame = frame;
|
||||
|
||||
/* Why is it correct to set FrameCols/Rows? */
|
||||
if (!FRAME_PARENT_FRAME (f))
|
||||
{
|
||||
/* If the new TTY frame changed dimensions, we need to
|
||||
resync term.c's idea of the frame size with the new
|
||||
frame's data. */
|
||||
if (FRAME_COLS (f) != FrameCols (tty))
|
||||
FrameCols (tty) = FRAME_COLS (f);
|
||||
if (FRAME_TOTAL_LINES (f) != FrameRows (tty))
|
||||
FrameRows (tty) = FRAME_TOTAL_LINES (f);
|
||||
}
|
||||
}
|
||||
tty->top_frame = frame;
|
||||
}
|
||||
|
||||
sf->select_mini_window_flag = MINI_WINDOW_P (XWINDOW (sf->selected_window));
|
||||
|
|
@ -1605,9 +1793,7 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
|
|||
(select-window (frame-root-window (make-frame))) doesn't end up
|
||||
with your typing being interpreted in the new frame instead of
|
||||
the one you're actually typing in. */
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
if (!frame_ancestor_p (f, sf))
|
||||
#endif
|
||||
internal_last_event_frame = Qnil;
|
||||
|
||||
return frame;
|
||||
|
|
@ -1725,7 +1911,6 @@ parent window is the window-system's root window) or an embedded window
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
bool
|
||||
frame_ancestor_p (struct frame *af, struct frame *df)
|
||||
{
|
||||
|
|
@ -1741,7 +1926,6 @@ frame_ancestor_p (struct frame *af, struct frame *df)
|
|||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
DEFUN ("frame-ancestor-p", Fframe_ancestor_p, Sframe_ancestor_p,
|
||||
2, 2, 0,
|
||||
|
|
@ -1752,15 +1936,10 @@ ANCESTOR and DESCENDANT must be live frames and default to the selected
|
|||
frame. */)
|
||||
(Lisp_Object ancestor, Lisp_Object descendant)
|
||||
{
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
struct frame *af = decode_live_frame (ancestor);
|
||||
struct frame *df = decode_live_frame (descendant);
|
||||
|
||||
return frame_ancestor_p (af, df) ? Qt : Qnil;
|
||||
#else
|
||||
return Qnil;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* Return CANDIDATE if it can be used as 'other-than-FRAME' frame on the
|
||||
same tty (for tty frames) or among frames which uses FRAME's keyboard.
|
||||
|
|
@ -2021,7 +2200,9 @@ other_frames (struct frame *f, bool invisible, bool force)
|
|||
&& (invisible || NILP (get_frame_param (f1, Qdelete_before)))
|
||||
/* For invisibility and normal deletions, at least one
|
||||
visible or iconified frame must remain (Bug#26682). */
|
||||
&& (FRAME_VISIBLE_P (f1) || FRAME_ICONIFIED_P (f1)
|
||||
&& (FRAME_VISIBLE_P (f1)
|
||||
|| is_tty_frame (f1)
|
||||
|| FRAME_ICONIFIED_P (f1)
|
||||
|| (!invisible
|
||||
&& (force
|
||||
/* Allow deleting the terminal frame when at
|
||||
|
|
@ -2282,7 +2463,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
|
|||
fset_root_window (f, Qnil);
|
||||
|
||||
Vframe_list = Fdelq (frame, Vframe_list);
|
||||
SET_FRAME_VISIBLE (f, 0);
|
||||
SET_FRAME_VISIBLE (f, false);
|
||||
|
||||
/* Allow the vector of menu bar contents to be freed in the next
|
||||
garbage collection. The frame object itself may not be garbage
|
||||
|
|
@ -2868,6 +3049,12 @@ If omitted, FRAME defaults to the currently selected frame. */)
|
|||
if (FRAME_WINDOW_P (f) && FRAME_TERMINAL (f)->frame_visible_invisible_hook)
|
||||
FRAME_TERMINAL (f)->frame_visible_invisible_hook (f, true);
|
||||
|
||||
if (is_tty_frame (f))
|
||||
{
|
||||
SET_FRAME_VISIBLE (f, true);
|
||||
tty_raise_lower_frame (f, true);
|
||||
}
|
||||
|
||||
make_frame_visible_1 (f->root_window);
|
||||
|
||||
/* Make menu bar update for the Buffers and Frames menus. */
|
||||
|
|
@ -2918,6 +3105,12 @@ displayed in the terminal. */)
|
|||
if (FRAME_WINDOW_P (f) && FRAME_TERMINAL (f)->frame_visible_invisible_hook)
|
||||
FRAME_TERMINAL (f)->frame_visible_invisible_hook (f, false);
|
||||
|
||||
/* The Elisp info manual says that this "usually" makes child frames
|
||||
invisible, too, but without saying when not. Since users can't rely
|
||||
on this, it's not implemented. */
|
||||
if (is_tty_frame (f))
|
||||
SET_FRAME_VISIBLE (f, false);
|
||||
|
||||
/* Make menu bar update for the Buffers and Frames menus. */
|
||||
windows_or_buffers_changed = 16;
|
||||
|
||||
|
|
@ -2977,10 +3170,13 @@ currently being displayed on the terminal. */)
|
|||
(Lisp_Object frame)
|
||||
{
|
||||
CHECK_LIVE_FRAME (frame);
|
||||
struct frame *f = XFRAME (frame);
|
||||
|
||||
if (FRAME_VISIBLE_P (XFRAME (frame)))
|
||||
if (FRAME_VISIBLE_P (f))
|
||||
return Qt;
|
||||
if (FRAME_ICONIFIED_P (XFRAME (frame)))
|
||||
else if (is_tty_root_frame (f))
|
||||
return Qt;
|
||||
if (FRAME_ICONIFIED_P (f))
|
||||
return Qicon;
|
||||
return Qnil;
|
||||
}
|
||||
|
|
@ -3012,12 +3208,7 @@ doesn't support multiple overlapping frames, this function selects FRAME. */)
|
|||
|
||||
XSETFRAME (frame, f);
|
||||
|
||||
if (FRAME_TERMCAP_P (f))
|
||||
/* On a text terminal select FRAME. */
|
||||
Fselect_frame (frame, Qnil);
|
||||
else
|
||||
/* Do like the documentation says. */
|
||||
Fmake_frame_visible (frame);
|
||||
Fmake_frame_visible (frame);
|
||||
|
||||
if (FRAME_TERMINAL (f)->frame_raise_lower_hook)
|
||||
(*FRAME_TERMINAL (f)->frame_raise_lower_hook) (f, true);
|
||||
|
|
@ -3318,6 +3509,15 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val)
|
|||
val = old_val;
|
||||
}
|
||||
|
||||
/* Re-parenting is currently not implemented when changing a root
|
||||
frame to a child frame or vice versa. */
|
||||
if (is_tty_frame (f) && EQ (prop, Qparent_frame))
|
||||
{
|
||||
if (NILP (f->parent_frame) != NILP (val))
|
||||
error ("Making a root frame a child or vice versa is not supported");
|
||||
f->parent_frame = val;
|
||||
}
|
||||
|
||||
/* The tty color needed to be set before the frame's parameter
|
||||
alist was updated with the new value. This is not true any more,
|
||||
but we still do this test early on. */
|
||||
|
|
@ -3441,13 +3641,10 @@ If FRAME is omitted or nil, return information on the currently selected frame.
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* This ought to be correct in f->param_alist for an X frame. */
|
||||
Lisp_Object lines;
|
||||
|
||||
XSETFASTINT (lines, FRAME_MENU_BAR_LINES (f));
|
||||
store_in_alist (&alist, Qmenu_bar_lines, lines);
|
||||
XSETFASTINT (lines, FRAME_TAB_BAR_LINES (f));
|
||||
store_in_alist (&alist, Qtab_bar_lines, lines);
|
||||
store_in_alist (&alist, Qmenu_bar_lines, make_fixnum (FRAME_MENU_BAR_LINES (f)));
|
||||
store_in_alist (&alist, Qtab_bar_lines, make_fixnum (FRAME_TAB_BAR_LINES (f)));
|
||||
store_in_alist (&alist, Qvisibility, FRAME_VISIBLE_P (f) ? Qt : Qnil);
|
||||
store_in_alist (&alist, Qno_accept_focus, FRAME_NO_ACCEPT_FOCUS (f) ? Qt : Qnil);
|
||||
}
|
||||
|
||||
return alist;
|
||||
|
|
@ -3525,7 +3722,6 @@ If FRAME is nil, describe the currently selected frame. */)
|
|||
return value;
|
||||
}
|
||||
|
||||
|
||||
DEFUN ("modify-frame-parameters", Fmodify_frame_parameters,
|
||||
Smodify_frame_parameters, 2, 2, 0,
|
||||
doc: /* Modify FRAME according to new values of its parameters in ALIST.
|
||||
|
|
@ -3563,6 +3759,7 @@ list, but are otherwise ignored. */)
|
|||
USE_SAFE_ALLOCA;
|
||||
SAFE_ALLOCA_LISP (parms, 2 * length);
|
||||
values = parms + length;
|
||||
Lisp_Object params = alist;
|
||||
|
||||
/* Extract parm names and values into those vectors. */
|
||||
|
||||
|
|
@ -3588,6 +3785,31 @@ list, but are otherwise ignored. */)
|
|||
update_face_from_frame_parameter (f, prop, val);
|
||||
}
|
||||
|
||||
if (is_tty_child_frame (f))
|
||||
{
|
||||
int x = tty_child_pos_param (f, Qleft, params, f->left_pos);
|
||||
int y = tty_child_pos_param (f, Qtop, params, f->top_pos);
|
||||
if (x != f->left_pos || y != f->top_pos)
|
||||
{
|
||||
f->left_pos = x;
|
||||
f->top_pos = y;
|
||||
SET_FRAME_GARBAGED (root_frame (f));
|
||||
}
|
||||
|
||||
int w = tty_child_size_param (f, Qwidth, params, f->total_cols);
|
||||
int h = tty_child_size_param (f, Qheight, params, f->total_lines);
|
||||
if (w != f->total_cols || h != f->total_lines)
|
||||
change_frame_size (f, w, h, false, false, false);
|
||||
|
||||
Lisp_Object visible = Fassq (Qvisibility, params);
|
||||
if (CONSP (visible))
|
||||
SET_FRAME_VISIBLE (f, !NILP (Fcdr (visible)));
|
||||
|
||||
Lisp_Object no_special = Fassq (Qno_special_glyphs, params);
|
||||
if (CONSP (no_special))
|
||||
FRAME_NO_SPECIAL_GLYPHS (f) = !NILP (Fcdr (no_special));
|
||||
}
|
||||
|
||||
SAFE_FREE ();
|
||||
}
|
||||
return Qnil;
|
||||
|
|
@ -3935,6 +4157,11 @@ bottom edge of FRAME's display. */)
|
|||
(void) yval;
|
||||
#endif
|
||||
}
|
||||
else if (is_tty_child_frame (f))
|
||||
{
|
||||
f->left_pos = xval;
|
||||
f->top_pos = yval;
|
||||
}
|
||||
|
||||
return Qt;
|
||||
}
|
||||
|
|
@ -4246,6 +4473,28 @@ frame_float (struct frame *f, Lisp_Object val, enum frame_float_type what,
|
|||
}
|
||||
}
|
||||
|
||||
/* Handle frame parameter change with frame parameter handler. F is the
|
||||
frame whose frame parameter was changed. PROP is the name of the
|
||||
frame parameter. VAL and OLD_VALUE are the current value and old
|
||||
value of the frame parameter. */
|
||||
|
||||
static void
|
||||
handle_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val,
|
||||
Lisp_Object old_value)
|
||||
{
|
||||
Lisp_Object param_index = Fget (prop, Qx_frame_parameter);
|
||||
if (FIXNATP (param_index) && XFIXNAT (param_index) < ARRAYELTS (frame_parms))
|
||||
{
|
||||
if (FRAME_RIF (f))
|
||||
{
|
||||
frame_parm_handler handler
|
||||
= FRAME_RIF (f)->frame_parm_handlers[XFIXNAT (param_index)];
|
||||
if (handler)
|
||||
handler (f, val, old_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Change the parameters of frame F as specified by ALIST.
|
||||
If a parameter is not specially recognized, do nothing special;
|
||||
otherwise call the `gui_set_...' function for that parameter.
|
||||
|
|
@ -4387,17 +4636,9 @@ gui_set_frame_parameters_1 (struct frame *f, Lisp_Object alist,
|
|||
}
|
||||
else
|
||||
{
|
||||
Lisp_Object param_index, old_value;
|
||||
|
||||
old_value = get_frame_param (f, prop);
|
||||
|
||||
Lisp_Object old_value = get_frame_param (f, prop);
|
||||
store_frame_param (f, prop, val);
|
||||
|
||||
param_index = Fget (prop, Qx_frame_parameter);
|
||||
if (FIXNATP (param_index)
|
||||
&& XFIXNAT (param_index) < ARRAYELTS (frame_parms)
|
||||
&& FRAME_RIF (f)->frame_parm_handlers[XFIXNUM (param_index)])
|
||||
(*(FRAME_RIF (f)->frame_parm_handlers[XFIXNUM (param_index)])) (f, val, old_value);
|
||||
handle_frame_param (f, prop, val, old_value);
|
||||
|
||||
if (!default_parameter && EQ (prop, Qfont))
|
||||
/* The user manually specified the `font' frame parameter.
|
||||
|
|
@ -4716,14 +4957,7 @@ gui_set_screen_gamma (struct frame *f, Lisp_Object new_value, Lisp_Object old_va
|
|||
/* Apply the new gamma value to the frame background. */
|
||||
bgcolor = Fassq (Qbackground_color, f->param_alist);
|
||||
if (CONSP (bgcolor) && (bgcolor = XCDR (bgcolor), STRINGP (bgcolor)))
|
||||
{
|
||||
Lisp_Object parm_index = Fget (Qbackground_color, Qx_frame_parameter);
|
||||
if (FIXNATP (parm_index)
|
||||
&& XFIXNAT (parm_index) < ARRAYELTS (frame_parms)
|
||||
&& FRAME_RIF (f)->frame_parm_handlers[XFIXNAT (parm_index)])
|
||||
(*FRAME_RIF (f)->frame_parm_handlers[XFIXNAT (parm_index)])
|
||||
(f, bgcolor, Qnil);
|
||||
}
|
||||
handle_frame_param (f, Qbackground_color, bgcolor, Qnil);
|
||||
|
||||
clear_face_cache (true); /* FIXME: Why of all frames? */
|
||||
fset_redisplay (f);
|
||||
|
|
|
|||
84
src/frame.h
84
src/frame.h
|
|
@ -161,10 +161,8 @@ struct frame
|
|||
Usually it is nil. */
|
||||
Lisp_Object title;
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM)
|
||||
/* This frame's parent frame, if it has one. */
|
||||
Lisp_Object parent_frame;
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
/* Last device to move over this frame. Any value that isn't a
|
||||
string means the "Virtual core pointer". */
|
||||
|
|
@ -385,15 +383,8 @@ struct frame
|
|||
zero if the frame has been made invisible without an icon. */
|
||||
|
||||
/* Nonzero if the frame is currently displayed; we check
|
||||
it to see if we should bother updating the frame's contents.
|
||||
|
||||
On ttys and on Windows NT/9X, to avoid wasting effort updating
|
||||
visible frames that are actually completely obscured by other
|
||||
windows on the display, we bend the meaning of visible slightly:
|
||||
if equal to 2, then the frame is obscured - we still consider
|
||||
it to be "visible" as seen from lisp, but we don't bother
|
||||
updating it. */
|
||||
unsigned visible : 2;
|
||||
it to see if we should bother updating the frame's contents. */
|
||||
unsigned visible : 1;
|
||||
|
||||
/* True if the frame is currently iconified. Do not
|
||||
set this directly, use SET_FRAME_ICONIFIED instead. */
|
||||
|
|
@ -451,7 +442,15 @@ struct frame
|
|||
This must be the same as the terminal->type. */
|
||||
ENUM_BF (output_method) output_method : 4;
|
||||
|
||||
/* True if this is an undecorated frame. */
|
||||
bool_bf undecorated : 1;
|
||||
|
||||
/* Nonzero if this frame's window does not want to receive input focus
|
||||
via mouse clicks or by moving the mouse into it. */
|
||||
bool_bf no_accept_focus : 1;
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
# ifndef HAVE_NTGUI
|
||||
/* True if this frame is a tooltip frame. */
|
||||
bool_bf tooltip : 1;
|
||||
|
||||
|
|
@ -465,10 +464,7 @@ struct frame
|
|||
/* Nonzero if we should actually display horizontal scroll bars on this frame. */
|
||||
bool_bf horizontal_scroll_bars : 1;
|
||||
|
||||
/* True if this is an undecorated frame. */
|
||||
bool_bf undecorated : 1;
|
||||
|
||||
#ifndef HAVE_NTGUI
|
||||
/* True if this is an override_redirect frame. */
|
||||
bool_bf override_redirect : 1;
|
||||
#endif
|
||||
|
|
@ -480,17 +476,13 @@ struct frame
|
|||
receive input focus when it is mapped. */
|
||||
bool_bf no_focus_on_map : 1;
|
||||
|
||||
/* Nonzero if this frame's window does not want to receive input focus
|
||||
via mouse clicks or by moving the mouse into it. */
|
||||
bool_bf no_accept_focus : 1;
|
||||
|
||||
/* The z-group this frame's window belongs to. */
|
||||
ENUM_BF (z_group) z_group : 2;
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
/* Non-zero if display of truncation and continuation glyphs outside
|
||||
the fringes is suppressed. */
|
||||
bool_bf no_special_glyphs : 1;
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
/* True means set_window_size_hook requests can be processed for
|
||||
this frame. */
|
||||
|
|
@ -740,7 +732,10 @@ struct frame
|
|||
#ifdef HAVE_TEXT_CONVERSION
|
||||
/* Text conversion state used by certain input methods. */
|
||||
struct text_conversion_state conversion;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Z-order of child frames. */
|
||||
int z_order;
|
||||
} GCALIGNED_STRUCT;
|
||||
|
||||
/* Most code should use these functions to set Lisp fields in struct frame. */
|
||||
|
|
@ -1021,9 +1016,11 @@ default_pixels_per_inch_y (void)
|
|||
does not have FRAME_DISPLAY_INFO. */
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
#ifndef HAVE_ANDROID
|
||||
# define MOUSE_HL_INFO(F) \
|
||||
# define MOUSE_HL_INFO(F) \
|
||||
(FRAME_WINDOW_P (F) \
|
||||
? &FRAME_DISPLAY_INFO(F)->mouse_highlight \
|
||||
? (FRAME_OUTPUT_DATA (F) \
|
||||
? &FRAME_DISPLAY_INFO (F)->mouse_highlight \
|
||||
: NULL) \
|
||||
: &(F)->output_data.tty->display_info->mouse_highlight)
|
||||
#else
|
||||
/* There is no "struct tty_output" on Android at all. */
|
||||
|
|
@ -1176,9 +1173,6 @@ default_pixels_per_inch_y (void)
|
|||
&& FRAME_X_VISIBLE (f)))
|
||||
#endif
|
||||
|
||||
/* True if frame F is currently visible but hidden. */
|
||||
#define FRAME_OBSCURED_P(f) ((f)->visible > 1)
|
||||
|
||||
/* True if frame F is currently iconified. */
|
||||
#define FRAME_ICONIFIED_P(f) (f)->iconified
|
||||
|
||||
|
|
@ -1243,21 +1237,23 @@ default_pixels_per_inch_y (void)
|
|||
#define FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT(f) ((void) (f), 0)
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM)
|
||||
INLINE struct frame *
|
||||
FRAME_PARENT_FRAME (struct frame *f)
|
||||
{
|
||||
return NILP (f->parent_frame) ? NULL : XFRAME (f->parent_frame);
|
||||
}
|
||||
|
||||
#define FRAME_UNDECORATED(f) ((f)->undecorated)
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM)
|
||||
#ifdef HAVE_NTGUI
|
||||
#define FRAME_OVERRIDE_REDIRECT(f) ((void) (f), 0)
|
||||
#else
|
||||
#define FRAME_OVERRIDE_REDIRECT(f) ((f)->override_redirect)
|
||||
#endif
|
||||
#define FRAME_PARENT_FRAME(f) \
|
||||
(NILP ((f)->parent_frame) \
|
||||
? NULL \
|
||||
: XFRAME ((f)->parent_frame))
|
||||
#define FRAME_SKIP_TASKBAR(f) ((f)->skip_taskbar)
|
||||
#define FRAME_NO_FOCUS_ON_MAP(f) ((f)->no_focus_on_map)
|
||||
#define FRAME_NO_ACCEPT_FOCUS(f) ((f)->no_accept_focus)
|
||||
#define FRAME_NO_SPECIAL_GLYPHS(f) ((f)->no_special_glyphs)
|
||||
#define FRAME_Z_GROUP(f) ((f)->z_group)
|
||||
#define FRAME_Z_GROUP_NONE(f) ((f)->z_group == z_group_none)
|
||||
#define FRAME_Z_GROUP_ABOVE(f) ((f)->z_group == z_group_above)
|
||||
|
|
@ -1270,13 +1266,10 @@ default_pixels_per_inch_y (void)
|
|||
#define FRAME_NS_TRANSPARENT_TITLEBAR(f) ((f)->ns_transparent_titlebar)
|
||||
#endif
|
||||
#else /* not HAVE_WINDOW_SYSTEM */
|
||||
#define FRAME_UNDECORATED(f) ((void) (f), 0)
|
||||
#define FRAME_OVERRIDE_REDIRECT(f) ((void) (f), 0)
|
||||
#define FRAME_PARENT_FRAME(f) ((void) (f), NULL)
|
||||
#define FRAME_SKIP_TASKBAR(f) ((void) (f), 0)
|
||||
#define FRAME_NO_FOCUS_ON_MAP(f) ((void) (f), 0)
|
||||
#define FRAME_NO_ACCEPT_FOCUS(f) ((void) (f), 0)
|
||||
#define FRAME_NO_SPECIAL_GLYPHS(f) ((void) (f), 0)
|
||||
#define FRAME_Z_GROUP(f) ((void) (f), z_group_none)
|
||||
#define FRAME_Z_GROUP_NONE(f) ((void) (f), true)
|
||||
#define FRAME_Z_GROUP_ABOVE(f) ((void) (f), false)
|
||||
|
|
@ -1284,6 +1277,8 @@ default_pixels_per_inch_y (void)
|
|||
#define FRAME_TOOLTIP_P(f) ((void) f, false)
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
#define FRAME_NO_SPECIAL_GLYPHS(f) ((f)->no_special_glyphs)
|
||||
|
||||
/* Whether horizontal scroll bars are currently enabled for frame F. */
|
||||
#if USE_HORIZONTAL_SCROLL_BARS
|
||||
#define FRAME_HAS_HORIZONTAL_SCROLL_BARS(f) \
|
||||
|
|
@ -1445,9 +1440,8 @@ extern bool frame_garbaged;
|
|||
if some changes were applied to it while it wasn't visible (and hence
|
||||
wasn't redisplayed). */
|
||||
INLINE void
|
||||
SET_FRAME_VISIBLE (struct frame *f, int v)
|
||||
SET_FRAME_VISIBLE (struct frame *f, bool v)
|
||||
{
|
||||
eassert (0 <= v && v <= 2);
|
||||
if (v)
|
||||
{
|
||||
if (v == 1 && f->visible != 1)
|
||||
|
|
@ -1504,13 +1498,14 @@ extern struct frame *decode_any_frame (Lisp_Object);
|
|||
extern struct frame *make_initial_frame (void);
|
||||
extern struct frame *make_frame (bool);
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
extern struct frame *make_minibuffer_frame (void);
|
||||
extern struct frame *make_frame_without_minibuffer (Lisp_Object,
|
||||
struct kboard *,
|
||||
Lisp_Object);
|
||||
extern bool display_available (void);
|
||||
#endif
|
||||
|
||||
struct frame *make_minibuffer_frame (void);
|
||||
struct frame *
|
||||
make_frame_without_minibuffer (Lisp_Object mini_window,
|
||||
KBOARD *kb, Lisp_Object display);
|
||||
|
||||
INLINE bool
|
||||
window_system_available (struct frame *f)
|
||||
{
|
||||
|
|
@ -1522,6 +1517,8 @@ window_system_available (struct frame *f)
|
|||
}
|
||||
|
||||
extern WINDOW_SYSTEM_RETURN void check_window_system (struct frame *);
|
||||
void check_tty (struct frame *f);
|
||||
struct frame *decode_tty_frame (Lisp_Object frame);
|
||||
extern void frame_make_pointer_invisible (struct frame *);
|
||||
extern void frame_make_pointer_visible (struct frame *);
|
||||
extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object);
|
||||
|
|
@ -1617,15 +1614,11 @@ FRAME_CHILD_FRAME_BORDER_WIDTH (struct frame *f)
|
|||
INLINE int
|
||||
FRAME_INTERNAL_BORDER_WIDTH (struct frame *f)
|
||||
{
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
return (FRAME_PARENT_FRAME(f)
|
||||
? (FRAME_CHILD_FRAME_BORDER_WIDTH(f) >= 0
|
||||
? FRAME_CHILD_FRAME_BORDER_WIDTH(f)
|
||||
: frame_dimension (f->internal_border_width))
|
||||
: frame_dimension (f->internal_border_width));
|
||||
#else
|
||||
return frame_dimension (f->internal_border_width);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Pixel-size of window divider lines. */
|
||||
|
|
@ -1880,7 +1873,6 @@ extern Lisp_Object gui_display_get_resource (Display_Info *,
|
|||
extern void set_frame_menubar (struct frame *f, bool deep_p);
|
||||
extern void frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y);
|
||||
extern void free_frame_menubar (struct frame *);
|
||||
extern bool frame_ancestor_p (struct frame *af, struct frame *df);
|
||||
extern enum internal_border_part frame_internal_border_part (struct frame *f, int x, int y);
|
||||
|
||||
#if defined HAVE_X_WINDOWS
|
||||
|
|
@ -1907,6 +1899,8 @@ gui_set_bitmap_icon (struct frame *f)
|
|||
#endif /* !HAVE_NS */
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
extern bool frame_ancestor_p (struct frame *af, struct frame *df);
|
||||
|
||||
INLINE void
|
||||
flush_frame (struct frame *f)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5415,7 +5415,7 @@ static const char *const lispy_kana_keys[] =
|
|||
|
||||
/* You'll notice that this table is arranged to be conveniently
|
||||
indexed by X Windows keysym values. */
|
||||
#ifdef HAVE_NS
|
||||
#if defined HAVE_NS || !defined HAVE_WINDOW_SYSTEM
|
||||
/* FIXME: Why are we using X11 keysym values for NS? */
|
||||
static
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -913,7 +913,11 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
|
|||
XWINDOW (minibuf_window)->cursor.hpos = 0;
|
||||
XWINDOW (minibuf_window)->cursor.x = 0;
|
||||
XWINDOW (minibuf_window)->must_be_updated_p = true;
|
||||
update_frame (XFRAME (selected_frame), true, true);
|
||||
struct frame *sf = XFRAME (selected_frame);
|
||||
update_frame (sf, true, true);
|
||||
if (is_tty_frame (sf))
|
||||
combine_updates_for_frame (sf, true, true);
|
||||
|
||||
#ifndef HAVE_NTGUI
|
||||
flush_frame (XFRAME (XWINDOW (minibuf_window)->frame));
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -3351,7 +3351,7 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
|
|||
[nswindow orderFront: NSApp];
|
||||
[nswindow display];
|
||||
|
||||
SET_FRAME_VISIBLE (tip_f, 1);
|
||||
SET_FRAME_VISIBLE (tip_f, true);
|
||||
unblock_input ();
|
||||
|
||||
goto start_timer;
|
||||
|
|
@ -3534,7 +3534,7 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
|
|||
[nswindow orderFront: NSApp];
|
||||
[nswindow display];
|
||||
|
||||
SET_FRAME_VISIBLE (tip_f, YES);
|
||||
SET_FRAME_VISIBLE (tip_f, true);
|
||||
FRAME_PIXEL_WIDTH (tip_f) = width;
|
||||
FRAME_PIXEL_HEIGHT (tip_f) = height;
|
||||
unblock_input ();
|
||||
|
|
|
|||
|
|
@ -1505,7 +1505,7 @@ ns_make_frame_visible (struct frame *f)
|
|||
EmacsView *view = (EmacsView *)FRAME_NS_VIEW (f);
|
||||
EmacsWindow *window = (EmacsWindow *)[view window];
|
||||
|
||||
SET_FRAME_VISIBLE (f, 1);
|
||||
SET_FRAME_VISIBLE (f, true);
|
||||
ns_raise_frame (f, ! FRAME_NO_FOCUS_ON_MAP (f));
|
||||
|
||||
/* Making a new frame from a fullscreen frame will make the new frame
|
||||
|
|
@ -1550,7 +1550,7 @@ ns_make_frame_invisible (struct frame *f)
|
|||
check_window_system (f);
|
||||
view = FRAME_NS_VIEW (f);
|
||||
[[view window] orderOut: NSApp];
|
||||
SET_FRAME_VISIBLE (f, 0);
|
||||
SET_FRAME_VISIBLE (f, false);
|
||||
SET_FRAME_ICONIFIED (f, 0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -366,7 +366,7 @@ do_scrolling (struct frame *frame, struct glyph_matrix *current_matrix,
|
|||
eassert (copy_from[k] >= 0 && copy_from[k] < window_size);
|
||||
|
||||
/* Perform the row swizzling. */
|
||||
mirrored_line_dance (current_matrix, unchanged_at_top, window_size,
|
||||
mirrored_line_dance (frame, unchanged_at_top, window_size,
|
||||
copy_from, retained_p);
|
||||
|
||||
/* Some sanity checks if GLYPH_DEBUG is defined. */
|
||||
|
|
@ -780,7 +780,7 @@ do_direct_scrolling (struct frame *frame, struct glyph_matrix *current_matrix,
|
|||
copy_from[i] gives the original line to copy to I, and
|
||||
retained_p[copy_from[i]] is zero if line I in the new display is
|
||||
empty. */
|
||||
mirrored_line_dance (current_matrix, unchanged_at_top, window_size,
|
||||
mirrored_line_dance (frame, unchanged_at_top, window_size,
|
||||
copy_from, retained_p);
|
||||
|
||||
if (terminal_window_p)
|
||||
|
|
|
|||
266
src/term.c
266
src/term.c
|
|
@ -65,11 +65,9 @@ static int been_here = -1;
|
|||
#ifndef HAVE_ANDROID
|
||||
|
||||
static void tty_set_scroll_region (struct frame *f, int start, int stop);
|
||||
static void turn_on_face (struct frame *, int face_id);
|
||||
static void turn_off_face (struct frame *, int face_id);
|
||||
static void turn_on_face (struct frame *f, struct face *face);
|
||||
static void turn_off_face (struct frame *f, struct face *face);
|
||||
static void tty_turn_off_highlight (struct tty_display_info *);
|
||||
static void tty_show_cursor (struct tty_display_info *);
|
||||
static void tty_hide_cursor (struct tty_display_info *);
|
||||
static void tty_background_highlight (struct tty_display_info *tty);
|
||||
static void clear_tty_hooks (struct terminal *terminal);
|
||||
static void set_tty_hooks (struct terminal *terminal);
|
||||
|
|
@ -336,7 +334,7 @@ tty_toggle_highlight (struct tty_display_info *tty)
|
|||
|
||||
/* Make cursor invisible. */
|
||||
|
||||
static void
|
||||
void
|
||||
tty_hide_cursor (struct tty_display_info *tty)
|
||||
{
|
||||
if (tty->cursor_hidden == 0)
|
||||
|
|
@ -353,7 +351,7 @@ tty_hide_cursor (struct tty_display_info *tty)
|
|||
|
||||
/* Ensure that cursor is visible. */
|
||||
|
||||
static void
|
||||
void
|
||||
tty_show_cursor (struct tty_display_info *tty)
|
||||
{
|
||||
if (tty->cursor_hidden)
|
||||
|
|
@ -788,13 +786,20 @@ tty_write_glyphs (struct frame *f, struct glyph *string, int len)
|
|||
/* Identify a run of glyphs with the same face. */
|
||||
int face_id = string->face_id;
|
||||
|
||||
/* FIXME/tty: it happens that a single glyph's frame is NULL. It
|
||||
might depend on a tab bar line being present, then switching
|
||||
from a buffer without header line to one with header line and
|
||||
opening a child frame. */
|
||||
struct frame *face_id_frame = string->frame ? string->frame : f;
|
||||
|
||||
for (n = 1; n < stringlen; ++n)
|
||||
if (string[n].face_id != face_id)
|
||||
if (string[n].face_id != face_id || string[n].frame != face_id_frame)
|
||||
break;
|
||||
|
||||
/* Turn appearance modes of the face of the run on. */
|
||||
tty_highlight_if_desired (tty);
|
||||
turn_on_face (f, face_id);
|
||||
struct face *face = FACE_FROM_ID (face_id_frame, face_id);
|
||||
turn_on_face (f, face);
|
||||
|
||||
if (n == stringlen)
|
||||
/* This is the last run. */
|
||||
|
|
@ -812,7 +817,7 @@ tty_write_glyphs (struct frame *f, struct glyph *string, int len)
|
|||
string += n;
|
||||
|
||||
/* Turn appearance modes off. */
|
||||
turn_off_face (f, face_id);
|
||||
turn_off_face (f, face);
|
||||
tty_turn_off_highlight (tty);
|
||||
}
|
||||
|
||||
|
|
@ -822,8 +827,8 @@ tty_write_glyphs (struct frame *f, struct glyph *string, int len)
|
|||
#ifndef DOS_NT
|
||||
|
||||
static void
|
||||
tty_write_glyphs_with_face (register struct frame *f, register struct glyph *string,
|
||||
register int len, register int face_id)
|
||||
tty_write_glyphs_with_face (struct frame *f, struct glyph *string,
|
||||
int len, struct face *face)
|
||||
{
|
||||
unsigned char *conversion_buffer;
|
||||
struct coding_system *coding;
|
||||
|
|
@ -856,7 +861,7 @@ tty_write_glyphs_with_face (register struct frame *f, register struct glyph *str
|
|||
|
||||
/* Turn appearance modes of the face. */
|
||||
tty_highlight_if_desired (tty);
|
||||
turn_on_face (f, face_id);
|
||||
turn_on_face (f, face);
|
||||
|
||||
coding->mode |= CODING_MODE_LAST_BLOCK;
|
||||
conversion_buffer = encode_terminal_code (string, len, coding);
|
||||
|
|
@ -871,7 +876,7 @@ tty_write_glyphs_with_face (register struct frame *f, register struct glyph *str
|
|||
}
|
||||
|
||||
/* Turn appearance modes off. */
|
||||
turn_off_face (f, face_id);
|
||||
turn_off_face (f, face);
|
||||
tty_turn_off_highlight (tty);
|
||||
|
||||
cmcheckmagic (tty);
|
||||
|
|
@ -919,6 +924,7 @@ tty_insert_glyphs (struct frame *f, struct glyph *start, int len)
|
|||
|
||||
while (len-- > 0)
|
||||
{
|
||||
struct face *face = NULL;
|
||||
OUTPUT1_IF (tty, tty->TS_ins_char);
|
||||
if (!start)
|
||||
{
|
||||
|
|
@ -928,7 +934,10 @@ tty_insert_glyphs (struct frame *f, struct glyph *start, int len)
|
|||
else
|
||||
{
|
||||
tty_highlight_if_desired (tty);
|
||||
turn_on_face (f, start->face_id);
|
||||
int face_id = start->face_id;
|
||||
struct frame *face_id_frame = start->frame;
|
||||
face = FACE_FROM_ID (face_id_frame, face_id);
|
||||
turn_on_face (f, face);
|
||||
glyph = start;
|
||||
++start;
|
||||
/* We must open sufficient space for a character which
|
||||
|
|
@ -957,9 +966,9 @@ tty_insert_glyphs (struct frame *f, struct glyph *start, int len)
|
|||
}
|
||||
|
||||
OUTPUT1_IF (tty, tty->TS_pad_inserted_char);
|
||||
if (start)
|
||||
if (face)
|
||||
{
|
||||
turn_off_face (f, glyph->face_id);
|
||||
turn_off_face (f, face);
|
||||
tty_turn_off_highlight (tty);
|
||||
}
|
||||
}
|
||||
|
|
@ -1542,6 +1551,7 @@ append_glyph (struct it *it)
|
|||
glyph->type = CHAR_GLYPH;
|
||||
glyph->pixel_width = 1;
|
||||
glyph->u.ch = it->char_to_display;
|
||||
glyph->frame = it->f;
|
||||
glyph->face_id = it->face_id;
|
||||
glyph->avoid_cursor_p = it->avoid_cursor_p;
|
||||
glyph->multibyte_p = it->multibyte_p;
|
||||
|
|
@ -1769,6 +1779,7 @@ append_composite_glyph (struct it *it)
|
|||
|
||||
glyph->avoid_cursor_p = it->avoid_cursor_p;
|
||||
glyph->multibyte_p = it->multibyte_p;
|
||||
glyph->frame = it->f;
|
||||
glyph->face_id = it->face_id;
|
||||
glyph->padding_p = false;
|
||||
glyph->charpos = CHARPOS (it->position);
|
||||
|
|
@ -1855,6 +1866,7 @@ append_glyphless_glyph (struct it *it, int face_id, const char *str)
|
|||
glyph->pixel_width = 1;
|
||||
glyph->avoid_cursor_p = it->avoid_cursor_p;
|
||||
glyph->multibyte_p = it->multibyte_p;
|
||||
glyph->frame = it->f;
|
||||
glyph->face_id = face_id;
|
||||
glyph->padding_p = false;
|
||||
glyph->charpos = CHARPOS (it->position);
|
||||
|
|
@ -1981,9 +1993,8 @@ produce_glyphless_glyph (struct it *it, Lisp_Object acronym)
|
|||
FACE_ID is a realized face ID number, in the face cache. */
|
||||
|
||||
static void
|
||||
turn_on_face (struct frame *f, int face_id)
|
||||
turn_on_face (struct frame *f, struct face *face)
|
||||
{
|
||||
struct face *face = FACE_FROM_ID (f, face_id);
|
||||
unsigned long fg = face->foreground;
|
||||
unsigned long bg = face->background;
|
||||
struct tty_display_info *tty = FRAME_TTY (f);
|
||||
|
|
@ -2064,9 +2075,8 @@ turn_on_face (struct frame *f, int face_id)
|
|||
/* Turn off appearances of face FACE_ID on tty frame F. */
|
||||
|
||||
static void
|
||||
turn_off_face (struct frame *f, int face_id)
|
||||
turn_off_face (struct frame *f, struct face *face)
|
||||
{
|
||||
struct face *face = FACE_FROM_ID (f, face_id);
|
||||
struct tty_display_info *tty = FRAME_TTY (f);
|
||||
|
||||
if (tty->TS_exit_attribute_mode)
|
||||
|
|
@ -2399,8 +2409,10 @@ A suspended tty may be resumed by calling `resume-tty' on it. */)
|
|||
t->display_info.tty->output = 0;
|
||||
|
||||
if (FRAMEP (t->display_info.tty->top_frame))
|
||||
SET_FRAME_VISIBLE (XFRAME (t->display_info.tty->top_frame), 0);
|
||||
|
||||
{
|
||||
struct frame *top = XFRAME (t->display_info.tty->top_frame);
|
||||
SET_FRAME_VISIBLE (root_frame (top), false);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear display hooks to prevent further output. */
|
||||
|
|
@ -2472,7 +2484,8 @@ frame's terminal). */)
|
|||
|
||||
if (FRAMEP (t->display_info.tty->top_frame))
|
||||
{
|
||||
struct frame *f = XFRAME (t->display_info.tty->top_frame);
|
||||
struct frame *top = XFRAME (t->display_info.tty->top_frame);
|
||||
struct frame *f = root_frame (top);
|
||||
int width, height;
|
||||
int old_height = FRAME_COLS (f);
|
||||
int old_width = FRAME_TOTAL_LINES (f);
|
||||
|
|
@ -2482,7 +2495,7 @@ frame's terminal). */)
|
|||
get_tty_size (fileno (t->display_info.tty->input), &width, &height);
|
||||
if (width != old_width || height != old_height)
|
||||
change_frame_size (f, width, height, false, false, false);
|
||||
SET_FRAME_VISIBLE (XFRAME (t->display_info.tty->top_frame), 1);
|
||||
SET_FRAME_VISIBLE (f, true);
|
||||
}
|
||||
|
||||
set_tty_hooks (t);
|
||||
|
|
@ -2563,22 +2576,24 @@ tty_draw_row_with_mouse_face (struct window *w, struct glyph_row *row,
|
|||
struct frame *f = XFRAME (WINDOW_FRAME (w));
|
||||
struct tty_display_info *tty = FRAME_TTY (f);
|
||||
int face_id = tty->mouse_highlight.mouse_face_face_id;
|
||||
int save_x, save_y, pos_x, pos_y;
|
||||
|
||||
if (end_hpos >= row->used[TEXT_AREA])
|
||||
nglyphs = row->used[TEXT_AREA] - start_hpos;
|
||||
|
||||
pos_y = row->y + WINDOW_TOP_EDGE_Y (w);
|
||||
pos_x = row->used[LEFT_MARGIN_AREA] + start_hpos + WINDOW_LEFT_EDGE_X (w);
|
||||
int pos_y = row->y + WINDOW_TOP_EDGE_Y (w);
|
||||
int pos_x = row->used[LEFT_MARGIN_AREA] + start_hpos + WINDOW_LEFT_EDGE_X (w);
|
||||
|
||||
/* Save current cursor coordinates. */
|
||||
save_y = curY (tty);
|
||||
save_x = curX (tty);
|
||||
int save_y = curY (tty);
|
||||
int save_x = curX (tty);
|
||||
cursor_to (f, pos_y, pos_x);
|
||||
|
||||
if (draw == DRAW_MOUSE_FACE)
|
||||
tty_write_glyphs_with_face (f, row->glyphs[TEXT_AREA] + start_hpos,
|
||||
nglyphs, face_id);
|
||||
{
|
||||
struct glyph *glyph = row->glyphs[TEXT_AREA] + start_hpos;
|
||||
struct face *face = FACE_FROM_ID (f, face_id);
|
||||
tty_write_glyphs_with_face (f, glyph, nglyphs, face);
|
||||
}
|
||||
else if (draw == DRAW_NORMAL_TEXT)
|
||||
write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
|
||||
|
||||
|
|
@ -3969,7 +3984,7 @@ tty_free_frame_resources (struct frame *f)
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef HAVE_ANDROID
|
||||
|
||||
|
|
@ -4044,6 +4059,8 @@ set_tty_hooks (struct terminal *terminal)
|
|||
terminal->read_socket_hook = &tty_read_avail_input; /* keyboard.c */
|
||||
terminal->delete_frame_hook = &tty_free_frame_resources;
|
||||
terminal->delete_terminal_hook = &delete_tty;
|
||||
|
||||
terminal->frame_raise_lower_hook = tty_raise_lower_frame;
|
||||
/* Other hooks are NULL by default. */
|
||||
}
|
||||
|
||||
|
|
@ -4714,6 +4731,184 @@ delete_tty (struct terminal *terminal)
|
|||
|
||||
#endif
|
||||
|
||||
/* Return geometric attributes of FRAME. According to the value of
|
||||
ATTRIBUTES return the outer edges of FRAME (Qouter_edges), the
|
||||
native edges of FRAME (Qnative_edges), or the inner edges of frame
|
||||
(Qinner_edges). Any other value means to return the geometry as
|
||||
returned by Fx_frame_geometry. */
|
||||
|
||||
static Lisp_Object
|
||||
tty_frame_geometry (Lisp_Object frame, Lisp_Object attribute)
|
||||
{
|
||||
struct frame *f = decode_live_frame (frame);
|
||||
if (FRAME_INITIAL_P (f) || !FRAME_TTY (f))
|
||||
return Qnil;
|
||||
|
||||
int native_width = f->pixel_width;
|
||||
int native_height = f->pixel_height;
|
||||
|
||||
eassert (FRAME_PARENT_FRAME (f) || (f->left_pos == 0 && f->top_pos == 0));
|
||||
int outer_left = f->left_pos;
|
||||
int outer_top = f->top_pos;
|
||||
int outer_right = outer_left + native_width;
|
||||
int outer_bottom = outer_top + native_height;
|
||||
|
||||
int native_left = outer_left;
|
||||
int native_top = outer_top;
|
||||
int native_right = outer_right;
|
||||
int native_bottom = outer_bottom;
|
||||
|
||||
int internal_border_width = FRAME_INTERNAL_BORDER_WIDTH (f);
|
||||
int inner_left = native_left + internal_border_width;
|
||||
int inner_top = native_top + internal_border_width;
|
||||
int inner_right = native_right - internal_border_width;
|
||||
int inner_bottom = native_bottom - internal_border_width;
|
||||
|
||||
int menu_bar_height = FRAME_MENU_BAR_HEIGHT (f);
|
||||
inner_top += menu_bar_height;
|
||||
int menu_bar_width = menu_bar_height ? native_width : 0;
|
||||
|
||||
int tab_bar_height = FRAME_TAB_BAR_HEIGHT (f);
|
||||
int tab_bar_width = (tab_bar_height
|
||||
? native_width - 2 * internal_border_width
|
||||
: 0);
|
||||
inner_top += tab_bar_height;
|
||||
|
||||
int tool_bar_height = FRAME_TOOL_BAR_HEIGHT (f);
|
||||
int tool_bar_width = (tool_bar_height
|
||||
? native_width - 2 * internal_border_width
|
||||
: 0);
|
||||
|
||||
/* Subtract or add to the inner dimensions based on the tool bar
|
||||
position. */
|
||||
if (EQ (FRAME_TOOL_BAR_POSITION (f), Qtop))
|
||||
inner_top += tool_bar_height;
|
||||
else
|
||||
inner_bottom -= tool_bar_height;
|
||||
|
||||
/* Construct list. */
|
||||
if (EQ (attribute, Qouter_edges))
|
||||
return list4i (outer_left, outer_top, outer_right, outer_bottom);
|
||||
else if (EQ (attribute, Qnative_edges))
|
||||
return list4i (native_left, native_top, native_right, native_bottom);
|
||||
else if (EQ (attribute, Qinner_edges))
|
||||
return list4i (inner_left, inner_top, inner_right, inner_bottom);
|
||||
else
|
||||
return list (Fcons (Qouter_position, Fcons (make_fixnum (outer_left),
|
||||
make_fixnum (outer_top))),
|
||||
Fcons (Qouter_size,
|
||||
Fcons (make_fixnum (outer_right - outer_left),
|
||||
make_fixnum (outer_bottom - outer_top))),
|
||||
Fcons (Qouter_border_width, make_fixnum (0)),
|
||||
Fcons (Qexternal_border_size,
|
||||
Fcons (make_fixnum (0), make_fixnum (0))),
|
||||
Fcons (Qtitle_bar_size,
|
||||
Fcons (make_fixnum (0), make_fixnum (0))),
|
||||
Fcons (Qmenu_bar_external, Qnil),
|
||||
Fcons (Qmenu_bar_size,
|
||||
Fcons (make_fixnum (menu_bar_width),
|
||||
make_fixnum (menu_bar_height))),
|
||||
Fcons (Qtab_bar_size,
|
||||
Fcons (make_fixnum (tab_bar_width),
|
||||
make_fixnum (tab_bar_height))),
|
||||
Fcons (Qtool_bar_external, Qnil),
|
||||
Fcons (Qtool_bar_position, FRAME_TOOL_BAR_POSITION (f)),
|
||||
Fcons (Qtool_bar_size,
|
||||
Fcons (make_fixnum (tool_bar_width),
|
||||
make_fixnum (tool_bar_height))),
|
||||
Fcons (Qinternal_border_width,
|
||||
make_fixnum (internal_border_width)));
|
||||
}
|
||||
|
||||
DEFUN ("tty-frame-geometry", Ftty_frame_geometry, Stty_frame_geometry, 0, 1, 0,
|
||||
doc: /* Return geometric attributes of terminal frame FRAME.
|
||||
See also `frame-geometry'. */)
|
||||
(Lisp_Object frame)
|
||||
{
|
||||
return tty_frame_geometry (frame, Qnil);
|
||||
}
|
||||
|
||||
DEFUN ("tty-frame-edges", Ftty_frame_edges, Stty_frame_edges, 0, 2, 0,
|
||||
doc: /* Return coordinates of FRAME's edges.
|
||||
See also `frame-edges'. */)
|
||||
(Lisp_Object frame, Lisp_Object type)
|
||||
{
|
||||
if (!EQ (type, Qouter_edges) && !EQ (type, Qinner_edges))
|
||||
type = Qnative_edges;
|
||||
return tty_frame_geometry (frame, type);
|
||||
}
|
||||
|
||||
DEFUN ("tty-frame-list-z-order", Ftty_frame_list_z_order,
|
||||
Stty_frame_list_z_order, 0, 1, 0,
|
||||
doc: /* Return list of Emacs's frames, in Z (stacking) order.
|
||||
See also `frame-list-z-order'. */)
|
||||
(Lisp_Object frame)
|
||||
{
|
||||
struct frame *f = decode_tty_frame (frame);
|
||||
Lisp_Object frames = frames_in_reverse_z_order (f, true);
|
||||
return Fnreverse (frames);
|
||||
}
|
||||
|
||||
DEFUN ("tty-frame-restack", Ftty_frame_restack,
|
||||
Stty_frame_restack, 2, 3, 0,
|
||||
doc: /* Restack FRAME1 below FRAME2 on terminals.
|
||||
. See also `frame-restack'. */)
|
||||
(Lisp_Object frame1, Lisp_Object frame2, Lisp_Object above)
|
||||
{
|
||||
/* FIXME/tty: tty-frame-restack implementation. */
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static void
|
||||
tty_display_dimension (Lisp_Object frame, int *width, int *height)
|
||||
{
|
||||
if (!FRAMEP (frame))
|
||||
frame = Fselected_frame ();
|
||||
struct frame *f = XFRAME (frame);
|
||||
switch (f->output_method)
|
||||
{
|
||||
case output_initial:
|
||||
*width = 80;
|
||||
*height = 25;
|
||||
break;
|
||||
case output_termcap:
|
||||
*width = FrameCols (FRAME_TTY (f));
|
||||
*height = FrameRows (FRAME_TTY (f));
|
||||
break;
|
||||
case output_x_window:
|
||||
case output_msdos_raw:
|
||||
case output_w32:
|
||||
case output_ns:
|
||||
case output_pgtk:
|
||||
case output_haiku:
|
||||
case output_android:
|
||||
emacs_abort ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DEFUN ("tty-display-pixel-width", Ftty_display_pixel_width,
|
||||
Stty_display_pixel_width, 0, 1, 0,
|
||||
doc: /* Return the width of DISPLAY's screen in pixels.
|
||||
. See also `display-pixel-width'. */)
|
||||
(Lisp_Object display)
|
||||
{
|
||||
int width, height;
|
||||
tty_display_dimension (display, &width, &height);
|
||||
return make_fixnum (width);
|
||||
}
|
||||
|
||||
DEFUN ("tty-display-pixel-height", Ftty_display_pixel_height,
|
||||
Stty_display_pixel_height, 0, 1, 0,
|
||||
doc: /* Return the height of DISPLAY's screen in pixels.
|
||||
See also `display-pixel-height'. */)
|
||||
(Lisp_Object display)
|
||||
{
|
||||
int width, height;
|
||||
tty_display_dimension (display, &width, &height);
|
||||
return make_fixnum (height);
|
||||
}
|
||||
|
||||
void
|
||||
syms_of_term (void)
|
||||
{
|
||||
|
|
@ -4770,6 +4965,13 @@ trigger redisplay. */);
|
|||
defsubr (&Sgpm_mouse_stop);
|
||||
#endif /* HAVE_GPM */
|
||||
|
||||
defsubr (&Stty_frame_geometry);
|
||||
defsubr (&Stty_frame_edges);
|
||||
defsubr (&Stty_frame_list_z_order);
|
||||
defsubr (&Stty_frame_restack);
|
||||
defsubr (&Stty_display_pixel_width);
|
||||
defsubr (&Stty_display_pixel_height);
|
||||
|
||||
#if !defined DOS_NT && !defined HAVE_ANDROID
|
||||
default_orig_pair = NULL;
|
||||
default_set_foreground = NULL;
|
||||
|
|
|
|||
|
|
@ -974,6 +974,9 @@ extern int cursorY (struct tty_display_info *);
|
|||
#define cursorY(t) curY(t)
|
||||
#endif
|
||||
|
||||
void tty_hide_cursor (struct tty_display_info *tty);
|
||||
void tty_show_cursor (struct tty_display_info *tty);
|
||||
|
||||
INLINE_HEADER_END
|
||||
|
||||
#endif /* EMACS_TERMHOOKS_H */
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@ void
|
|||
cursor_to (struct frame *f, int vpos, int hpos)
|
||||
{
|
||||
if (FRAME_TERMINAL (f)->cursor_to_hook)
|
||||
(*FRAME_TERMINAL (f)->cursor_to_hook) (f, vpos, hpos);
|
||||
(*FRAME_TERMINAL (f)->cursor_to_hook) (f, vpos + f->top_pos,
|
||||
hpos + f->left_pos);
|
||||
}
|
||||
|
||||
/* Similar but don't take any account of the wasted characters. */
|
||||
|
|
@ -120,7 +121,8 @@ void
|
|||
raw_cursor_to (struct frame *f, int row, int col)
|
||||
{
|
||||
if (FRAME_TERMINAL (f)->raw_cursor_to_hook)
|
||||
(*FRAME_TERMINAL (f)->raw_cursor_to_hook) (f, row, col);
|
||||
(*FRAME_TERMINAL (f)->raw_cursor_to_hook) (f, row + f->top_pos,
|
||||
col + f->left_pos);
|
||||
}
|
||||
|
||||
/* Erase operations. */
|
||||
|
|
|
|||
89
src/xdisp.c
89
src/xdisp.c
|
|
@ -943,7 +943,7 @@ redisplay_trace (char const *fmt, ...)
|
|||
{
|
||||
va_list ap;
|
||||
va_start (ap, fmt);
|
||||
vprintf (fmt, ap);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
}
|
||||
|
|
@ -961,7 +961,7 @@ move_trace (char const *fmt, ...)
|
|||
{
|
||||
va_list ap;
|
||||
va_start (ap, fmt);
|
||||
vprintf (fmt, ap);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
}
|
||||
|
|
@ -3348,9 +3348,7 @@ init_iterator (struct it *it, struct window *w,
|
|||
of the iterator's frame, when set, suppresses their display - by
|
||||
default for tooltip frames and when set via the 'no-special-glyphs'
|
||||
frame parameter. */
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
if (!(FRAME_WINDOW_P (it->f) && it->f->no_special_glyphs))
|
||||
#endif
|
||||
if (!it->f->no_special_glyphs)
|
||||
{
|
||||
if (it->line_wrap == TRUNCATE)
|
||||
{
|
||||
|
|
@ -13554,7 +13552,11 @@ echo_area_display (bool update_frame_p)
|
|||
flush_frame (f);
|
||||
}
|
||||
else
|
||||
update_frame (f, true, true);
|
||||
{
|
||||
update_frame (f, true, true);
|
||||
if (is_tty_frame (f))
|
||||
combine_updates_for_frame (f, true, true);
|
||||
}
|
||||
|
||||
/* If cursor is in the echo area, make sure that the next
|
||||
redisplay displays the minibuffer, so that the cursor will
|
||||
|
|
@ -17033,6 +17035,9 @@ redisplay_internal (void)
|
|||
if (face_change)
|
||||
windows_or_buffers_changed = 47;
|
||||
|
||||
/* Can we do better for tty child frames? It could be
|
||||
a bit faster when we switch between child frames of the same
|
||||
root frame. OTOH, it's probably not a frequent use case. */
|
||||
if ((FRAME_TERMCAP_P (sf) || FRAME_MSDOS_P (sf))
|
||||
&& FRAME_TTY (sf)->previous_frame != sf)
|
||||
{
|
||||
|
|
@ -17055,6 +17060,7 @@ redisplay_internal (void)
|
|||
{
|
||||
struct frame *f = XFRAME (frame);
|
||||
|
||||
/* FRAME_REDISPLAY_P true basically means the frame is visible. */
|
||||
if (FRAME_REDISPLAY_P (f))
|
||||
{
|
||||
++number_of_visible_frames;
|
||||
|
|
@ -17198,7 +17204,6 @@ redisplay_internal (void)
|
|||
&& !current_buffer->clip_changed
|
||||
&& !current_buffer->prevent_redisplay_optimizations_p
|
||||
&& FRAME_REDISPLAY_P (XFRAME (w->frame))
|
||||
&& !FRAME_OBSCURED_P (XFRAME (w->frame))
|
||||
&& !XFRAME (w->frame)->cursor_type_changed
|
||||
&& !XFRAME (w->frame)->face_change
|
||||
/* Make sure recorded data applies to current buffer, etc. */
|
||||
|
|
@ -17447,22 +17452,35 @@ redisplay_internal (void)
|
|||
|
||||
propagate_buffer_redisplay ();
|
||||
|
||||
Lisp_Object tty_root_frames = Qnil;
|
||||
FOR_EACH_FRAME (tail, frame)
|
||||
{
|
||||
struct frame *f = XFRAME (frame);
|
||||
|
||||
/* We don't have to do anything for unselected terminal
|
||||
frames. */
|
||||
if ((FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f))
|
||||
&& !EQ (FRAME_TTY (f)->top_frame, frame))
|
||||
continue;
|
||||
if (is_tty_frame (f))
|
||||
{
|
||||
/* Ignore all invisble tty frames, children or root. */
|
||||
if (!FRAME_VISIBLE_P (root_frame (f)))
|
||||
continue;
|
||||
|
||||
/* Remember tty root frames seen. */
|
||||
if (!FRAME_PARENT_FRAME (f))
|
||||
{
|
||||
Lisp_Object found;
|
||||
for (found = tty_root_frames;
|
||||
CONSP (found) && !EQ (XCAR (found), frame);
|
||||
found = XCDR (found))
|
||||
;
|
||||
if (!CONSP (found))
|
||||
tty_root_frames = Fcons (frame, tty_root_frames);
|
||||
}
|
||||
}
|
||||
|
||||
retry_frame:
|
||||
if (FRAME_WINDOW_P (f) || FRAME_TERMCAP_P (f) || f == sf)
|
||||
{
|
||||
bool gcscrollbars
|
||||
/* Only GC scrollbars when we redisplay the whole frame. */
|
||||
= f->redisplay || !REDISPLAY_SOME_P ();
|
||||
/* Only GC scrollbars when we redisplay the whole frame. */
|
||||
bool gcscrollbars = f->redisplay || !REDISPLAY_SOME_P ();
|
||||
bool f_redisplay_flag = f->redisplay;
|
||||
|
||||
/* The X error handler may have deleted that frame before
|
||||
|
|
@ -17479,7 +17497,7 @@ redisplay_internal (void)
|
|||
if (gcscrollbars && FRAME_TERMINAL (f)->condemn_scroll_bars_hook)
|
||||
FRAME_TERMINAL (f)->condemn_scroll_bars_hook (f);
|
||||
|
||||
if (FRAME_REDISPLAY_P (f) && !FRAME_OBSCURED_P (f))
|
||||
if (FRAME_REDISPLAY_P (f))
|
||||
{
|
||||
/* Don't allow freeing images and faces for this
|
||||
frame as long as the frame's update wasn't
|
||||
|
|
@ -17505,7 +17523,7 @@ redisplay_internal (void)
|
|||
if (gcscrollbars && FRAME_TERMINAL (f)->judge_scroll_bars_hook)
|
||||
FRAME_TERMINAL (f)->judge_scroll_bars_hook (f);
|
||||
|
||||
if (FRAME_REDISPLAY_P (f) && !FRAME_OBSCURED_P (f))
|
||||
if (FRAME_REDISPLAY_P (f))
|
||||
{
|
||||
/* If fonts changed on visible frame, display again. */
|
||||
if (f->fonts_changed)
|
||||
|
|
@ -17590,6 +17608,9 @@ redisplay_internal (void)
|
|||
}
|
||||
}
|
||||
|
||||
if (CONSP (tty_root_frames))
|
||||
pending |= combine_updates (tty_root_frames, false, false);
|
||||
|
||||
eassert (EQ (XFRAME (selected_frame)->selected_window, selected_window));
|
||||
|
||||
if (!pending)
|
||||
|
|
@ -17611,7 +17632,7 @@ redisplay_internal (void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (FRAME_REDISPLAY_P (sf) && !FRAME_OBSCURED_P (sf))
|
||||
else if (FRAME_REDISPLAY_P (sf))
|
||||
{
|
||||
sf->inhibit_clear_image_cache = true;
|
||||
displayed_buffer = XBUFFER (XWINDOW (selected_window)->contents);
|
||||
|
|
@ -17662,7 +17683,7 @@ redisplay_internal (void)
|
|||
unrequest_sigio ();
|
||||
STOP_POLLING;
|
||||
|
||||
if (FRAME_REDISPLAY_P (sf) && !FRAME_OBSCURED_P (sf))
|
||||
if (FRAME_REDISPLAY_P (sf))
|
||||
{
|
||||
if (hscroll_retries <= MAX_HSCROLL_RETRIES
|
||||
&& hscroll_windows (selected_window))
|
||||
|
|
@ -17673,6 +17694,10 @@ redisplay_internal (void)
|
|||
|
||||
XWINDOW (selected_window)->must_be_updated_p = true;
|
||||
pending = update_frame (sf, false, false);
|
||||
|
||||
if (is_tty_frame (sf))
|
||||
pending |= combine_updates_for_frame (sf, false, false);
|
||||
|
||||
sf->cursor_type_changed = false;
|
||||
sf->inhibit_clear_image_cache = false;
|
||||
}
|
||||
|
|
@ -17685,10 +17710,12 @@ redisplay_internal (void)
|
|||
Lisp_Object mini_window = FRAME_MINIBUF_WINDOW (sf);
|
||||
struct frame *mini_frame = XFRAME (WINDOW_FRAME (XWINDOW (mini_window)));
|
||||
|
||||
if (mini_frame != sf && FRAME_WINDOW_P (mini_frame))
|
||||
if (mini_frame != sf)
|
||||
{
|
||||
XWINDOW (mini_window)->must_be_updated_p = true;
|
||||
pending |= update_frame (mini_frame, false, false);
|
||||
if (is_tty_frame (mini_frame))
|
||||
pending |= combine_updates_for_frame (mini_frame, false, false);
|
||||
mini_frame->cursor_type_changed = false;
|
||||
if (!pending && hscroll_retries <= MAX_HSCROLL_RETRIES
|
||||
&& hscroll_windows (mini_window))
|
||||
|
|
@ -23975,6 +24002,7 @@ extend_face_to_end_of_line (struct it *it)
|
|||
{
|
||||
it->glyph_row->glyphs[TEXT_AREA][0] = space_glyph;
|
||||
it->glyph_row->glyphs[TEXT_AREA][0].face_id = face->id;
|
||||
it->glyph_row->glyphs[TEXT_AREA][0].frame = f;
|
||||
it->glyph_row->used[TEXT_AREA] = 1;
|
||||
}
|
||||
/* Mode line and the header line don't have margins, and
|
||||
|
|
@ -23994,6 +24022,7 @@ extend_face_to_end_of_line (struct it *it)
|
|||
it->glyph_row->glyphs[LEFT_MARGIN_AREA][0] = space_glyph;
|
||||
it->glyph_row->glyphs[LEFT_MARGIN_AREA][0].face_id =
|
||||
default_face->id;
|
||||
it->glyph_row->glyphs[LEFT_MARGIN_AREA][0].frame = f;
|
||||
it->glyph_row->used[LEFT_MARGIN_AREA] = 1;
|
||||
}
|
||||
if (WINDOW_RIGHT_MARGIN_WIDTH (it->w) > 0
|
||||
|
|
@ -24002,6 +24031,7 @@ extend_face_to_end_of_line (struct it *it)
|
|||
it->glyph_row->glyphs[RIGHT_MARGIN_AREA][0] = space_glyph;
|
||||
it->glyph_row->glyphs[RIGHT_MARGIN_AREA][0].face_id =
|
||||
default_face->id;
|
||||
it->glyph_row->glyphs[RIGHT_MARGIN_AREA][0].frame = f;
|
||||
it->glyph_row->used[RIGHT_MARGIN_AREA] = 1;
|
||||
}
|
||||
|
||||
|
|
@ -24366,9 +24396,11 @@ highlight_trailing_whitespace (struct it *it)
|
|||
while (glyph >= start
|
||||
&& BUFFERP (glyph->object)
|
||||
&& (glyph->type == STRETCH_GLYPH
|
||||
|| (glyph->type == CHAR_GLYPH
|
||||
&& glyph->u.ch == ' ')))
|
||||
(glyph--)->face_id = face_id;
|
||||
|| (glyph->type == CHAR_GLYPH && glyph->u.ch == ' ')))
|
||||
{
|
||||
glyph->frame = it->f;
|
||||
(glyph--)->face_id = face_id;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -24377,7 +24409,10 @@ highlight_trailing_whitespace (struct it *it)
|
|||
&& (glyph->type == STRETCH_GLYPH
|
||||
|| (glyph->type == CHAR_GLYPH
|
||||
&& glyph->u.ch == ' ')))
|
||||
(glyph++)->face_id = face_id;
|
||||
{
|
||||
glyph->frame = it->f;
|
||||
(glyph++)->face_id = face_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -27230,7 +27265,7 @@ display_menu_bar (struct window *w)
|
|||
|
||||
/* Deep copy of a glyph row, including the glyphs. */
|
||||
static void
|
||||
deep_copy_glyph_row (struct glyph_row *to, struct glyph_row *from)
|
||||
deep_copy_glyph_row (struct frame *f, struct glyph_row *to, struct glyph_row *from)
|
||||
{
|
||||
struct glyph *pointers[1 + LAST_AREA];
|
||||
int to_used = to->used[TEXT_AREA];
|
||||
|
|
@ -27251,7 +27286,7 @@ deep_copy_glyph_row (struct glyph_row *to, struct glyph_row *from)
|
|||
/* If we filled only part of the TO row, fill the rest with
|
||||
space_glyph (which will display as empty space). */
|
||||
if (to_used > from->used[TEXT_AREA])
|
||||
fill_up_frame_row_with_spaces (to, to_used);
|
||||
fill_up_frame_row_with_spaces (f, to, to_used);
|
||||
}
|
||||
|
||||
/* Display one menu item on a TTY, by overwriting the glyphs in the
|
||||
|
|
@ -27300,7 +27335,7 @@ display_tty_menu_item (const char *item_text, int width, int face_id,
|
|||
it.last_visible_x = FRAME_COLS (f) - 1;
|
||||
row = it.glyph_row;
|
||||
/* Start with the row contents from the current matrix. */
|
||||
deep_copy_glyph_row (row, f->current_matrix->rows + y);
|
||||
deep_copy_glyph_row (f, row, f->current_matrix->rows + y);
|
||||
bool saved_width = row->full_width_p;
|
||||
row->full_width_p = true;
|
||||
bool saved_reversed = row->reversed_p;
|
||||
|
|
|
|||
|
|
@ -696,7 +696,6 @@ void
|
|||
free_frame_faces (struct frame *f)
|
||||
{
|
||||
struct face_cache *face_cache = FRAME_FACE_CACHE (f);
|
||||
|
||||
if (face_cache)
|
||||
{
|
||||
free_face_cache (face_cache);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue