+ case '\t':
+ tui_focus(uilist[focus], 0);
+ focus ^= 1;
+ tui_focus(uilist[focus], 1);
+ break;
+
+ case KB_UP:
+ tui_list_sel_prev(uilist[focus]);
+ break;
+ case KB_DOWN:
+ tui_list_sel_next(uilist[focus]);
+ break;
+ case KB_LEFT:
+ tui_list_sel_start(uilist[focus]);
+ break;
+ case KB_RIGHT:
+ tui_list_sel_end(uilist[focus]);
+ break;
+
+ case '\n':
+ sel = tui_get_list_sel(uilist[focus]);
+ if(focus == 0) {
+ struct ftp_dirent *ent = ftp_dirent(ftp, sel);
+ if(ent->type == FTP_DIR) {
+ ftp_queue(ftp, FTP_CHDIR, ent->name);
+ } else {
+ /* TODO */
+ }
+ } else {
+ if(localdir[sel].type == FTP_DIR) {
+ if(chdir(localdir[sel].name) == -1) {
+ errmsg("failed to change directory: %s\n", localdir[sel].name);
+ } else {
+ getcwd(curdir, sizeof curdir);
+ update_localdir();
+ }
+ } else {
+ /* TODO */
+ }
+ }
+ break;
+
+ case '\b':
+ if(focus == 0) {
+ ftp_queue(ftp, FTP_CDUP, 0);
+ } else {
+ if(chdir("..") == 0) {
+ getcwd(curdir, sizeof curdir);
+ update_localdir();
+ }
+ }
+ break;
+
+ case KB_F5:
+ sel = tui_get_list_sel(uilist[focus]);
+ if(focus == 0) {
+ struct ftp_transfer *xfer;
+ struct ftp_dirent *ent = ftp_dirent(ftp, sel);
+ char *lname = alloca(strlen(ent->name) + 1);
+
+ fixname(lname, ent->name);
+
+ xfer = malloc_nf(sizeof *xfer);
+ if(!(xfer->fp = fopen(lname, "wb"))) {
+ errmsg("failed to open %s: %s\n", lname, strerror(errno));
+ free(xfer);
+ break;
+ }
+
+ xfer->op = FTP_RETR;
+ xfer->rname = strdup_nf(ent->name);
+ xfer->total = ent->size;
+ xfer->done = xfer_done;
+
+ ftp_queue_transfer(ftp, xfer);
+ local_modified = 1;
+ } else {
+ /* TODO */
+ }
+ break;
+