/*
$NiH: status.c,v 1.19 2002/09/16 12:42:43 dillo Exp $
status.c -- status line
Copyright (C) 1996-2002 Dieter Baron
This file is part of cftp, a fullscreen ftp client
The author can be contacted at <dillo@giga.or.at>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <string.h>
#include "display.h"
#include "bindings.h"
#include "status.h"
#include "list.h"
#include "directory.h"
#include "tag.h"
#include "tty.h"
#define MAX_STATUS 8192
char status_line[MAX_STATUS];
struct status status;
void
status_init(void)
{
status.host = status.remote.path = status.local.path = 0;
}
void
status_do(enum state when)
{
int cols, space, l, l2;
if (when != bs_none && when != binding_state)
return;
cols = tty_cols;
if (cols >= MAX_STATUS)
cols = MAX_STATUS-1;
memset(status_line, ' ', cols);
status_line[cols] = '\0';
if (cols < 25) {
switch (binding_state) {
case bs_remote:
l = strlen(status.remote.path);
if (l > cols)
strcpy(status_line, status.remote.path+(l-cols));
else
strncpy(status_line, status.remote.path, l);
break;
case bs_tag:
if (cols < 5)
strncpy(status_line, "tag ", cols);
else
strncpy(status_line, "<tag>", 5);
break;
default:
break;
}
}
else {
strncpy(status_line, "--cftp: ", 8);
switch(status.percent) {
case -1:
strcpy(status_line+cols-5, "All--");
break;
case 0:
strcpy(status_line+cols-5, "Top--");
break;
case 100:
strcpy(status_line+cols-5, "Bot--");
break;
default:
sprintf(status_line+cols-5, "%2d%%--", status.percent);
}
space = cols-24;
l = strlen(status.host);
if (l > space) {
strncpy(status_line+8, status.host, space-3);
strncpy(status_line+space-3+8, "...", 3);
space = 0;
}
else {
strncpy(status_line+8, status.host, l);
space -= l;
}
switch (binding_state) {
case bs_remote:
strncpy(status_line+cols-15, "<remote>--", 10);
if (status.remote.path) {
l = strlen(status.remote.path);
if (l+1 > space && space < (cols-24)/2) {
l2 = cols-24-l+1;
if (l > (cols-24)/2)
l2 = (cols-24)/2;
strncpy(status_line+8+l2-3, "... ", 4);
space = cols-24-l2;
}
l2 = 8+(cols-24)-space+1;
if (l+1 > space) {
strncpy(status_line+l2, "...", 3);
strncpy(status_line+l2+3,
status.remote.path+l-space+3+1,
space-4);
}
else
strncpy(status_line+l2, status.remote.path, l);
}
break;
case bs_tag:
strcpy(status_line+cols-15, "<tag>-----");
break;
default:
break;
}
if (!disp_quiet) {
tty_goto(0, tty_lines-2);
tty_standout();
fputs(status_line, stdout);
tty_standend();
fputc('\n', stdout);
}
}
}
extern enum state leave_tag;
void
enter_state(enum state state)
{
switch (state) {
case bs_remote:
binding_state = bs_remote;
list = (struct list *)curdir;
list_do(1);
status_do(bs_none);
break;
case bs_local:
disp_status(DISP_STATUS, "state <local> not implemented yet");
case bs_tag:
if (!tag_anytags()) {
disp_status(DISP_STATUS, "no tags");
break;
}
if (binding_state != bs_tag)
leave_tag = binding_state;
binding_state = bs_tag;
list = (struct list *)&tags;
list_do(1);
status_do(bs_none);
break;
case bs_none:
disp_status(DISP_STATUS, "can't enter state <global>");
break;
default:
disp_status(DISP_STATUS, "no such state: %s", state);
}
}
syntax highlighted by Code2HTML, v. 0.9.1