Esempio n. 1
0
void NMButton::eventhandle(NEvent* ev) 	//обработчик событий
{
    NStaticText::eventhandle(ev); //предок
    if ( ev->done )
	return;
    //одиночный или двойной клик
    NMouseEvent* mevent = (NMouseEvent*)ev;
    if (( ev->type == NEvent::evMOUSE ) && (mevent->cmdcode & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED)))
    {
	if (isinside(mevent->row, mevent->col))
	{
		ev->done = true;
		NEvent* tmp = pevent;
		pevent = NULL;
		putevent(tmp); //активируем событие связанное с этой кнопкой
	}
    }
    //клавиатура
    if ( ev->type == NEvent::evKB )
    {
	if ( keys.end() != std::find(keys.begin(), keys.end(), ev->cmdcode) )
	{
	    kLogPrintf("NMButton::eventhandle() got '%c' key\n", ev->cmdcode);
	    if (pevent)
	    {
		ev->done = true;
		NEvent* tmp = pevent;
		pevent = NULL;
		putevent(tmp); //активируем событие связанное с этой кнопкой
	    }
	}
    }
}
Esempio n. 2
0
void HelpWin::eventhandle(NEvent* ev) 	//обработчик событий
{
    NGroup::eventhandle(ev); //предок
    if ( ev->done )
	return;
    //закрываем при любом клике независимо от координат
    NMouseEvent* mevent = (NMouseEvent*)ev;
    if (( ev->type == NEvent::evMOUSE ) && (mevent->cmdcode & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED)))
	putevent(new TuiEvent(evKEYBIND));

    if ( ev->type == NEvent::evKB )
    {
	ev->done = true;
	switch(ev->cmdcode)
	{
	    case 27:
	    case KEY_ENTER:
	    case ' ':
	    case '\n':
		putevent(new TuiEvent(evKEYBIND)); //NEvent(NEvent::evPROG, 4)); //создаем событие с кодом 4 "окно Help"
		break;
	} //switch
	if (ev->done) //если обработали, то нужно перерисоваться
	    refresh();
    }
}
Esempio n. 3
0
void AddProjectForm::eventhandle(NEvent* ev) 	//обработчик событий
{
    if ( ev->done )
	return;
    NMouseEvent* mevent = (NMouseEvent*)ev;
    if ( ev->type == NEvent::evMOUSE)
    {
	NForm::eventhandle(ev); //предок
    }
    if ( ev->type == NEvent::evKB )
    {
	ev->done = true;
        switch(ev->keycode)
	{
	    case KEY_ENTER:
	    case '\n': //ENTER
	    {
		form_driver(frm, REQ_NEXT_FIELD); //костыль чтобы текущее поле не потеряло значение
		char* email = strlowcase(rtrim(field_buffer(fields[emailfield],0)));
		char* passw = rtrim(field_buffer(fields[passwfield],0));
		kLogPrintf("AddProjectForm OK name=[%s] url=[%s] email=[%s]\n passw=[%s]\n", projname.c_str(), projurl.c_str(), email, passw);
		if (srv!=NULL)
		{
		    std::string errmsg;
		    bool success = true;
		    if (!userexist) //если аккаунта еще нет то создаем
		    {
			char* username = strlowcase(rtrim(field_buffer(fields[usernamefield],0)));
			char* teamname = rtrim(field_buffer(fields[teamfield],0));
			success = srv->createaccount(projurl.c_str(),email,passw, username, teamname, errmsg);
		    }
		    if (success)
			success = srv->projectattach(projurl.c_str(), projname.c_str(), email, passw, errmsg); //подключить проект
		    if (success)
			putevent(new TuiEvent(evADDPROJECT)); //создаем событие чтобы закрыть форму
		    else
		    {
			//СООБЩЕНИЕ ОБ ОШИБКЕ
			errmsg = " Error: " + errmsg;
			set_field_buffer(fields[errmsgfield], 0, errmsg.c_str());
			field_opts_on(fields[errmsgfield], O_VISIBLE); //делаем видимой строку ошибки
			this->refresh();
		    }
		}
		break;
	    }
	    case 27:
		putevent(new TuiEvent(evADDPROJECT)); //код закрытия окна
		break;
	    default:
		kLogPrintf("AddProjectForm::KEYCODE=%d\n", ev->keycode);
		ev->done = false;
		NForm::eventhandle(ev); //предок
		break;
	} //switch
    }
}
Esempio n. 4
0
void mmu_NRU::getevent()
{
	if(readylist.size()>0)
	{
		current_event=locate_event();
		//current_event=*readylist.begin();
		//readylist.erase(readylist.begin());
	}
	else
	{
		current_event=*blockedlist.begin();
		system_time=current_event.arrive_time;
		putevent();
		getevent();
	}
}
Esempio n. 5
0
void mmu_NRU::ProcessIO()      
{
	//printf("start main process!\n");
	//printf("blockedlist.size=%d\n",blockedlist.size());
	  
	init_io();
	/* for test */
		for(int i=0;i<instr_size;i++)
		{
			//instruction[i].arrive_time=atoi((*pointer_input)[2*i].c_str());
			//cout<<"blockedlist["<<i<<"].arrive_time="<<blockedlist[i].arrive_time<<endl;
			//instruction[i].track_number=atoi((*pointer_input)[2*i+1].c_str());
			//cout<<"blockedlist["<<i<<"].track_number="<<blockedlist[i].track_number<<endl;
		}
	/* for test */

	 for(int i=0;i<instr_size;i++)
	 {
		 getevent();
		 scheduler();
		 putevent();

		 // finish operation
#ifdef VERBOSE
		 printf("%d: %d finish %d\n",system_time,finish_event.index,system_time-finish_event.arrive_time);
#endif

	 }

	 total_time=total_movement+instruction[0].arrive_time;
	 avg_turnaround=(double)total_turnaround/instr_size;
	 avg_waittime=(double)total_wait/instr_size;


	 printf("SUM: %d %d %.2lf %.2lf %d\n",system_time,total_movement,avg_turnaround,avg_waittime,max_waittime);
	 //printf("total_time=%d\n",system_time);
	 //printf("total_movement=%d\n",total_movement);
	 //printf("avg_turnaround=%f\n",(double)total_turnaround/instr_size);
	 //printf("avg_waittime=%f\n",(double)total_wait/instr_size);

}
Esempio n. 6
0
bool MainProg::mainloop() //основной цикл порождающий события
{
    sigset_t newset;
    sigemptyset(&newset);
    sigaddset(&newset, SIGWINCH); //маска для сигнала 
    if (gCfg->isdefault) //если конфига нет то открыть форму
	putevent(new NEvent(NEvent::evKB, 'C')); //создаем событие иммитирующее нажатие 'C'
    do
    {
	//блокировка сигнала изменения окна SIGWINCH на время отрисовки (из-за нереентерабельности курсес)
	sigprocmask(SIG_BLOCK, &newset, 0);
	//если нужен ресайз - перерисовать полностью
	if (MainProg::needresize)
	{
	    smartresize();
	    refresh();
	    menu->refresh();
	    //wmain->erase();
	    wstatus->erase();
	    wmain->refresh();
	    wstatus->refresh();
	}
	#ifndef EVENTTHREAD
	//если настало время посылаем evTIMER
	if (time(NULL) - evtimertime > EVTIMERINTERVAL)
	{
	    NEvent* event = new NEvent(NEvent::evTIMER, 0); //создаем событие таймера
	    putevent(event); //отправить в очередь
	    time(&evtimertime);
	}
	//есть символ в буфере -> нужно создать событие
	int ic;
	if ( (ic = getch()) != ERR ) //символ(ы) есть?
	{
	    NEvent* event = NULL;
	    if (KEY_MOUSE == ic)
	    {
		// mouse event
		MEVENT mevent;
		if (OK == getmouse(&mevent))
		    event = new NMouseEvent(mevent.bstate, mevent.y, mevent.x); //создаем мышиное событие
		else
		    kLogPrintf("getmouse() err\n");
	    }
	    else // keyboard event
		event = new NEvent(NEvent::evKB, ic); //создаем клавиатурное событие
	    if (event != NULL)
		putevent(event); //отправить в очередь
	}
	#endif
	//есть события в очереди - выполняем
	while(!evqueueempty())
	{
	    NEvent* event = popevent(); //получить первое событие из очереди
	    this->eventhandle(event); //отправить событие обработчику
	    #ifdef DEBUG
	    if ((event->type != NEvent::evTIMER)&&(!event->done))
		kLogPrintf("WARNING! lost event %s\n", event->tostring().c_str());
	    #endif
	    delete event; //удаляем отработанное событие
	    //обновляем экран
	    update_panels();
	    doupdate(); //физически выполняет перерисовку
	}
	//разблокируем SIGWINCH
	sigprocmask(SIG_UNBLOCK, &newset, 0); 
	#ifdef EVENTTHREAD
	usleep(10000); //10 milisec
	#endif
    }
    while(!done);
}
Esempio n. 7
0
void MainProg::eventhandle(NEvent* ev)	//обработчик событий КОРНЕВОЙ!
{
    NProgram::eventhandle(ev);
    if (ev->done) //если событие не обработано обработать здесь
	return;
    if (ev->type == NEvent::evKB) //клавиатурные
    {
        switch(ev->keycode)
	{
	    case 'q':
	    case 'Q':
		done = true; //выходим
		break;
	    case 'n':
	    case 'N':
		menu->disable();
		gsrvlist->nextserver();
		wmain->setserver(gsrvlist->getcursrv());
		menu->setserver(gsrvlist->getcursrv());
		evtimertime = 0; //для перезапуска таймера для форсированонй перерисовки
		wmain->updatecaption();
		break;
	    case 'c':
	    case 'C':
		if (getitembyid(typeid(CfgForm).name()) == NULL)
		{
		    menu->disable();
		    CfgForm* cfgform = new CfgForm(15,54/*,cfg*/);
		    insert(cfgform);
		    cfgform->settitle("Configuration");
		    cfgform->refresh();
		    uistate = uistate | stUIMODALFORM;
		    updatestatuslinecontent();
		}
		break;
	    case 'S':
	    case 's':
	    {
		TaskInfo* tinfo = (TaskInfo*)wmain->wtask->getselectedobj();
		if (tinfo) //только если есть выделенный эл-т
		    gsrvlist->getcursrv()->optask(tinfo->projecturl.c_str(), tinfo->taskname.c_str(),"suspend_result");
		break;
	    }
	    case 'R':
	    case 'r':
	    {
		TaskInfo* tinfo = (TaskInfo*)wmain->wtask->getselectedobj();
		if (tinfo) //только если есть выделенный эл-т
		gsrvlist->getcursrv()->optask(tinfo->projecturl.c_str(), tinfo->taskname.c_str(),"resume_result");
		break;
	    }
	    case 'A':
	    case 'a':
	    {
		TaskInfo* tinfo = (TaskInfo*)wmain->wtask->getselectedobj();
		if (tinfo) //только если есть выделенный эл-т
		{
		    TuiEvent* ev = new TuiEvent(evABORTRES);
		    ev->bdata1 = false;
		    putevent(ev); //создаем событие с кодом 2 "abort_result"
		}
		break;
	    }
	    case 27:
		menu->disable();
		//деструктим все какие есть модельные окна
		destroybyid(typeid(CfgForm).name()); //деструктим форму
		destroybyid(typeid(NMessageBox).name()); //деструктим форму
		if (destroybyid(typeid(TaskInfoWin).name())) //деструктим форму
		{
		    wmain->wtask->setselectorenable(true);
		    uistate = uistate & ~stUITASKINFO;
		}
		uistate = uistate & ~stUIMODALFORM;
		updatestatuslinecontent();
		break;
	    case KEY_F(9):
		if (!menu->isenable())
		{
		    menu->enable();
		    menu->action();
		}
		else
		    menu->disable();
		break;
	    default:
		kLogPrintf("KEYCODE=%d\n", ev->keycode);
		break;
	} //switch
    }
    if (ev->type == NEvent::evPROG) //прграммные
    {
	switch(ev->cmdcode)
	{
	    case evCFGCH: //событие при изменении конфига
	    {
		menu->disable();
		destroybyid(typeid(CfgForm).name()); //деструктим форму
		//реакция на изменение конфига
		gsrvlist->refreshcfg();
		wmain->setserver(gsrvlist->getcursrv()); //отображать первый в списке сервер
		menu->setserver(gsrvlist->getcursrv()); //отображать первый в списке сервер
		wmain->updatecaption();
		evtimertime = 0; //для перезапуска таймера для форсированонй перерисовки
		break;
	    }
	    case evABOUT: //событие About win
	    {
		if (!destroybyid(typeid(AboutWin).name()))
		{
		    AboutWin* about = new AboutWin(2,40);
		    insert(about);
		    about->move(getmaxy(stdscr)/2-about->getheight()/2,getmaxx(stdscr)/2-about->getwidth()/2); //центрируем
		    uistate = uistate | stUIMODALFORM;
		}
		else
		    uistate = uistate & ~stUIMODALFORM;
		updatestatuslinecontent();
		break;
	    }
	    case evKEYBIND: //событие KeyBinding win
	    {
		if (!destroybyid(typeid(HelpWin).name()))
		{
		    HelpWin* help = new HelpWin(2,40);
		    insert(help);
		    help->move(getmaxy(stdscr)/2-help->getheight()/2,getmaxx(stdscr)/2-help->getwidth()/2); //центрируем
		    uistate = uistate | stUIMODALFORM;
		}
		else
		    uistate = uistate & ~stUIMODALFORM;
		updatestatuslinecontent();
		break;
	    }
	    case evBENCHMARK: //запустить бенчмарк
	    {
		Srv* srv = gsrvlist->getcursrv();
		if (srv != NULL)
		    srv->runbenchmarks();
		break;
	    }
	    case evADDPROJECT: //добавить проект
	    {
		if (!destroybyid(typeid(AddProjectForm).name()))
		{
		    TuiEvent* ev1 = (TuiEvent*)ev;
		    Srv* srv = gsrvlist->getcursrv();
		    if (ev1->srv != NULL)
		    {
			AddProjectForm* addform = new AddProjectForm(30,65,ev1->srv,ev1->sdata1.c_str(),ev1->bdata1);
			insert(addform);
			addform->move(getmaxy(stdscr)/2-addform->getheight()/2,getmaxx(stdscr)/2-addform->getwidth()/2); //центрируем
			uistate = uistate | stUIMODALFORM;
		    }
		}
		else
		    uistate = uistate & ~stUIMODALFORM;
		updatestatuslinecontent();
		break;
	    }
	    case evADDACCMGR: //добавить акк менеджер
	    {
		if (!destroybyid(typeid(AddAccMgrForm).name()))
		{
		    TuiEvent* ev1 = (TuiEvent*)ev;
		    Srv* srv = gsrvlist->getcursrv();
		    if (ev1->srv != NULL)
		    {
			AddAccMgrForm* addmgrform = new AddAccMgrForm(30,65,ev1->srv,ev1->sdata1.c_str());
			insert(addmgrform);
			addmgrform->move(getmaxy(stdscr)/2-addmgrform->getheight()/2,getmaxx(stdscr)/2-addmgrform->getwidth()/2); //центрируем
			uistate = uistate | stUIMODALFORM;
		    }
		}
		else
		    uistate = uistate & ~stUIMODALFORM;
		updatestatuslinecontent();
		break;
	    }
	    case evPROJECTOP: //операции над проектом
	    {
		TuiEvent* ev1 = (TuiEvent*)ev;
		const char* projname = ev1->sdata1.c_str();
		const char* projop = ev1->sdata2.c_str();
		if (!ev1->bdata1) //если нет флага подтвержденного события, то не выполняем а спрашиваем юзера
		{
		    menu->disable(); //выключаем меню
		    //создаем окно сообщения с подтверждением
		    std::stringstream s;
		    s << "Please Confirm\n\n" << "Project   : "<< projname << "\nOperation : " << projop;
		    NMessageBox* mbox = new NMessageBox(s.str().c_str());
		    TuiEvent* buttonYev = new TuiEvent(evPROJECTOP, ev1->srv, projname, projop); //событие для кнопки Y
		    buttonYev->bdata1 = true; //флаг подтвержденности
		    mbox->addbutton(new NMButton("Yes",buttonYev, 'Y','y',0));
		    NEvent* buttonNev = new NEvent(NEvent::evKB, 27); //событие для кнопки N
		    mbox->addbutton(new NMButton("No",buttonNev, 'N','n',27,0));
		    insert(mbox);
		    uistate = uistate | stUIMODALFORM;
		}
		else
		{
		    kLogPrintf("evPROJECT confirmed event detected\n");
		    ev1->srv->opproject(projname, projop); //выполняем действие
		    if (destroybyid(typeid(NMessageBox).name())) //удаляем окно подтверждения (если есть)
			uistate = uistate & ~stUIMODALFORM;
		}
		updatestatuslinecontent();
		break;
	    }
	    case evABORTRES: //событие действий над проектами "abort_result" и.т.д.
	    {
		TaskInfo* tinfo = (TaskInfo*)wmain->wtask->getselectedobj();
		if (tinfo) //только если есть выделенный эл-т
		{
		    TuiEvent* ev1 = (TuiEvent*)ev;
		    if (!ev1->bdata1) //если нет флага подтвержденного события, то не выполняем а спрашиваем юзера
		    {
			menu->disable(); //выключаем меню
			//создаем окно сообщения с подтверждением
			std::stringstream s;
			s << "Please Confirm\n\n" << "Task   : " << tinfo->taskname << "\nOperation : " << "Abort";
			NMessageBox* mbox = new NMessageBox(s.str().c_str());
			TuiEvent* buttonYev = new TuiEvent(evABORTRES); //событие для кнопки Y
			buttonYev->bdata1 = true; //флаг подтвержденности
			mbox->addbutton(new NMButton("Yes",buttonYev, 'Y','y',0));
			NEvent* buttonNev = new NEvent(NEvent::evKB, 27); //событие для кнопки N
			mbox->addbutton(new NMButton("No",buttonNev, 'N','n',27,0));
			insert(mbox);
			uistate = uistate | stUIMODALFORM;
		    }
		    else
		    {
			kLogPrintf("evABORTRES confirmed event detected\n");
			Srv* srv = gsrvlist->getcursrv();
			srv->optask(tinfo->projecturl.c_str(), tinfo->taskname.c_str(),"abort_result"); //выполняем действие
			if (destroybyid(typeid(NMessageBox).name())) //удаляем окно подтверждения (если есть)
			    uistate = uistate & ~stUIMODALFORM;
		    }
		    updatestatuslinecontent();
		    break;
		}
	    }
	    case evTASKSELECTORON:
	    {
		uistate = uistate | stUISELECTOR;
		updatestatuslinecontent();
		break;
	    }
	    case evTASKSELECTOROFF:
	    {
		uistate = uistate & ~stUISELECTOR;
		updatestatuslinecontent();
		break;
	    }
	    case evTASKINFO:
	    {
		TaskInfo* tinfo = (TaskInfo*)wmain->wtask->getselectedobj();
		if (tinfo) //только если есть выделенный эл-т
		{
		    wmain->wtask->setselectorenable(false);
		    TaskInfoWin* taskinfowin = new TaskInfoWin("Task Info Raw View", gsrvlist->getcursrv(), tinfo->projecturl.c_str(), tinfo->taskname.c_str());
		    insert(taskinfowin);
		    taskinfowin->move(getmaxy(stdscr)/2-taskinfowin->getheight()/2,getmaxx(stdscr)/2-taskinfowin->getwidth()/2); //центрируем
		    uistate = uistate | stUITASKINFO;
		    updatestatuslinecontent();
		}
	    }
	    case evASCIIMODECHANGE:
	    {
		gCfg->setivalue("line_draw_mode",asciilinedraw);
		refresh();
		break;
	    }
	} //switch
    }
}
Esempio n. 8
0
void AddAccMgrForm::eventhandle(NEvent* ev) 	//обработчик событий
{
    if ( ev->done )
	return;
    NMouseEvent* mevent = (NMouseEvent*)ev;
    if ( ev->type == NEvent::evMOUSE)
    {
	NForm::eventhandle(ev); //предок
    }
    if ( ev->type == NEvent::evKB )
    {
	ev->done = true;
        switch(ev->keycode)
	{
	    case KEY_ENTER:
	    case '\n': //ENTER
	    {
		form_driver(frm, REQ_NEXT_FIELD); //костыль чтобы текущее поле не потеряло значение
		char* username = rtrim(field_buffer(fields[usernamefield],0));
		char* passw = rtrim(field_buffer(fields[passwfield],0));
		mgrurl = rtrim(field_buffer(fields[urlfield],0));
		char* mgrname = rtrim(field_buffer(fields[namefield],0));
		kLogPrintf("AddAccMgrForm OK username=[%s] passw=[%s]\n", username, passw);
		if (srv!=NULL)
		{
		    std::string errmsg;
		    bool success = srv->accountmanager(mgrurl.c_str(), username, passw, false, errmsg);
		    if (success)
		    {
			Item* account_manager = NULL;
			if (srv !=NULL)
			    account_manager = srv->findaccountmanager(mgrname);
			if (account_manager == NULL) //для кастомных менеджеров сохраняем в конфигах
			{
			    //проверить есть-ли уже в конфиге такой аккаунт менеджер
			    //то обновляем существующую запись, иначе добавляем новую
			    bool exist = false;
			    Item* boinctui_cfg = gCfg->getcfgptr();
			    if (boinctui_cfg != NULL)
			    {
				std::vector<Item*> mgrlist = boinctui_cfg->getItems("accmgr");
				std::vector<Item*>::iterator it;
				for (it = mgrlist.begin(); it != mgrlist.end(); it++)
				{
				    Item* namecfg = (*it)->findItem("name");
				    Item* urlcfg =  (*it)->findItem("url");
				    if (namecfg != NULL)
					if (strcmp(namecfg->getsvalue(),mgrname) == 0)
					{
					    exist = true;
					    //обновить значение url в конфиге
					    Item* urlcfg = (*it)->findItem("url");
					    if (urlcfg != NULL)
						urlcfg->setsvalue(mgrurl.c_str());
					}
				    if (urlcfg != NULL)
				    {
					if (strcmp(urlcfg->getsvalue(),mgrurl.c_str()) == 0)
					{
					    exist = true;
					    //обновить значение имени в конфиге
					    Item* namecfg = (*it)->findItem("name");
					    if (namecfg != NULL)
						namecfg->setsvalue(mgrname);
					}
				    }
				    if (exist)
					break;
				}
				if (!exist)
				{
				    //записать в конфиг как новый
				    Item* accmgr  = new Item("accmgr");
				    boinctui_cfg->addsubitem(accmgr);
				    Item* name  = new Item("name");
				    name->setsvalue(mgrname);
				    Item* url  = new Item("url");
				    url->setsvalue(mgrurl.c_str());
				    accmgr->addsubitem(name);
				    accmgr->addsubitem(url);
				}
			    }
			}
			putevent(new TuiEvent(evADDACCMGR)); //создаем событие чтобы закрыть форму
		    }
		    else
		    {
			//СООБЩЕНИЕ ОБ ОШИБКЕ
			errmsg = " Error: " + errmsg;
			set_field_buffer(fields[errmsgfield], 0, errmsg.c_str());
			field_opts_on(fields[errmsgfield], O_VISIBLE); //делаем видимой строку ошибки
			this->refresh();
		    }
		}
		break;
	    }
	    case 27:
		putevent(new TuiEvent(evADDACCMGR, srv, mgrname.c_str())); //код закрытия окна
		break;
	    default:
		kLogPrintf("AddAccMgrForm::KEYCODE=%d\n", ev->keycode);
		ev->done = false;
		NForm::eventhandle(ev); //предок
		break;
	} //switch
    }
}