• Jim Blandy's avatar
    Make scrollbar structures into lisp objects, so that they can be · 12ba150f
    Jim Blandy authored
    	GC'd; this allows windows and scrollbars can refer to each other
    	without worrying about dangling pointers.
    	* xterm.h (struct x_display): vertical_scrollbars and
    	judge_timestamp members deleted.
    	(struct scrollbar): Redesigned to be a template for a Lisp_Vector.
    	New macros, to help deal with the lispy structures, and deal with
    	the graphics.
    	* frame.h (WINDOW_VERTICAL_SCROLLBAR): Macro deleted.
    	(struct frame): New fields `scrollbars' and
    	`condemned_scrollbars', for use by the scrollbar implementation.
    	FRAME_CONDEMNED_SCROLLBARS): Accessors for the new field.
    	* window.h (struct window): Doc fix for vertical_scrollbar field.
    	* frame.c (make_frame): Initialize the `scrollbars' and
    	`condemned_scrollbars' fields of the new frame.
    	* alloc.c (mark_object): Mark the `scrollbars' and
    	`condemned_scrollbars' slots of frames.
    	* xterm.c (x_window_to_scrollbar): Scrollbars are chained on
    	frames' scrollbar field, not their x.display->vertical_scrollbars
    	(x_scrollbar_create, x_scrollbar_set_handle, x_scrollbar_move,
    	x_scrollbar_remove, XTset_vertical_scrollbar,
    	XTcondemn_scrollbars, XTredeem_scrollbar, XTjudge_scrollbars,
    	x_scrollbar_expose, x_scrollbar_handle_click,
    	x_scrollbar_handle_motion): Substantially rewritten to correct
    	typos and brainos, and to accomodate the lispy structures.
    	* xterm.c (x_scrollbar_background_expose): Function deleted; we
    	don't want anything in the background there after all.
    	(XTread_socket): Don't call x_scrollbar_background_expose.  We
    	don't care.
    	PIXEL_TO_CHAR_COL): New macros.
    	* xfns.c [not HAVE_X11] (Fx_create_frame): Use the
    	PIXEL_TO_CHAR_{HEIGHT,WIDTH} macros to figure the frame's
    	character size, and the CHAR_TO_PIXEL* macros for vice versa.
    	* xterm.c (XTwrite_glyphs, XTclear_end_of_line, stufflines,
    	scraplines, dumprectangle, pixel_to_glyph_coords, x_draw_box,
    	clear_cursor, x_display_bar_cursor, x_draw_single_glyph,
    	x_set_mouse_position): Use the CHAR_TO_PIXEL_* macros.
    	* xterm.c (x_wm_set_size_hint): The max_width and max_height
    	members of the size_hints are expressed in pixels, not columns.
    	* xterm.c (x_set_window_size): Remove ibw var; it's not used.
    	Set FRAME_WIDTH (f) to cols instead of rows.  Duh.
    	* xterm.c (pixel_to_glyph_coords): Properly set *bounds to the
    	character cell bounding the position, even when the position is
    	off the frame.
    	* termhooks.h (mouse_position_hook): Doc fix.
    	(set_vertical_scrollbar_hook): This doesn't return anything any
    	more, and doesn't take a struct scrollbar * argument any more.
    	(condemn_scrollbars_hook, redeem_scrollbar_hook,
    	judge_scrollbars_hook): Doc fixes.
    	* term.c (mouse_position_hook): Doc fix.
    	(set_vertical_scrollbar_hook): This doesn't return
    	anything any more.  Doc fixes.
    	* keyboard.c (kbd_buffer_get_event): Receive the scrollbar's
    	window from *mouse_position_hook and pass it to
    	make_lispy_movement, instead of working with a pointer to a struct
    	(make_lispy_event): We don't need a window_from_scrollbar function
    	anymore; we are given the window directly in *EVENT.
    	Unify the code which generates
    	text-area mouse clicks and scrollbar clicks; use the same code to
    	distinguish clicks from drags on the scrollbar as in the text area.
    	Distinguish clicks from drags by storing a copy of the lispy
    	position list returned as part of the event.
    	(button_down_location): Make this a lisp vector, rather than an
    	array of random structures.
    	(struct mouse_position): Remove this; it's been replaced by a lisp
    	(make_lispy_movement): Accept the scrollbar's window as a
    	parameter, rather than the scrollbar itself.
    	If FRAME is zero, assume that the other arguments are garbage.
    	(syms_of_keyboard): No need to staticpro each window of
    	button_down_location now; just initialize and staticpro it.
    	* window.c (window_from_scrollbar): Function deleted; no longer
    	* xdisp.c (redisplay_window): Just pass the window to
    	set_vertical_scrollbar hook; don't pass the scrollbar object too.
    	* xterm.c (XTmouse_position): Don't return a pointer to the
    	scrollbar for scrollbar motion; instead, return the scrollbar's
    	* xterm.c (XTmouse_position): Entirely rewritten, using
    	XTranslateCoordinates.  Call x_scrollbar_report_motion to handle
    	scrollbar movement events.
    	(x_scrollbar_report_motion): New function, to help out
    	* termhooks.h (struct input_event): Replace the frame member with
    	a Lisp_Object member by the name of frame_or_window.  Doc fixes.
    	Remove the scrollbar member; instead, use frame_or_window to hold the
    	window whose scrollbar was clicked.
    	* keyboard.c (kbd_buffer_store_event, kbd_buffer_get_event,
    	make_lispy_event): Adjust references to frame member of struct
    	input_event to use frame_or_window now.
    	* xterm.c (construct_mouse_click, XTread_socket): Same.
    	* xterm.c (last_mouse_bar, last_mouse_bar_frame, last_mouse_part,
    	last_mouse_scroll_range_start, last_mouse_scroll_range_end):
    	Replaced with...
    	(last_mouse_scrollbar): New variable.
    	(note_mouse_movement): Clear last_mouse_scrollbar when we have
    	receieved a new motion.
    	(syms_of_xterm): Staticpro last_mouse_scrollbar.
    	* xterm.c (note_mouse_position): Renamed to note_mouse_movement,
    	because that's what it really does.
    	(x_scrollbar_handle_motion): Renamed to x_scrollbar_note_movement,
    	for consistency.
    	(XTread_socket): Adjusted.
    	* xterm.c (XTset_scrollbar): Renamed to XTset_vertical_scrollbar.
    	(x_term_init): Adjusted.
    	* emacs.c (shut_down_emacs): New function.
    	(fatal_error_signal, Fkill_emacs): Call it, instead of writing it out.
    	* xterm.c (x_connection_closed): Call shut_down_emacs instead of
    	Fkill_emacs; the latter will try to perform operations on the X
    	server and die a horrible death.
    	* lisp.h (shut_down_emacs): Add extern declaration for it.
    	* xterm.c (x_error_quitter): Move the abort call to after we print
    	the error message.  No harm in that.
xterm.c 116 KB