comparison src/scrollbar.c @ 398:74fd4e045ea6 r21-2-29

Import from CVS: tag r21-2-29
author cvs
date Mon, 13 Aug 2007 11:13:30 +0200
parents 8626e4521993
children 2f8bb876ab1d
comparison
equal deleted inserted replaced
397:f4aeb21a5bad 398:74fd4e045ea6
32 #include "commands.h" 32 #include "commands.h"
33 #include "scrollbar.h" 33 #include "scrollbar.h"
34 #include "device.h" 34 #include "device.h"
35 #include "frame.h" 35 #include "frame.h"
36 #include "glyphs.h" 36 #include "glyphs.h"
37 #include "gutter.h"
37 #include "window.h" 38 #include "window.h"
38 39
39 Lisp_Object Qinit_scrollbar_from_resources; 40 Lisp_Object Qinit_scrollbar_from_resources;
40 41
41 Lisp_Object Qscrollbar_line_up; 42 Lisp_Object Qscrollbar_line_up;
450 /* We used to check for inhibit_scrollbar_slider_size_change here, 451 /* We used to check for inhibit_scrollbar_slider_size_change here,
451 but that seems bogus. */ 452 but that seems bogus. */
452 { 453 {
453 int x_offset, y_offset; 454 int x_offset, y_offset;
454 455
455 /* Scrollbars are always the farthest from the text area. */ 456 /* Scrollbars are always the farthest from the text area, barring
457 gutters. */
456 if (vertical) 458 if (vertical)
457 { 459 {
458 x_offset = (!NILP (w->scrollbar_on_left_p) 460 if (!NILP (w->scrollbar_on_left_p))
459 ? WINDOW_LEFT (w) 461 {
460 : (WINDOW_RIGHT (w) - scrollbar_width 462 x_offset = WINDOW_LEFT (w);
461 - (window_needs_vertical_divider (w) 463 if (window_is_leftmost (w))
462 ? window_divider_width (w) : 0))); 464 x_offset += FRAME_LEFT_GUTTER_BOUNDS (f);
465 }
466 else
467 {
468 x_offset = WINDOW_RIGHT (w) - scrollbar_width;
469 if (window_is_rightmost (w))
470 x_offset -= FRAME_RIGHT_GUTTER_BOUNDS (f);
471 if (window_needs_vertical_divider (w))
472 x_offset -= window_divider_width (w);
473 }
463 y_offset = WINDOW_TEXT_TOP (w) + f->scrollbar_y_offset; 474 y_offset = WINDOW_TEXT_TOP (w) + f->scrollbar_y_offset;
464 } 475 }
465 else 476 else
466 { 477 {
467 x_offset = WINDOW_TEXT_LEFT (w); 478 x_offset = WINDOW_TEXT_LEFT (w);
468 y_offset = f->scrollbar_y_offset + 479 y_offset = f->scrollbar_y_offset;
469 (!NILP (w->scrollbar_on_top_p) 480
470 ? WINDOW_TOP (w) 481 if (!NILP (w->scrollbar_on_top_p))
471 : WINDOW_TEXT_BOTTOM (w) + window_bottom_toolbar_height (w)); 482 {
483 y_offset += WINDOW_TOP (w);
484 if (window_is_highest (w))
485 y_offset += FRAME_TOP_GUTTER_BOUNDS (f);
486 }
487 else
488 {
489 y_offset += WINDOW_TEXT_BOTTOM (w);
490 }
472 } 491 }
473 492
474 new_x = x_offset; 493 new_x = x_offset;
475 new_y = y_offset; 494 new_y = y_offset;
476 } 495 }
848 if (!EQ (value, Qmax)) 867 if (!EQ (value, Qmax))
849 CHECK_INT (value); 868 CHECK_INT (value);
850 869
851 w = XWINDOW (window); 870 w = XWINDOW (window);
852 wcw = window_char_width (w, 0) - 1; 871 wcw = window_char_width (w, 0) - 1;
853 /* ### We should be able to scroll further right as long as there is 872 /* #### We should be able to scroll further right as long as there is
854 a visible truncation glyph. This calculation for max is bogus. */ 873 a visible truncation glyph. This calculation for max is bogus. */
855 max_len = w->max_line_len + 2; 874 max_len = w->max_line_len + 2;
856 875
857 if (EQ (value, Qmax) || (XINT (value) > (max_len - wcw))) 876 if (EQ (value, Qmax) || (XINT (value) > (max_len - wcw)))
858 hscroll = max_len - wcw; 877 hscroll = max_len - wcw;
935 Vscrollbar_width = make_magic_specifier (Qnatnum); 954 Vscrollbar_width = make_magic_specifier (Qnatnum);
936 set_specifier_fallback 955 set_specifier_fallback
937 (Vscrollbar_width, 956 (Vscrollbar_width,
938 list1 (Fcons (Qnil, make_int (DEFAULT_SCROLLBAR_WIDTH)))); 957 list1 (Fcons (Qnil, make_int (DEFAULT_SCROLLBAR_WIDTH))));
939 set_specifier_caching (Vscrollbar_width, 958 set_specifier_caching (Vscrollbar_width,
940 slot_offset (struct window, 959 offsetof (struct window, scrollbar_width),
941 scrollbar_width),
942 vertical_scrollbar_changed_in_window, 960 vertical_scrollbar_changed_in_window,
943 slot_offset (struct frame, 961 offsetof (struct frame, scrollbar_width),
944 scrollbar_width),
945 frame_size_slipped); 962 frame_size_slipped);
946 963
947 DEFVAR_SPECIFIER ("scrollbar-height", &Vscrollbar_height /* 964 DEFVAR_SPECIFIER ("scrollbar-height", &Vscrollbar_height /*
948 *Height of horizontal scrollbars. 965 *Height of horizontal scrollbars.
949 This is a specifier; use `set-specifier' to change it. 966 This is a specifier; use `set-specifier' to change it.
951 Vscrollbar_height = make_magic_specifier (Qnatnum); 968 Vscrollbar_height = make_magic_specifier (Qnatnum);
952 set_specifier_fallback 969 set_specifier_fallback
953 (Vscrollbar_height, 970 (Vscrollbar_height,
954 list1 (Fcons (Qnil, make_int (DEFAULT_SCROLLBAR_HEIGHT)))); 971 list1 (Fcons (Qnil, make_int (DEFAULT_SCROLLBAR_HEIGHT))));
955 set_specifier_caching (Vscrollbar_height, 972 set_specifier_caching (Vscrollbar_height,
956 slot_offset (struct window, 973 offsetof (struct window, scrollbar_height),
957 scrollbar_height),
958 some_window_value_changed, 974 some_window_value_changed,
959 slot_offset (struct frame, 975 offsetof (struct frame, scrollbar_height),
960 scrollbar_height),
961 frame_size_slipped); 976 frame_size_slipped);
962 977
963 DEFVAR_SPECIFIER ("horizontal-scrollbar-visible-p", &Vhorizontal_scrollbar_visible_p /* 978 DEFVAR_SPECIFIER ("horizontal-scrollbar-visible-p", &Vhorizontal_scrollbar_visible_p /*
964 *Whether the horizontal scrollbar is visible. 979 *Whether the horizontal scrollbar is visible.
965 This is a specifier; use `set-specifier' to change it. 980 This is a specifier; use `set-specifier' to change it.
966 */ ); 981 */ );
967 Vhorizontal_scrollbar_visible_p = Fmake_specifier (Qboolean); 982 Vhorizontal_scrollbar_visible_p = Fmake_specifier (Qboolean);
968 set_specifier_fallback (Vhorizontal_scrollbar_visible_p, 983 set_specifier_fallback (Vhorizontal_scrollbar_visible_p,
969 list1 (Fcons (Qnil, Qt))); 984 list1 (Fcons (Qnil, Qt)));
970 set_specifier_caching (Vhorizontal_scrollbar_visible_p, 985 set_specifier_caching (Vhorizontal_scrollbar_visible_p,
971 slot_offset (struct window, 986 offsetof (struct window,
972 horizontal_scrollbar_visible_p), 987 horizontal_scrollbar_visible_p),
973 some_window_value_changed, 988 some_window_value_changed,
974 slot_offset (struct frame, 989 offsetof (struct frame,
975 horizontal_scrollbar_visible_p), 990 horizontal_scrollbar_visible_p),
976 frame_size_slipped); 991 frame_size_slipped);
977 992
978 DEFVAR_SPECIFIER ("vertical-scrollbar-visible-p", &Vvertical_scrollbar_visible_p /* 993 DEFVAR_SPECIFIER ("vertical-scrollbar-visible-p", &Vvertical_scrollbar_visible_p /*
979 *Whether the vertical scrollbar is visible. 994 *Whether the vertical scrollbar is visible.
980 This is a specifier; use `set-specifier' to change it. 995 This is a specifier; use `set-specifier' to change it.
981 */ ); 996 */ );
982 Vvertical_scrollbar_visible_p = Fmake_specifier (Qboolean); 997 Vvertical_scrollbar_visible_p = Fmake_specifier (Qboolean);
983 set_specifier_fallback (Vvertical_scrollbar_visible_p, 998 set_specifier_fallback (Vvertical_scrollbar_visible_p,
984 list1 (Fcons (Qnil, Qt))); 999 list1 (Fcons (Qnil, Qt)));
985 set_specifier_caching (Vvertical_scrollbar_visible_p, 1000 set_specifier_caching (Vvertical_scrollbar_visible_p,
986 slot_offset (struct window, 1001 offsetof (struct window,
987 vertical_scrollbar_visible_p), 1002 vertical_scrollbar_visible_p),
988 vertical_scrollbar_changed_in_window, 1003 vertical_scrollbar_changed_in_window,
989 slot_offset (struct frame, 1004 offsetof (struct frame,
990 vertical_scrollbar_visible_p), 1005 vertical_scrollbar_visible_p),
991 frame_size_slipped); 1006 frame_size_slipped);
992 1007
993 DEFVAR_SPECIFIER ("scrollbar-on-left-p", &Vscrollbar_on_left_p /* 1008 DEFVAR_SPECIFIER ("scrollbar-on-left-p", &Vscrollbar_on_left_p /*
994 *Whether the vertical scrollbar is on the left side of window or frame. 1009 *Whether the vertical scrollbar is on the left side of window or frame.
995 This is a specifier; use `set-specifier' to change it. 1010 This is a specifier; use `set-specifier' to change it.
1009 #endif 1024 #endif
1010 set_specifier_fallback (Vscrollbar_on_left_p, fallback); 1025 set_specifier_fallback (Vscrollbar_on_left_p, fallback);
1011 } 1026 }
1012 1027
1013 set_specifier_caching (Vscrollbar_on_left_p, 1028 set_specifier_caching (Vscrollbar_on_left_p,
1014 slot_offset (struct window, 1029 offsetof (struct window, scrollbar_on_left_p),
1015 scrollbar_on_left_p),
1016 vertical_scrollbar_changed_in_window, 1030 vertical_scrollbar_changed_in_window,
1017 slot_offset (struct frame, 1031 offsetof (struct frame, scrollbar_on_left_p),
1018 scrollbar_on_left_p),
1019 frame_size_slipped); 1032 frame_size_slipped);
1020 1033
1021 DEFVAR_SPECIFIER ("scrollbar-on-top-p", &Vscrollbar_on_top_p /* 1034 DEFVAR_SPECIFIER ("scrollbar-on-top-p", &Vscrollbar_on_top_p /*
1022 *Whether the horizontal scrollbar is on the top side of window or frame. 1035 *Whether the horizontal scrollbar is on the top side of window or frame.
1023 This is a specifier; use `set-specifier' to change it. 1036 This is a specifier; use `set-specifier' to change it.
1024 */ ); 1037 */ );
1025 Vscrollbar_on_top_p = Fmake_specifier (Qboolean); 1038 Vscrollbar_on_top_p = Fmake_specifier (Qboolean);
1026 set_specifier_fallback (Vscrollbar_on_top_p, 1039 set_specifier_fallback (Vscrollbar_on_top_p,
1027 list1 (Fcons (Qnil, Qnil))); 1040 list1 (Fcons (Qnil, Qnil)));
1028 set_specifier_caching (Vscrollbar_on_top_p, 1041 set_specifier_caching (Vscrollbar_on_top_p,
1029 slot_offset (struct window, 1042 offsetof (struct window, scrollbar_on_top_p),
1030 scrollbar_on_top_p),
1031 some_window_value_changed, 1043 some_window_value_changed,
1032 slot_offset (struct frame, 1044 offsetof (struct frame, scrollbar_on_top_p),
1033 scrollbar_on_top_p),
1034 frame_size_slipped); 1045 frame_size_slipped);
1035 } 1046 }
1036 1047
1037 void 1048 void
1038 complex_vars_of_scrollbar (void) 1049 complex_vars_of_scrollbar (void)
1039 { 1050 {
1040 Vscrollbar_pointer_glyph = Fmake_glyph_internal (Qpointer); 1051 Vscrollbar_pointer_glyph = Fmake_glyph_internal (Qpointer);
1041 1052
1042 set_specifier_caching (XGLYPH (Vscrollbar_pointer_glyph)->image, 1053 set_specifier_caching (XGLYPH (Vscrollbar_pointer_glyph)->image,
1043 slot_offset (struct window, 1054 offsetof (struct window, scrollbar_pointer),
1044 scrollbar_pointer),
1045 scrollbar_pointer_changed_in_window, 1055 scrollbar_pointer_changed_in_window,
1046 0, 0); 1056 0, 0);
1047 } 1057 }