Mercurial > emacs
view lisp/scroll-bar.el @ 1786:5179baee010b
* xfns.c (Fx_create_frame): After mapping the frame, call
SET_FRAME_GARBAGED, not just plain FRAME_GARBAGED.
* xfns.c (Qvertical_scrollbars): New symbol. Use it as the name
of the parameter which decides whether or not the frame has
scrollbars, instead of Qvertical_scrollbar.
(Fx_create_frame): Adjusted accordingly.
(syms_of_xfns): Initialize and staticpro Qvertical_scrollbars.
(x_set_vertical_scrollbar): Renamed to x_set_vertical_scrollbars.
(x_frame_parms): Adjusted accordingly.
* xterm.h (CHAR_TO_PIXEL_WIDTH, CHAR_TO_PIXEL_HEIGHT,
PIXEL_TO_CHAR_WIDTH, PIXEL_TO_CHAR_HEIGHT): Rewritten, using:
(CHAR_TO_PIXEL_ROW, CHAR_TO_PIXEL_COL, PIXEL_TO_CHAR_ROW,
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.
* xfns.c (x_set_name): To request that the modelines be redrawn,
execute the statement "update_mode_lines = 1;" instead of the
silly statement "update_mode_lines;".
* xfns.c (x_set_vertical_scrollbars): Don't try to set the
X window's size if the frame's X window hasn't been created yet.
* xfns.c (x_figure_window_size): Set the frame's
vertical_scrollbar_extra field before trying to calculate its
pixel dimensions.
* xfns.c (x_window): When calling x_implicitly_set_name for the
sake of drawing the name for the first time, remember to clear and
set the frame's explicit_name member as well as its name member.
(Fx_create_frame): Set the frame's explicit_name member if the
user specified the name explicitly.
* xfns.c (Fx_get_resource): Add CLASS argument, to give class of
ATTRIBUTE.
[not HAVE_X11]: Change definition of Fx_get_resource macro
accordingly.
(x_get_arg): Add CLASS argument, to give the class of ATTRIBUTE.
Pass it along to Fx_get_resource.
(x_figure_window_size, x_icon): Pass new argument to x_get_arg.
(x_default_parameter): Add XCLASS argument, to give the class of
XPROP. Pass it along to x_get_arg.
(Fx_create_frame): Pass new args to x_get_arg and
x_default_parameter.
* xfns.c (Fx_create_frame): Use the same resource names and
classes as xterm and Emacs 18.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Thu, 14 Jan 1993 15:19:55 +0000 |
parents | 86f58433c8aa |
children | 04fb1d3d6992 |
line wrap: on
line source
;;; scrollbar.el -- window system-independent scrollbar support. ;;; Copyright (C) 1993 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: hardware ;;; This file is part of GNU Emacs. ;;; GNU Emacs is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; GNU Emacs is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Emacs; see the file COPYING. If not, write to ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;;; Utilities. (defun scrollbar-scale (num-denom whole) "Given a pair (NUM . DENOM) and WHOLE, return (/ (* NUM WHOLE) DENOM). This is handy for scaling a position on a scrollbar into real units, like buffer positions. If SCROLLBAR-POS is the (PORTION . WHOLE) pair from a scrollbar event, then (scrollbar-scale SCROLLBAR-POS \(buffer-size)) is the position in the current buffer corresponding to that scrollbar position." ;; We multiply before we divide to maintain precision. ;; We use floating point because the product of a large buffer size ;; with a large scrollbar portion can easily overflow a lisp int. (truncate (/ (* (float (car num-denom)) whole) (cdr num-denom)))) ;;;; Buffer navigation using the scrollbar. (defun scrollbar-set-window-start (event) "Set the window start according to where the scrollbar is dragged. EVENT should be a scrollbar click or drag event." (interactive "e") (let* ((end-position (nth (1- (length event)) event)) (window (nth 0 end-position)) (portion-whole (nth 2 end-position))) (save-excursion (set-buffer (window-buffer window)) (save-excursion (goto-char (scrollbar-scale portion-whole (buffer-size))) (beginning-of-line) (set-window-start window (point)))))) (defun scrollbar-scroll-down (event) "Scroll the window's top line down to the location of the scrollbar click. EVENT should be a scrollbar click." (interactive "e") (let ((old-selected-window (selected-window))) (unwind-protect (progn (let* ((end-position (nth (1- (length event)) event)) (window (nth 0 end-position)) (portion-whole (nth 2 end-position))) (select-window window) (scroll-down (scrollbar-scale portion-whole (1- (window-height)))))) (select-window old-selected-window)))) (defun scrollbar-scroll-up (event) "Scroll the line next to the scrollbar click to the top of the window. EVENT should be a scrollbar click." (interactive "e") (let ((old-selected-window (selected-window))) (unwind-protect (progn (let* ((end-position (nth (1- (length event)) event)) (window (nth 0 end-position)) (portion-whole (nth 2 end-position))) (select-window window) (scroll-up (scrollbar-scale portion-whole (1- (window-height)))))) (select-window old-selected-window)))) ;;;; Bindings. ;;; For now, we'll set things up to work like xterm. (global-set-key [vertical-scrollbar mouse-1] 'scrollbar-scroll-up) (global-set-key [vertical-scrollbar drag-mouse-1] 'scrollbar-scroll-up) (global-set-key [vertical-scrollbar mouse-2] 'scrollbar-set-window-start) (global-set-key [vertical-scrollbar drag-mouse-2] 'scrollbar-set-window-start) (global-set-key [vertical-scrollbar mouse-3] 'scrollbar-scroll-down) (global-set-key [vertical-scrollbar drag-mouse-3] 'scrollbar-scroll-down) (provide 'scrollbar) ;;; scrollbar.el ends here