Может ли 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 - и который не полагается на тайные коды терминала для загрузки.

Другие вопросы по тегам