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

📄 defaultsedit.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		PANEL_VALUE_DISPLAY_LENGTH, DE_STANDARD_DISPLAYLEN, 		PANEL_VALUE_STORED_LENGTH, DE_FULLNAME_MAX_LENGTH, 		PANEL_VALUE, panel_get(old, PANEL_LABEL_STRING), 		PANEL_NOTIFY_PROC, tree_choice_notifyproc, 		PANEL_CLIENT_DATA, defobjptr, 		PANEL_PAINT, PANEL_NONE, 		 0);	} else if (defobjptr->nodetype==String) {	    defobjptr->nodetype=Editstring;	    defobjptr->ilabel=panel_create_item(treepanel, PANEL_TEXT,		PANEL_ITEM_X, PANEL_CU(0),		PANEL_ITEM_Y, (int)panel_get(old, PANEL_ITEM_Y), 		PANEL_VALUE_DISPLAY_LENGTH, DE_STANDARD_DISPLAYLEN, 		PANEL_VALUE_STORED_LENGTH, DE_FULLNAME_MAX_LENGTH, 		PANEL_VALUE, panel_get(old, PANEL_LABEL_STRING), 		PANEL_EVENT_PROC, tree_text_eventproc, 		PANEL_CLIENT_DATA, defobjptr, 		PANEL_PAINT, PANEL_NONE, 		 0);	}	(void)panel_set(old, PANEL_PAINT, PANEL_NONE, 0);	(void)panel_free(old);	(void)panel_paint(defobjptr->ilabel, PANEL_CLEAR);	last_clicked_defobj = NULL;}/*  * Insert a new defaults object into the tree panel and the linked list * of defaults objects. * Copy label name and possible value from the preceeding node. *//* ARGSUSED */static voidmenu_insert_notifyproc(it,  event)	Panel_item		it;	Event			event;{	Recttype rectptr;	int	totheight;	int	ycoord;	Panel_item  item;	char	nodename[DE_FULLNAME_MAX_LENGTH];	Defobj	succptr;	Defobj	defobjptr;	char*	labelptr;	if (!check_clicked_defobj(True)) return;	if (last_clicked_defobj->nodetype==Helpstring) {	    show_message((char *)NULL, "Click on an item first!", "");	    return;	}		item=last_clicked_defobj->ivalue;	rectptr = (Recttype)(LINT_CAST(panel_get(item, PANEL_ITEM_RECT)));	totheight = rectptr->r_height + (int)(LINT_CAST(panel_get(treepanel, PANEL_ITEM_Y_GAP)));	ycoord = (int)panel_get(item, PANEL_ITEM_Y);	tree_scrollup(ycoord, -totheight);	(void)strcpy(nodename, getnodename_defobj(last_clicked_defobj));	labelptr =  nodename+strlen(get_cur_progname())+1;	defobjptr=create_text_defobj(labelptr, nodename, ycoord+totheight, True);	succptr = last_clicked_defobj->nodenext;	defobjptr->nodename = NULL;	last_clicked_defobj->nodenext = defobjptr;	defobjptr->nodenext = succptr;	(void)panel_paint(treepanel, PANEL_CLEAR);	last_clicked_defobj = NULL;}/*  * Delete defaults object, both in the treepanel and in the database *//* ARGSUSED */static voidmenu_delete_notifyproc(it,  event)	Panel_item		it;	Event			event;{	Recttype rectptr;	int	totheight;	int	ycoord;	Panel_item  item;    	Defobj	defobjptr;    	Defobj	prevptr;	if (!check_clicked_defobj(True)) return;	if (last_clicked_defobj->nodetype==Helpstring) {	    show_message((char *)NULL, "Click on an item first!", "");	    return;	}	item=last_clicked_defobj->ivalue;	rectptr = (Recttype)(LINT_CAST(panel_get(item, PANEL_ITEM_RECT)));	totheight = rectptr->r_height + (int)panel_get(treepanel, PANEL_ITEM_Y_GAP);	ycoord = (int)(LINT_CAST(panel_get(item, PANEL_ITEM_Y)));	if (last_clicked_defobj->nodename!=NULL) {	    defaults_remove(last_clicked_defobj->nodename, (int *)NULL);	}		/* Update nodenext pointer field of predecessor of deleted node */	defobjptr = last_clicked_defobj->nodenext;	if (last_clicked_defobj==firstdefobj) {	    firstdefobj = defobjptr;	} else {	    prevptr=firstdefobj;	    while (prevptr->nodenext != last_clicked_defobj) {		prevptr = prevptr->nodenext;	    }	    prevptr->nodenext = defobjptr;	}	freemem_defobj(last_clicked_defobj);	last_clicked_defobj = NULL;	tree_scrollup(ycoord, totheight);	(void)panel_paint(treepanel, PANEL_CLEAR);}/*  * This proc is called when setup program finishes processing. * Reads in parameters stored in .defaults file by the setup program. *//* ARGSUSED */static Notify_valuedemo_child_wait3(client, pid, status, rusage)	Notify_client	client;	int		pid;	union wait* 	status;	struct rusage*	rusage;{	char		name[DE_FULLNAME_MAX_LENGTH];	show_message((char *)NULL, "Loading defaults parameters written into .defaults by demo program", get_cur_progname());	sleep(1);	(void)strcpy(name, get_cur_progname());	/* Read parameters written to .defaults file by demo program  */	defaults_special_mode();        /* Actually reads the whole database  */	/* defaults_reread(name, NULL);   Commented out temporarily because	   of bug in defaults_reread  */	subtree_clearitems();	subtree_show();	show_message((char *)NULL, "", "");}	/* * This event proc is called whenever a text or a message item is clicked on * in the tree panel subwindow. It is also called when the label of a * choice object (implemented as a message item) is clicked on. * A help message is displayed in the help subwindow * by the proc showhelpitem. */static voidtree_text_eventproc(item, event)	Panel_item	item;	Event		*event;{	if (event_action(event) == MS_LEFT && event_is_up(event)) {	    last_clicked_defobj = (Defobj)(LINT_CAST(	    	panel_get(item, PANEL_CLIENT_DATA)));	    last_clicked_defobj->specifichelp = False;	    showhelpitem(last_clicked_defobj, False);	}	(void)panel_default_handle_event(item, event);}/* This is the notify procedure for the password item. It is called on *//* every input character. All characters are accepted. The showdtop () *//* routine is called upon a \r\n\t. */static unsigned char edit_char, edit_word, edit_line;Panel_setting panel_notify_proc(panel_item, event)Panel_item panel_item;Event *event;{    register unsigned short w = event_id(event);    char s[80], t[80];    /*     * Here we accept and report non-printing characters to make entering     * the line editing characters more intuitive.     *     * The start-up edit chars are cached so that we don't report them     * during user type-in.  Note that these chars do not change even     * after the user has saved replacements into her defaults.     */    if (!edit_char)        edit_char =            *(char *)defaults_get_string("/Text/Edit_back_char", "\0177", 0);    if (!edit_word)        edit_word =            *(char *)defaults_get_string("/Text/Edit_back_word", "\027", 0);    if (!edit_line)        edit_line =            *(char *)defaults_get_string("/Text/Edit_back_line", "\025", 0);    if (((0 <= w && w < (unsigned short) ' ') || w == 0177)            && !(w == edit_char || w == edit_word || w == edit_line            || w == 0177 || w == 027 || w == 025)) {    	*s = (char) event_id(event);    	*(s+1) = '\0';    	defaults_str_unparse(s, t);    	strcpy(s, "You have entered the non-printing character ");    	strcat(s, t);    	show_message((char *)NULL, "", s);    }    switch (w)    {      case '\011': /* tab */      case '\012': /* new line */      case '\015': /* return */         return (PANEL_NONE);      default:         return (PANEL_INSERT);    }}/* * This event proc is called whenever a text or a message item is clicked on * in the message subwindow where help texts are displayed. */static voidhelp_text_eventproc(item, event)	Panel_item	item;	Event		*event;{	if (event_action(event) == MS_LEFT && event_is_up(event)) {	    last_clicked_defobj = (Defobj)(LINT_CAST(panel_get(item, PANEL_CLIENT_DATA)));	    last_clicked_defobj->specifichelp = False;	}	(void)panel_default_handle_event(item, event);}/* * This notifyproc is called whenever a choice item in the treepanel * is clicked on. A help message is displayed in the help subwindow * by the proc showhelpitem. *//* ARGSUSED */static voidtree_choice_notifyproc(item, value, event)	Panel_item	item;	int		value;	Event		*event;{	last_clicked_defobj = (Defobj)(LINT_CAST(panel_get(item, PANEL_CLIENT_DATA)));	last_clicked_defobj->specifichelp = True;	showhelpitem(last_clicked_defobj, False);}	/* * Run the setup program when the relevant button in the current * tree panel subwindow is clicked. * This button exists only for programs which have the $Setup_program * parameter defined. *//* ARGSUSED */static voidtree_runsetup_notifyproc(item, event)         Panel_item	item;	Event		*event;{	run_setup_prog();}/* * Iterate over all default objects and items in treepanel and delete them. */static voidsubtree_clearitems(){	Defobj defobjptr;	Panel_item firstitem;	Panel_item tmpitem;	cur_ylinenr = 0;	defobjptr = firstdefobj;	while (defobjptr != NULL) {	    firstdefobj=defobjptr->nodenext;	    freemem_defobj(defobjptr);	    defobjptr = firstdefobj;	}	firstdefobj = NULL;	lastinserteddefobj = NULL;	/* Clean up any remaining buttons in the treepanel */	firstitem = panel_get(treepanel, PANEL_FIRST_ITEM);	while (firstitem != NULL) {	    tmpitem = panel_get(firstitem, PANEL_NEXT_ITEM);	    (void)panel_free(firstitem);	    firstitem = tmpitem;	}}/* * Return the defaults full path nodename corresponding to defaults object * pointed to by defobjptr. */static char*getnodename_defobj(defobjptr)    Defobj  defobjptr;{    char   tmpname[DE_FULLNAME_MAX_LENGTH];    char*   nodename;    if (defobjptr==NULL) {	deferror("NULL pointer in getnodename_defobj", False);	stop();    }	    if   (defobjptr->nodetype==Editstring ||          defobjptr->nodetype==Editenumerate) {	(void)strcpy(tmpname, get_cur_progname());	(void)strcat(tmpname, "/");	(void)strcat(tmpname, (char*)panel_get(defobjptr->ilabel, PANEL_VALUE));	nodename = getchars(strlen(tmpname));	(void)strcpy(nodename, tmpname);	return nodename;    }    return defobjptr->nodename;}Debug(    Bool t_subtree_extractinfo = False;    )/* * subtree_extractinfo() checks each panel item and if it reflects a * different value than that stored in the in-memory database, * and if store_panel_values is true, it extracts the new values * from the items and copies it to the database.  It also returns a * Bool(ean) which indicates whethe any of the items reflect different * values.   * * When store_panel_values is False, subtree_extractinfo() essentially * tests whether or not there are values in the parameters that might * need saving. */static Boolsubtree_extractinfo(store_panel_values)        Bool		store_panel_values;{	Defobj		defobjptr;	Defobj		prevobjptr;	int		intvalue;	char*		strvalue;	char		strvalue2[DE_NAME_ITEM_MAX_LENGTH];	char*		nodename;	Bool		changedflg;	/* True if any panel value change  */	int		progname_pos;	/* Possible program name position */	changedflg = False;	defobjptr = firstdefobj;	prevobjptr = firstdefobj;	while (defobjptr != NULL) {	    switch (defobjptr->nodetype) {		case Message: {			/* do nothing */		}		break;	   	case Enumerate:		    intvalue = (int)panel_get_value(defobjptr->ivalue);		    (void)get_enum_member_string(defobjptr->nodename, intvalue,			    strvalue2);		    if ((store_panel_values && deflt_always_save(		  		  defobjptr->nodename))		    	|| (!strequal(strvalue2,			    defaults_get_string(defobjptr->nodename, strvalue2,			    (int *)NULL))) ) {                        if (store_panel_values) {			    /* set_enumeration same as set_string but does			       additional checking  */			    defaults_set_enumeration(defobjptr->nodename, 			            strvalue2, (int *)NULL);			}		    	changedflg = True;		    }		break;	    	case String:		    strvalue = panel_get_value(defobjptr->ivalue);		    (void)convert_string(strvalue, strvalue2);		    if (strequal(strvalue, "")) {			(void)strcpy(strvalue2, 				defaults_get_default(defobjptr->nodename, "", 				(int *)NULL));		    }		    if (!strequal(strvalue2, 			    defaults_get_string(defobjptr->nodename, strvalue2, 			    (int *)NULL)) ) {                        if (store_panel_values) {			    defaults_set_string(defobjptr->nodename, strvalue2, 			            (int *)NULL);			}			changedflg = True;		    } 		break;		case Editstring:			/* This text node was inserted. Extract the label			    string and construct a corresponding node			    in the defaults database.			 */		    nodename=getnodename_defobj(defobjptr);		    changedflg = True;		    if (store_panel_values) {		        if (! strequal(nodename, "")) {			    strvalue = panel_get_value(defobjptr->ivalue);			    (void)convert_string(strvalue, strvalue2);			    if (strequal(strvalue, "") &&				        defaults_exists(nodename, (int *)NULL)) {			        (void)strcpy(strvalue2, defaults_get_default(nodename,					"", (int *)NULL));			    }			    defaults_set_string(nodename, strvalue2, (int *)NULL);			    if (defobjptr->nodename!=NULL) {		                subtree_copy(defobjptr->nodename, nodename);			        defaults_set_string(nodename, strvalue2, (int *)NULL);			        defaults_move(getnodename_defobj(prevobjptr),			                nodename, False, (int *)NULL);			        defaults_remove(defobjptr->nodename, (int *)NULL);			    } else {			        defaults_move(getnodename_defobj(prevobjptr),				        nodename, False, (int *)NULL);			    }			}					    }		break;		case Editenumerate: {			/* This enumeration node was inserted. Extract the label			    string and construct a corresponding node			    in the defaults database.			 */		    nodename=getnodename_defobj(defobjptr);		    changedflg = True;                    if (store_panel_values) {		        if (! strequal(nodename, "")) {			    intvalue = (int)panel_get_value(defobjptr->ivalue);			    (void)get_enum_member_string(defobjptr->nodename, 

⌨️ 快捷键说明

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