#pragma implementation "Controller.h" #include #include char Controller::insert_mode = 0; Controller *Controller::focus = 0; void Controller::setfocus(Controller *p) { //cerr << "setfocus(" << this << ',' << p << ")"; //for (Controller *t = focus;;t = t->next_focus) { // cerr << " -> " << t; // if (!t) break; //} //cerr << endl; Controller *t; for (t = focus; t && t != this; t = t->next_focus) ; if (t) while (focus && focus != this) { focus->losefocus(); focus = focus->next_focus; } if (p) { p->unlink(); p->next_focus = focus; focus = p; p->getfocus(); } else { losefocus(); unlink(); if (focus) focus->getfocus(); } } void Controller::unlink() { for (Controller **p = &focus; *p; p = &(*p)->next_focus) if (*p == this) { *p = next_focus; next_focus = this; break; } } void Controller::key(int k) { switch (k) { case KEY_IC: insert_mode = ~insert_mode; return; } if (next_focus) next_focus->key(k); } void Controller::cmd(int) { } int Controller::run() { int ky = 0; while (next_focus != this && dokey(ky = getkey()) == 0); return ky; } Controller::Controller() { next_focus = this; } Controller::~Controller() { unlink(); } int Controller::dokey(int k) { if (focus) focus->key(k); return (focus == 0); }