📄 scrollbar_public.c
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)scrollbar_public.c 1.1 92/07/30 Copyr 1984 Sun Micro";#endif#endif/*************************************************************************//* scrollbar_public.c *//* Copyright (c) 1985 by Sun Microsystems, Inc. *//*************************************************************************/#include <sys/types.h>#include <sys/ioccom.h>#include <varargs.h>#include <sunwindow/defaults.h>#include <suntool/scrollbar_impl.h> #include <pixrect/pixrect_hs.h>#include <sun/fbio.h>static int defaults_thickness, defaults_button_length;static Scrollbar_setting defaults_v_gravity, defaults_h_gravity;static scrollbar_set_internal();static scrollbar_free();static scrollbar_fix_region();scrollbar_handle scrollbar_active_sb; /* currently active scrollbar */scrollbar_handle scrollbar_head_sb; /* head of linked list of sb's for pixwin *//**************************************************************************//* cursors *//* There are 3 cursors for each of the 2 scrollbar orientations. *//**************************************************************************/static short v_west_active_cursor_image[16] = { 0x0800,0x0C00,0x0E00,0x0F00,0xFF80,0xFFC0,0xFFE0,0xFFF0, 0xFFE0,0xFFC0,0xFF80,0x0F00,0x0E00,0x0C00,0x0800,0x0000};mpr_static(scrollbar_v_west_active_mpr, 16, 16, 1, v_west_active_cursor_image);struct cursor scrollbar_v_west_active_cursor = {5,7,PIX_SRC|PIX_DST,&scrollbar_v_west_active_mpr};static short v_east_active_cursor_image[16] = { 0x0100,0x0300,0x0700,0x0F00,0x1FF8,0x3FF8,0x7FF8,0xFFF8, 0x7FF8,0x3FF8,0x1FF8,0x0F00,0x0700,0x0300,0x0100,0x0000};mpr_static(scrollbar_v_east_active_mpr, 16, 16, 1, v_east_active_cursor_image);struct cursor scrollbar_v_east_active_cursor = {5,7,PIX_SRC|PIX_DST,&scrollbar_v_east_active_mpr};static short h_north_active_cursor_image[16] = { 0x07F0,0x07F0,0x07F0,0x07F0,0x07F0,0x7FFF,0x3FFE,0x1FFC, 0x0FF8,0x07F0,0x03E0,0x01C0,0x0080,0x0000,0x0000,0x0000};mpr_static(scrollbar_h_north_active_mpr,16,16,1,h_north_active_cursor_image);struct cursor scrollbar_h_north_active_cursor = {7,5,PIX_SRC|PIX_DST,&scrollbar_h_north_active_mpr};static short h_south_active_cursor_image[16] = { 0x0080,0x01C0,0x03E0,0x07F0,0x0FF8,0x1FFC,0x3FFE,0x7FFF, 0x07F0,0x07F0,0x07F0,0x07F0,0x07F0,0x0000,0x0000,0x0000};mpr_static(scrollbar_h_south_active_mpr,16,16,1, h_south_active_cursor_image);struct cursor scrollbar_h_south_active_cursor = {7,5,PIX_SRC|PIX_DST,&scrollbar_h_south_active_mpr};static short down_cursor_image[16] = { 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0xFFFF, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x07E0, 0x03C0, 0x0180};mpr_static(scrollbar_scrolldown_mpr, 16, 16, 1, down_cursor_image);struct cursor scrollbar_down_cursor = {8, 15, PIX_SRC|PIX_DST, &scrollbar_scrolldown_mpr};static short up_cursor_image[16] = { 0x0180, 0x03C0, 0x07E0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0xFFFF, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0};mpr_static(scrollbar_scrollup_mpr, 16, 16, 1, up_cursor_image);struct cursor scrollbar_up_cursor = {8, 0, PIX_SRC|PIX_DST, &scrollbar_scrollup_mpr};static short thumbv_cursor_image[16] = { 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, 0xFF00, 0xFE00, 0xFC00, 0xF800, 0xF000, 0xE000, 0xC000, 0x8000};mpr_static(scrollbar_thumbv_mpr, 16, 16, 1, thumbv_cursor_image);struct cursor scrollbar_thumbv_cursor = {3, 8, PIX_SRC|PIX_DST, &scrollbar_thumbv_mpr};static short left_cursor_image[16] = { 0x0100, 0x0300, 0x0700, 0x0F00, 0x1F00, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, 0x7FFF, 0x3FFF, 0x1F00, 0x0F00, 0x0700, 0x0300, 0x0100};mpr_static(scrollbar_scrollleft_mpr, 16, 16, 1, left_cursor_image);struct cursor scrollbar_left_cursor = {15, 8, PIX_SRC|PIX_DST, &scrollbar_scrollleft_mpr};static short right_cursor_image[16] = { 0x0080, 0x00C0, 0x00E0, 0x00F0, 0x00F8, 0xFFFC, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFC, 0x00F8, 0x00F0, 0x00E0, 0x00C0, 0x0080};mpr_static(scrollbar_scrollright_mpr, 16, 16, 1, right_cursor_image);struct cursor scrollbar_right_cursor = {0, 8, PIX_SRC|PIX_DST, &scrollbar_scrollright_mpr};static short thumbh_cursor_image[16] = { 0x7FFF,0x3FFE,0x1FFC,0x0FF8,0x07F0,0x03E0,0x01C0,0x0080, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};mpr_static(scrollbar_thumbh_mpr, 16, 16, 1, thumbh_cursor_image);struct cursor scrollbar_thumbh_cursor = {8, 0, PIX_SRC|PIX_DST, &scrollbar_thumbh_mpr};scrollbar_nullproc() { }/**************************************************************************//* scrollbar_build *//**************************************************************************/Scrollbarscrollbar_create_internal(avlist)caddr_t *avlist;{ extern char *calloc(); register scrollbar_handle sb; if (sb = (scrollbar_handle)(LINT_CAST( sv_calloc(1, sizeof(struct scrollbar))))) { (void)scrollbar_init(sb); (void)scrollbar_set_internal(sb, avlist); } return (Scrollbar) sb;}Scrollbarscrollbar_build(argv)caddr_t argv;{ return scrollbar_create_internal(&argv);}/*VARARGS*/Scrollbarscrollbar_create(va_alist)va_dcl{ va_list valist; caddr_t avlist[ATTR_STANDARD_SIZE]; va_start(valist); (void)attr_make(avlist,ATTR_STANDARD_SIZE,valist); va_end(valist); return scrollbar_create_internal(avlist);}/* [use this when we clean up: note *argv vs argv usage]Scrollbarscrollbar_create(argv)caddr_t argv;{ extern char *calloc(); register scrollbar_handle sb; if (sb = (scrollbar_handle)sv_calloc(1, sizeof(struct scrollbar))) { (void)scrollbar_init(sb); (void)scrollbar_set_internal(sb, &argv); } return (Scrollbar) sb;}*//**************************************************************************//* scrollbar_init *//**************************************************************************/scrollbar_init(sb)scrollbar_handle sb;{ static Defaults_pairs display_level[] = { "Always", (int)SCROLL_ALWAYS, "Active", (int)SCROLL_ACTIVE, "Never", (int)SCROLL_NEVER, NULL, (int)SCROLL_ALWAYS, }; static Defaults_pairs vertical_placement[] = { "East", (int)SCROLL_MAX, "West", (int)SCROLL_MIN, NULL, (int)SCROLL_MIN }; static Defaults_pairs horizontal_placement[] = { "South", (int)SCROLL_MAX, "North", (int)SCROLL_MIN, NULL, (int)SCROLL_MIN }; static Defaults_pairs bubble_color[] = { "Black", FALSE, "Grey", TRUE, NULL, TRUE }; static Defaults_pairs bar_color[] = { "White", FALSE, "Grey", TRUE, NULL, TRUE }; defaults_v_gravity = (Scrollbar_setting)defaults_lookup( defaults_get_string("/Scrollbar/Vertical_bar_placement", (char *)NULL, (int *)NULL), vertical_placement); defaults_h_gravity = (Scrollbar_setting)defaults_lookup( defaults_get_string("/Scrollbar/Horizontal_bar_placement", (char *)NULL, (int *)NULL), horizontal_placement); defaults_thickness = defaults_get_integer_check("/Scrollbar/Thickness", SCROLL_DEFAULT_WIDTH, 0, 200, (int *)NULL); defaults_button_length = defaults_get_integer_check("/Scrollbar/Page_button_length", SCROLLBAR_DEFAULT_PAGE_BUTTON_LENGTH, 0, 200, (int *)NULL); sb->gravity = SCROLL_MIN; sb->gravity_not_yet_set = TRUE; sb->pixwin = (struct pixwin *) 0; sb->modify = scrollbar_nullproc; sb->view_start = 0; sb->view_length = 0; sb->object_length = SCROLLBAR_INVALID_LENGTH; sb->undo_mark = 0; sb->horizontal = FALSE; sb->rect.r_width = defaults_thickness; sb->normalize = TRUE; sb->use_grid = FALSE; sb->line_height = 0; sb->normalize_margin = SCROLL_DEFAULT_NORMALIZE_MARGIN; sb->gap = SCROLLBAR_INVALID_LENGTH; sb->button_length = defaults_button_length; sb->saved_button_length = defaults_button_length; sb->forward_cursor = &scrollbar_up_cursor; sb->backward_cursor = &scrollbar_down_cursor; sb->absolute_cursor = &scrollbar_thumbv_cursor; sb->active_cursor = &scrollbar_v_west_active_cursor; sb->advanced_mode = FALSE; sb->bar_painted = FALSE; sb->bubble_painted = FALSE; sb->buttons_painted = FALSE; sb->border_painted = FALSE; sb->direction_not_yet_set = TRUE; sb->bubble_modified = TRUE; sb->attrs_modified = TRUE; sb->next = scrollbar_head_sb; sb->paint_buttons_proc = scrollbar_paint_buttons; scrollbar_head_sb = sb; sb->bar_display_level = (Scrollbar_setting)defaults_lookup( defaults_get_string("/Scrollbar/Bar_display_level", (char *)NULL, (int *)NULL), display_level); sb->bubble_display_level = (Scrollbar_setting)defaults_lookup( defaults_get_string("/Scrollbar/Bubble_display_level", (char *)NULL, (int *)NULL), display_level); sb->border = (unsigned)defaults_get_boolean("/Scrollbar/Border", (Bool)(LINT_CAST(TRUE)), (int *)NULL); sb->buttons= (unsigned)defaults_get_boolean("/Scrollbar/Page_buttons", (Bool)(LINT_CAST(TRUE)),(int *)NULL); sb->bubble_grey = defaults_lookup( defaults_get_string ("/Scrollbar/Bubble_color", (char *)NULL, (int *)NULL), bubble_color); sb->bar_grey = defaults_lookup( defaults_get_string ("/Scrollbar/Bar_color", (char *)NULL, (int *)NULL), bar_color); sb->bubble_margin = defaults_get_integer_check("/Scrollbar/Bubble_margin", SCROLL_DEFAULT_BUBBLE_MARGIN, 0, (int)defaults_thickness/2, (int *)NULL); sb->end_point_area = defaults_get_integer("/Scrollbar/End_point_area", SCROLLBAR_DEFAULT_END_POINT_AREA, (int *)NULL); sb->delay = defaults_get_integer ("/Scrollbar/Repeat_time", SCROLLBAR_DEFAULT_REPEAT_TIME, (int *)NULL); sb->help_data = "sunview:scrollbar"; /* initialize timer struct */ /* timer = NOTIFY_NO_ITIMER; */ scrollbar_timer.it_value.tv_sec = 0; scrollbar_timer.it_value.tv_usec = 0; scrollbar_timer.it_interval.tv_sec = 0; scrollbar_timer.it_interval.tv_usec = 0;}/**************************************************************************//* scrollbar_set *//**************************************************************************//*VARARGS1*/intscrollbar_set(sb, va_alist)scrollbar_handle sb;va_dcl{ va_list valist; caddr_t avlist[ATTR_STANDARD_SIZE]; va_start(valist); (void) attr_make(avlist,ATTR_STANDARD_SIZE,valist); va_end(valist); (void)scrollbar_set_internal(sb, avlist);}staticscrollbar_set_internal(sb, avlist)scrollbar_handle sb;char **avlist;{ if (!sb) return 0; set_scrollbar_attr(sb, avlist); if (sb->attrs_modified) sb->modify(sb); /* Note: can't clear the attrs_modified flag here * because it is looked at elsewhere also. */ return 1;}staticset_scrollbar_attr(sb, argv)scrollbar_handle sb;caddr_t *argv;{ register Scrollbar_attribute attr; register Rect *r; Rect rect; int client_set = FALSE; int thickness_set = FALSE; int rect_set = FALSE; int direction_set = FALSE; int forward_cursor_set = FALSE; int backward_cursor_set = FALSE; int absolute_cursor_set = FALSE; int active_cursor_set = FALSE; Scrollbar_setting defaults_gravity; int thickness; Rect old_bubble, new_bubble; int sb_major_axis; int sb_is_tiny; (void)scrollbar_compute_bubble_rect(sb, &old_bubble); while(attr = (Scrollbar_attribute) *argv++) { switch ((Scrollbar_attribute)attr) { case SCROLL_NOTIFY_CLIENT: sb->notify_client = *argv++; client_set = TRUE; break; case SCROLL_OBJECT: sb->object = *argv++; break; case SCROLL_PIXWIN: sb->pixwin = (struct pixwin *) (LINT_CAST(*argv++)); sb->attrs_modified = TRUE; break; case SCROLL_MODIFY_PROC: sb->modify = (int (*)()) (LINT_CAST(*argv++)); if (!sb->modify) sb->modify = scrollbar_nullproc; break; case SCROLL_RECT: r = (struct rect *) (LINT_CAST(*argv++)); sb->rect.r_top = r->r_top; sb->rect.r_left = r->r_left; sb->rect.r_height = r->r_height; sb->rect.r_width = r->r_width; sb->rect_fixed = TRUE; sb->attrs_modified = TRUE; rect_set = TRUE; break; case SCROLL_TOP: sb->rect.r_top = (int) *argv++; sb->rect_fixed = TRUE; sb->attrs_modified = TRUE; rect_set = TRUE; break; case SCROLL_LEFT: sb->rect.r_left = (int) *argv++; sb->rect_fixed = TRUE; sb->attrs_modified = TRUE; rect_set = TRUE; break; case SCROLL_WIDTH: sb->rect.r_width = (int) *argv++; sb->rect_fixed = TRUE; sb->attrs_modified = TRUE; rect_set = TRUE; break; case SCROLL_HEIGHT: sb->rect.r_height = (int) *argv++; sb->rect_fixed = TRUE; sb->attrs_modified = TRUE; rect_set = TRUE; break; case SCROLL_THICKNESS: thickness = (int) *argv++; sb->rect_fixed = TRUE; thickness_set = TRUE; rect_set = TRUE; sb->attrs_modified = TRUE; break; case SCROLL_PLACEMENT: sb->gravity = (Scrollbar_setting) *argv++; sb->gravity_not_yet_set = FALSE; sb->attrs_modified = TRUE; break; case SCROLL_BUBBLE_MARGIN: sb->bubble_margin = (unsigned) *argv++; sb->attrs_modified = TRUE; break; case SCROLL_BUBBLE_COLOR: if ((Scrollbar_setting) *argv++ == SCROLL_GREY) sb->bubble_grey = TRUE; else sb->bubble_grey = FALSE; sb->attrs_modified = TRUE; break; case SCROLL_BAR_COLOR: if ((Scrollbar_setting) *argv++ == SCROLL_GREY) sb->bar_grey = TRUE; else sb->bar_grey = FALSE; sb->attrs_modified = TRUE; break; case SCROLL_BORDER: sb->border = (int) *argv++; sb->attrs_modified = TRUE; break; case SCROLL_BAR_DISPLAY_LEVEL: sb->bar_display_level = (Scrollbar_setting) *argv++; sb->attrs_modified = TRUE; break; case SCROLL_BUBBLE_DISPLAY_LEVEL: sb->bubble_display_level = (Scrollbar_setting) *argv++; sb->attrs_modified = TRUE; break; case SCROLL_DIRECTION: if ((Scrollbar_setting) *argv++ == SCROLL_HORIZONTAL) { sb->horizontal = TRUE; sb->active_cursor = sb->gravity == SCROLL_NORTH ? &scrollbar_h_north_active_cursor : &scrollbar_h_south_active_cursor ; } else { sb->horizontal = FALSE; sb->active_cursor = sb->gravity == SCROLL_WEST ? &scrollbar_v_west_active_cursor : &scrollbar_v_east_active_cursor ; } direction_set = TRUE; sb->attrs_modified = TRUE; break; case SCROLL_FORWARD_CURSOR: sb->forward_cursor = (cursor_handle) (LINT_CAST(*argv++)); forward_cursor_set = TRUE; break; case SCROLL_BACKWARD_CURSOR: sb->backward_cursor = (cursor_handle) (LINT_CAST(*argv++)); backward_cursor_set = TRUE; break; case SCROLL_ABSOLUTE_CURSOR: sb->absolute_cursor = (cursor_handle) (LINT_CAST(*argv++)); absolute_cursor_set = TRUE; break; case SCROLL_ACTIVE_CURSOR: sb->active_cursor = (cursor_handle) (LINT_CAST(*argv++)); active_cursor_set = TRUE; break; case SCROLL_NORMALIZE: if (*argv++) sb->normalize = TRUE; else sb->normalize = FALSE; sb->attrs_modified = TRUE; break; case SCROLL_MARGIN: sb->normalize_margin = (int) *argv++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -