GTK-сервер
Оригинальный автор(ы) | Петер ван Эртен |
---|---|
Разработчик(и) | Петер ван Эртен |
Первоначальный выпуск | 2003 год |
Стабильная версия | 2.4.6
/ 11 октября 2022 г |
Операционная система | Кросс-платформенный |
Лицензия | Стандартная общественная лицензия GNU |
Веб-сайт | www |
Проект GTK-сервера направлен на то, чтобы перенести программирование графического пользовательского интерфейса (GUI) на любой интерпретируемый язык с помощью GNU Image Manipulation Program ( GIMP ), ToolKit ( GTK ) или XForms . Он выпускает бесплатное программное обеспечение с открытым исходным кодом под лицензией GNU General Public License .
Философия
[ редактировать ]GTK-сервер предоставляет поточно -ориентированный интерфейс для GTK . Если GTK-сервер скомпилирован как самостоятельная двоичная программа , он допускает пять различных интерфейсов: стандартный ввод (stdin), «первым вошел — первым вышел » (FIFO) ( именованный канал ), межпроцессное взаимодействие (IPC) ( очередь сообщений ), Протокол управления передачей (TCP) или протокол пользовательских датаграмм (UDP). Любой интерпретируемый язык или сценарий оболочки с возможностями ввода/вывода (I/O) может запустить GTK-сервер с аргументом, определяющим тип интерфейса, и может начать отправку функций вызовов S-выражения GTK в формате . После каждого запроса GTK-сервер возвращает результат, в зависимости от типа вызванной функции GTK.
Если GTK-сервер скомпилирован как общий объект , он экспортирует функцию «gtk», которую сначала необходимо импортировать в клиентскую программу. После этого клиентская программа может начать отправлять вызовы функций GTK в формате S-выражения в качестве аргумента импортированной функции gtk.
Прежде чем GTK-сервер сможет выполнять функции GTK, он должен прочитать файл конфигурации , в котором описаны прототипы функций GTK. Начиная с версии 2.2.3 это также можно делать «на лету», позволяя GTK-серверу работать без файла конфигурации.
Выполнение
[ редактировать ]Реализация GTK-сервера приводит к следующим соображениям.
- Доступ к внешним функциям возможен только в том случае, если библиотеки, к которым осуществляется доступ , созданы с использованием необъектно программирования, -ориентированного языка такого как C или Pascal . библиотеки, созданные на C++ Например, , используют преобразование имен для унификации перегруженных функций . Это означает, что имя функции в библиотеке C++ не может быть известно после компиляции общей библиотеки. Следовательно, функции в такой библиотеке недоступны. Следовательно, такие библиотеки, как wxWidgets , набор инструментов Qt , Fast Light Toolkit ( FLTK ), которые запрограммированы на C++, не могут быть доступны с помощью концепции GTK-сервера. [ 1 ]
- Библиотека GTK была реализована на языке программирования C. Поскольку C является строго типизированным языком программирования , интерпретируемой программе необходимо знать тип данных аргументов и тип возвращаемого значения для каждой функции GTK во время выполнения . Они могут быть определены «на лету» или в файле конфигурации, который анализируется GTK-сервером во время запуска. Однако GTK-серверу не известны функции, которые будут использоваться интерпретируемой клиентской программой, поэтому для GTK-сервера все аргументы и возвращаемые значения для каждой функции GTK являются типами переменных.
Это приводит к проблемам реализации, поскольку функции GTK и соответствующие аргументы и возвращаемые значения не могут быть жестко запрограммированы в двоичном файле GTK-сервера.
Способ решения этой проблемы — использование интерфейса внешней функции . В настоящее время GTK-сервер поддерживает четыре интерфейса внешних внешних функций: libffi , FFCALL, [ 2 ] С/Вызов [ 3 ] и Динколл. [ 4 ] Одна из этих библиотек должна быть доступна в целевой системе для успешной компиляции GTK-сервера.
Пример
[ редактировать ]Следующий скрипт KornShell запускает GTK-сервер в режиме stdin и создает простое окно с кнопкой выхода:
#!/bin/ksh
# Start GTK-server
gtk-server -stdin |&
# Communicate with GTK-server and assign function
function gtk { print -p $1; read -p GTK; }
function define { $2 "$3"; eval $1="$GTK"; }
# Setup GUI
gtk "gtk_init NULL NULL"
define WINDOW gtk "gtk_window_new 0"
gtk "gtk_window_set_title $WINDOW 'Korn GTK-server demo'"
gtk "gtk_window_set_default_size $WINDOW 400 200"
define TABLE gtk "gtk_table_new 10 10 1"
gtk "gtk_container_add $WINDOW $TABLE"
define BUTTON gtk "gtk_button_new_with_label 'Click to Quit'"
gtk "gtk_table_attach_defaults $TABLE $BUTTON 5 9 5 9"
gtk "gtk_widget_show_all $WINDOW"
# Mainloop
until [[ $EVENT = $BUTTON || $EVENT = $WINDOW ]]
do
define EVENT gtk "gtk_server_callback wait"
done
# Exit GTK-server
gtk "gtk_server_exit"
Преимущества и ограничения
[ редактировать ]Хотя GTK предназначался для использования с языком программирования C , теперь можно использовать GTK из любого интерпретируемого языка без изменения реализации интерпретатора. Также доступны GTK 1.x, GTK2.x и GTK 3.x. При желании можно использовать любую другую общую библиотеку, например библиотеки, связанные с OpenGL , Poppler , Mozilla , а также libc , sqlite и музыкальную библиотеку, например MikMod .
При использовании GTK-сервера в качестве автономного двоичного файла неизбежно создается дополнительный процесс в списке процессов. Кроме того, клиентская программа не может получить доступ к функциям GTK, определенным как макрос.
Ссылки
[ редактировать ]- ^ Изоттон, Аарон (16 марта 2006 г.), «C++ dlopen mini HOWTO» , Проект документации Linux , заархивировано из оригинала 12 августа 2021 г. , получено 7 сентября 2021 г.
- ^ Библиотеки FFCALL , заархивировано из оригинала 1 июля 2021 г. , получено 7 сентября 2021 г.
- ^ C/Invoke , заархивировано из оригинала 20 августа 2021 г. , получено 7 сентября 2021 г.
- ^ dyncall.org - динамический вызов функций C , заархивировано из оригинала 16 апреля 2021 г. , получено 7 сентября 2021 г.