Commit 20a558dc 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.
parent db269683
......@@ -93,12 +93,16 @@ int (*set_terminal_window_hook) ();
int (*read_socket_hook) ();
/* Return the current position of the mouse. This should clear
mouse_moved until the next motion event arrives. */
/* Return the current position of the mouse.
Set `bar' to point to the scrollbar if the mouse movement started
in a scrollbar, or zero if it started elsewhere in the frame.
This should clear mouse_moved until the next motion event arrives. */
void (*mouse_position_hook) ( /* FRAME_PTR *f,
Lisp_Object *x,
Lisp_Object *y,
unsigned long *time */ );
struct scrollbar **bar,
enum scrollbar_part *part,
Lisp_Object *x,
Lisp_Object *y,
unsigned long *time */ );
/* When reading from a minibuffer in a different frame, Emacs wants
to shift the highlight from the selected frame to the minibuffer's
......@@ -107,6 +111,38 @@ void (*mouse_position_hook) ( /* FRAME_PTR *f,
the highlight. */
void (*frame_rehighlight_hook) ( /* FRAME_PTR f */ );
/* Set vertical scollbar BAR to have its upper left corner at (TOP,
LEFT), and be LENGTH rows high. Set its handle to indicate that we
are displaying PORTION characters out of a total of WHOLE
characters, starting at POSITION. Return BAR. If BAR is zero,
create a new scrollbar and return a pointer to it. */
struct scrollbar *(*set_vertical_scrollbar_hook)
( /* struct scrollbar *BAR,
struct window *window,
int portion, int whole, int position */ );
/* The following three hooks are used when we're doing a thorough
redisplay of the frame. We don't explicitly know which scrollbars
are going to be deleted, because keeping track of when windows go
away is a real pain - can you say set-window-configuration?
Instead, we just assert at the beginning of redisplay that *all*
scrollbars are to be removed, and then save scrollbars from the
firey pit when we actually redisplay their window. */
/* Arrange for all scrollbars on FRAME to be removed at the next call
to `*judge_scrollbars_hook'. A scrollbar may be spared if
`*redeem_scrollbar_hook' is applied to it before the judgement. */
void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
/* Unmark BAR for deletion in this judgement cycle. */
void (*redeem_scrollbar_hook)( /* struct scrollbar *BAR */ );
/* Remove all scrollbars on FRAME that haven't been saved since the
last call to `*condemn_scrollbars_hook'. */
void (*judge_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
/* Strings, numbers and flags taken from the termcap entry. */
char *TS_ins_line; /* termcap "al" */
......@@ -1414,6 +1450,9 @@ It may be necessary to do `unsetenv TERMCAP' as well.\n",
if (read_socket_hook) /* Baudrate is somewhat */
/* meaningless in this case */
baud_rate = 9600;
FRAME_CAN_HAVE_SCROLLBARS (selected_frame) = 0;
FRAME_HAS_VERTICAL_SCROLLBARS (selected_frame) = 0;
}
/* VARARGS 1 */
......
......@@ -45,9 +45,19 @@ extern int (*set_terminal_window_hook) ();
extern int (*read_socket_hook) ();
/* Return the current position of the mouse. This should clear
mouse_moved until the next motion event arrives. */
enum scrollbar_part {
scrollbar_above_handle,
scrollbar_handle,
scrollbar_below_handle
};
/* Return the current position of the mouse.
Set `bar' to point to the scrollbar if the mouse movement started
in a scrollbar, or zero if it started elsewhere in the frame.
This should clear mouse_moved until the next motion event arrives. */
extern void (*mouse_position_hook) ( /* FRAME_PTR *f,
struct scrollbar **bar,
enum scrollbar_part *part,
Lisp_Object *x,
Lisp_Object *y,
unsigned long *time */ );
......@@ -62,6 +72,39 @@ extern int mouse_moved;
X, this means that Emacs lies about where the focus is. */
extern void (*frame_rehighlight_hook) ( /* void */ );
/* Set vertical scollbar BAR to have its upper left corner at (TOP,
LEFT), and be LENGTH rows high. Set its handle to indicate that we
are displaying PORTION characters out of a total of WHOLE
characters, starting at POSITION. Return BAR. If BAR is zero,
create a new scrollbar and return a pointer to it. */
extern struct scrollbar *(*set_vertical_scrollbar_hook)
( /* struct scrollbar *BAR,
struct window *window,
int portion, int whole, int position */ );
/* The following three hooks are used when we're doing a thorough
redisplay of the frame. We don't explicitly know which scrollbars
are going to be deleted, because keeping track of when windows go
away is a real pain - can you say set-window-configuration?
Instead, we just assert at the beginning of redisplay that *all*
scrollbars are to be removed, and then save scrollbars from the
firey pit when we actually redisplay their window. */
/* Arrange for all scrollbars on FRAME to be removed at the next call
to `*judge_scrollbars_hook'. A scrollbar may be spared if
`*redeem_scrollbar_hook' is applied to it before the judgement. */
extern void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
/* Unmark BAR for deletion in this judgement cycle. */
extern void (*redeem_scrollbar_hook)( /* struct scrollbar *BAR */ );
/* Remove all scrollbars on FRAME that haven't been saved since the
last call to `*condemn_scrollbars_hook'. */
extern void (*judge_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
/* If nonzero, send all terminal output characters to this stream also. */
extern FILE *termscript;
......@@ -112,31 +155,32 @@ struct input_event {
click occurred in.
.timestamp gives a timestamp (in
milliseconds) for the click. */
scrollbar_click, /* .code gives the number of the mouse
button that was clicked.
scrollbar_click, /* .code gives the number of the mouse button
that was clicked.
.modifiers holds the state of the modifier
keys.
.part is a lisp symbol indicating which
part of the scrollbar got clicked. This
indicates whether the scroll bar was
horizontal or vertical.
.modifiers gives the state of the
modifier keys.
.x gives the distance from the start
of the scroll bar of the click; .y gives
the total length of the scroll bar.
.frame gives the frame the click
should apply to.
part of the scrollbar got clicked.
.scrollbar is a pointer to the scrollbar
clicked on. Since redisplay may delete
scrollbars at any time, you may not assume
that this scrollbar still exists when you
dequeue this event. You have to traverse
the window tree to make it's in a valid
window.
.x gives the distance from the start of the
scroll bar of the click; .y gives the total
length of the scroll bar.
.frame gives the frame the click should
apply to.
.timestamp gives a timestamp (in
milliseconds) for the click. */
#if 0
frame_selected, /* The user has moved the focus to another
frame.
.frame is the frame that should become
selected at the next convenient time. */
#endif
} kind;
Lisp_Object code;
Lisp_Object part;
enum scrollbar_part part;
struct scrollbar *scrollbar;
/* This is obviously wrong, but I'm not sure what else I should do.
Obviously, this should be a FRAME_PTR. But that would require that
......
......@@ -123,6 +123,12 @@ struct window
Lisp_Object last_modified;
/* Value of point at that time */
Lisp_Object last_point;
/* Pointer to this window's vertical scrollbar, tagged as an
integer. If this window is newly created and we haven't
displayed a scrollbar in it yet, or if the frame doesn't have
any scrollbars, this is nil. */
Lisp_Object vertical_scrollbar;
/* The rest are currently not used or only half used */
/* Frame coords of point at that time */
Lisp_Object last_point_x;
......
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