New internal-border face and args for select-window and x-focus-frame
Add `internal-border' face and handle it whenever clearing the internal border. If NORECORD equals the symbol 'mark-for-redisplay', `select-window' will not record the window but still mark it for redisplay. The new argument NOACTIVATE for `x-focus-frame' tries to not activate FRAME when set. * lisp/faces.el (internal-border): New face. * lisp/mwheel.el (mwheel-scroll): Select window to scroll with `mark-for-redisplay'. * lisp/scroll-bar.el (scroll-bar-drag) (scroll-bar-horizontal-drag, scroll-bar-scroll-down) (scroll-bar-scroll-up, scroll-bar-toolkit-scroll) (scroll-bar-toolkit-horizontal-scroll): Select window to scroll with `mark-for-redisplay'. * lisp/window.el (handle-select-window): When `focus-follows-mouse' is not 'auto-raise' try to not activate FRAME. * src/dispextern.h (face_id): Add INTERNAL_BORDER_FACE_ID. * src/frame.c (Fx_focus_frame): New argument NOACTIVATE. * src/frame.h (x_focus_frame): Update extern declaration. * src/gtkutil.c (xg_clear_under_internal_border): Remove function. (xg_frame_resized, xg_frame_set_char_size): Call x_clear_under_internal_border. (xg_tool_bar_callback): Adapt x_focus_frame call. * src/gtkutil.h (xg_clear_under_internal_border): Remove declaration. * src/nsfns.m (x_focus_frame): Add argument NOACTIVATE. * src/w32fns.c (x_clear_under_internal_border): Fill border with internal-border background if specified. * src/w32term.h (x_clear_under_internal_border): Add extern declaration. * src/w32term.c (x_after_update_window_line): Fill border with internal-border background if specified. (w32_set_vertical_scroll_bar, w32_set_horizontal_scroll_bar) (x_scroll_bar_clear, w32_read_socket): Call x_clear_under_internal_border. (x_focus_frame): New argument NOACTIVATE. * src/window.c (select_window): Mark WINDOW for redisplay when NORECORD equals 'mark-for-redisplay'. (Fselect_window): Update doc-string. (syms_of_window): Define Qmark_for_redisplay. * src/xdisp.c (clear_garbaged_frames, echo_area_display) (redisplay_internal): Call x_clear_under_internal_border. * src/xfaces.c (lookup_basic_face): Handle `window-divider' and `internal-border' faces. (realize_basic_faces): Realize `internal-border' face. (syms_of_xfaces): Define Qinternal_border. * src/xfns.c (x_set_internal_border_width): Remove call for xg_clear_under_internal_border. (x_focus_frame): New argument NOACTIVATE. When non-nil try to not activate frame. * src/xterm.c (x_fill_rectangle): No more static. (x_clear_under_internal_border, x_after_update_window_line): Fill border with internal-border background if specified. (xt_horizontal_action_hook): Rewrite. (handle_one_xevent): Call x_clear_under_internal_border. * src/xterm.h (x_fill_rectangle): Add extern declaration.
This commit is contained in:
parent
8720f601e7
commit
c25005eda1
19 changed files with 196 additions and 92 deletions
|
@ -2629,6 +2629,13 @@ the same as `window-divider' face."
|
|||
:group 'window-divider
|
||||
:group 'basic-faces)
|
||||
|
||||
(defface internal-border
|
||||
'((t nil))
|
||||
"Basic face for the internal border."
|
||||
:version "26.1"
|
||||
:group 'frames
|
||||
:group 'basic-faces)
|
||||
|
||||
(defface minibuffer-prompt
|
||||
'((((background dark)) :foreground "cyan")
|
||||
;; Don't use blue because many users of the MS-DOS port customize
|
||||
|
|
|
@ -220,6 +220,9 @@ non-Windows systems."
|
|||
(mods
|
||||
(delq 'click (delq 'double (delq 'triple (event-modifiers event)))))
|
||||
(amt (assoc mods mouse-wheel-scroll-amount)))
|
||||
(unless (eq scroll-window selected-window)
|
||||
;; Mark window to be scrolled for redisplay.
|
||||
(select-window scroll-window 'mark-for-redisplay))
|
||||
;; Extract the actual amount or find the element that has no modifiers.
|
||||
(if amt (setq amt (cdr amt))
|
||||
(let ((list-elt mouse-wheel-scroll-amount))
|
||||
|
|
|
@ -281,7 +281,7 @@ If you click outside the slider, the window scrolls to bring the slider there."
|
|||
(with-current-buffer (window-buffer window)
|
||||
(setq before-scroll point-before-scroll))
|
||||
(save-selected-window
|
||||
(select-window window)
|
||||
(select-window window 'mark-for-redisplay)
|
||||
(setq before-scroll
|
||||
(or before-scroll (point))))
|
||||
(scroll-bar-drag-1 event)
|
||||
|
@ -326,7 +326,7 @@ If you click outside the slider, the window scrolls to bring the slider there."
|
|||
(with-current-buffer (window-buffer window)
|
||||
(setq before-scroll point-before-scroll))
|
||||
(save-selected-window
|
||||
(select-window window)
|
||||
(select-window window 'mark-for-redisplay)
|
||||
(setq before-scroll
|
||||
(or before-scroll (point))))
|
||||
(scroll-bar-horizontal-drag-1 event)
|
||||
|
@ -356,7 +356,7 @@ EVENT should be a scroll bar click."
|
|||
(unwind-protect
|
||||
(save-selected-window
|
||||
(let ((portion-whole (nth 2 end-position)))
|
||||
(select-window window)
|
||||
(select-window window 'mark-for-redisplay)
|
||||
(setq before-scroll
|
||||
(or before-scroll (point)))
|
||||
(scroll-down
|
||||
|
@ -377,7 +377,7 @@ EVENT should be a scroll bar click."
|
|||
(unwind-protect
|
||||
(save-selected-window
|
||||
(let ((portion-whole (nth 2 end-position)))
|
||||
(select-window window)
|
||||
(select-window window 'mark-for-redisplay)
|
||||
(setq before-scroll
|
||||
(or before-scroll (point)))
|
||||
(scroll-up
|
||||
|
@ -402,7 +402,7 @@ EVENT should be a scroll bar click."
|
|||
(with-current-buffer (window-buffer window)
|
||||
(setq before-scroll point-before-scroll))
|
||||
(save-selected-window
|
||||
(select-window window)
|
||||
(select-window window 'mark-for-redisplay)
|
||||
(setq before-scroll (or before-scroll (point)))
|
||||
(cond
|
||||
((eq part 'above-handle)
|
||||
|
@ -449,7 +449,7 @@ EVENT should be a scroll bar click."
|
|||
(with-current-buffer (window-buffer window)
|
||||
(setq before-scroll point-before-scroll))
|
||||
(save-selected-window
|
||||
(select-window window)
|
||||
(select-window window 'mark-for-redisplay)
|
||||
(setq before-scroll (or before-scroll (point)))
|
||||
(cond
|
||||
((eq part 'before-handle)
|
||||
|
|
|
@ -8855,7 +8855,7 @@ is active. This function is run by `mouse-autoselect-window-timer'."
|
|||
(raise-frame frame))
|
||||
(t
|
||||
;; Just focus frame.
|
||||
(x-focus-frame frame))))))
|
||||
(x-focus-frame frame t))))))
|
||||
|
||||
(defun truncated-partial-width-window-p (&optional window)
|
||||
"Return non-nil if lines in WINDOW are specifically truncated due to its width.
|
||||
|
|
|
@ -1784,6 +1784,7 @@ enum face_id
|
|||
WINDOW_DIVIDER_FACE_ID,
|
||||
WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID,
|
||||
WINDOW_DIVIDER_LAST_PIXEL_FACE_ID,
|
||||
INTERNAL_BORDER_FACE_ID,
|
||||
BASIC_FACE_ID_SENTINEL
|
||||
};
|
||||
|
||||
|
|
10
src/frame.c
10
src/frame.c
|
@ -2450,14 +2450,16 @@ See `redirect-frame-focus'. */)
|
|||
return FRAME_FOCUS_FRAME (decode_live_frame (frame));
|
||||
}
|
||||
|
||||
DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
|
||||
DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 2, 0,
|
||||
doc: /* Set the input focus to FRAME.
|
||||
FRAME nil means use the selected frame.
|
||||
FRAME nil means use the selected frame. Optional argument NOACTIVATE
|
||||
means do not activate FRAME.
|
||||
|
||||
If there is no window system support, this function does nothing. */)
|
||||
(Lisp_Object frame)
|
||||
(Lisp_Object frame, Lisp_Object noactivate)
|
||||
{
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
x_focus_frame (decode_window_system_frame (frame));
|
||||
x_focus_frame (decode_window_system_frame (frame), !NILP (noactivate));
|
||||
#endif
|
||||
return Qnil;
|
||||
}
|
||||
|
|
|
@ -1531,7 +1531,7 @@ extern void x_sync (struct frame *);
|
|||
#endif /* HAVE_X_WINDOWS */
|
||||
|
||||
extern void x_query_colors (struct frame *f, XColor *, int);
|
||||
extern void x_focus_frame (struct frame *);
|
||||
extern void x_focus_frame (struct frame *, bool);
|
||||
|
||||
#ifndef HAVE_NS
|
||||
|
||||
|
|
|
@ -835,30 +835,6 @@ xg_set_geometry (struct frame *f)
|
|||
}
|
||||
}
|
||||
|
||||
/* Clear under internal border if any. As we use a mix of Gtk+ and X calls
|
||||
and use a GtkFixed widget, this doesn't happen automatically. */
|
||||
|
||||
void
|
||||
xg_clear_under_internal_border (struct frame *f)
|
||||
{
|
||||
if (FRAME_INTERNAL_BORDER_WIDTH (f) > 0)
|
||||
{
|
||||
x_clear_area (f, 0, 0,
|
||||
FRAME_PIXEL_WIDTH (f), FRAME_INTERNAL_BORDER_WIDTH (f));
|
||||
|
||||
x_clear_area (f, 0, 0,
|
||||
FRAME_INTERNAL_BORDER_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
|
||||
|
||||
x_clear_area (f, 0,
|
||||
FRAME_PIXEL_HEIGHT (f) - FRAME_INTERNAL_BORDER_WIDTH (f),
|
||||
FRAME_PIXEL_WIDTH (f), FRAME_INTERNAL_BORDER_WIDTH (f));
|
||||
|
||||
x_clear_area (f,
|
||||
FRAME_PIXEL_WIDTH (f) - FRAME_INTERNAL_BORDER_WIDTH (f),
|
||||
0, FRAME_INTERNAL_BORDER_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
xg_get_gdk_scale (void)
|
||||
{
|
||||
|
@ -905,7 +881,7 @@ xg_frame_resized (struct frame *f, int pixelwidth, int pixelheight)
|
|||
|| pixelwidth != FRAME_PIXEL_WIDTH (f)
|
||||
|| pixelheight != FRAME_PIXEL_HEIGHT (f))
|
||||
{
|
||||
xg_clear_under_internal_border (f);
|
||||
x_clear_under_internal_border (f);
|
||||
change_frame_size (f, width, height, 0, 1, 0, 1);
|
||||
SET_FRAME_GARBAGED (f);
|
||||
cancel_mouse_face (f);
|
||||
|
@ -933,7 +909,7 @@ xg_frame_set_char_size (struct frame *f, int width, int height)
|
|||
&gwidth, &gheight);
|
||||
|
||||
/* Do this before resize, as we don't know yet if we will be resized. */
|
||||
xg_clear_under_internal_border (f);
|
||||
x_clear_under_internal_border (f);
|
||||
|
||||
if (FRAME_VISIBLE_P (f))
|
||||
{
|
||||
|
@ -4361,7 +4337,7 @@ xg_tool_bar_callback (GtkWidget *w, gpointer client_data)
|
|||
|
||||
/* Return focus to the frame after we have clicked on a detached
|
||||
tool bar button. */
|
||||
x_focus_frame (f);
|
||||
x_focus_frame (f, false);
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
|
|
|
@ -150,7 +150,6 @@ extern void update_frame_tool_bar (struct frame *f);
|
|||
extern void free_frame_tool_bar (struct frame *f);
|
||||
extern void xg_change_toolbar_position (struct frame *f, Lisp_Object pos);
|
||||
|
||||
extern void xg_clear_under_internal_border (struct frame *f);
|
||||
extern void xg_frame_resized (struct frame *f,
|
||||
int pixelwidth,
|
||||
int pixelheight);
|
||||
|
|
|
@ -1391,7 +1391,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
}
|
||||
|
||||
void
|
||||
x_focus_frame (struct frame *f)
|
||||
x_focus_frame (struct frame *f, bool noactivate)
|
||||
{
|
||||
struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
|
||||
|
||||
|
|
30
src/w32fns.c
30
src/w32fns.c
|
@ -1634,7 +1634,13 @@ x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
/**
|
||||
* x_clear_under_internal_border:
|
||||
*
|
||||
* Clear area of frame F's internal border. If the internal border face
|
||||
* of F has been specified (is not null), fill the area with that face.
|
||||
*/
|
||||
void
|
||||
x_clear_under_internal_border (struct frame *f)
|
||||
{
|
||||
int border = FRAME_INTERNAL_BORDER_WIDTH (f);
|
||||
|
@ -1645,12 +1651,26 @@ x_clear_under_internal_border (struct frame *f)
|
|||
HDC hdc = get_frame_dc (f);
|
||||
int width = FRAME_PIXEL_WIDTH (f);
|
||||
int height = FRAME_PIXEL_HEIGHT (f);
|
||||
struct face *face = FACE_FROM_ID_OR_NULL (f, INTERNAL_BORDER_FACE_ID);
|
||||
|
||||
block_input ();
|
||||
w32_clear_area (f, hdc, 0, FRAME_TOP_MARGIN_HEIGHT (f), width, border);
|
||||
w32_clear_area (f, hdc, 0, 0, border, height);
|
||||
w32_clear_area (f, hdc, width - border, 0, border, height);
|
||||
w32_clear_area (f, hdc, 0, height - border, width, border);
|
||||
if (face)
|
||||
{
|
||||
/* Fill border with internal border face. */
|
||||
unsigned long color = face->background;
|
||||
|
||||
w32_fill_area (f, hdc, color, 0, FRAME_TOP_MARGIN_HEIGHT (f), width, border);
|
||||
w32_fill_area (f, hdc, color, 0, 0, border, height);
|
||||
w32_fill_area (f, hdc, color, width - border, 0, border, height);
|
||||
w32_fill_area (f, hdc, color, 0, height - border, width, border);
|
||||
}
|
||||
else
|
||||
{
|
||||
w32_clear_area (f, hdc, 0, FRAME_TOP_MARGIN_HEIGHT (f), width, border);
|
||||
w32_clear_area (f, hdc, 0, 0, border, height);
|
||||
w32_clear_area (f, hdc, width - border, 0, border, height);
|
||||
w32_clear_area (f, hdc, 0, height - border, width, border);
|
||||
}
|
||||
release_frame_dc (f, hdc);
|
||||
unblock_input ();
|
||||
}
|
||||
|
|
|
@ -782,9 +782,23 @@ x_after_update_window_line (struct window *w, struct glyph_row *desired_row)
|
|||
block_input ();
|
||||
{
|
||||
HDC hdc = get_frame_dc (f);
|
||||
w32_clear_area (f, hdc, 0, y, width, height);
|
||||
w32_clear_area (f, hdc, FRAME_PIXEL_WIDTH (f) - width,
|
||||
y, width, height);
|
||||
struct face *face = FACE_FROM_ID_OR_NULL (f, INTERNAL_BORDER_FACE_ID);
|
||||
|
||||
if (face)
|
||||
{
|
||||
/* Fill border with internal border face. */
|
||||
unsigned long color = face->background;
|
||||
|
||||
w32_fill_area (f, hdc, color, 0, y, width, height);
|
||||
w32_fill_area (f, hdc, color, FRAME_PIXEL_WIDTH (f) - width,
|
||||
y, width, height);
|
||||
}
|
||||
else
|
||||
{
|
||||
w32_clear_area (f, hdc, 0, y, width, height);
|
||||
w32_clear_area (f, hdc, FRAME_PIXEL_WIDTH (f) - width,
|
||||
y, width, height);
|
||||
}
|
||||
release_frame_dc (f, hdc);
|
||||
}
|
||||
unblock_input ();
|
||||
|
@ -3908,6 +3922,7 @@ w32_set_vertical_scroll_bar (struct window *w,
|
|||
for them on the frame, we have to clear "under" them. */
|
||||
w32_clear_area (f, hdc, left, top, width, height);
|
||||
release_frame_dc (f, hdc);
|
||||
x_clear_under_internal_border (f);
|
||||
}
|
||||
/* Make sure scroll bar is "visible" before moving, to ensure the
|
||||
area of the parent window now exposed will be refreshed. */
|
||||
|
@ -4009,6 +4024,7 @@ w32_set_horizontal_scroll_bar (struct window *w,
|
|||
for them on the frame, we have to clear "under" them. */
|
||||
w32_clear_area (f, hdc, clear_left, top, clear_width, height);
|
||||
release_frame_dc (f, hdc);
|
||||
x_clear_under_internal_border (f);
|
||||
}
|
||||
/* Make sure scroll bar is "visible" before moving, to ensure the
|
||||
area of the parent window now exposed will be refreshed. */
|
||||
|
@ -4553,6 +4569,7 @@ x_scroll_bar_clear (struct frame *f)
|
|||
GetClientRect (window, &rect);
|
||||
select_palette (f, hdc);
|
||||
w32_clear_rect (f, hdc, &rect);
|
||||
x_clear_under_internal_border (f);
|
||||
deselect_palette (f, hdc);
|
||||
|
||||
ReleaseDC (window, hdc);
|
||||
|
@ -4682,6 +4699,7 @@ w32_read_socket (struct terminal *terminal,
|
|||
msg.rect.top,
|
||||
msg.rect.right - msg.rect.left,
|
||||
msg.rect.bottom - msg.rect.top);
|
||||
x_clear_under_internal_border (f);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -5118,6 +5136,9 @@ w32_read_socket (struct terminal *terminal,
|
|||
}
|
||||
#endif
|
||||
|
||||
if (f = x_window_to_frame (dpyinfo, msg.msg.hwnd))
|
||||
x_clear_under_internal_border (f);
|
||||
|
||||
check_visibility = 1;
|
||||
break;
|
||||
|
||||
|
@ -6392,10 +6413,14 @@ frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
|
|||
}
|
||||
|
||||
|
||||
/* focus shifting, raising and lowering. */
|
||||
/* Focus shifting, raising and lowering. */
|
||||
|
||||
/* The NOACTIVATE argument has no effect on Windows. According to the
|
||||
Windows API: An application cannot activate an inactive window
|
||||
without also bringing it to the top of the Z order. */
|
||||
|
||||
void
|
||||
x_focus_frame (struct frame *f)
|
||||
x_focus_frame (struct frame *f, bool noactivate)
|
||||
{
|
||||
#if 0
|
||||
struct w32_display_info *dpyinfo = &one_w32_display_info;
|
||||
|
|
|
@ -707,7 +707,7 @@ extern BOOL parse_button (int, int, int *, int *);
|
|||
|
||||
extern void w32_sys_ring_bell (struct frame *f);
|
||||
extern void x_delete_display (struct w32_display_info *dpyinfo);
|
||||
|
||||
extern void x_clear_under_internal_border (struct frame *f);
|
||||
extern void x_query_color (struct frame *, XColor *);
|
||||
|
||||
#define FILE_NOTIFICATIONS_SIZE 16384
|
||||
|
|
|
@ -492,7 +492,7 @@ select_window (Lisp_Object window, Lisp_Object norecord,
|
|||
record_buffer before returning here. */
|
||||
goto record_and_return;
|
||||
|
||||
if (NILP (norecord))
|
||||
if (NILP (norecord) || EQ (norecord, Qmark_for_redisplay))
|
||||
{ /* Mark the window for redisplay since the selected-window has
|
||||
a different mode-line. */
|
||||
wset_redisplay (XWINDOW (selected_window));
|
||||
|
@ -571,7 +571,8 @@ Return WINDOW.
|
|||
|
||||
Optional second arg NORECORD non-nil means do not put this buffer at the
|
||||
front of the buffer list and do not make this window the most recently
|
||||
selected one.
|
||||
selected one. Also, do not mark WINDOW for redisplay unless NORECORD
|
||||
equals the special symbol `mark-for-redisplay'.
|
||||
|
||||
Run `buffer-list-update-hook' unless NORECORD is non-nil. Note that
|
||||
applications and internal routines often select a window temporarily for
|
||||
|
@ -7350,6 +7351,7 @@ syms_of_window (void)
|
|||
DEFSYM (Qclone_of, "clone-of");
|
||||
DEFSYM (Qfloor, "floor");
|
||||
DEFSYM (Qceiling, "ceiling");
|
||||
DEFSYM (Qmark_for_redisplay, "mark-for-redisplay");
|
||||
|
||||
staticpro (&Vwindow_list);
|
||||
|
||||
|
|
18
src/xdisp.c
18
src/xdisp.c
|
@ -11379,6 +11379,11 @@ clear_garbaged_frames (void)
|
|||
redraw_frame (f);
|
||||
else
|
||||
clear_current_matrices (f);
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM) && !defined (HAVE_NS)
|
||||
x_clear_under_internal_border (f);
|
||||
#endif /* HAVE_WINDOW_SYSTEM && !HAVE_NS */
|
||||
|
||||
fset_redisplay (f);
|
||||
f->garbaged = false;
|
||||
f->resized_p = false;
|
||||
|
@ -11441,7 +11446,14 @@ echo_area_display (bool update_frame_p)
|
|||
been called, so that mode lines above the echo area are
|
||||
garbaged. This looks odd, so we prevent it here. */
|
||||
if (!display_completed)
|
||||
n = redisplay_mode_lines (FRAME_ROOT_WINDOW (f), false);
|
||||
{
|
||||
n = redisplay_mode_lines (FRAME_ROOT_WINDOW (f), false);
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM) && !defined (HAVE_NS)
|
||||
x_clear_under_internal_border (f);
|
||||
#endif /* HAVE_WINDOW_SYSTEM && !HAVE_NS */
|
||||
|
||||
}
|
||||
|
||||
if (window_height_changed_p
|
||||
/* Don't do this if Emacs is shutting down. Redisplay
|
||||
|
@ -14151,6 +14163,10 @@ redisplay_internal (void)
|
|||
if (FRAME_GARBAGED_P (f))
|
||||
goto retry;
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM) && !defined (HAVE_NS)
|
||||
x_clear_under_internal_border (f);
|
||||
#endif /* HAVE_WINDOW_SYSTEM && !HAVE_NS */
|
||||
|
||||
/* Prevent various kinds of signals during display
|
||||
update. stdio is not robust about handling
|
||||
signals, which can cause an apparent I/O error. */
|
||||
|
|
10
src/xfaces.c
10
src/xfaces.c
|
@ -4474,6 +4474,10 @@ lookup_basic_face (struct frame *f, int face_id)
|
|||
case CURSOR_FACE_ID: name = Qcursor; break;
|
||||
case MOUSE_FACE_ID: name = Qmouse; break;
|
||||
case MENU_FACE_ID: name = Qmenu; break;
|
||||
case WINDOW_DIVIDER_FACE_ID: name = Qwindow_divider; break;
|
||||
case WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID: name = Qwindow_divider_first_pixel; break;
|
||||
case WINDOW_DIVIDER_LAST_PIXEL_FACE_ID: name = Qwindow_divider_last_pixel; break;
|
||||
case INTERNAL_BORDER_FACE_ID: name = Qinternal_border; break;
|
||||
|
||||
default:
|
||||
emacs_abort (); /* the caller is supposed to pass us a basic face id */
|
||||
|
@ -5168,6 +5172,7 @@ realize_basic_faces (struct frame *f)
|
|||
WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID);
|
||||
realize_named_face (f, Qwindow_divider_last_pixel,
|
||||
WINDOW_DIVIDER_LAST_PIXEL_FACE_ID);
|
||||
realize_named_face (f, Qinternal_border, INTERNAL_BORDER_FACE_ID);
|
||||
|
||||
/* Reflect changes in the `menu' face in menu bars. */
|
||||
if (FRAME_FACE_CACHE (f)->menu_face_changed_p)
|
||||
|
@ -6420,11 +6425,12 @@ syms_of_xfaces (void)
|
|||
DEFSYM (Qmouse, "mouse");
|
||||
DEFSYM (Qmode_line_inactive, "mode-line-inactive");
|
||||
DEFSYM (Qvertical_border, "vertical-border");
|
||||
|
||||
/* TTY color-related functions (defined in tty-colors.el). */
|
||||
DEFSYM (Qwindow_divider, "window-divider");
|
||||
DEFSYM (Qwindow_divider_first_pixel, "window-divider-first-pixel");
|
||||
DEFSYM (Qwindow_divider_last_pixel, "window-divider-last-pixel");
|
||||
DEFSYM (Qinternal_border, "internal-border");
|
||||
|
||||
/* TTY color-related functions (defined in tty-colors.el). */
|
||||
DEFSYM (Qtty_color_desc, "tty-color-desc");
|
||||
DEFSYM (Qtty_color_standard_values, "tty-color-standard-values");
|
||||
DEFSYM (Qtty_color_by_index, "tty-color-by-index");
|
||||
|
|
12
src/xfns.c
12
src/xfns.c
|
@ -1703,15 +1703,10 @@ x_set_internal_border_width (struct frame *f, Lisp_Object arg, Lisp_Object oldva
|
|||
widget_store_internal_border (FRAME_X_OUTPUT (f)->edit_widget);
|
||||
#endif
|
||||
|
||||
if (FRAME_X_WINDOW (f) != 0)
|
||||
if (FRAME_X_WINDOW (f))
|
||||
{
|
||||
adjust_frame_size (f, -1, -1, 3, false, Qinternal_border_width);
|
||||
|
||||
#ifdef USE_GTK
|
||||
xg_clear_under_internal_border (f);
|
||||
#else
|
||||
x_clear_under_internal_border (f);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4076,7 +4071,7 @@ x_get_focus_frame (struct frame *frame)
|
|||
following a user-command. */
|
||||
|
||||
void
|
||||
x_focus_frame (struct frame *f)
|
||||
x_focus_frame (struct frame *f, bool noactivate)
|
||||
{
|
||||
Display *dpy = FRAME_X_DISPLAY (f);
|
||||
|
||||
|
@ -4094,7 +4089,8 @@ x_focus_frame (struct frame *f)
|
|||
{
|
||||
XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
RevertToParent, CurrentTime);
|
||||
x_ewmh_activate_frame (f);
|
||||
if (!noactivate)
|
||||
x_ewmh_activate_frame (f);
|
||||
}
|
||||
|
||||
x_uncatch_errors ();
|
||||
|
|
104
src/xterm.c
104
src/xterm.c
|
@ -714,7 +714,7 @@ x_reset_clip_rectangles (struct frame *f, GC gc)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
x_fill_rectangle (struct frame *f, GC gc, int x, int y, int width, int height)
|
||||
{
|
||||
#ifdef USE_CAIRO
|
||||
|
@ -1295,8 +1295,12 @@ XTbuffer_flipping_unblocked_hook (struct frame *f)
|
|||
show_back_buffer (f);
|
||||
}
|
||||
|
||||
/* Clear under internal border if any (GTK has its own version). */
|
||||
#ifndef USE_GTK
|
||||
/**
|
||||
* x_clear_under_internal_border:
|
||||
*
|
||||
* Clear area of frame F's internal border. If the internal border face
|
||||
* of F has been specified (is not null), fill the area with that face.
|
||||
*/
|
||||
void
|
||||
x_clear_under_internal_border (struct frame *f)
|
||||
{
|
||||
|
@ -1305,17 +1309,39 @@ x_clear_under_internal_border (struct frame *f)
|
|||
int border = FRAME_INTERNAL_BORDER_WIDTH (f);
|
||||
int width = FRAME_PIXEL_WIDTH (f);
|
||||
int height = FRAME_PIXEL_HEIGHT (f);
|
||||
#ifdef USE_GTK
|
||||
int margin = 0;
|
||||
#else
|
||||
int margin = FRAME_TOP_MARGIN_HEIGHT (f);
|
||||
#endif
|
||||
struct face *face = FACE_FROM_ID_OR_NULL (f, INTERNAL_BORDER_FACE_ID);
|
||||
|
||||
block_input ();
|
||||
x_clear_area (f, 0, 0, border, height);
|
||||
x_clear_area (f, 0, margin, width, border);
|
||||
x_clear_area (f, width - border, 0, border, height);
|
||||
x_clear_area (f, 0, height - border, width, border);
|
||||
|
||||
if (face)
|
||||
{
|
||||
unsigned long color = face->background;
|
||||
Display *display = FRAME_X_DISPLAY (f);
|
||||
GC gc = f->output_data.x->normal_gc;
|
||||
|
||||
XSetForeground (display, gc, color);
|
||||
x_fill_rectangle (f, gc, 0, margin, width, border);
|
||||
x_fill_rectangle (f, gc, 0, 0, border, height);
|
||||
x_fill_rectangle (f, gc, width - border, 0, border, height);
|
||||
x_fill_rectangle (f, gc, 0, height - border, width, border);
|
||||
XSetForeground (display, gc, FRAME_FOREGROUND_PIXEL (f));
|
||||
}
|
||||
else
|
||||
{
|
||||
x_clear_area (f, 0, 0, border, height);
|
||||
x_clear_area (f, 0, margin, width, border);
|
||||
x_clear_area (f, width - border, 0, border, height);
|
||||
x_clear_area (f, 0, height - border, width, border);
|
||||
}
|
||||
|
||||
unblock_input ();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Draw truncation mark bitmaps, continuation mark bitmaps, overlay
|
||||
arrow bitmaps, or clear the fringes if no bitmaps are required
|
||||
|
@ -1351,10 +1377,25 @@ x_after_update_window_line (struct window *w, struct glyph_row *desired_row)
|
|||
height > 0))
|
||||
{
|
||||
int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y));
|
||||
struct face *face = FACE_FROM_ID_OR_NULL (f, INTERNAL_BORDER_FACE_ID);
|
||||
|
||||
block_input ();
|
||||
x_clear_area (f, 0, y, width, height);
|
||||
x_clear_area (f, FRAME_PIXEL_WIDTH (f) - width, y, width, height);
|
||||
if (face)
|
||||
{
|
||||
unsigned long color = face->background;
|
||||
Display *display = FRAME_X_DISPLAY (f);
|
||||
|
||||
XSetForeground (display, f->output_data.x->normal_gc, color);
|
||||
x_fill_rectangle (f, f->output_data.x->normal_gc,
|
||||
0, y, width, height);
|
||||
x_fill_rectangle (f, f->output_data.x->normal_gc,
|
||||
FRAME_PIXEL_WIDTH (f) - width, y, width, height);
|
||||
}
|
||||
else
|
||||
{
|
||||
x_clear_area (f, 0, y, width, height);
|
||||
x_clear_area (f, FRAME_PIXEL_WIDTH (f) - width, y, width, height);
|
||||
}
|
||||
unblock_input ();
|
||||
}
|
||||
}
|
||||
|
@ -3849,11 +3890,11 @@ x_clear_area (struct frame *f, int x, int y, int width, int height)
|
|||
cairo_fill (cr);
|
||||
x_end_cr_clip (f);
|
||||
#else
|
||||
if (FRAME_X_DOUBLE_BUFFERED_P (f))
|
||||
XFillRectangle (FRAME_X_DISPLAY (f),
|
||||
FRAME_X_DRAWABLE (f),
|
||||
f->output_data.x->reverse_gc,
|
||||
x, y, width, height);
|
||||
if (FRAME_X_DOUBLE_BUFFERED_P (f))
|
||||
XFillRectangle (FRAME_X_DISPLAY (f),
|
||||
FRAME_X_DRAWABLE (f),
|
||||
f->output_data.x->reverse_gc,
|
||||
x, y, width, height);
|
||||
else
|
||||
x_clear_area1 (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
x, y, width, height, False);
|
||||
|
@ -5307,20 +5348,22 @@ xt_horizontal_action_hook (Widget widget, XtPointer client_data, String action_n
|
|||
x_send_scroll_bar_event (window_being_scrolled,
|
||||
scroll_bar_end_scroll, 0, 0, true);
|
||||
w = XWINDOW (window_being_scrolled);
|
||||
bar = XSCROLL_BAR (w->horizontal_scroll_bar);
|
||||
|
||||
if (bar->dragging != -1)
|
||||
if (!NILP (w->horizontal_scroll_bar))
|
||||
{
|
||||
bar->dragging = -1;
|
||||
/* The thumb size is incorrect while dragging: fix it. */
|
||||
set_horizontal_scroll_bar (w);
|
||||
}
|
||||
window_being_scrolled = Qnil;
|
||||
bar = XSCROLL_BAR (w->horizontal_scroll_bar);
|
||||
if (bar->dragging != -1)
|
||||
{
|
||||
bar->dragging = -1;
|
||||
/* The thumb size is incorrect while dragging: fix it. */
|
||||
set_horizontal_scroll_bar (w);
|
||||
}
|
||||
window_being_scrolled = Qnil;
|
||||
#if defined (USE_LUCID)
|
||||
bar->last_seen_part = scroll_bar_nowhere;
|
||||
bar->last_seen_part = scroll_bar_nowhere;
|
||||
#endif
|
||||
/* Xt timeouts no longer needed. */
|
||||
toolkit_scroll_bar_interaction = false;
|
||||
/* Xt timeouts no longer needed. */
|
||||
toolkit_scroll_bar_interaction = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* not USE_GTK */
|
||||
|
@ -7920,6 +7963,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
|||
event->xexpose.x, event->xexpose.y,
|
||||
event->xexpose.width, event->xexpose.height,
|
||||
0);
|
||||
x_clear_under_internal_border (f);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -7935,6 +7979,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
|||
#endif
|
||||
expose_frame (f, event->xexpose.x, event->xexpose.y,
|
||||
event->xexpose.width, event->xexpose.height);
|
||||
#ifdef USE_GTK
|
||||
x_clear_under_internal_border (f);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!FRAME_GARBAGED_P (f))
|
||||
|
@ -7983,7 +8030,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
|||
event->xgraphicsexpose.y,
|
||||
event->xgraphicsexpose.width,
|
||||
event->xgraphicsexpose.height);
|
||||
show_back_buffer (f);
|
||||
#ifdef USE_GTK
|
||||
x_clear_under_internal_border (f);
|
||||
#endif
|
||||
show_back_buffer (f);
|
||||
}
|
||||
#ifdef USE_X_TOOLKIT
|
||||
else
|
||||
|
|
|
@ -1102,6 +1102,7 @@ extern bool x_alloc_lighter_color_for_widget (Widget, Display *, Colormap,
|
|||
extern bool x_alloc_nearest_color (struct frame *, Colormap, XColor *);
|
||||
extern void x_query_color (struct frame *f, XColor *);
|
||||
extern void x_clear_area (struct frame *f, int, int, int, int);
|
||||
extern void x_fill_rectangle (struct frame *f, GC, int, int, int, int);
|
||||
#if !defined USE_X_TOOLKIT && !defined USE_GTK
|
||||
extern void x_mouse_leave (struct x_display_info *);
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue