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

📄 slider.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic	char sccsid[] = "@(#)slider.c 1.1 92/07/30 Copyr 1984 Sun Micro";#endif#endif/* * Copyright (c) 1984 by Sun Microsystems, Inc. */#include <stdio.h>#include <signal.h>#include "other_hs.h"#include "fontedit.h"#include "externs.h"#include "button.h"#include "slider.h"#include "edit.h"#define TEXT_X 		5#define TEXT_Y		15/* * A slider is a special type of button. A slider covers a range * of values and uses an "indicator" to indicate(!) some sub-section * of the range. The indicator can be slid over the range - thus * the name.  *  * The indicator is draw by a user supplied routine and it should * draw in XOR mode. *  */int		fted_slider_down();int		fted_slider_move();int		fted_slider_up();int		fted_slider_reset();static slider	*slider_head = NULL;slider * fted_slider_create( round, notify, draw, character,font, but_id, x_axis, offset)int	(*round)();	/* rounding  function	*/int 	(*notify)();	/* func that gets called when button is released */int	(*draw)();	/* func to draw stuff for the slider button */int 	(*character)(); /* func to handle input of a character */PIXFONT *font;		/* font of text 	*/int 	but_id;		/* button id 		*/int	x_axis;		/* true if slider is on the x axis */int	offset;		/* how far to offset the text from the cursor */{    slider	*new_slider;		/* the newly created slider */    button	*new_button;    button	**button_list;    button_group *new_group;    new_slider = (slider *) malloc(sizeof(slider));    CHECK_RETURN(new_slider, (slider *), "Can't malloc slider");    new_button = (button *) malloc(sizeof(button));    CHECK_RETURN(new_button, (button *), "Can't malloc button in fted_slider_create");    button_list = (button **) (malloc(sizeof(button *)));    CHECK_RETURN(button_list, (button **), "Can't malloc button_list in fted_slider_create");    new_group = (button_group *) malloc(sizeof(button_group));    CHECK_RETURN(new_group, (button_group *), "Can't malloc button_group in fted_slider_create");    new_slider->round	  = round;    new_slider->up_action = notify;    new_slider->draw	  = draw;    new_slider->font      = font;    new_slider->button    = new_button;    new_slider->group     = new_group;    new_slider->is_x_axis = x_axis;    new_slider->offset	  = offset;    *button_list = new_button;    new_group->buttons = button_list;    new_group->num_buttons = 0;    fted_add_button_group(new_group);    new_button->usr_data  = (caddr_t) new_slider;    new_button->down = fted_slider_down;    new_button->move = fted_slider_move;    new_button->up   = fted_slider_up;    new_button->character = character;    new_button->id   = but_id;    new_button->reset = fted_slider_reset;    new_button->type = BUTTON_TYPE_ACTION;        new_slider->next = slider_head;    slider_head = new_slider;    return(new_slider);}fted_slider_init(s, left, top, width, height,  text, init_x, init_y)slider		*s;int		left, top, width, height; /* rect that slider moves in */char		*text;			/* text displayed 	*/int		init_x, init_y;		/* init_position of slider */{    struct pr_size	size;		/* size of text string */    s->button->text = text;    if (text != NULL) {	s->button->text_x =  s->font->pf_char[*text].pc_pr->pr_size.x >> 1;        s->button->text_y = - s->font->pf_char[*text].pc_home.y;	size = pf_textwidth(strlen(text), s->font, text);        RECT_CONSTRUCT(s->button->out_fted_line1, init_x, init_y, size.x, size.y);    }    else {	RECT_CONSTRUCT(s->button->out_fted_line1, init_x, init_y, 1, 1);    }    RECT_CONSTRUCT(s->button->out_fted_line2, left, top, width, height);    s->group->bounding_box = s->button->out_fted_line2;}/* * Mouse button is pressed over  the button. */static button	*but_to_reset = NULL;static int	reset_left;static int	reset_top;fted_slider_down(but_ptr, but_num, cur_x, cur_y)button	*but_ptr;			/* ptr to button that was picked */int	but_num;			/* its number */int	cur_x, cur_y;{    if (but_to_reset != but_ptr) {	fted_slider_reset(0, 0);	but_to_reset = but_ptr;	reset_left = but_ptr->out_fted_line1.r_left;	reset_top  = but_ptr->out_fted_line1.r_top;    }    fted_slider_move(but_ptr, but_num, cur_x, cur_y);}fted_slider_move(but_ptr, but_num, cur_x, cur_y)register button	*but_ptr;			/* ptr to button that was picked */	 int	but_num;			/* its number */	 int	cur_x, cur_y;{    register struct rect *ol1, *ol2;		/* out_line rects 1 and 2 */    register slider	 *s;    register int	cur_coord;    register int	ref_pt;    if ( but_to_reset == NULL)        fted_slider_down(but_ptr, but_num, cur_x, cur_y);    s = (slider *) but_ptr->usr_data;    ol1 = &(but_ptr->out_fted_line1);    ol2 = &(but_ptr->out_fted_line2);    (*s->draw)(s);     if (s->is_x_axis) {	cur_coord = cur_x;	ref_pt = ol1->r_left;	if ( cur_coord <= ol2->r_left ) {	   cur_coord = ol2->r_left;	}	else if ( cur_coord >= (ol2->r_left + ol2->r_width) ) {	   cur_coord = (ol2->r_left + ol2->r_width);	}	ref_pt += cur_coord - (ref_pt + (s->offset >> 1));	ol1->r_left = ref_pt;    }    else {	cur_coord = cur_y;	ref_pt = ol1->r_top;	if ( cur_coord <= ol2->r_top ) {	   cur_coord = ol2->r_top;	}	else if ( cur_coord >= (ol2->r_top + ol2->r_height) ) {	   cur_coord = (ol2->r_top + ol2->r_height);	}	ref_pt += cur_coord - (ref_pt + (s->offset >> 1));	ol1->r_top = ref_pt;    }    (*s->draw)(s);}fted_slider_up(but_ptr, but_num, cur_x, cur_y)register button	*but_ptr;			/* ptr to button that was picked */	 int	but_num;			/* its number */	 int	cur_x, cur_y;{    register struct rect *r;    register slider	 *s;    		int	 new_x, new_y;    if ( but_to_reset == NULL)        return;	    r = &(but_ptr->out_fted_line1);    s = (slider *) but_ptr->usr_data;    (*s->draw)(s);    if (but_ptr->text != NULL) {    	pw_text(fted_canvas_pw, (but_ptr->text_x + reset_left),			   (but_ptr->text_y + reset_top),			   PIX_SRC, s->font, " ");    }    (*s->round)(s, cur_x, cur_y, &new_x, &new_y);    if((*s->up_action)(s, new_x, new_y)) {    	r->r_left = new_x;    	r->r_top = new_y;    }        if (but_ptr->text != NULL) {    	pw_text(fted_canvas_pw, (but_ptr->text_x + r->r_left),			   (but_ptr->text_y + r->r_top),			   PIX_SRC, s->font, but_ptr->text);    }    (*s->draw)(s);    but_to_reset = NULL;}fted_slider_reset(x, y)register int x,y;{    register button		*but_ptr;    register slider		*s;    register struct rect 	*r;        if (but_to_reset == NULL)        return;    but_ptr = but_to_reset;			/* put pointer into a register */    s = (slider *) but_ptr->usr_data;	     (*s->draw)(s);    r = &(but_ptr->out_fted_line1);    r->r_left = reset_left;    r->r_top  = reset_top;    if ( but_ptr->text != NULL) {    	pw_text(fted_canvas_pw, (but_ptr->text_x + r->r_left),			   (but_ptr->text_y + r->r_top),			   PIX_SRC, s->font, but_ptr->text);    }    (*s->draw)(s);    but_to_reset = NULL;}fted_slider_display(slider_list)slider	*slider_list[];{    register slider	*s;    register button 	*but_ptr;    register struct rect *r;    register int 	i;    for (i = 0; i < NUM_SLIDERS; i++) {	s = slider_list[i];	but_ptr = s->button;        r = &(but_ptr->out_fted_line1);	if (but_ptr->text)    		pw_text(fted_canvas_pw, (but_ptr->text_x + r->r_left),			   (but_ptr->text_y + r->r_top),			   PIX_SRC, s->font, but_ptr->text);	(*s->draw)(s);    }}fted_slider_enable(id)int	id;{    register slider *s;    for(s = slider_head; s != NULL; s =  s->next)	if ( s->button->id == id )            s->group->num_buttons = 1;}fted_slider_disable(id)int	id;{    register slider *s;    for(s = slider_head; s != NULL; s =  s->next){	if ( s->button->id == id )            s->group->num_buttons = 0;    }}fted_step_func_x(s, cur_x, cur_y, new_x, new_y)register slider		*s;		/* the slider that's being moved */	int		cur_x, cur_y;	/* current location 		*/	int		*new_x, *new_y;	/* new locataion 		*/	{    register int origin_x;    register struct rect *ol1, *ol2;        ol1 = &(s->button->out_fted_line1);    ol2 = &(s->button->out_fted_line2);    *new_y = ol1->r_top;    origin_x = fted_edit_pad_groups[s->button->id].edit->buttons[EDIT_BUTTON]->hi_light.r_left + 1;    if (cur_x <= origin_x)       *new_x = origin_x;    else {	if (cur_x >= (ol2->r_left + ol2->r_width))	     cur_x = (ol2->r_left + ol2->r_width);	*new_x = ((int)(cur_x - origin_x) / CELL_SIZE) * CELL_SIZE + origin_x;    }    *new_x += ( (CELL_SIZE / 2) - (SLIDER_WIDTH / 2) );}fted_step_func_y(s, cur_x, cur_y, new_x, new_y)register slider		*s;		/* the slider that's being moved */	int		cur_x, cur_y;	/* current location 		*/	int		*new_x, *new_y;	/* new locataion 		*/	{    register int origin_y;    register struct rect *ol1, *ol2;        ol1 = &(s->button->out_fted_line1);    ol2 = &(s->button->out_fted_line2);    *new_x = ol1->r_left;    origin_y = fted_edit_pad_groups[s->button->id].edit->buttons[EDIT_BUTTON]->hi_light.r_top + 1;    if (cur_y <= origin_y)       *new_y = origin_y;    else {	if (cur_y >= (ol2->r_top + ol2->r_height))	     cur_y = (ol2->r_top + ol2->r_height);	*new_y = ((int)(cur_y - origin_y) / CELL_SIZE) * CELL_SIZE + origin_y;    }    *new_y += ( (CELL_SIZE / 2) - (SLIDER_WIDTH / 2) );}fted_slider_cmd_advance(s, x, y)slider	*s;int 	x, y;{    register int new_advance;    register edit_info 	*pad;    pad = &(fted_edit_pad_info[s->button->id]);    if (!fted_undo_push(pad))	fprintf(stderr,"Looks like we're out of memory; couldn't push undo\n");    x += (SLIDER_WIDTH / 2);    new_advance = ((int)(x - s->button->out_fted_line2.r_left) / CELL_SIZE) + 1 ;    pad->pix_char_ptr->pc_adv.x =  new_advance;    pad->modified = TRUE;    return(TRUE);}fted_slider_cmd_right_edge(s, x, y)slider	*s;int 	x, y;{    register int	new_edge;    register edit_info	*pad;    register button	*but;	    but = fted_edit_pad_groups[s->button->id].edit->buttons[EDIT_BUTTON];    pad = &(fted_edit_pad_info[s->button->id]);    if (!fted_undo_push(pad))	fprintf(stderr,"Looks like we're out of memory; couldn't push undo\n");    x += (SLIDER_WIDTH / 2);    new_edge = ((int)(x - (but->hi_light.r_left + 1)) / CELL_SIZE) + 1;    pad->window.r_width = new_edge;    but->out_fted_line2.r_width = new_edge * CELL_SIZE;    pr_rop(pad->pix_char_ptr->pc_pr,    		new_edge, 0, fted_char_max_width, fted_char_max_height, PIX_CLR, NULL, 0, 0);    pw_write(fted_canvas_pw, pad->proof.out_fted_line2.r_left + PROOF_X_OFFSET,                pad->proof.out_fted_line2.r_top + PROOF_Y_OFFSET,		fted_char_max_width, fted_char_max_height, PIX_SRC,		pad->pix_char_ptr->pc_pr, 0, 0);				    pad->modified = TRUE;    if (!fted_undoing)    	fted_paint_pad(pad, but);    return(TRUE);}fted_slider_cmd_bottom_edge(s, x, y)slider	*s;int 	x, y;{    register int new_edge;    register edit_info	*pad;    register button	*but;    but = fted_edit_pad_groups[s->button->id].edit->buttons[EDIT_BUTTON];    pad = &(fted_edit_pad_info[s->button->id]);    if (!fted_undo_push(pad))	fprintf(stderr,"Looks like we're out of memory; couldn't push undo\n");    y += (SLIDER_WIDTH / 2);    new_edge = ((int)(y - (but->hi_light.r_top + 1)) / CELL_SIZE) + 1;    new_edge = new_edge - pad->window.r_top;    if (new_edge <= 0) {	fted_message_user("bottom edge can't be above the top edge.");	return(FALSE);    }    pad->window.r_height = new_edge;    but->out_fted_line2.r_height = new_edge * CELL_SIZE;    pr_rop(pad->pix_char_ptr->pc_pr, 0, (pad->window.r_top + new_edge),			fted_char_max_width, fted_char_max_height, PIX_CLR, NULL, 0, 0);    pw_write(fted_canvas_pw, pad->proof.out_fted_line2.r_left + PROOF_X_OFFSET,                    pad->proof.out_fted_line2.r_top + PROOF_Y_OFFSET,		    fted_char_max_width, fted_char_max_height, PIX_SRC,		    pad->pix_char_ptr->pc_pr, 0, 0);				    if (!fted_undoing)    	fted_paint_pad(pad, but);    pad->modified = TRUE;    return(TRUE);}fted_slider_cmd_top_edge(s, x, y)slider	*s;int 	x, y;{    register int	new_top;    register int	diff;    register edit_info	*pad;    register button	*but;        y += (SLIDER_WIDTH / 2);    but = fted_edit_pad_groups[s->button->id].edit->buttons[EDIT_BUTTON];    pad = &(fted_edit_pad_info[s->button->id]);        new_top 		= ((int)(y - (but->hi_light.r_top + 1)) / CELL_SIZE)/* + 1 */;    diff 		= new_top - pad->window.r_top;    if ((pad->window.r_height - diff) <= 0) {	fted_message_user("top edge can't be below the bottom edge.");	return(FALSE);    }    pad->window.r_top 	= new_top;    but->out_fted_line2.r_top = (new_top * CELL_SIZE) + (but->hi_light.r_top + 1);        but->out_fted_line2.r_height = pad->window.r_height * CELL_SIZE;    if (rect_bottom(&(but->out_fted_line2)) < rect_bottom(&(but->hi_light)))    	but->out_fted_line2.r_height = rect_bottom(&(but->hi_light)) - 1 - but->out_fted_line2.r_top;	    pad->pix_char_ptr->pc_home.y += diff;    pw_write(fted_canvas_pw, pad->proof.out_fted_line2.r_left + PROOF_X_OFFSET,                    pad->proof.out_fted_line2.r_top + PROOF_Y_OFFSET,		    fted_char_max_width, fted_char_max_height, PIX_SRC,		    pad->pix_char_ptr->pc_pr, 0, 0);				    if (!fted_undoing)    	fted_paint_pad(pad, but);    return(TRUE); }fted_draw_indicator(s)register slider 	*s;{    register int x1, y1, x2, y2;    register button *b;        b = s->button;    if (s->is_x_axis) {	x1 = b->out_fted_line1.r_left ;	x2 =  x1 + SLIDER_WIDTH;	if ( *(b->text) == 'A' )  {	    y1 = b->out_fted_line1.r_top + b->out_fted_line1.r_height;	    y2 = y1 - SLIDER_LONGER_HEIGHT;	}	else {	    y1 = b->out_fted_line1.r_top ;	    y2 = y1 + SLIDER_LONGER_HEIGHT;	}	pw_vector(fted_canvas_pw, x1, y1, x2, y1, PIX_XOR, FOREGROUND);	pw_vector(fted_canvas_pw, x1, y1, x1, y2, PIX_XOR, FOREGROUND);	pw_vector(fted_canvas_pw, x2, y1, x2, y2, PIX_XOR, FOREGROUND);    }    else {	x1 = b->out_fted_line1.r_left ;	if ( *(b->text) == 'B' ) {	    x1 += b->out_fted_line1.r_width + b->text_x;	    x2 = x1 - SLIDER_LONGER_WIDTH;	}	else	    x2 = x1 + SLIDER_LONGER_WIDTH;	y1 = b->out_fted_line1.r_top ;	y2 = y1 + SLIDER_HEIGHT;	pw_vector(fted_canvas_pw, x1, y1, x1, y2, PIX_XOR, FOREGROUND);	pw_vector(fted_canvas_pw, x1, y1, x2, y1, PIX_XOR, FOREGROUND);	pw_vector(fted_canvas_pw, x1, y2, x2, y2, PIX_XOR, FOREGROUND);    }  }		   fted_draw_bounding_box(s)register slider 	*s;{    fted_FTdraw_rect(fted_canvas_pw, &(s->group->bounding_box), FOREGROUND);}		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -