X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0a8bf3afca415fec94742cf830622b22f186062c..b59a2e9edb562fce9c63a73242db323cd4a9dc0f:/src/frame.h diff --git a/src/frame.h b/src/frame.h index ec535d4448..c18b766207 100644 --- a/src/frame.h +++ b/src/frame.h @@ -18,7 +18,7 @@ along with GNU Emacs. If not, see . */ /* Don't multiply include: dispextern.h includes macterm.h which includes frame.h some emacs source includes both dispextern.h and - frame.h */ + frame.h. */ #ifndef EMACS_FRAME_H #define EMACS_FRAME_H @@ -33,7 +33,7 @@ INLINE_HEADER_BEGIN /* Miscellanea. */ -/* Nonzero means there is at least one garbaged frame. */ +/* Nonzero means there is at least one garbaged frame. */ extern bool frame_garbaged; @@ -200,7 +200,7 @@ struct frame string's pointer (`name', above) because it might get relocated. */ char *namebuf; - /* Glyph pool and matrix. */ + /* Glyph pool and matrix. */ struct glyph_pool *current_pool; struct glyph_pool *desired_pool; struct glyph_matrix *desired_matrix; @@ -353,46 +353,30 @@ struct frame unsigned int external_menu_bar : 1; #endif - /* visible is nonzero if the frame is currently displayed; we check + /* Next two bitfields are mutually exclusive. They might both be + 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. - DON'T SET IT DIRECTLY; instead, use FRAME_SET_VISIBLE. Note that, since invisible frames aren't updated, whenever a - frame becomes visible again, it must be marked as garbaged. The - FRAME_SAMPLE_VISIBILITY macro takes care of this. + frame becomes visible again, it must be marked as garbaged. 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 greater than 1, then the frame is obscured - we still consider + 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. We must take care to garbage the frame when it - ceases to be obscured though. - - iconified is nonzero if the frame is currently iconified. - - Asynchronous input handlers should NOT change these directly; - instead, they should change async_visible or async_iconified, and - let the FRAME_SAMPLE_VISIBILITY macro set visible and iconified - at the next redisplay. - - These should probably be considered read-only by everyone except - FRAME_SAMPLE_VISIBILITY. - - These two are mutually exclusive. They might both be zero, if the - frame has been made invisible without an icon. */ + ceases to be obscured though. See SET_FRAME_VISIBLE below. */ unsigned visible : 2; - unsigned iconified : 1; - /* Let's not use bitfields for volatile variables. */ - - /* Asynchronous input handlers change these, and - FRAME_SAMPLE_VISIBILITY copies them into visible and iconified. - See FRAME_SAMPLE_VISIBILITY, below. */ - volatile char async_visible, async_iconified; + /* Nonzero if the frame is currently iconified. Do not + set this directly, use SET_FRAME_ICONIFIED instead. */ + unsigned iconified : 1; /* Nonzero if this frame should be redrawn. */ - volatile char garbaged; + unsigned garbaged : 1; /* True if frame actually has a minibuffer window on it. 0 if using a minibuffer window that isn't on this frame. */ @@ -444,9 +428,6 @@ struct frame /* Width of bar cursor (if we are using that) for blink-off state. */ int blink_off_cursor_width; - /* Storage for messages to this frame. */ - char *message_buf; - /* Nonnegative if current redisplay should not do scroll computation for lines beyond a certain vpos. This is the vpos. */ int scroll_bottom_vpos; @@ -714,7 +695,7 @@ typedef struct frame *FRAME_PTR; #else #define FRAME_EXTERNAL_MENU_BAR(f) 0 #endif -#define FRAME_VISIBLE_P(f) ((f)->visible != 0) +#define FRAME_VISIBLE_P(f) (f)->visible /* Nonzero if frame F is currently visible but hidden. */ #define FRAME_OBSCURED_P(f) ((f)->visible > 1) @@ -722,9 +703,10 @@ typedef struct frame *FRAME_PTR; /* Nonzero if frame F is currently iconified. */ #define FRAME_ICONIFIED_P(f) (f)->iconified -#define FRAME_SET_VISIBLE(f,p) \ - ((f)->async_visible = (p), FRAME_SAMPLE_VISIBILITY (f)) +/* Mark frame F as currently garbaged. */ #define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1) + +/* Nonzero if frame F is currently garbaged. */ #define FRAME_GARBAGED_P(f) (f)->garbaged /* Nonzero means do not allow splitting this frame's window. */ @@ -751,7 +733,6 @@ typedef struct frame *FRAME_PTR; #define FRAME_DELETE_COST(f) (f)->delete_line_cost #define FRAME_INSERTN_COST(f) (f)->insert_n_lines_cost #define FRAME_DELETEN_COST(f) (f)->delete_n_lines_cost -#define FRAME_MESSAGE_BUF(f) (f)->message_buf #define FRAME_SCROLL_BOTTOM_VPOS(f) (f)->scroll_bottom_vpos #define FRAME_FOCUS_FRAME(f) f->focus_frame @@ -870,39 +851,6 @@ typedef struct frame *FRAME_PTR; #define FRAME_MESSAGE_BUF_SIZE(f) (((int) FRAME_COLS (f)) * 4) -/* Emacs's redisplay code could become confused if a frame's - visibility changes at arbitrary times. For example, if a frame is - visible while the desired glyphs are being built, but becomes - invisible before they are updated, then some rows of the - desired_glyphs will be left marked as enabled after redisplay is - complete, which should never happen. The next time the frame - becomes visible, redisplay will probably barf. - - Currently, there are no similar situations involving iconified, but - the principle is the same. - - So instead of having asynchronous input handlers directly set and - clear the frame's visibility and iconification flags, they just set - the async_visible and async_iconified flags; the redisplay code - calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay, - which sets visible and iconified from their asynchronous - counterparts. - - Synchronous code must use the FRAME_SET_VISIBLE macro. - - Also, if a frame used to be invisible, but has just become visible, - it must be marked as garbaged, since redisplay hasn't been keeping - up its contents. - - Note that a tty frame is visible if and only if it is the topmost - frame. */ - -#define FRAME_SAMPLE_VISIBILITY(f) \ - (((f)->async_visible && (f)->visible != (f)->async_visible) ? \ - SET_FRAME_GARBAGED (f) : 0, \ - (f)->visible = (f)->async_visible, \ - (f)->iconified = (f)->async_iconified) - #define CHECK_FRAME(x) \ CHECK_TYPE (FRAMEP (x), Qframep, x) @@ -936,12 +884,24 @@ typedef struct frame *FRAME_PTR; block_input (); \ if (hlinfo->mouse_face_mouse_frame) \ note_mouse_highlight (hlinfo->mouse_face_mouse_frame, \ - hlinfo->mouse_face_mouse_x, \ - hlinfo->mouse_face_mouse_y); \ + hlinfo->mouse_face_mouse_x, \ + hlinfo->mouse_face_mouse_y); \ unblock_input (); \ } \ } while (0) +/* Set visibility of frame F, marking F as garbaged if needed. */ + +#define SET_FRAME_VISIBLE(f, v) \ + (((f)->visible == 0 || ((f)->visible == 2)) \ + && ((v) == 1) ? SET_FRAME_GARBAGED (f) : 0, \ + (f)->visible = (eassert (0 <= (v) && (v) <= 2), (v))) + +/* Set iconify of frame F. */ + +#define SET_FRAME_ICONIFIED(f, i) \ + (f)->iconified = (eassert (0 <= (i) && (i) <= 1), (i)) + extern Lisp_Object Qframep, Qframe_live_p; extern Lisp_Object Qtty, Qtty_type; extern Lisp_Object Qtty_color_mode;