Commit a42e9724 authored by Jim Blandy's avatar Jim Blandy

* frame.h (struct frame): New fields `can_have_scrollbars' and

	`has_vertical_scrollbars'.
	(FRAME_CAN_HAVE_SCROLLBARS, FRAME_HAS_VERTICAL_SCROLLBARS): New
	accessors, for both the MULTI_FRAME and non-MULTI_FRAME.
	(VERTICAL_SCROLLBAR_WIDTH, WINDOW_VERTICAL_SCROLLBAR,
	WINDOW_VERTICAL_SCROLLBAR_COLUMN,
	WINDOW_VERTICAL_SCROLLBAR_HEIGHT): New macros.
	* window.h (struct window): New field `vertical_scrollbar'.
	* xterm.h (struct x_display): vertical_scrollbars,
	judge_timestamp, vertical_scrollbar_extra: New fields.
	(struct scrollbar): New struct.
	(VERTICAL_SCROLLBAR_PIXEL_WIDTH, VERTICAL_SCROLLBAR_PIXEL_HEIGHT,
	VERTICAL_SCROLLBAR_LEFT_BORDER, VERTICAL_SCROLLBAR_RIGHT_BORDER,
	VERTICAL_SCROLLBAR_TOP_BORDER, VERTICAL_SCROLLBAR_BOTTOM_BORDER,
	CHAR_TO_PIXEL_WIDTH, CHAR_TO_PIXEL_HEIGHT, PIXEL_TO_CHAR_WIDTH,
	PIXEL_TO_CHAR_HEIGHT): New accessors and macros.
	* frame.c (make_frame): Initialize the `can_have_scrollbars' and
	`has_vertical_scrollbars' fields of the frame.
	* term.c (term_init): Note that TERMCAP terminals don't support
	scrollbars.
	(mouse_position_hook): Document new args.
	(set_vertical_scrollbar_hook, condemn_scrollbars_hook,
	redeem_scrollbar_hook, judge_scrollbars_hook): New hooks.
	* termhooks.h: Declare and document them.
	(enum scrollbar_part): New type.
	(struct input_event): Describe the new form of the scrollbar_click
	event type.  Change `part' from a Lisp_Object to an enum
	scrollbar_part.  Add a new field `scrollbar'.
	* keyboard.c (kbd_buffer_get_event): Pass appropriate new
	parameters to *mouse_position_hook, and make_lispy_movement.
	* xfns.c (x_set_vertical_scrollbar): New function.
	(x_figure_window_size): Use new macros to calculate frame size.
	(Fx_create_frame): Note that X Windows frames do support scroll
	bars.  Default to "yes".
	* xterm.c: #include <X11/cursorfont.h> and "window.h".
	(x_vertical_scrollbar_cursor): New variable.
	(x_term_init): Initialize it.
	(last_mouse_bar, last_mouse_bar_frame, last_mouse_part,
	last_mouse_scroll_range_start, last_mouse_scroll_range_end): New
	variables.
	(XTmouse_position): Use them to return scrollbar movement events.
	Take new arguments, for that purpose.
	(x_window_to_scrollbar, x_scrollbar_create,
	x_scrollbar_set_handle, x_scrollbar_remove, x_scrollbar_move,
	XTset_scrollbar, XTcondemn_scrollbars, XTredeem_scrollbar,
	XTjudge_scrollbars, x_scrollbar_expose,
	x_scrollbar_background_expose, x_scrollbar_handle_click,
	x_scrollbar_handle_motion): New functions to implement scrollbars.
	(x_term_init): Set the termhooks.h hooks to point to them.
	(x_set_window_size): Use new macros to calculate frame size.  Set
	vertical_scrollbar_extra field.
	(x_make_frame_visible): Use the frame accessor
	FRAME_HAS_VERTICAL_SCROLLBARS to decide if we need to map the
	frame's subwindows as well.
	(XTread_socket): Use new size-calculation macros from xterm.h when
	processing ConfigureNotify events.
	(x_wm_set_size_hint): Use PIXEL_TO_CHAR_WIDTH and
	PIXEL_TO_CHAR_HEIGHT macros.
	* ymakefile (xdisp.o): This now depends on termhooks.h.
	(xterm.o): This now depends on window.h.

	* floatfns.c (Flog): Fix unescaped newline in string.
	* frame.c (Fnext_frame): Same.
	* textprop.c (Fprevious_single_property_change): Same.
	(syms_of_textprop): Same, for DEFVAR for
	`interval_balance_threshold'.

	Change the meaning of focus redirection to make switching windows
	work properly.  Fredirect_frame_focus has the details.
	* frame.h (focus_frame): Doc fix.
	[not MULTI_FRAME] (FRAME_FOCUS_FRAME): Make this Qnil, which
	indicates no focus redirection, instead of zero, which is
	selected_frame.
	* frame.c (make_frame): Initialize f->focus_frame to Qnil, rather
	than making it point to frame itself.
	(Fselect_frame): If changing the selected frame from FOO to BAR,
	make all redirections to FOO shift to BAR as well.  Doc fix.
	(Fredirect_frame_focus): Doc fix.  Accept nil as a valid
	redirection, not just as a default for FRAME.
	(Fframe_focus): Doc fix.
	* keyboard.c (kbd_buffer_store_event, kbd_buffer_get_event): Deal
	with focus redirections being nil.
	* xterm.c (XTframe_rehighlight): Doc fix.  Deal with focus
	redirections being nil.

	It's a pain to remember that you can't assign to FRAME->visible.
	Let's change all references to the `visible' member of struct
	frame to use the accessor macros, and then write a setter for the
	`visible' field that does the right thing.
	* frame.h (FRAME_VISIBLE_P): Make this not an l-value.
	(FRAME_SET_VISIBLE): New macro.
	* frame.c (make_terminal_frame, Fdelete_frame): Use FRAME_SET_VISIBLE.
	(Fframe_visible_p, Fvisible_frame_list): Use FRAME_VISIBLE_P and
	FRAME_ICONIFIED_P.
	* dispnew.c (Fredraw_display): Use the FRAME_VISIBLE_P and
	FRAME_GARBAGED_P accessors.
	* xdisp.c (redisplay): Use the FRAME_VISIBLE_P accessor.
	* xfns.c (x_set_foreground_color, x_set_background_color,
	x_set_cursor_color, x_set_border_pixel, x_set_icon_type): Use the
	FRAME_VISIBLE_P accessor.
	(Fx_create_frame): Use FRAME_SET_VISIBILITY.
	* xterm.c (clear_cursor, x_display_bar_cursor,
	x_display_box_cursor): Use FRAME_SET_VISIBILITY.
parent 950c2628
......@@ -156,8 +156,10 @@ make_frame (mini_p)
f->no_split = 0;
f->garbaged = 0;
f->has_minibuffer = mini_p;
f->focus_frame = frame;
f->focus_frame = Qnil;
f->explicit_name = 0;
f->can_have_scrollbars = 0;
f->has_vertical_scrollbars = 0;
f->param_alist = Qnil;
......@@ -314,8 +316,7 @@ make_terminal_frame ()
Vframe_list = Qnil;
f = make_frame (1);
f->name = build_string ("terminal");
f->async_visible = 1;
f->visible = 1;
FRAME_SET_VISIBLE (f, 1);
f->display.nothing = 1; /* Nonzero means frame isn't deleted. */
XSET (Vterminal_frame, Lisp_Frame, f);
return f;
......@@ -329,7 +330,10 @@ focus on that frame.\n\
This function is interactive, and may be bound to the ``switch-frame''\n\
event; when invoked this way, it switches to the frame named in the\n\
event. When called from lisp, FRAME may be a ``switch-frame'' event;\n\
if it is, select the frame named in the event.")
if it is, select the frame named in the event.\n\
\n\
Changing the selected frame can change focus redirections. See\n\
`redirect-frame-focus' for details.")
(frame, no_enter)
Lisp_Object frame, no_enter;
{
......@@ -345,6 +349,31 @@ if it is, select the frame named in the event.")
if (selected_frame == XFRAME (frame))
return frame;
/* If a frame's focus has been redirected toward the currently
selected frame, we should change the redirection to point to the
newly selected frame. This means that if the focus is redirected
from a minibufferless frame to a surrogate minibuffer frame, we
can use `other-window' to switch between all the frames using
that minibuffer frame, and the focus redirection will follow us
around. */
{
Lisp_Object tail;
for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
{
Lisp_Object focus;
if (XTYPE (XCONS (tail)->car) != Lisp_Frame)
abort ();
focus = FRAME_FOCUS_FRAME (XFRAME (XCONS (tail)->car));
if (XTYPE (focus) == Lisp_Frame
&& XFRAME (focus) == selected_frame)
Fredirect_frame_focus (XCONS (tail)->car, frame);
}
}
selected_frame = XFRAME (frame);
if (! FRAME_MINIBUF_ONLY_P (selected_frame))
last_nonminibuf_frame = selected_frame;
......@@ -535,7 +564,7 @@ prev_frame (frame, minibuf)
DEFUN ("next-frame", Fnext_frame, Snext_frame, 0, 2, 0,
"Return the next frame in the frame list after FRAME.\n\
By default, skip minibuffer-only frames.
By default, skip minibuffer-only frames.\n\
If omitted, FRAME defaults to the selected frame.\n\
If optional argument MINIFRAME is non-nil, include minibuffer-only frames.\n\
If MINIFRAME is a window, include only frames using that window for their\n\
......@@ -623,7 +652,7 @@ A frame may not be deleted if its minibuffer is used by other frames.")
f->root_window = Qnil;
Vframe_list = Fdelq (frame, Vframe_list);
f->visible = 0;
FRAME_SET_VISIBLE (f, 0);
displ = f->display;
f->display.nothing = 0;
......@@ -867,9 +896,9 @@ Return the symbol `icon' if frame is visible only as an icon.")
{
CHECK_LIVE_FRAME (frame, 0);
if (XFRAME (frame)->visible)
if (FRAME_VISIBLE_P (XFRAME (frame)))
return Qt;
if (XFRAME (frame)->iconified)
if (FRAME_ICONIFIED_P (XFRAME (frame)))
return Qicon;
return Qnil;
}
......@@ -890,7 +919,7 @@ DEFUN ("visible-frame-list", Fvisible_frame_list, Svisible_frame_list,
if (XTYPE (frame) != Lisp_Frame)
continue;
f = XFRAME (frame);
if (f->visible)
if (FRAME_VISIBLE_P (f))
value = Fcons (frame, value);
}
return value;
......@@ -901,25 +930,34 @@ DEFUN ("visible-frame-list", Fvisible_frame_list, Svisible_frame_list,
DEFUN ("redirect-frame-focus", Fredirect_frame_focus, Sredirect_frame_focus,
1, 2, 0,
"Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\
This means that, after reading a keystroke typed at FRAME,\n\
`last-event-frame' will be FOCUS-FRAME.\n\
In other words, switch-frame events caused by events in FRAME will\n\
request a switch to FOCUS-FRAME, and `last-event-frame' will be\n\
FOCUS-FRAME after reading an event typed at FRAME.\n\
\n\
If FOCUS-FRAME is omitted or eq to FRAME, any existing redirection is\n\
If FOCUS-FRAME is omitted or nil, any existing redirection is\n\
cancelled, and the frame again receives its own keystrokes.\n\
\n\
The redirection lasts until the next call to `redirect-frame-focus'\n\
or `select-frame'.\n\
Focus redirection is useful for temporarily redirecting keystrokes to\n\
a surrogate minibuffer frame when a frame doesn't have its own\n\
minibuffer window.\n\
\n\
This is useful for temporarily redirecting keystrokes to the minibuffer\n\
window when a frame doesn't have its own minibuffer.")
A frame's focus redirection can be changed by select-frame. If frame\n\
FOO is selected, and then a different frame BAR is selected, any\n\
frames redirecting their focus to FOO are shifted to redirect their\n\
focus to BAR. This allows focus redirection to work properly when the\n\
user switches from one frame to another using `select-window'.\n\
\n\
This means that a frame whose focus is redirected to itself is treated\n\
differently from a frame whose focus is redirected to nil; the former\n\
is affected by select-frame, while the latter is not.\n\
\n\
The redirection lasts until `redirect-frame-focus' is called to change it.")
(frame, focus_frame)
Lisp_Object frame, focus_frame;
{
CHECK_LIVE_FRAME (frame, 0);
if (NILP (focus_frame))
focus_frame = frame;
else
if (! NILP (focus_frame))
CHECK_LIVE_FRAME (focus_frame, 1);
XFRAME (frame)->focus_frame = focus_frame;
......@@ -933,11 +971,13 @@ window when a frame doesn't have its own minibuffer.")
DEFUN ("frame-focus", Fframe_focus, Sframe_focus, 1, 1, 0,
"Return the frame to which FRAME's keystrokes are currently being sent.\n\
This returns nil if FRAME's focus is not redirected.\n\
See `redirect-frame-focus'.")
(frame)
Lisp_Object frame;
{
CHECK_LIVE_FRAME (frame, 0);
return FRAME_FOCUS_FRAME (XFRAME (frame));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment