这个仓库的名字其实是不太合适的,因为这个仓库本来是储存我编写C语言程序时用于方便 地引用一些头文件与使用一些所有程序都能用的功能。
注:该库中的程序均只能在Linux环境下运行
要使用本仓库的工具仅需要在程序内引用 include
目录下的 tools.h
文件,并且在编
译程序时传入编译器该仓库下的所有 *.c
文件以及链接ncurses库即可,抑或者可以将该
仓库中的内容编译为静态库或者动态库文件再编译,这里提供一些参考命令:
# 编译为静态库文件 libtools.a
gcc -c `find ./src -name "*.c"`
ar -rv libtools.a *.o
rm *.o
注意!本README文件内容可能会跟不上代码翻新的速度,具体功能请以实际代码为准
附注:大多数功能需要使用 ctools_init
函数返回的值为接口使用,例如:
_getch()
不回显的输入函数,可供实现 等待用户输入,输入后无需回车确认 让程序继续并且不显示输入的字符 的功能(返回整数值作为字符值)(即输入不回显, 无行缓冲)。kbhit()
可以判断当且是否有输入(返回整数值,1有,0无)。kbhitGetchar()
基于kbhit
函数的基础上加上一些修改能够顺便获取输入的 字符,且无需等待输入,不会阻止程序的继续运行。
该功能能够在Linux环境下实现屏幕大小对齐(过小的终端不可用)。提供可视化选择。并 且可以为选项添加描述,充当半个帮助。选项、描述采用滚动设计,若光标移动到了显示上 限但还有选项时会让选项上滚,描述也同理,都是可以翻动的,并且描述还使用了白底黑字 做显示颜色(可能有的终端会显示成黑底黑色),选中项则做反色处理
在使用菜单时需要定义一个 cmenu
型的变量并调用 cmenu_create
函数为变量初始化。
以下是对各个函数的说明:
ctools_ncurses_init()
初始化ncursescmenu_create()
初始化数据指针cmenu_set_title()
设置界面标题cmenu_set_type
设置菜单类型,可选项如下: Key: “normal”, “main_only”, “help”, “setting”, “help_only”normal
正常模式main_only
仅打印菜单框架(样式)help
帮助模式,大半白底黑字setting
设置模式,在正常模式基础上增加变量的显示和设置功能help_only
仅打印帮助模式下的菜单框架
cmenu_set_type()
设置菜单的类型,类型列表:normal
默认main_only
仅显示主界面help
帮助模式setting
设置模式help_only
仅显示帮助界面,无输入处理
cmenu_add_text()
添加菜单选项,其选项解释如下:id
菜单项应被插入的位置(插入后),若值为0则插入在最后,若值大于列表长度 则也插入在最后text
菜单项显示的文字describe
菜单项对应的描述信息func
选择菜单项后执行的函数var
在setting
类型菜单中显示、更改的变量指针type
在setting
类型菜单中菜单项的类型,可选值如下:number
设置类型为数字的参数(可选参数部分)button
设置类型为按钮/开关
foot
在setting
number
设定下变量变化的步长max
在setting
number
设定下变量变化的上限,与下限相等时采用默认值mix
在setting
number
设定下变量变化的下限,与上限相等时采用默认值
cmenu_set_text()
添加菜单选项,其选项解释如下:id
同上tag
指定要更改的变量,可选值具体含义参上。所有可选值如下 Key: “text”, “describe”, “func”, “var”, “type”, “foot”, “max”, “min”value
赋值内容
cmenu_show()
显示菜单程序,返回经过处理的输入- 输入与返回值对照
- 数字 => int型数字
- 空格/回车 => 对应选项的序号
- 部分字符 => int型字符ASCII
q
/ESC
=> 0
- 输入与返回值对照
参考使用代码:
#include "/path/to/file/tools.h" //引用头文件
int var = 0;
static void func()
{
endwin();
printf("Exit safety\nThe var is:%d\n", var);
exit(0);
}
int main()
{
cmenu menu = cmenu_create();
cmenu_set_title(menu, "This is title");
cmenu_add_text(menu, 0, "text", "describe", func, &var, "number", 0, 0, 0);
cmenu_add_text(menu, 0, "Second", "describe 2", NULL, NULL, NULL, 0, 0, 0);
cmenu_add_text(menu, 0, "Third", NULL, NULL, NULL, NULL, 0, 0, 0);
cmenu_add_text(menu, 0, "Fourth", NULL, NULL, NULL, NULL, 0, 0, 0);
cmenu_add_text(menu, 2, "Should be 2nd", "describe 2", NULL, NULL, NULL, 0, 0, 0);
cmenu_add_text(menu, 3, "setting", "setting or normal?", NULL, NULL, NULL, 0, 0, 0);
cmenu_add_text(menu, 4, "normal", "normal!", NULL, NULL, NULL, 0, 0, 0);
ctools_ncurses_init();
while(1) {
int in = cmenu_show(menu);
if (in == 3) cmenu_set_type(menu, "setting");
else if (in == 4) cmenu_set_type(menu, "normal");
}
endwin();
return 0;
}
移动按键支持三套:
- WASD
- hjkl(Vim的键位)
- 直接使用方向键
使用 Tab
键在选项与描述间跳转
使用空格或者回车确认选项或者输入对应的数字
使用 Esc
, q
, 0
键可以退出菜单(会返回整型的0)
在设置页中,光标在数值型选项上时使用 +=或 ==
增加或使用 -
减少指定的 foot
变量值(默认为1)。在开关型选项上使用空格或者回车控制选项的状态为开或者关
在默认界面中,按下非操作键外的字符按键会返回字符,其他的均只返回数字(主要是防范 出现了非单数的编号的内容选项导致选择不了)
懒了,不想写了,自己看 include/tools.h
最后面的部分内容