Index: network/network_gui.cpp =================================================================== --- network/network_gui.cpp (revision 14004) +++ network/network_gui.cpp (working copy) @@ -563,6 +563,37 @@ virtual EventState OnKeyPress(uint16 key, uint16 keycode) { EventState state = ES_NOT_HANDLED; + + /* scroll through server list */ + if (keycode == WKC_UP || keycode == WKC_DOWN) { + /* if no server is currently selected, return */ + if (this->server == NULL) return ES_HANDLED; + + /* search for the position of the current server in the list */ + for (uint32 i = 0; i < this->servers.Length(); i++) { + if (this->servers[i] == this->server) { + if (keycode == WKC_UP && i > 0) i--; // go up + if (keycode == WKC_DOWN && i < this->servers.Length() - 1) i++; // go down + this->server = this->servers[i]; + + /* if the server selected now is above/below the displayed + * range, scroll to its position accordingly */ + if (i < this->vscroll.pos) { + /* scroll up to the server */ + this->vscroll.pos = i; + } else if (i >= this->vscroll.pos + this->vscroll.cap) { + /* scroll down so that the server is at the bottom */ + this->vscroll.pos = i - this->vscroll.cap + 1; + } + + /* redraw window */ + this->SetDirty(); + return ES_HANDLED; + } + } + return ES_HANDLED; + } + if (this->field != NGWW_PLAYER) { if (this->server != NULL) { if (keycode == WKC_DELETE) { // Press 'delete' to remove servers