Exemple #1
0
MStatus pbdSolverCmd::redoIt()
{
	//create solver node
	MStatus stat;
	MObject transform = dgMod.createNode("transform");
    MObject solver= dgMod.createNode(pbdSolverNode::typeId, transform, &stat);
	//connect time attribute
	MPlug plgInTime(solver,pbdSolverNode::time);
	MItDependencyNodes dnTime(MFn::kTime);
	MObject time = dnTime.thisNode();
	MPlug plgOutTime = MFnDependencyNode(time).findPlug("outTime", false);
	dgMod.connect(plgOutTime, plgInTime);
	
	//connect msattr
	MSelectionList activeSelect; 
	MGlobal::getActiveSelectionList(activeSelect);

	int pnum = 0, mnum = 0;
	for(int i = 0;i < activeSelect.length(); ++i)
	{
		MObject tNode; 
		activeSelect.getDependNode(i,tNode);
		MFnDagNode fnDagNode(tNode);
		MObject pNode=fnDagNode.child(0); 
		MFnDependencyNode fnNode(pNode);
			
		//MString name=fnNode1.name().asChar();
		if(fnNode.typeId() == OParticleNode::typeId)
		{
			//get solver message attribute from particleNode
			MPlug s_msg(pNode,OParticleNode::pbd_solver);
			//get particle message attribute from solverNode
			MPlug o_msg(solver,pbdSolverNode::orientedParticle);
			dgMod.connect(o_msg,s_msg);
			++pnum;
		}
		else if(pNode.apiType()==MFn::kMesh)
		{
			MString name=MFnDependencyNode(pNode).name().asChar();
			MPlug m_vs=fnNode.findPlug("ogc",false);
			MPlug s_vs(solver,pbdSolverNode::inMesh);

			dgMod.connect(m_vs,s_vs);
			++mnum;
		}
	}
	if( pnum == 0 )
		MGlobal::displayError(" No oriented particles are selected");
	if( mnum == 0 )
		MGlobal::displayError(" No mesh is selected");

	MGlobal::displayInfo("PBD solver is created");
	return dgMod.doIt();	
}
Exemple #2
0
void			cmd_msg(char *cmd, t_env *e, int cs)
{
	char	*trim;
	char	**spl;
	char	*tmp;

	trim = ft_strtrim(cmd);
	spl = ft_strsplit(trim, ' ');
	ft_strdel(&trim);
	if (ft_strlistlen(spl) == 3)
	{
		s_msg(e, cs, spl[1], spl[2]);
	}
	else
	{
		tmp = ft_strijoin(e->fds[cs].buf_write,
				CLEAR_LINE, "usage: /msg [name] [message]\n", 0);
		ft_strcpy(e->fds[cs].buf_write, tmp);
		ft_strdel(&tmp);
	}
	ft_strlistdel(spl);
}
Exemple #3
0
static int set_keydefine_key(struct _select_def *conf, int key)
{
    int oldmode;

    switch (key) {
        case KEY_TAB:
            ask_define();
            return SHOW_DIRCHANGE;
        case 'a':                  /* add new user */
            if (keymem_total < MAX_KEY_DEFINE) {
                int i,j;
                struct key_struct k;
                char buf[120];

                clear();
                move(1, 0);
                prints("请键入自定义键: ");
                do {
                    i = igetkey();
                    get_key_name(i, buf);
                } while (!buf[0]&&i!=KEY_ESC);
                if (i==KEY_ESC) return SHOW_DIRCHANGE;
                prints("%s\n", buf);
                k.key = i;
                move(2, 0);
                prints("请输入替换序列(最多10个),按一次ESC结束: ");
                j=0;
                do {
                    do {
                        i = igetkey();
                        get_key_name(i, buf);
                    } while (!buf[0]&&i!=KEY_ESC);
                    if (i==KEY_ESC) break;
                    prints("%s ", buf);
                    k.mapped[j] = i;
                    j++;
                    if (j>=10) break;
                } while (1);
                if (j<10) k.mapped[j]=0;
                if (j==0) return SHOW_DIRCHANGE;

                k.status[0] = -1;
                add_key(&k);

                return SHOW_DIRCHANGE;
            }
            break;
        case 'e':
            set_modes(keymem[conf->pos-1].status);
            return SHOW_DIRCHANGE;
        case 's': {
            int i,j,x,y;
            struct key_struct k;
            char buf[120];
            memmove(&k,keymem+conf->pos-1,sizeof(struct key_struct));
            clear();
            move(1, 0);
            prints("请键入自定义键: ");
            do {
                i = igetkey();
                get_key_name(i, buf);
            } while (!buf[0]&&i!=KEY_ESC);
            if (i==KEY_ESC) return SHOW_DIRCHANGE;
            prints("%s\n", buf);
            k.key = i;
            move(2, 0);
            prints("请输入替换序列(最多10个),按一次ESC结束: ");
            j=0;
            do {
                do {
                    i = igetkey();
                    get_key_name(i, buf);
                } while (!buf[0]&&i!=KEY_ESC);
                if (i==KEY_ESC) break;
                getyx(&y,&x);
                prints((x+strlen(buf)<t_columns-1)?"%s ":"\n%s ",buf);
                k.mapped[j] = i;
                j++;
                if (j>=10) break;
            } while (1);
            if (j<10) k.mapped[j]=0;
            if (j==0) return SHOW_DIRCHANGE;

            memcpy(keymem+conf->pos-1, &k, sizeof(struct key_struct));

            return SHOW_DIRCHANGE;
        }
        break;
        case 'x': {
            struct key_struct k;
            int i;
            char buf[128];
            memmove(&k,keymem+conf->pos-1,sizeof(struct key_struct));
            clear();
            move(1,0);
            prints("请键入自定义键: ");
            do {
                i=igetkey();
                get_key_name(i,buf);
            } while (!buf[0]&&i!=KEY_ESC);
            if (i==KEY_ESC)
                return SHOW_DIRCHANGE;
            k.key=i;
            prints("%s",buf);
            memmove(keymem+conf->pos-1,&k,sizeof(struct key_struct));
            prints("\n\n\033[1;33m%s\033[0;33m<Enter>\033[m","已更新!");
            WAIT_RETURN;
            return SHOW_DIRCHANGE;
        }
        break;
        case 't': {
            struct key_struct k;
            int i,j,x,y;
            char buf[128];
            memmove(&k,keymem+conf->pos-1,sizeof(struct key_struct));
            clear();
            move(1,0);
            prints("请输入替换序列(最多10个), 按一次ESC结束: ");
            for (j=0; j<10; j++) {
                do {
                    i=igetkey();
                    get_key_name(i,buf);
                } while (!buf[0]&&i!=KEY_ESC);
                if (i==KEY_ESC)
                    break;
                getyx(&y,&x);
                prints((x+strlen(buf)<t_columns-1)?"%s ":"\n%s ",buf);
                k.mapped[j]=i;
            }
            if (!j)
                return SHOW_DIRCHANGE;
            if (j<10)
                k.mapped[j]=0;
            memmove(keymem+conf->pos-1,&k,sizeof(struct key_struct));
            prints("\n\n\033[1;33m%s\033[0;33m<Enter>\033[m","已更新!");
            WAIT_RETURN;
            return SHOW_DIRCHANGE;
        }
        break;
        case 'd':                  /* delete existed user */
            if (keymem_total > 0) {
                char ans[3];

                getdata(t_lines - 1, 0, "确实要删除该定义键吗(Y/N)? [N]: ", ans, sizeof(ans), DOECHO, NULL, true);
                if (ans[0] == 'Y' || ans[0] == 'y') {
                    remove_key(conf->pos-1);
                    if (keymem_total==0) {
                        struct key_struct key;
                        key.key = 'A';
                        key.mapped[0] = 'A';
                        key.mapped[1] = 0;
                        key.status[0] = 0;
                        add_key(&key);
                    }
                }
                return SHOW_DIRCHANGE;
            }
            break;
        case 'L':
        case 'l':
            oldmode = uinfo.mode;
            show_allmsgs();
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'W':
        case 'w':
            oldmode = uinfo.mode;
            if (!HAS_PERM(getCurrentUser(), PERM_PAGE))
                break;
            s_msg();
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'u':
            oldmode = uinfo.mode;
            clear();
            modify_user_mode(QUERY);
            t_query(NULL);
            modify_user_mode(oldmode);
            clear();
            return SHOW_REFRESH;
    }

    return SHOW_CONTINUE;
}
Exemple #4
0
static int tmpl_key(struct _select_def *conf, int key)
{
    int oldmode;
    switch (key) {
        case 'a' :
            tmpl_check_limit(template_num);
            tmpl_add();
            return SHOW_DIRCHANGE;
            break;
        case 'd' : {
            char ans[3];

            getdata(t_lines - 1, 0, "确实要删除吗(Y/N)? [N]: ", ans, sizeof(ans), DOECHO, NULL, true);
            if (ans[0] == 'Y' || ans[0] == 'y') {
                int i;

                deepfree(ptemplate + conf->pos - 1, currboard->filename);

                template_num--;
                for (i=conf->pos-1; i<template_num; i++)
                    memcpy(ptemplate+i, ptemplate+i+1, sizeof(struct a_template));
                ptemplate[template_num].tmpl = NULL;
                ptemplate[template_num].cont = NULL;


                tmpl_save();
            }
            if (template_num > 0)
                return SHOW_DIRCHANGE;
            else
                return SHOW_QUIT;
        }
        break;
        case 'c':
            do {
                extern bool in_do_sendmsg;
                extern int super_select_board(char *bname);

                int ret;
                char bname[STRLEN] = "";

                move(0,0); clrtoeol();
                prints("%s","复制到讨论区 [ \033[1;32mSPACE/TAB\033[m - 自动补全, \033[1;32mESC\033[m - 退出 ]");
                move(1,0); clrtoeol();
                prints("请输入讨论区名称 [\033[1;32m%s\033[m]: ",currboard->filename);

                make_blist(0, 3);
                in_do_sendmsg=1;
                ret = namecomplete(NULL, bname);
                in_do_sendmsg=0;
                CreateNameList();   /*  free list memory. */

                if (ret == KEY_ESC) {
                    /* noop */
                } else if (!*bname || !strcmp(bname, currboard->filename)) {
                    /* copy to current board */
                    tmpl_check_BM(currboard->filename); /* sanity check, how about stick here when deposing? */
                    tmpl_check_limit(template_num);
                    if (tmpl_copy(conf->pos))
                        tmplcp_sorry();
                    else
                        tmplcp_success();
                } else { /* copy to another board */
                    struct a_template *ptemp;
                    int temp_num = tmpl_init_ex(0, bname, &ptemp);
                    if (temp_num >= 0) {
                        tmpl_check_BM(bname); /* sanity check */
                        tmpl_check_limit(temp_num);
                        if (tmpl_copy_to_board(bname, &ptemp, &temp_num, conf->pos))
                            tmplcp_sorry();
                        else
                            tmplcp_success();
                        tmpl_free_ex(&ptemp, temp_num);
                    }
                }
            } while (0);
            return SHOW_DIRCHANGE;
            /* etnlegend, 2006.05.19, move templates... */
        case 'm':
            do {
                struct a_template temp;
                char ans[4];
                int i,pos;
                getdata(t_lines-1,0,"请输入希望移动到的位置序号: ",ans,4,DOECHO,NULL,true);
                trimstr(ans);
                if (!isdigit(ans[0]))
                    break;
                pos=atoi(ans);
                pos=((pos<1)?1:((pos>template_num)?template_num:pos));
                if (pos==conf->pos)
                    break;
                memcpy(&temp,&ptemplate[conf->pos-1],sizeof(struct a_template));
                if (pos>conf->pos) {
                    for (i=(conf->pos-1); i<(pos-1); i++)
                        memcpy(&ptemplate[i],&ptemplate[i+1],sizeof(struct a_template));
                } else {
                    for (i=(conf->pos-1); i>(pos-1); i--)
                        memcpy(&ptemplate[i],&ptemplate[i-1],sizeof(struct a_template));
                }
                memcpy(&ptemplate[pos-1],&temp,sizeof(struct a_template));
                tmpl_save();
            } while (0);
            return SHOW_DIRCHANGE;
            /* END - etnlegend, 2006.05.19, move templates ... */
        case 't' : {
            char newtitle[60];

            strcpy(newtitle, ptemplate[conf->pos-1].tmpl->title);
            getdata(t_lines - 1, 0, "新名称: ", newtitle, 50, DOECHO, NULL, false);

            if (newtitle[0] == '\0' || newtitle[0]=='\n' || ! strcmp(newtitle,ptemplate[conf->pos-1].tmpl->title))
                return SHOW_REFRESH;

            strncpy(ptemplate[conf->pos-1].tmpl->title, newtitle, 50);
            ptemplate[conf->pos-1].tmpl->title[49]='\0';

            tmpl_save();

            return SHOW_REFRESH;
        }
        break;/*
 case 'z' :
  {
   char newtitle[30];

   strcpy(newtitle, ptemplate[conf->pos-1].tmpl->title_prefix);
getdata(t_lines - 1, 0, "请输入此模板的文章标题前缀: ", newtitle, 20, DOECHO, NULL, false);

   if( newtitle[0] == '\0' || newtitle[0]=='\n' || ! strcmp(newtitle,ptemplate[conf->pos-1].tmpl->title_prefix) )
return SHOW_REFRESH;

   strncpy(ptemplate[conf->pos-1].tmpl->title_prefix, newtitle, 20);
   ptemplate[conf->pos-1].tmpl->title_prefix[19]='\0';

   tmpl_save();

   return SHOW_REFRESH;
  }*/
        case 'f' : {
            char filepath[STRLEN];
            int oldmode;

            oldmode = uinfo.mode;
            modify_user_mode(EDITUFILE);

            if (ptemplate[conf->pos-1].tmpl->filename[0] == '\0') {

                setbfile(filepath, currboard->filename, "");
                if (GET_POSTFILENAME(ptemplate[conf->pos-1].tmpl->filename, filepath) != 0) {
                    clear();
                    move(3,0);
                    prints("创建模板文件失败!");
                    pressanykey();
                    return SHOW_REFRESH;
                }
                tmpl_save();
            }

            setbfile(filepath, currboard->filename, ptemplate[conf->pos-1].tmpl->filename);

            vedit(filepath,0,NULL,NULL,0);
            modify_user_mode(oldmode);

            return SHOW_REFRESH;
        }
        case 's' : {
            char filepath[STRLEN];
            setbfile(filepath, currboard->filename, ptemplate[conf->pos-1].tmpl->filename);
            clear();
            ansimore(filepath,1);
            return SHOW_REFRESH;
        }
        case 'b' : {
            if (ptemplate[conf->pos-1].tmpl->flag & TMPL_BM_FLAG)
                ptemplate[conf->pos-1].tmpl->flag &= ~TMPL_BM_FLAG ;
            else
                ptemplate[conf->pos-1].tmpl->flag |= TMPL_BM_FLAG;

            tmpl_save();

            return SHOW_REFRESH;
        }
        case 'i' : {
            char newtitle[STRLEN];

            strcpy(newtitle, ptemplate[conf->pos-1].tmpl->title_tmpl);
            getdata(t_lines - 1, 0, "新文章标题: ", newtitle, STRLEN, DOECHO, NULL, false);

            if (newtitle[0] == '\0' || newtitle[0]=='\n' || ! strcmp(newtitle,ptemplate[conf->pos-1].tmpl->title_tmpl))
                return SHOW_REFRESH;

            strncpy(ptemplate[conf->pos-1].tmpl->title_tmpl, newtitle, STRLEN);
            ptemplate[conf->pos-1].tmpl->title_tmpl[STRLEN-1]='\0';

            tmpl_save();

            return SHOW_REFRESH;
        }
        case 'x' : {
            clear();
            move(2,0);
            prints("此模版的标题设置为");
            move(4,0);
            prints("%s",ptemplate[conf->pos-1].tmpl->title_tmpl);
            pressanykey();
            return SHOW_REFRESH;
        }
        /*
        case 'h':
        {
         clear();
         move(1,0);
         prints("  x  :  查看标题格式\n");
         prints("  i  :  修改标题格式");
         pressanykey();
         return SHOW_REFRESH;
        }
        */
        case 'l': /* by pig2532 on 2005.12.01 */
            oldmode = uinfo.mode;
            show_allmsgs();
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'w':                  /* by pig2532 on 2005-12-1 */
            oldmode = uinfo.mode;
            if (!HAS_PERM(getCurrentUser(), PERM_PAGE))
                break;
            s_msg();
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'u':                  /* by pig2532 on 2005-12-1 */
            clear();
            oldmode = uinfo.mode;
            modify_user_mode(QUERY);
            t_query(NULL);
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'U':  /* pig2532 2005.12.10 */
            board_query();
            return SHOW_REFRESH;
        default :
            break;
    }

    return SHOW_CONTINUE;
}
Exemple #5
0
static int content_key(struct _select_def *conf, int key)
{
    int oldmode;
    switch (key) {
        case 'm': {
            char ans[5];
            int newm;
            getdata(t_lines-1, 0, "移动到新次序:", ans, 4, DOECHO, NULL, true);
            if (ans[0]=='\0' || ans[0]=='\n' || ans[0]=='\r')
                return SHOW_REFRESH;
            newm=atoi(ans);

            if (newm <= 0 || newm > ptemplate[t_now].tmpl->content_num)
                return SHOW_REFRESH;

            if (newm > conf->pos) {
                int i;
                struct s_content sc;
                memcpy(&sc, &ptemplate[t_now].cont[conf->pos-1], sizeof(struct s_content));
                for (i=conf->pos; i<newm; i++)
                    memcpy(& ptemplate[t_now].cont[i-1], & ptemplate[t_now].cont[i], sizeof(struct s_content));
                memcpy(&ptemplate[t_now].cont[newm-1], &sc, sizeof(struct s_content));

                tmpl_save();

                return SHOW_REFRESH;
            } else if (newm < conf->pos) {
                int i;
                struct s_content sc;
                memcpy(&sc, &ptemplate[t_now].cont[conf->pos-1], sizeof(struct s_content));
                for (i=conf->pos; i>newm; i--)
                    memcpy(& ptemplate[t_now].cont[i-1], & ptemplate[t_now].cont[i-2], sizeof(struct s_content));
                memcpy(&ptemplate[t_now].cont[newm-1], &sc, sizeof(struct s_content));

                tmpl_save();

                return SHOW_REFRESH;
            } else
                return SHOW_REFRESH;

        }
        case 'a':
            if (ptemplate[t_now].tmpl->content_num >= MAX_CONTENT) {
                char ans[STRLEN];
                move(t_lines - 1, 0);
                clrtoeol();
                a_prompt(-1, "选项已满,按回车继续 << ", ans);
                move(t_lines - 1, 0);
                clrtoeol();
                return SHOW_CONTINUE;
            }
            content_add();
            return SHOW_DIRCHANGE;
            break;
        case 'd': {
            char ans[3];

            getdata(t_lines - 1, 0, "确实要删除吗(Y/N)? [N]: ", ans, sizeof(ans), DOECHO, NULL, true);
            if (ans[0] == 'Y' || ans[0] == 'y') {
                int i=0;
                struct s_content *ct;

                if (ptemplate[t_now].tmpl->content_num == 1) {
                    ptemplate[t_now].tmpl->content_num = 0;
                    free(ptemplate[t_now].cont);

                    tmpl_save();
                    return SHOW_QUIT;
                }

                ct = (struct s_content *) malloc(sizeof(struct s_content) * (ptemplate[t_now].tmpl->content_num-1));

                memcpy(ct+i,&(ptemplate[t_now].cont[i]),sizeof(struct s_content) *(conf->pos-1));
                for (i=conf->pos-1; i<ptemplate[t_now].tmpl->content_num-1; i++)
                    memcpy(ct+i, &(ptemplate[t_now].cont[i+1]), sizeof(struct s_content));

                free(ptemplate[t_now].cont);
                ptemplate[t_now].cont = ct;

                ptemplate[t_now].tmpl->content_num --;

                tmpl_save();
                return SHOW_DIRCHANGE;
            }
            return SHOW_REFRESH;
        }
        case 't' : {
            char newtitle[60];

            strcpy(newtitle, ptemplate[t_now].cont[conf->pos-1].text);
            getdata(t_lines - 1, 0, "新标题: ", newtitle, 50, DOECHO, NULL, false);

            if (newtitle[0] == '\0' || newtitle[0]=='\n' || ! strcmp(newtitle,ptemplate[t_now].cont[conf->pos-1].text))
                return SHOW_REFRESH;

            strncpy(ptemplate[t_now].cont[conf->pos-1].text, newtitle, 50);
            ptemplate[t_now].cont[conf->pos-1].text[49]='\0';

            tmpl_save();

            return SHOW_REFRESH;
        }
        break;
        case 'l' : {
            char newlen[10];
            int nl;

            sprintf(newlen,"%-3d",ptemplate[t_now].cont[conf->pos-1].length);
            getdata(t_lines-1, 0, "新长度: ", newlen, 5, DOECHO, NULL, false);

            nl = atoi(newlen);

            if (nl <= 0 || nl > MAX_CONTENT_LENGTH || nl == ptemplate[t_now].cont[conf->pos-1].length)
                return SHOW_REFRESH;

            ptemplate[t_now].cont[conf->pos-1].length = nl;

            tmpl_save();

            return SHOW_REFRESH;
        }
        break;
        case 'w':                  /* by pig2532 on 2005-12-1 */
            oldmode = uinfo.mode;
            if (!HAS_PERM(getCurrentUser(), PERM_PAGE))
                break;
            s_msg();
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'u':                  /* by pig2532 on 2005-12-1 */
            clear();
            oldmode = uinfo.mode;
            modify_user_mode(QUERY);
            t_query(NULL);
            modify_user_mode(oldmode);
            return SHOW_REFRESH;
        case 'U':  /* pig2532 2005.12.10 */
            board_query();
            return SHOW_REFRESH;
        default:
            break;
    }

    return SHOW_CONTINUE;
}
Exemple #6
0
static choose_handler_t choose_board_handler(choose_t *cp, int ch)
{
	choose_board_t *cbrd = cp->data;
	board_data_t *ptr;
	char ans[2];
	bool modify_mode = false;

	switch (ch) {
		case '*':
			if (cbrd->brds[cp->cur].flag & BOARD_CUSTOM_FLAG)
				return DONOTHING;
			ptr = cbrd->brds + cp->cur;
			show_board_info(ptr->name);
			return FULLUPDATE;
		case 'C':
			return tui_goodbrd_copy(cp);
		case 'c':
			cbrd->newflag = !cbrd->newflag;
			return PARTUPDATE;
		case 'L':
			m_read();
			cp->valid = false;
			modify_mode = true;
			break;
		case 'M':
			m_new();
			cp->valid = false;
			modify_mode = true;
			break;
		case 'u':
			modify_user_mode(QUERY);
			t_query();
			modify_mode = true;
			break;
		case 'H':
			getdata(t_lines - 1, 0, "您选择? (1) 本日十大  (2) 系统热点 [1]",
					ans, 2, DOECHO, YEA);
			if (ans[0] == '2')
				show_help("etc/hotspot");
			else
				show_help("0Announce/bbslist/day");
			break;
		case 'l':
			msg_more();
			modify_mode = true;
			break;
		case 'P':
			return tui_goodbrd_paste(cp);
		case '!':
			save_zapbuf(cbrd);
			free(cbrd->brds);
			free(cbrd->gbrds);
			Goodbye();
			return -1;
		case 'h':
			show_help("help/boardreadhelp");
			break;
		case '/':
			// TODO: search.
			break;
		case 's':
			if (currentuser.flags[0] & BRDSORT_FLAG) {
				currentuser.flags[0] ^= BRDSORT_FLAG;
				currentuser.flags[0] |= BRDSORT_ONLINE;
				cbrd->cmp = board_cmp_online;
			} else if (currentuser.flags[0] & BRDSORT_ONLINE) {
				currentuser.flags[0] ^= BRDSORT_ONLINE;
				cbrd->cmp = board_cmp_default;
			} else {
				currentuser.flags[0] |= BRDSORT_FLAG;
				cbrd->cmp = board_cmp_flag;
			}
			qsort(cbrd->brds, cbrd->num, sizeof(*cbrd->brds), cbrd->cmp);
			substitut_record(PASSFILE, &currentuser,
					sizeof(currentuser), usernum);
			return PARTUPDATE;
		case 'y':
			if (cbrd->gnum)
				return DONOTHING;
			cbrd->yank = !cbrd->yank;
			cp->valid = false;
			return PARTUPDATE;
		case 'z':
			if (cbrd->gnum)
				return DONOTHING;
			if (HAS_PERM(PERM_LOGIN)
					&& !(cbrd->brds[cp->cur].flag & BOARD_NOZAP_FLAG)) {
				ptr = cbrd->brds + cp->cur;
				ptr->zap = !ptr->zap;
				ptr->total = -1;
				cbrd->zapbuf[ptr->pos] = (ptr->zap ? 0 : login_start_time);
			}
			cp->valid = false;
			return PARTUPDATE;
		case 'a':
			return tui_goodbrd_add(cp);
		case 'A':
			return tui_goodbrd_mkdir(cp);
		case 'T':
			return tui_goodbrd_rename(cp);
		case 'd':
			return tui_goodbrd_rm(cp);
		case '\r':
		case '\n':
		case KEY_RIGHT:
			if (cbrd->num > 0)
				choose_board_read(cp);
			cp->valid = false;
			modify_mode = true;
			break;
		case 'S':
			if (!HAS_PERM(PERM_TALK))
				return DONOTHING;
			s_msg();
			modify_mode = true;
			break;
		case 'o':
			if (!HAS_PERM(PERM_LOGIN))
				return DONOTHING;
			online_users_show_override();
			modify_mode = true;
			break;
		default:
			return DONOTHING;
	}
	if (modify_mode)
		modify_user_mode(cbrd->newflag ? READNEW : READBRD);
	return FULLUPDATE;
}