Mercurial > hg > xemacs-beta
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 } |