Commit c8e3cbe0 authored by Jim Blandy's avatar Jim Blandy
Browse files

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

	accessors, for both the MULTI_FRAME and non-MULTI_FRAME.
	* 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.
	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
	(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
	(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
	* ymakefile (xdisp.o): This now depends on termhooks.h.
	(xterm.o): This now depends on window.h.

	* xterm.h (struct x_display): Delete v_scrollbar, v_thumbup,
	v_thumbdown, v_slider, h_scrollbar, h_thumbup,
	h_thumbdown, h_slider, v_scrollbar_width, h_scrollbar_height
	* keyboard.c (Qvscrollbar_part, Qvslider_part, Qvthumbup_part,
	Qvthumbdown_part, Qhscrollbar_part, Qhslider_part, Qhthumbup_part,
	Qhthumbdown_part, Qscrollbar_click): Deleted; part of an obsolete
	(head_table): Removed from here as well.
	(syms_of_keyboard): And here.
	* keyboard.h: And here.
	* xscrollbar.h: File removed - no longer necessary.
	* xfns.c: Don't #include it any more.
	(Qhorizontal_scroll_bar, Qvertical_scroll_bar): Deleted.
	(syms_of_xfns): Don't initialize or staticpro them.
	(gray_bits): Salvaged from xscrollbar.h.
	(x_window_to_scrollbar): Deleted.
	(x_set_horizontal_scrollbar): Deleted.
	(enum x_frame_parm, x_frame_parms): Remove references to
	(x_set_foreground_color, x_set_background_color,
	x_set_border_pixel): Remove special code to support scrollbars.
	(Fx_create_frame): Remove old scrollbar setup code.
	(install_vertical_scrollbar, install_horizontal_scrollbar,
	adjust_scrollbars, x_resize_scrollbars): Deleted.
	* xterm.c (construct_mouse_click): This doesn't need to take care of
	scrollbar clicks anymore.
	(XTread_socket): Remove old code to support scrollbars.  Call new
	functions instead for events which occur in scrollbar windows.
	(XTupdate_end): Remove call to adjust_scrollbars; the main
	redisplay code takes care of that now.
	(enum window_type): Deleted.
	* ymakefile: Note that xfns.o no longer depends on xscrollbar.h.

	* xterm.h (PIXEL_WIDTH, PIXEL_HEIGHT): Change name of parameter
	from `s' to `f'; it's a frame pointer.
parent f451eb13
......@@ -239,8 +239,8 @@ enum text_cursor_kinds {
filled_box_cursor, hollow_box_cursor, bar_cursor
#define PIXEL_WIDTH(s) ((s)->display.x->pixel_width)
#define PIXEL_HEIGHT(s) ((s)->display.x->pixel_height)
#define PIXEL_WIDTH(f) ((f)->display.x->pixel_width)
#define PIXEL_HEIGHT(f) ((f)->display.x->pixel_height)
/* Each X frame object points to its own struct x_display object
in the display.x field. The x_display structure contains all
......@@ -299,22 +299,6 @@ struct x_display
PIX_TYPE border_pixel;
PIX_TYPE mouse_pixel;
/* Windows for scrollbars */
Window v_scrollbar;
Window v_thumbup;
Window v_thumbdown;
Window v_slider;
Window h_scrollbar;
Window h_thumbleft;
Window h_thumbright;
Window h_slider;
/* Scrollbar info */
int v_scrollbar_width;
int h_scrollbar_height;
/* Descriptor for the cursor in use for this window. */
#ifdef HAVE_X11
Cursor text_cursor;
......@@ -348,6 +332,17 @@ struct x_display
structure around, just leaving values in it and adding new bits
to the mask as we go. */
XWMHints wm_hints;
/* The list of vertical scrollbars currently being displayed in this
frame. */
struct scrollbar *vertical_scrollbars;
/* The timestamp used to implement the condemn/redeem/judge functions. */
int judge_timestamp;
/* The size of the extra width currently allotted for vertical
scrollbars, in pixels. */
int vertical_scrollbar_extra;
/* Return the window associated with the frame F. */
......@@ -380,3 +375,84 @@ struct face
extern struct face *x_face_table[];
/* X-specific scrollbar stuff. */
struct scrollbar {
/* The frame we're displayed on. */
struct frame *frame;
/* The next in the chain of scrollbars in this frame. */
struct scrollbar *next;
/* The window representing this scrollbar. */
Window window;
/* The position and size of the scrollbar in pixels, relative to the
frame. */
int top, left;
int width, height;
/* The starting and ending positions of the handle, relative to
the handle area. If they're equal, that means the handle
hasn't been drawn yet. */
int start, end;
/* The timestamp for judgement. If this is less than
judge_timestamp in the x_display structure, this scrollbar is
damned. */
int judge_timestamp;
/* If the scrollbar handle is currently being dragged by the user,
this is the number of pixels from the top of the handle to the
place where the user grabbed it. If the handle isn't currently
being dragged, this is -1. */
int dragging;
/* Return the outside pixel width for a vertical scrollbar on frame F. */
#define VERTICAL_SCROLLBAR_PIXEL_WIDTH(f) (2*FONT_WIDTH ((f)->display.x->font))
/* Return the outside pixel height for a vertical scrollbar HEIGHT
rows high on frame F. */
((height) * FONT_HEIGHT ((f)->display.x->font))
/* Border widths for scrollbars. */
/* Manipulating pixel sizes and character sizes.
Knowledge of which factors affect the overall size of the window should
be hidden in these macros, if that's possible.
/* Return the pixel width of frame F if it has WIDTH columns. */
#define CHAR_TO_PIXEL_WIDTH(f, width) \
((width) * FONT_WIDTH ((f)->display.x->font) \
+ 2 * (f)->display.x->internal_border_width \
+ (f)->display.x->vertical_scrollbar_extra)
/* Return the pixel height of frame F if it has HEIGHT rows. */
#define CHAR_TO_PIXEL_HEIGHT(f, height) \
((height) * FONT_HEIGHT ((f)->display.x->font) \
+ 2 * (f)->display.x->internal_border_width)
/* How many columns of text can we fit in WIDTH pixels on frame F? */
#define PIXEL_TO_CHAR_WIDTH(f, width) \
(((width) \
- (f)->display.x->vertical_scrollbar_extra \
- 2 * (f)->display.x->internal_border_width) \
/ FONT_WIDTH ((f)->display.x->font))
/* How many rows of text can we fit in HEIGHT pixels on frame F? */
#define PIXEL_TO_CHAR_HEIGHT(f, height) \
(((height) \
- 2 * (f)->display.x->internal_border_width) \
/ FONT_HEIGHT ((f)->display.x->font))
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