General Graphics Interface (GGI) — проект, целью которого была разработка надежной, стабильной и быстрой компьютерной графической системы, работающей везде. [1] Целью было позволить любой программе, использующей GGI, работать на любой поддерживаемой ею вычислительной платформе , требуя в лучшем случае перекомпиляции . GGI — это бесплатное программное обеспечение с открытым исходным кодом , подпадающее под требования лицензии MIT .
Проект GGI и связанные с ним проекты, такие как KGI, общепризнанно считаются мертвыми. [2]
Первоначально проект был начат для того, чтобы сделать переключение между виртуальными консолями , svgalib и подсистемами сервера отображения X на Linux более надежным. Цели были следующими:
Фреймворк GGI реализован набором переносимых библиотек пользовательского пространства с массивом различных бэкэндов или целей (например, Linux framebuffer , X11 , Quartz , DirectX ), из которых два наиболее фундаментальных — LibGII (для обработки ввода) и LibGGI (для графического вывода). Все остальные пакеты добавляют функции к этим основным библиотекам и поэтому зависят от одной или обеих из них.
Некоторые цели общаются с другими целями. Они называются псевдоцелями. Псевдоцели могут быть объединены и работать как конвейер.
Один пример: display-palemu, например, эмулирует режим палитры в режимах truecolor. Это позволяет пользователям запускать приложения в режиме палитры даже на машинах, где в противном случае режим палитры был бы недоступен. display-tile разбивает большой виртуальный дисплей на множество более мелких частей. Вы можете распределить их по нескольким мониторам или даже пересылать по сети.
Андреас Бек и Штеффен Сигер основали проект GGI в 1994 году после нескольких экспериментальных предшественников, которые назывались «scrdrv». [3]
Разработка scrdrv была мотивирована проблемами, вызванными сосуществующими, но не очень хорошо взаимодействующими графическими средами (в основном X и SVGAlib ) в операционной системе Linux в то время, что часто приводило к зависаниям, требующим перезагрузки. Первый дизайн scrdrv был в значительной степени основан на графической подсистеме расширителя DJ DOS и некоторых концепциях из проекта SANE . Основная проблема, которую решил scrdrv, заключалась в том, что он предоставлял драйвер режима ядра, который знал достаточно о видеооборудовании для настройки режимов, что позволяло перейти в нормальное состояние даже из испорченного или аварийно завершившегося графического приложения.
Первая официальная версия появилась в 1995 году. Около 1996 года GGI 1.0 был выпущен под лицензией LGPL. GGI состоял только из основной библиотеки libggi . Она включала обработку ввода, набор 2D-графических примитивов и некоторые драйверы пользовательского пространства для графических плат вместе с патчем ядра Linux с пользовательским интерфейсом для драйверов. Патч был известен как KGI, Kernel Graphics Interface.
В 1997 году GGI полностью переработали. Множество новых идей и решение Linux сделали GGI тем, чем он стал в GGI 2.0, выпущенном в августе 2001 года под релизом MIT.
В 1998 году в почтовой рассылке ядра Linux разгорелась большая война по поводу включения KGI в ядро. Линус Торвальдс объяснил свои опасения [4] по поводу GGI, заявив: «Я думаю, что X достаточно хорош» и выразив обеспокоенность по поводу общего направления GGI.
В это время еще одна идея дизайна под названием EvStack также внесла свой вклад в флейм. EvStack был практически полной переработкой подсистемы ввода и вывода, которая позволяла событиям (отсюда и «Ev») проходить через «стек» модулей, которые можно настроить для управления ими. EvStack — очень мощная концепция, позволяющая, например, иметь две клавиатуры, подключенные к одной машине, одна из которых будет работать как текстовая консоль на одном графическом адаптере, а другая — как графическая консоль на другом (как было продемонстрировано на Linux-Kongreß ´97 [5] ), и даже позволяет иметь разные раскладки клавиатуры на разных виртуальных консолях или подключать клавиатуры по сети. Однако это стоило огромного патча к подсистеме ввода, что казалось неприемлемым. Современная система событий ввода Linux позволяет программам (например, Xorg) получать события клавиатуры не через консольную клавиатуру, что позволяет работать в многопользовательском режиме .
На LinuxExpo 98 был прочитан ряд докладов о GGI, KGI и EvStack.
Для GGI 2.0 KGI был отделен и стал отдельным проектом под названием The KGI Project . GGI 2.0 состоял из набора библиотек. Во время бета-фазы 2.0 в конце 1998 года лицензия библиотек была изменена с LGPL на лицензию в стиле MIT. Много работы было также проделано над системой сборки для поддержки большего количества операционных систем. Она работала на FreeBSD, там был код для OpenBSD, NetBSD и даже Microsoft Windows , а также некоторая поддержка большего количества аппаратных платформ.
Обработка ввода была перемещена в библиотеку libgii. Общий код GGI находился в libgg, подбиблиотеке внутри libgii. Основная графическая библиотека libggi имеет облегченный набор графических примитивов, который был достаточно распространен для написания любого графического приложения, в то время как API более высокого уровня перешел в другие библиотеки поверх libggi. Они назывались расширениями GGI. libggi поддерживает набор целей, большинство из которых были специфичны для Linux: fbdev, X, aa, vcsa, terminfo и некоторые псевдоцели, такие как tile, multi, palemu и trueemu. Расширения GGI имели API более высокого уровня. libggiwmh предоставляет функциональность только для оконных целей, в то время это был только X. libggimisc предоставлял некоторые базовые вещи, такие как vga splitline.
GGI 2.0.2 был выпущен в декабре 2002 года. Наиболее заметным изменением для пользователя стал полностью переработанный бэкенд X. Другим заметным изменением стало значительное улучшение документации. И последнее, но не менее важное: изменились циклы выпуска. Начиная с этого выпуска, существовало дерево разработки и стабильное дерево. Стабильное дерево открыто только для исправлений ошибок, дерево разработки получило название, следуя схеме BSD, -current.
В ноябре 2004 года последнее исправление ошибок из стабильной версии GGI 2.0.x было выпущено в пользу новой стабильной версии GGI 2.1.x.
GGI 2.1.x работает на многих операционных системах: GNU Hurd , Linux , *BSD , System V , Mac OS X и Microsoft Windows. Добавлена поддержка большего количества аппаратных платформ. NetBSD даже создала бинарный пакет для NetBSD/Vax! Добавлена новая библиотека GGI поверх libgii под названием libgiigic. Она позволяет комбинировать действия пользователя с событиями во время выполнения.
GGI 2.2 был выпущен в декабре 2005 года. Автоматическое определение цели было переработано и больше не было ориентировано на Linux. GGI заменил собственные целочисленные типы данных на типы ANSI C99 для большей переносимости. Была добавлена цель для Quartz. Пользователи Mac OS X больше не зависят от X11, но по-прежнему могут использовать бэкэнд X11. Однако наиболее заметным для пользователей изменением стала поддержка статически связанных целей.
Последняя версия — GGI 2.2.2, исправление ошибок в стабильной серии GGI 2.2.x. Она была выпущена в январе 2007 года.
Исходные порты шутеров от первого лица Doom , Heretic , Quake и Descent были перенесены на использование GGI, [6] [7] с Linux Doom Editor, также основанным на нем. [8] Он также поддерживался аркадной игрой Heroes , [9] игрой - змейкой , и Thrust , вдохновленной игрой Thrust для Commodore 64 , [10] а также платформенными играми U.RBAN The Cyborg Project [11] и Dave Gnukem , [12] вдохновленной оригинальной Duke Nukem для MS-DOS . GGI также был доступен в качестве видеодрайвера в Simple DirectMedia Layer до версии 2x. [13]
Проект GGI двигался вперед к выпуску GGI 3.0. [ когда? ] libgii был переработан. Обработка ввода была заменена моделью событий реактора , которая более гибка, чем использование select() для файлового дескриптора . Это также упростило драйверы ввода в целом, особенно для тех, кто не использует файловые дескрипторы, такие как input-quartz. libgg был вынесен в отдельную библиотеку.
libggi объединила некоторые цели в одну подбиблиотеку: multi с tile и mono text с palemu. libggi также получила новую цель VNC , которая позволяет запускать любое приложение как VNC-сервер.
В GGI 3.0 механизм расширения был переработан с нуля, чтобы упростить взаимодействие между расширениями и основными библиотеками. Это потребовало небольшого изменения API.