aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Rudalics2025-02-10 10:36:38 +0100
committerMartin Rudalics2025-02-10 10:36:38 +0100
commit4d1ceac9f9332f74ac2ab300eb2a629ea742b1dc (patch)
tree2dc013150344d3b846d4d902387090ea166a7b73 /src
parent302274b18625b04d1f52fe4c1e52dbcd2cd5124b (diff)
downloademacs-4d1ceac9f9332f74ac2ab300eb2a629ea742b1dc.tar.gz
emacs-4d1ceac9f9332f74ac2ab300eb2a629ea742b1dc.zip
Fix handling of visibility on tty frames (Bug#76031)
* src/frame.h (FRAME_REDISPLAY_P): Remove. Use the new function frame_redisplay_p instead. Extern frame_redisplay_p. * src/frame.c (frame_redisplay_p): New function to replace FRAME_REDISPLAY_P macro. (make_terminal_frame): Don't tinker with frame visibility and don't make the new frame the terminal's top frame. (do_switch_frame): Make sure frame switched to and any of its ancestors are visible. Don't reset the visibility of other frames. (other_frames): Do not assume tty frames are by default visible. (Fmake_frame_invisible): When making the selected tty frame invisible, explicitly select the next visible frame. * src/dispnew.c (Fredraw_display): Use frame_redisplay_p instead of FRAME_REDISPLAY_P. * src/xdisp.c (clear_garbaged_frames, echo_area_display) (prepare_menu_bars, redisplay_internal, display_and_set_cursor) (gui_clear_cursor): Use frame_redisplay_p instead of FRAME_REDISPLAY_P. * src/keyboard.c (tty_read_avail_input): When storing an event and the selected frame is a child frame whose root is its terminal's top frame, set the frame_or_window slot to the child frame since otherwise the next switch frame event will select the top frame instead.
Diffstat (limited to 'src')
-rw-r--r--src/dispnew.c2
-rw-r--r--src/frame.c118
-rw-r--r--src/frame.h15
-rw-r--r--src/keyboard.c11
-rw-r--r--src/xdisp.c28
-rw-r--r--src/xterm.h2
6 files changed, 103 insertions, 73 deletions
diff --git a/src/dispnew.c b/src/dispnew.c
index 5f5575d484b..a952f7623c0 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -3240,7 +3240,7 @@ DEFUN ("redraw-display", Fredraw_display, Sredraw_display, 0, 0, "",
3240 Lisp_Object tail, frame; 3240 Lisp_Object tail, frame;
3241 3241
3242 FOR_EACH_FRAME (tail, frame) 3242 FOR_EACH_FRAME (tail, frame)
3243 if (FRAME_REDISPLAY_P (XFRAME (frame))) 3243 if (frame_redisplay_p (XFRAME (frame)))
3244 redraw_frame (XFRAME (frame)); 3244 redraw_frame (XFRAME (frame));
3245 3245
3246 return Qnil; 3246 return Qnil;
diff --git a/src/frame.c b/src/frame.c
index 6e125b9561c..2ccdec6fc41 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -338,6 +338,51 @@ predicates which report frame's specific UI-related capabilities. */)
338 return type; 338 return type;
339} 339}
340 340
341/** Return true if F can be redisplayed, that is if F is visible and, if
342 F is a tty frame, all its ancestors are visible too. */
343bool
344frame_redisplay_p (struct frame *f)
345{
346 if (is_tty_frame (f))
347 {
348 struct frame *p = FRAME_PARENT_FRAME (f);
349 struct frame *q = NULL;
350
351 while (p)
352 {
353 if (!p->visible)
354 /* A tty child frame cannot be redisplayed if one of its
355 ancestors is invisible. */
356 return false;
357 else
358 {
359 q = p;
360 p = FRAME_PARENT_FRAME (p);
361 }
362 }
363
364 struct tty_display_info *tty = FRAME_TTY (f);
365 struct frame *r = XFRAME (tty->top_frame);
366
367 /* A tty child frame can be redisplayed iff its root is the top
368 frame of its terminal. Any other tty frame can be redisplayed
369 iff it is the top frame of its terminal itself which must be
370 always visible. */
371 return (q ? q == r : f == r);
372 }
373 else
374#ifndef HAVE_X_WINDOWS
375 return FRAME_VISIBLE_P (f);
376#else
377 /* Under X, frames can continue to be displayed to the user by the
378 compositing manager even if they are invisible, so this also
379 checks whether or not the frame is reported visible by the X
380 server. */
381 return (FRAME_VISIBLE_P (f)
382 || (FRAME_X_P (f) && FRAME_X_VISIBLE (f)));
383#endif
384}
385
341/* Placeholder used by temacs -nw before window.el is loaded. */ 386/* Placeholder used by temacs -nw before window.el is loaded. */
342DEFUN ("frame-windows-min-size", Fframe_windows_min_size, 387DEFUN ("frame-windows-min-size", Fframe_windows_min_size,
343 Sframe_windows_min_size, 4, 4, 0, 388 Sframe_windows_min_size, 4, 4, 0,
@@ -1407,18 +1452,6 @@ make_terminal_frame (struct terminal *terminal, Lisp_Object parent,
1407 FRAME_TEXT_HEIGHT (f) = FRAME_TEXT_HEIGHT (f) - FRAME_MENU_BAR_HEIGHT (f) 1452 FRAME_TEXT_HEIGHT (f) = FRAME_TEXT_HEIGHT (f) - FRAME_MENU_BAR_HEIGHT (f)
1408 - FRAME_TAB_BAR_HEIGHT (f); 1453 - FRAME_TAB_BAR_HEIGHT (f);
1409 1454
1410 /* Mark current topmost frame obscured if we make a new root frame.
1411 Child frames don't completely obscure other frames. */
1412 if (NILP (parent) && FRAMEP (FRAME_TTY (f)->top_frame))
1413 {
1414 struct frame *top = XFRAME (FRAME_TTY (f)->top_frame);
1415 struct frame *root = root_frame (top);
1416 if (FRAME_LIVE_P (root))
1417 SET_FRAME_VISIBLE (root, false);
1418 }
1419
1420 /* Set the top frame to the newly created frame. */
1421 FRAME_TTY (f)->top_frame = frame;
1422 return f; 1455 return f;
1423} 1456}
1424 1457
@@ -1772,28 +1805,27 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
1772 struct tty_display_info *tty = FRAME_TTY (f); 1805 struct tty_display_info *tty = FRAME_TTY (f);
1773 Lisp_Object top_frame = tty->top_frame; 1806 Lisp_Object top_frame = tty->top_frame;
1774 1807
1775 /* Switching to a frame on a different root frame is special. The 1808 /* When FRAME's root frame is not its terminal's top frame, make
1776 old root frame has to be marked invisible, and the new root 1809 that root frame the new top frame of FRAME's terminal. */
1777 frame has to be made visible. */ 1810 if (root_frame (f) != XFRAME (top_frame))
1778 if (!EQ (frame, top_frame)
1779 && (!FRAMEP (top_frame)
1780 || root_frame (f) != root_frame (XFRAME (top_frame))))
1781 { 1811 {
1782 struct frame *new_root = root_frame (f); 1812 struct frame *p = FRAME_PARENT_FRAME (f);
1783 SET_FRAME_VISIBLE (new_root, true); 1813
1784 SET_FRAME_VISIBLE (f, true); 1814 XSETFRAME (top_frame, root_frame (f));
1815 tty->top_frame = top_frame;
1785 1816
1786 /* Mark previously displayed root frame as no longer 1817 while (p)
1787 visible. */
1788 if (FRAMEP (top_frame))
1789 { 1818 {
1790 struct frame *top = XFRAME (top_frame); 1819 /* If FRAME is a child frame, make its ancsetors visible
1791 struct frame *old_root = root_frame (top); 1820 and garbage them ... */
1792 if (old_root != new_root) 1821 SET_FRAME_VISIBLE (p, true);
1793 SET_FRAME_VISIBLE (old_root, false); 1822 SET_FRAME_GARBAGED (p);
1823 p = FRAME_PARENT_FRAME (p);
1794 } 1824 }
1795 1825
1796 tty->top_frame = frame; 1826 /* ... and FRAME itself too. */
1827 SET_FRAME_VISIBLE (f, true);
1828 SET_FRAME_GARBAGED (f);
1797 1829
1798 /* FIXME: Why is it correct to set FrameCols/Rows here? */ 1830 /* FIXME: Why is it correct to set FrameCols/Rows here? */
1799 if (!FRAME_PARENT_FRAME (f)) 1831 if (!FRAME_PARENT_FRAME (f))
@@ -1808,10 +1840,8 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
1808 } 1840 }
1809 } 1841 }
1810 else 1842 else
1811 { 1843 /* Should be covered by the condition above. */
1812 SET_FRAME_VISIBLE (f, true); 1844 SET_FRAME_VISIBLE (f, true);
1813 tty->top_frame = frame;
1814 }
1815 } 1845 }
1816 1846
1817 sf->select_mini_window_flag = MINI_WINDOW_P (XWINDOW (sf->selected_window)); 1847 sf->select_mini_window_flag = MINI_WINDOW_P (XWINDOW (sf->selected_window));
@@ -2229,8 +2259,8 @@ DEFUN ("last-nonminibuffer-frame", Flast_nonminibuf_frame,
2229 * other_frames: 2259 * other_frames:
2230 * 2260 *
2231 * Return true if there exists at least one visible or iconified frame 2261 * Return true if there exists at least one visible or iconified frame
2232 * but F. Tooltip frames do not qualify as candidates. Return false 2262 * but F. Tooltip and child frames do not qualify as candidates.
2233 * if no such frame exists. 2263 * Return false if no such frame exists.
2234 * 2264 *
2235 * INVISIBLE true means we are called from make_frame_invisible where 2265 * INVISIBLE true means we are called from make_frame_invisible where
2236 * such a frame must be visible or iconified. INVISIBLE nil means we 2266 * such a frame must be visible or iconified. INVISIBLE nil means we
@@ -2322,7 +2352,6 @@ other_frames (struct frame *f, bool invisible, bool force)
2322 /* For invisibility and normal deletions, at least one 2352 /* For invisibility and normal deletions, at least one
2323 visible or iconified frame must remain (Bug#26682). */ 2353 visible or iconified frame must remain (Bug#26682). */
2324 && (FRAME_VISIBLE_P (f1) 2354 && (FRAME_VISIBLE_P (f1)
2325 || is_tty_frame (f1)
2326 || FRAME_ICONIFIED_P (f1) 2355 || FRAME_ICONIFIED_P (f1)
2327 || (!invisible 2356 || (!invisible
2328 && (force 2357 && (force
@@ -3234,11 +3263,18 @@ displayed in the terminal. */)
3234 if (FRAME_WINDOW_P (f) && FRAME_TERMINAL (f)->frame_visible_invisible_hook) 3263 if (FRAME_WINDOW_P (f) && FRAME_TERMINAL (f)->frame_visible_invisible_hook)
3235 FRAME_TERMINAL (f)->frame_visible_invisible_hook (f, false); 3264 FRAME_TERMINAL (f)->frame_visible_invisible_hook (f, false);
3236 3265
3237 /* The ELisp manual says that this "usually" makes child frames 3266 if (is_tty_frame (f) && EQ (frame, selected_frame))
3238 invisible, too, but without saying when not. Since users can't 3267 /* On a tty if FRAME is the selected frame, we have to select another
3239 rely on this, it's not implemented. */ 3268 frame instead. If FRAME is a child frame, use the first visible
3240 if (is_tty_frame (f)) 3269 ancestor as returned by 'mru_rooted_frame'. If FRAME is a root
3241 SET_FRAME_VISIBLE (f, false); 3270 frame, use the frame returned by 'next-frame' which must exist since
3271 otherwise other_frames above would have lied. */
3272 Fselect_frame (FRAME_PARENT_FRAME (f)
3273 ? mru_rooted_frame (f)
3274 : next_frame (frame, make_fixnum (0)),
3275 Qnil);
3276
3277 SET_FRAME_VISIBLE (f, false);
3242 3278
3243 /* Make menu bar update for the Buffers and Frames menus. */ 3279 /* Make menu bar update for the Buffers and Frames menus. */
3244 windows_or_buffers_changed = 16; 3280 windows_or_buffers_changed = 16;
diff --git a/src/frame.h b/src/frame.h
index fea8baa7332..c9cc65e597d 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1152,20 +1152,6 @@ default_pixels_per_inch_y (void)
1152/* True if frame F is currently visible. */ 1152/* True if frame F is currently visible. */
1153#define FRAME_VISIBLE_P(f) (f)->visible 1153#define FRAME_VISIBLE_P(f) (f)->visible
1154 1154
1155/* True if frame F should be redisplayed. This is normally the same
1156 as FRAME_VISIBLE_P (f). Under X, frames can continue to be
1157 displayed to the user by the compositing manager even if they are
1158 invisible, so this also checks whether or not the frame is reported
1159 visible by the X server. */
1160
1161#ifndef HAVE_X_WINDOWS
1162#define FRAME_REDISPLAY_P(f) FRAME_VISIBLE_P (f)
1163#else
1164#define FRAME_REDISPLAY_P(f) (FRAME_VISIBLE_P (f) \
1165 || (FRAME_X_P (f) \
1166 && FRAME_X_VISIBLE (f)))
1167#endif
1168
1169/* True if frame F is currently iconified. */ 1155/* True if frame F is currently iconified. */
1170#define FRAME_ICONIFIED_P(f) (f)->iconified 1156#define FRAME_ICONIFIED_P(f) (f)->iconified
1171 1157
@@ -1473,6 +1459,7 @@ extern struct frame *decode_live_frame (Lisp_Object);
1473extern struct frame *decode_any_frame (Lisp_Object); 1459extern struct frame *decode_any_frame (Lisp_Object);
1474extern struct frame *make_initial_frame (void); 1460extern struct frame *make_initial_frame (void);
1475extern struct frame *make_frame (bool); 1461extern struct frame *make_frame (bool);
1462extern bool frame_redisplay_p (struct frame *);
1476extern int tty_child_pos_param (struct frame *, Lisp_Object, 1463extern int tty_child_pos_param (struct frame *, Lisp_Object,
1477 Lisp_Object, int); 1464 Lisp_Object, int);
1478extern int tty_child_size_param (struct frame *, Lisp_Object, 1465extern int tty_child_size_param (struct frame *, Lisp_Object,
diff --git a/src/keyboard.c b/src/keyboard.c
index ac143af83f4..b22814d702d 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -8133,8 +8133,15 @@ tty_read_avail_input (struct terminal *terminal,
8133 buf.code = cbuf[i]; 8133 buf.code = cbuf[i];
8134 /* Set the frame corresponding to the active tty. Note that the 8134 /* Set the frame corresponding to the active tty. Note that the
8135 value of selected_frame is not reliable here, redisplay tends 8135 value of selected_frame is not reliable here, redisplay tends
8136 to temporarily change it. */ 8136 to temporarily change it. However, if the selected frame is a
8137 buf.frame_or_window = tty->top_frame; 8137 child frame, don't do that since it will cause switch frame
8138 events to switch to the root frame instead. */
8139 if (FRAME_PARENT_FRAME (XFRAME (selected_frame))
8140 && (root_frame (XFRAME (selected_frame))
8141 == XFRAME (tty->top_frame)))
8142 buf.frame_or_window = selected_frame;
8143 else
8144 buf.frame_or_window = tty->top_frame;
8138 buf.arg = Qnil; 8145 buf.arg = Qnil;
8139 8146
8140 kbd_buffer_store_event (&buf); 8147 kbd_buffer_store_event (&buf);
diff --git a/src/xdisp.c b/src/xdisp.c
index 804a19e048f..c9bcafe57fd 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -13453,7 +13453,7 @@ clear_garbaged_frames (void)
13453 { 13453 {
13454 struct frame *f = XFRAME (frame); 13454 struct frame *f = XFRAME (frame);
13455 13455
13456 if (FRAME_REDISPLAY_P (f) && FRAME_GARBAGED_P (f)) 13456 if (frame_redisplay_p (f) && FRAME_GARBAGED_P (f))
13457 { 13457 {
13458 if (f->resized_p 13458 if (f->resized_p
13459 /* It makes no sense to redraw a non-selected TTY 13459 /* It makes no sense to redraw a non-selected TTY
@@ -13507,7 +13507,7 @@ echo_area_display (bool update_frame_p)
13507 13507
13508 /* Don't display if frame is invisible or not yet initialized or 13508 /* Don't display if frame is invisible or not yet initialized or
13509 if redisplay is inhibited. */ 13509 if redisplay is inhibited. */
13510 if (!FRAME_REDISPLAY_P (f) || !f->glyphs_initialized_p 13510 if (!frame_redisplay_p (f) || !f->glyphs_initialized_p
13511 || !NILP (Vinhibit_redisplay)) 13511 || !NILP (Vinhibit_redisplay))
13512 return; 13512 return;
13513 13513
@@ -14048,7 +14048,7 @@ prepare_menu_bars (void)
14048 TTY frames to be completely redrawn, when there 14048 TTY frames to be completely redrawn, when there
14049 are more than one of them, even though nothing 14049 are more than one of them, even though nothing
14050 should be changed on display. */ 14050 should be changed on display. */
14051 || (FRAME_REDISPLAY_P (f) && FRAME_WINDOW_P (f)))) 14051 || (frame_redisplay_p (f) && FRAME_WINDOW_P (f))))
14052 gui_consider_frame_title (frame); 14052 gui_consider_frame_title (frame);
14053 } 14053 }
14054 } 14054 }
@@ -17062,8 +17062,8 @@ redisplay_internal (void)
17062 { 17062 {
17063 struct frame *f = XFRAME (frame); 17063 struct frame *f = XFRAME (frame);
17064 17064
17065 /* FRAME_REDISPLAY_P true basically means the frame is visible. */ 17065 /* frame_redisplay_p true basically means the frame is visible. */
17066 if (FRAME_REDISPLAY_P (f)) 17066 if (frame_redisplay_p (f))
17067 { 17067 {
17068 ++number_of_visible_frames; 17068 ++number_of_visible_frames;
17069 /* Adjust matrices for visible frames only. */ 17069 /* Adjust matrices for visible frames only. */
@@ -17206,7 +17206,7 @@ redisplay_internal (void)
17206 && !w->update_mode_line 17206 && !w->update_mode_line
17207 && !current_buffer->clip_changed 17207 && !current_buffer->clip_changed
17208 && !current_buffer->prevent_redisplay_optimizations_p 17208 && !current_buffer->prevent_redisplay_optimizations_p
17209 && FRAME_REDISPLAY_P (XFRAME (w->frame)) 17209 && frame_redisplay_p (XFRAME (w->frame))
17210 && !XFRAME (w->frame)->cursor_type_changed 17210 && !XFRAME (w->frame)->cursor_type_changed
17211 && !XFRAME (w->frame)->face_change 17211 && !XFRAME (w->frame)->face_change
17212 /* Make sure recorded data applies to current buffer, etc. */ 17212 /* Make sure recorded data applies to current buffer, etc. */
@@ -17467,7 +17467,7 @@ redisplay_internal (void)
17467 if (is_tty_frame (f)) 17467 if (is_tty_frame (f))
17468 { 17468 {
17469 /* Ignore all invisble tty frames, children or root. */ 17469 /* Ignore all invisble tty frames, children or root. */
17470 if (!FRAME_VISIBLE_P (root_frame (f))) 17470 if (!frame_redisplay_p (f))
17471 continue; 17471 continue;
17472 17472
17473 /* Remember tty root frames which we've seen. */ 17473 /* Remember tty root frames which we've seen. */
@@ -17498,7 +17498,7 @@ redisplay_internal (void)
17498 if (gcscrollbars && FRAME_TERMINAL (f)->condemn_scroll_bars_hook) 17498 if (gcscrollbars && FRAME_TERMINAL (f)->condemn_scroll_bars_hook)
17499 FRAME_TERMINAL (f)->condemn_scroll_bars_hook (f); 17499 FRAME_TERMINAL (f)->condemn_scroll_bars_hook (f);
17500 17500
17501 if (FRAME_REDISPLAY_P (f)) 17501 if (frame_redisplay_p (f))
17502 { 17502 {
17503 /* Don't allow freeing images and faces for this 17503 /* Don't allow freeing images and faces for this
17504 frame as long as the frame's update wasn't 17504 frame as long as the frame's update wasn't
@@ -17524,7 +17524,7 @@ redisplay_internal (void)
17524 if (gcscrollbars && FRAME_TERMINAL (f)->judge_scroll_bars_hook) 17524 if (gcscrollbars && FRAME_TERMINAL (f)->judge_scroll_bars_hook)
17525 FRAME_TERMINAL (f)->judge_scroll_bars_hook (f); 17525 FRAME_TERMINAL (f)->judge_scroll_bars_hook (f);
17526 17526
17527 if (FRAME_REDISPLAY_P (f)) 17527 if (frame_redisplay_p (f))
17528 { 17528 {
17529 /* If fonts changed on visible frame, display again. */ 17529 /* If fonts changed on visible frame, display again. */
17530 if (f->fonts_changed) 17530 if (f->fonts_changed)
@@ -17630,7 +17630,7 @@ redisplay_internal (void)
17630 } 17630 }
17631 } 17631 }
17632 } 17632 }
17633 else if (FRAME_REDISPLAY_P (sf)) 17633 else if (frame_redisplay_p (sf))
17634 { 17634 {
17635 sf->inhibit_clear_image_cache = true; 17635 sf->inhibit_clear_image_cache = true;
17636 displayed_buffer = XBUFFER (XWINDOW (selected_window)->contents); 17636 displayed_buffer = XBUFFER (XWINDOW (selected_window)->contents);
@@ -17681,7 +17681,7 @@ redisplay_internal (void)
17681 unrequest_sigio (); 17681 unrequest_sigio ();
17682 STOP_POLLING; 17682 STOP_POLLING;
17683 17683
17684 if (FRAME_REDISPLAY_P (sf)) 17684 if (frame_redisplay_p (sf))
17685 { 17685 {
17686 if (hscroll_retries <= MAX_HSCROLL_RETRIES 17686 if (hscroll_retries <= MAX_HSCROLL_RETRIES
17687 && hscroll_windows (selected_window)) 17687 && hscroll_windows (selected_window))
@@ -17763,7 +17763,7 @@ redisplay_internal (void)
17763 17763
17764 FOR_EACH_FRAME (tail, frame) 17764 FOR_EACH_FRAME (tail, frame)
17765 { 17765 {
17766 if (FRAME_REDISPLAY_P (XFRAME (frame))) 17766 if (frame_redisplay_p (XFRAME (frame)))
17767 new_count++; 17767 new_count++;
17768 } 17768 }
17769 17769
@@ -34268,7 +34268,7 @@ display_and_set_cursor (struct window *w, bool on,
34268 windows and frames; in the latter case, the frame or window may 34268 windows and frames; in the latter case, the frame or window may
34269 be in the midst of changing its size, and x and y may be off the 34269 be in the midst of changing its size, and x and y may be off the
34270 window. */ 34270 window. */
34271 if (! FRAME_REDISPLAY_P (f) 34271 if (! frame_redisplay_p (f)
34272 || vpos >= w->current_matrix->nrows 34272 || vpos >= w->current_matrix->nrows
34273 || hpos >= w->current_matrix->matrix_w) 34273 || hpos >= w->current_matrix->matrix_w)
34274 return; 34274 return;
@@ -34436,7 +34436,7 @@ gui_update_cursor (struct frame *f, bool on_p)
34436void 34436void
34437gui_clear_cursor (struct window *w) 34437gui_clear_cursor (struct window *w)
34438{ 34438{
34439 if (FRAME_REDISPLAY_P (XFRAME (w->frame)) && w->phys_cursor_on_p) 34439 if (frame_redisplay_p (XFRAME (w->frame)) && w->phys_cursor_on_p)
34440 update_window_cursor (w, false); 34440 update_window_cursor (w, false);
34441} 34441}
34442 34442
diff --git a/src/xterm.h b/src/xterm.h
index 7c2fadbf094..57e37a1a8f5 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -1494,7 +1494,7 @@ extern void x_mark_frame_dirty (struct frame *f);
1494#define FRAME_X_VISUAL_INFO(f) (&FRAME_DISPLAY_INFO (f)->visual_info) 1494#define FRAME_X_VISUAL_INFO(f) (&FRAME_DISPLAY_INFO (f)->visual_info)
1495 1495
1496/* Whether or not the frame is visible. Do not test this alone. 1496/* Whether or not the frame is visible. Do not test this alone.
1497 Instead, use FRAME_REDISPLAY_P. */ 1497 Instead, use frame_redisplay_p. */
1498#define FRAME_X_VISIBLE(f) (FRAME_X_OUTPUT (f)->visibility_state \ 1498#define FRAME_X_VISIBLE(f) (FRAME_X_OUTPUT (f)->visibility_state \
1499 != VisibilityFullyObscured) 1499 != VisibilityFullyObscured)
1500 1500