📄 sbox.c
字号:
#include <stdio.h>
#include <curses.h>
#include <stdlib.h>
#include "tool.h"
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
struct _item {
char flag;
char *item;
};
struct _bar {
struct _item *items;
int itemnum;
int curno;
int begno;
};
struct _sbox {
char *title;
int x;
int y;
int width;
int height;
struct _bar *bars;
int barnum;
int curno;
} sbox;
int createsbox(height, width, y, x, barnum, title)
int height;
int width;
int y;
int x;
int barnum;
char *title;
{
int i;
sbox.title = (char *)malloc(strlen(title) + 1);
if (!sbox.title) return(-1);
strcpy(sbox.title, title);
sbox.barnum = barnum;
sbox.curno = 0;
sbox.bars = (struct _bar *)malloc(barnum * sizeof(struct _bar));
if (!sbox.bars) return(-1);
for (i = 0; i < barnum; i++) {
sbox.bars[i].items = NULL;
sbox.bars[i].itemnum = sbox.bars[i].curno = sbox.bars[i].begno = 0;
}
sbox.height = height;
sbox.width = width;
sbox.y = y;
sbox.x = x;
return(0);
}
int additem(int bar, char *item, char flag)
{
struct _bar *tmp_bars;
struct _item *tmp_items;
if (bar > sbox.barnum - 1) return(-1);
tmp_bars = sbox.bars + bar;
tmp_items = (struct _item *)realloc((void *)tmp_bars->items,
(tmp_bars->itemnum + 1) * sizeof(struct _item));
if (!tmp_items) return(-1);
tmp_bars->items = tmp_items;
tmp_items = tmp_bars->items + tmp_bars->itemnum;
tmp_items->item = (char *)malloc(strlen(item) + 1);
if (!tmp_items->item) return(-1);
strcpy(tmp_items->item, item);
tmp_items->flag = flag;
tmp_bars->itemnum += 1;
return(0);
}
int setitemflag(int bar, int itemno, char flag)
{
struct _bar *tmp_bars;
if (bar > sbox.barnum - 1) return(-1);
tmp_bars = sbox.bars + bar;
if (itemno > tmp_bars->itemnum - 1) return(-1);
tmp_bars->items[itemno].flag = flag;
return(0);
}
int getitemflag(int bar, int itemno, char* pflag)
{
struct _bar *tmp_bars;
if (bar > sbox.barnum - 1) return(-1);
tmp_bars = sbox.bars + bar;
if (itemno > tmp_bars->itemnum - 1) return(-1);
*pflag = tmp_bars->items[itemno].flag;
return(0);
}
void dispitem(win, bar, itemno)
WINDOW *win;
int bar;
int itemno;
{
char prompt[81], tmp[3];
int width, x, y, flag;
if (bar > sbox.barnum - 1) return;
width = (sbox.width - 4) / sbox.barnum;
x = 3 + width * bar;
y = 3 + itemno - sbox.bars[bar].begno;
if (itemno > sbox.bars[bar].itemnum - 1) {
sprintf(prompt, "%-*.*s", width - 2, width - 2, "");
flag = 0;
} else {
if (sbox.bars[bar].items[itemno].flag) strcpy(tmp, "√ ");
else strcpy(tmp, " ");
sprintf(prompt, "%s%-*.*s", tmp, width - 5, width - 5,
sbox.bars[bar].items[itemno].item);
if (bar == sbox.curno) flag = (itemno == sbox.bars[bar].curno) ? 1 : 0;
else flag = 0;
}
h_winprompt(win, y, x, prompt, 0, flag);
}
void dispprompt(win, y, title)
WINDOW *win;
int y;
char *title;
{
char prompt[81];
sprintf(prompt, "%*s%s", (sbox.width - 4 - strlen(title)) / 2, "", title);
sprintf(prompt, "%-*s", sbox.width - 4, prompt);
h_winprompt(win, y, 2, prompt, 0, 0);
}
int dispsbox()
{
WINDOW *sbox_win;
char filename[128], *flagbak = NULL;
int ch, i, j, k;
int toggle, curbar, barbak, curitem, itembak;
sprintf(filename, "/tmp/.sbox.%d", getpid());
scr_dump(filename);
sbox_win = newwin(sbox.height, sbox.width, sbox.y, sbox.x);
wrefresh(sbox_win);
if (sbox.title[0]) {
// Box2(sbox_win, sbox.height, sbox.width);
dispprompt(sbox_win, 1, sbox.title);
// dispprompt(sbox_win, sbox.height - 2, "切换: Space 取消: ESC 确认: Enter");
}
k = 0;
for (i = 0; i < sbox.barnum; i++)
for (j = 0; j < sbox.bars[i].itemnum; j++) {
flagbak = (char *)realloc(flagbak, k + 1);
if (!flagbak) {
delwin(sbox_win);
scr_restore(filename);
unlink(filename);
return(-1);
}
flagbak[k++] = sbox.bars[i].items[j].flag;
if (j > sbox.height - 7) continue;
dispitem(sbox_win, i, j);
}
toggle = curbar = barbak = curitem = itembak = 0;
while (1) {
switch (ch = getkey(sbox_win)) {
case UP:
if (curitem == 0) {
beep();
continue;
} else
curitem--;
break;
case DOWN:
if (curitem == sbox.bars[curbar].itemnum - 1) {
beep();
continue;
} else
curitem++;
break;
case LEFT:
if (sbox.barnum == 1) {
beep();
continue;
}
if (curbar == 0) curbar = sbox.barnum - 1;
else curbar--;
break;
case RIGHT:
if (sbox.barnum == 1) {
beep();
continue;
}
curbar = (curbar + 1) % sbox.barnum;
break;
case SPACE:
toggle = 1;
break;
case ESCAPE:
k = 0;
for (i = 0; i < sbox.barnum; i++)
for (j = 0; j < sbox.bars[i].itemnum; j++)
sbox.bars[i].items[j].flag = flagbak[k++];
break;
case ENTER:
free((void *)flagbak);
break;
default:
beep();
continue;
break;
}
if ((ch == ESCAPE) || (ch == ENTER)) break;
if (toggle) {
sbox.bars[curbar].items[curitem].flag =
!sbox.bars[curbar].items[curitem].flag;
dispitem(sbox_win, curbar, curitem);
toggle = 0;
continue;
}
if (curbar != barbak) {
sbox.curno = curbar;
dispitem(sbox_win, barbak, curitem);
i = curitem - sbox.bars[barbak].begno + sbox.bars[curbar].begno;
if (i > sbox.bars[curbar].itemnum - 1)
i = sbox.bars[curbar].itemnum - 1;
sbox.bars[curbar].curno = i;
dispitem(sbox_win, curbar, i);
curitem = i;
barbak = curbar;
itembak = curitem;
continue;
}
sbox.bars[curbar].curno = curitem;
if ((curitem <= sbox.bars[curbar].begno + sbox.height - 7) &&
(sbox.bars[curbar].begno <= curitem)) {
dispitem(sbox_win, curbar, itembak);
dispitem(sbox_win, curbar, curitem);
itembak = curitem;
continue;
}
if (curitem < sbox.bars[curbar].begno)
sbox.bars[curbar].begno -= 1;
else
sbox.bars[curbar].begno += 1;
for (i = 0; i < sbox.height - 6; i++)
dispitem(sbox_win, curbar, sbox.bars[curbar].begno + i);
itembak = curitem;
}
delwin(sbox_win);
scr_restore(filename);
unlink(filename);
return((ch == ENTER) ? 0 : -1);
}
int freesbox()
{
int i, j;
for (i = 0; i < sbox.barnum; i++) {
for (j = 0; j < sbox.bars[i].itemnum; j++)
free((void *)sbox.bars[i].items[j].item);
free((void *)sbox.bars[i].items);
}
free((void *)sbox.bars);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -