Может ли GTK работать с библиотекой readline?
Возможно ли, чтобы графическая программа GTK также имела "интерфейс командной строки", подобный тем, которые предоставляются GNU readline, editline или linenoise?
Как бороться с блокировкой вызовов gtk_main() и блокированием шагов цикла из этих библиотек?
1 ответ
Определенно возможно интегрировать библиотеку, такую как GNU readline, с графической программой. Самый простой вариант - создать поток, предназначенный для readline, и общаться с потоком GUI, используя g_idle_add
(который является потокобезопасным).
Если вы не хотите использовать темы, вы можете использовать механизм GIO (g_io_channel_unix_new()
а также g_io_add_watch()
), чтобы дать команду главному циклу GTK уведомить вас об ожидающем вводе и вызвать readline, используя интерфейс altnernate, предназначенный для использования в качестве обратного вызова цикла событий. Поддержка readline в Python и PyGTK используют эти функции для включения следующего, все в одном потоке:
>>> import gtk
>>> w = gtk.Window()
>>> w.add(gtk.Label("foo"))
>>> w.show_all() # at this point, a window with label is shown
Другой вопрос, однако, заключается в том, хотите ли вы, чтобы ваша программа имела интерфейс командной строки, основанный на эмуляции терминала в 21-м веке. В GTK у вас есть средство многострочного редактирования, которое намного превышает readline(), оно называется GtkTextView
, Это довольно просто (и, я бы добавил, забавно) использовать его для создания средства, похожего на командную строку, которое не имеет проблем с копированием-вставкой, многострочным редактированием, Unicode, цветами, пропорциональными шрифтами, встроенными изображениями или с работой. на Windows - и который не полагается на тайные коды терминала для загрузки.