Is it possible for a graphical GTK program, to also have a "command line interface" like those provided by GNU readline, editline or linenoise?
How to deal with blocking gtk_main() calls, and blocking loop steps from those libraries?
Is it possible for a graphical GTK program, to also have a "command line interface" like those provided by GNU readline, editline or linenoise?
How to deal with blocking gtk_main() calls, and blocking loop steps from those libraries?
It is definitely possible to integrate a library such as GNU readline with a graphical program. The simplest option is to spawn a thread dedicated for readline, and communicate with the GUI thread using
g_idle_add
(which is thread-safe).If you don't want to use threads, you can use the GIO machinery (
g_io_channel_unix_new()
andg_io_add_watch()
) to instruct the GTK main loop notify you of pending input, and invoke readline using the altnernate interface designed for use as event loop callback. Python's readline support and PyGTK make use of these features to enable the following, all in one thread:A different question, however, is whether you want your program to sport a command-line interface based on terminal emulation in the 21st century. In GTK you have a multiline editing facility that far exceeds readline(), it's called a
GtkTextView
. It is quite straightforward (and, I might add, fun) to use it to build a command-line-like facility which has no problems with copy-paste, multiline editing, Unicode, colors, proportional fonts, embedded images, or with working on Windows — and which doesn't rely on arcane terminal codes to boot.