Newt 中的按钮

Buttons in Newt

我需要一个简单的基于终端的 window/widget 库,在 Linux 中带有 C 或 C++ 接口。我找到了 newt,它似乎足以满足我的需求,但我只有一个问题无法解决并且 google 不是很有帮助:
如何确定按下了哪个按钮?下面是一个带有 2 个按钮的简单按钮示例 - "Ok" 和 "Cancel"。如何确定按下的是哪一个?

#include <newt.h>
#include <stdlib.h>

void main(void) {
    newtComponent form, b1, b2;
    newtInit();
    newtCls();

    newtOpenWindow(10, 5, 40, 6, "Button Sample");

    b1 = newtButton(10, 1, "Ok");
    b2 = newtCompactButton(22, 2, "Cancel");
    form = newtForm(NULL, NULL, 0);
    newtFormAddComponents(form, b1, b2, NULL);

    newtRunForm(form);

    newtFormDestroy(form);
    newtFinished();
}

更新:
收到反馈后,我尝试按照我的理解添加回调函数:

#include <newt.h>
#include <stdlib.h>

void b1Callback(newComponent co, void * data)
{
    *((int*)data) = 4;
}

void main(void) {
    void* data;
    *((int*)data) = 0;
    newtComponent form, b1, b2;
    newtInit();
    newtCls();

    newtOpenWindow(10, 5, 40, 6, "Button Sample");

    b1 = newtButton(10, 1, "Ok");
    b2 = newtCompactButton(22, 2, "Cancel");
    newtComponentAddCallback(b1, b1Callback, data);
    form = newtForm(NULL, NULL, 0);
    newtFormAddComponents(form, b1, b2, NULL);

    newtRunForm(form);

    newtFormDestroy(form);
    newtFinished();
}

你必须看一个解释回调的指南

typedef void (*newtCallback)(newtComponent, void *);

void newtComponentAddCallback(newtComponent co, newtCallback f, void * data);
void newtComponentTakesFocus(newtComponent co, int val);

回调示例

static void b1Callback(newtComponent co, void * data) 
{
// DO YOUR STUFF
}

然后在代码中添加:

newtComponentAddCallback(b1, b1Callback, NULL);

编辑:

更改您的回调:*((int*)data) = 4;

回调后InitVal将为4。

你必须先研究指针才能继续,我猜...

我的解决方案是:

  • 设置一个变量为newtComponent answer
  • 销毁表单后调用此函数answer = newtFormGetCurrent(form);
  • 并检查答案是否是我的 b1 按钮 if( answer == b1 )

您正在使用已弃用的函数 newtRunForm()。使用 newtFormRun()newtFormRun() 中的第二个参数是带有结果的结构,returns 您需要了解表单执行期间发生的一切。像这样使用它:

newtComponent form,b1,b2;
struct newtExitStruct exit_status;  
newtFormRun(form,&exit_status);                                                              
if (exit_status.reason==NEWT_EXIT_COMPONENT) {                                                                                                                                                     
    if (exit_status.u.co==b1) {  // ok button
        your code here
    }
    if (exit_status.u.co==b2) {  // cancel button
        your code here
    }
}

检查 form.c newt.cnewt.h 常量和更多详细信息的源文件。