⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrollbar_public.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -