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); //активируем событие связанное с этой кнопкой } } } }
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(); } }
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 } }
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(); } }
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); }
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); }
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 } }
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 } }