我正在寻找一个GUI工具包,我可以在普通的C中使用,至少在Linux上工作并且不会强迫我使用它自己的eventloop - 我想使用libev作为主循环并让它通知当X事件进入左右时,工具包库。
我还没有找到类似的东西 - 我真的需要修补工具包库以获得我想要的东西吗?
答案 0 :(得分:4)
不幸的是,这种需求可能会严重限制您可以选择的GUI工具包,因为在这方面(在许多其他方面)它们都非常如此糟糕。我不知道这是否公平作为答案,但我想向您提出一个不同的解决方案:让GUI工具包运行它想要在自己的线程或进程中运行的任何事件循环。由于GUI库非常糟糕(在没有警告的情况下崩溃或退出),“自己的进程”版本可能实际上是最好的想法 - 您可以通过管道与UI进行通信,并按照您想要的方式滚动您自己的事件循环主要过程。线程当然有它们自己的好处:不需要序列化与GUI共享的数据,也不需要担心用户杀死主程序而不杀死GUI的情况,反之亦然(因为线程不能单独杀死)。 / p>
答案 1 :(得分:1)
https://github.com/Immediate-Mode-UI/Nuklear
Nuklear是一个GUI工具箱,它仅创建小部件,按钮,标签和类似内容,而不单独使用渲染后端。您必须为其提供渲染后端。 您可以使用Xlib / X11进行渲染。 Xlib不需要主循环。您可以执行以下操作:
Nuklear有一个示例头文件,该文件提供了组合Nuklear和Xlib所需的功能,可以帮助您进行第4步和第6步: https://github.com/Immediate-Mode-UI/Nuklear/blob/master/demo/x11/nuklear_xlib.h
Nuklear具有此功能和缺点:
答案 2 :(得分:0)
我还没有尝试过,但GTK +至少有gtk_main_iteration_do()
功能,它会消耗一个事件。该事件虽然是GDK事件(不是原始X11事件),但可能不是您想要的。
另一方面,GTK也有some functions for working with the events所以也许你可以把东西粘在一起。我对libev不太熟悉,所以我不确定。
答案 3 :(得分:0)
所有工具包都支持这种操作模式。
您需要在自己的事件引擎中观看X服务器连接套接字。数据可用后,您可以(以伪代码形式)
while (PendingEvent())
ProcessEvent()
每个工具包都有自己的ProcessEvent()版本,也许也有PendingEvent()(但你可以随时使用XPending(Display*)
)。即,
gtk_events_pending()
和gtk_main_iteration()
XtAppPending()
和XtDispatchEvent()
wxApp::.Pending()
和wxApp::Dispatch()
QApplication::processEvents()
,你也可以实现自己的QAbstractEventDispatcher
和/或QEventLoop
类没有那么多积极开发的C工具包,我认为Gtk +是唯一合理的选择。
编辑至少使用GTK,此技术不适用于工具包添加的超时,即闪烁光标不会闪烁,除非有其他工具包事件需要处理。定期调用gtk_main_iteration_do(FALSE)
即使没有事件等待“修复”这一点,但在不同的线程中执行工具包循环会更加健壮。