Что такое собственный графический интерфейс API для Linux?

441

Надеюсь, это не глупый вопрос, но я всегда удивляюсь этому. И Windows (API Win32), и OS X (Какао) имеют свои собственные API для обработки окон, событий и других вещей ОС. Я никогда не получал четкого ответа о том, каков эквивалент Linux.

Я слышал, что некоторые люди говорят GTK +, но GTK +, будучи кроссплатформенным, как это может быть нативным?

DavidColson
источник
46
Джони прав: «В Linux графический интерфейс пользователя не является частью операционной системы ... X Window System определяет сетевой протокол для [возможностей GUI]. Библиотеки инструментария, такие как Gtk + (используется Gnome) и QT (используется KDE), построенный поверх Xlib. "
paulsm4
33
наоборот, Дэвид, это отличный запрос
амфибия
7
Я согласен - я прочитал «API программирования Linux» и «Системное программирование ... Unix», которые являются двумя библиями в ядре и API, и этот вопрос мне никогда не приходил :) Ответы интересны.
Джон Хамфри - w00te
10
Win32 API также является кроссплатформенным, если вы включите Wine ..
Брендан Лонг,
2
Кстати, в Windows есть подсистемы WIN32 / WIN64, которые, в частности, реализуют то же самое для «Windows Look and Feel - aka WIN32». Эти подсистемы работают над ядром NT. API для них разные. Например, C: это абстракция WIN32, а не ядро ​​NT. То же самое для некоторых оконных функций. В Windows также были доступны подсистемы Unix (которые в некоторой степени поддерживают X11).
Прит Сангха

Ответы:

603

В Linux графический интерфейс пользователя не является частью операционной системы. Графический интерфейс пользователя, встречающийся на большинстве настольных систем Linux, предоставляется программным обеспечением, называемым X Window System , которое определяет независимый от устройства способ работы с экранами, клавиатурами и указательными устройствами.

X Window определяет сетевой протокол для связи, и любая программа, которая знает, как «говорить» по этому протоколу, может использовать его. Существует библиотека C под названием Xlib, которая упрощает использование этого протокола, поэтому Xlib является своего рода в родной GUI API. Xlib - не единственный способ получить доступ к серверу X Window; также есть XCB .

Библиотеки инструментария, такие как GTK + (используется GNOME ) и Qt (используется KDE ), построенные поверх Xlib, используются потому, что с ними проще программировать. Например, они обеспечивают единообразный внешний вид приложений, упрощают использование перетаскивания, предоставляют компоненты, стандартные для современной среды рабочего стола, и т. Д.

То, как X рисует на экране, зависит от реализации. X.org имеет независимую от устройства часть и зависимую от устройства часть. Первый управляет ресурсами экрана, такими как windows, а второй связывается с драйвером графической карты, обычно с модулем ядра. Связь может происходить через прямой доступ к памяти или через системные вызовы ядра. Драйвер переводит команды в форму, понятную аппаратному обеспечению на карте.

С 2013 года новая оконная система под названием Wayland начинает становиться пригодной для использования, и во многих дистрибутивах говорят, что в какой-то момент она перейдет на нее, хотя четкого графика пока нет. Эта система основана на OpenGL / ES API, что означает, что в будущем OpenGL будет «родным GUI API» в Linux. Ведется работа по переносу GTK + и QT на Wayland, поэтому современные популярные приложения и настольные системы потребуют минимальных изменений. Приложения, которые нельзя перенести, будут поддерживаться через сервер X11, так же как OS X поддерживает приложения X11 через Xquartz. Ожидается, что порт GTK + будет завершен в течение года , а Qt 5 уже имеет полную поддержку Wayland.

Чтобы еще больше усложнить ситуацию, Ubuntu объявила, что разрабатывает новую систему под названием Mir из-за проблем, которые они испытывают с Wayland. Эта оконная система также основана на API OpenGL / ES.

Joni
источник
95
+1. С каких это пор операционная система должна иметь графический интерфейс, подразумевая, что если нет, то это не ОС? Бред какой то.
Дэвид Хаммен
42
Даже Windows изначально была просто программой, которая работала поверх DOS.
апреля
2
+1 @DavidHammen Я не уверен, было ли это направлено на меня или нет, но вы на 100% правы. Моя терминология была не совсем точной. Я должен был сказать, что это не полноценная операционная система в том смысле, в каком вы обычно думаете об ОС со всеми дополнительными компонентами, облегчающими ее использование, а скорее конгломерат компонентов разных производителей и т. Д.
Крис Томпсон
3
@ChrisThompson - хм ... может быть, я слишком стар, но я никогда не думал о графическом интерфейсе как основной части операционной системы. И я никогда не думал, что ОС без графического интерфейса - это просто «совокупность компонентов разных производителей и т. Д.» Но, может быть, все пошло дальше, так как я сформировал свое мнение о том, что представляет собой ОС :)
Джордж Хокинс
2
Если ответ не является вики сообщества, я не буду менять контент, кроме улучшения грамматики / форматирования или добавления ссылок. Если контент должен быть исправлен или обновлен, это ответственность человека, чья репутация связана с контентом. Однако я сделаю им одолжение комментирования, чтобы они осознали, что я думаю, что что- то нужно исправить или обновить.
Честный Эйб
84

Linux - это ядро, а не полноценная операционная система. Существуют разные оконные системы и графические интерфейсы, которые работают поверх Linux для обеспечения оконного управления. Обычно X11 - это оконная система, используемая дистрибутивами Linux.

Крис Томпсон
источник
6
Они построены поверх этого. X11 - это сервер, в то время как KDE, Gnome и т. Д. - это менеджеры рабочего стола, которые предоставляют API более высокого уровня, общие макеты окон и т. Д.
Mark
7
X11 - это настоящий низкоуровневый слой, который обрабатывает все эти вещи и обрабатывает рисование на экране и т. Д. (И связывается с графическими драйверами). Затем Gnome / KDE контролируют X11. Это об этом на высоком уровне и игнорируя миллиард и одну деталь.
slugonamission
3
Спасибо. еще один вопрос: википедия объясняет, что X11 «создает уровень абстрагирования оборудования, где программное обеспечение написано для использования обобщенного набора команд, что позволяет обеспечить независимость устройства и повторное использование программ на любом компьютере, который реализует X». у меня вопрос: почему X11 обеспечивает аппаратное взаимодействие (HAL), если ядро ​​Linux обеспечивает это, а X11 работает поверх ядра? Другими словами, почему X11 обращается к аппаратным устройствам, когда ядро ​​должно быть его прокси?
амфибия
1
Я думаю, что в данном случае HALэто неправильно используемый термин. На самом деле они говорят, что X11 предоставляет независимые от системы средства для отображения окон. Существуют версии X11 для Darwin (Mac OS - это на самом деле сложнее с Mountain Lion ...), MS Windows и Linux.
Крис Томпсон
4
X11 - это сетевой протокол. Абстракция включает в себя написание программ на платформе A, которые могут отображать клиенты X11 (окна, приложения и т. Д.) На платформе B через некоторое сетевое оборудование. Ваше приложение может работать локально, удаленно, на вложенном сервере, на виртуальном сервере, который выполняет только VNC и т. Д. Аппаратная абстракция (на локальной платформе) является побочным эффектом этой функции, но она также стирает грань между X11 и ядро (что делает аппаратную абстракцию в средней системе Unix).
Алексиос
59

Стоит также упомянуть Wayland, так как его называют «будущим убийцей X11».

Также обратите внимание, что Android и некоторые другие мобильные операционные системы не включают X11, хотя они имеют ядро ​​Linux, поэтому в этом смысле X11 не является родным для всех систем Linux.

Кроссплатформенность не имеет ничего общего с тем, чтобы быть нативным. Какао также было портировано на другие платформы через GNUStep, но все еще является родным для OS X / macOS.

никто
источник
2
Диаграмма архитектуры высокого уровня для Wayland такая же, как и для X, за исключением того, что «Compositor» и «Server» на диаграмме X объединены в диаграмме Wayland. Чего не хватает, так это правдоподобного объяснения, почему эта интеграция не может быть реализована в X.
Kaz
1
ну, я бы сказал, что изменить базовый дизайн кодовой базы старше 20 лет нелегко. Также обратите внимание, что другая проблема с X11 заключается в том, что большая часть его функций, таких как рендеринг шрифтов, сегодня не используется. Кроме того, X11 все еще будет необходим в серверах и суперкомпьютерах, прозрачность сети слишком хороша, чтобы от нее отказываться.
нет
3
@gokcehan wayland не пропускает прозрачность сети, это миф. Это не реализовано еще , так же , как и многие другие вещи в Wayland. wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/… и т. д.
whitequark
8
+! за упоминание об отсутствии в Android X11. Android является, пожалуй, наиболее убедительным контрпримером к аргументу, что «x11 - это родной графический интерфейс Linux». Демонстрация того, что Linux может иметь x11 или Android, поскольку это «родной» графический интерфейс, показывает новичкам, что Linux на самом деле является просто ядром и не всегда имеет графический интерфейс.
Тревор Бойд Смит
«Быть ​​кроссплатформенным не имеет ничего общего с тем, чтобы быть нативным» - превосходное замечание. Я очень часто использовал этот шаблон за годы кроссплатформенного переноса. В частности, в 90-х я продал фреймворк, который позволял вам кросс-компилировать код, написанный для фреймворка Metrowerks PowerPlant с использованием MFC. (Прежде, чем кто-то рассмеется, когда вы окажетесь ниже макросов, MFC вполне разумен.) У меня также было несколько заданий на портирование, где либо Win32, либо Mac Toolbox API были спецификацией, против которой мы скомпилировали, переопределенной по мере необходимости на других платформах. ,
Энди Дент
23

Строго говоря, API Linux состоит из его системных вызовов . Это все функции ядра, которые могут вызываться программой пользовательского режима (не ядра). Это интерфейс очень низкого уровня, который позволяет программам делать такие вещи, как открывать и читать файлы. См. Http://en.wikipedia.org/wiki/System_call для общего ознакомления.

Настоящая система Linux также будет иметь целый «стек» другого программного обеспечения, работающего на ней, чтобы обеспечить графический интерфейс пользователя и другие функции. Каждый элемент этого стека будет предлагать свой собственный API.

nibot
источник
3
Этот ответ был написан, когда вопрос был "Что такое родной API Linux?" (с тех пор «GUI» был вставлен в вопрос).
nibot
Это все еще правильный ответ на непоследовательный вопрос, потому что ни одна из систем, работающих на Linux, включая GNU и X11, не является «родной» в каком-либо значимом смысле.
Джим Балтер
20

Чтобы помочь в том, что уже было упомянуто, в этом блоге очень хороший обзор графического стека Linux: http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

Это объясняет X11 / Wayland и т. Д. И как все это сочетается. В дополнение к тому, что уже было упомянуто, я думаю, что стоит добавить немного о следующих API, которые вы можете использовать для графики в Linux:

Mesa - «Mesa - это много вещей, но одной из основных вещей, которые она обеспечивает, является самой известной ее реализация OpenGL. Это реализация OpenGL API с открытым исходным кодом».

Cairo - «cairo - это библиотека для рисования, используемая приложениями, такими как Firefox, напрямую или через библиотеки, такие как GTK +, для рисования векторных фигур».

DRM (Direct Rendering Manager) - я понимаю это меньше всего, но в основном это драйверы ядра, которые позволяют записывать графику непосредственно в кадровый буфер, не проходя через X

Matt
источник
habrahabr.ru/post/148954 - перевод этого поста, если кому-то нужно
Борис Бурков
9

Я полагаю, что вопрос больше похож на «Что такое родной интерфейс Linux API».

В большинстве случаев X (иначе X11) будет использоваться для этого: http://en.wikipedia.org/wiki/X_Window_System .

Вы можете найти документацию по API здесь

отметка
источник
5

XWindows, вероятно, ближе всего к тому, что можно назвать «нативным» :)

Сергей Сироткин
источник
3
это то же самое, что и x11?
Дэвид Колсон
1
Но если вы используете его напрямую, вы увидите, что это не совсем API-интерфейс GUI ... Linux просто не имеет 1 собственного API-интерфейса GUI. Но почти все эти API-интерфейсы GUI (по крайней мере, те, которые сегодня широко распространены в Linux для настольных компьютеров) работают поверх X. Если вы начнете писать приложение с использованием простого старого X сегодня, оно будет выглядеть совершенно неуместным в любом современном дистрибутиве, поэтому я бы хотел скажем, собственный GUI зависит от дистрибутива - gtk / gnome для Ubuntu, kde для других.
Аксель
1

Ближе всего к Win32 в Linux будет libc, так как вы упоминаете не только пользовательский интерфейс, но и другие события и прочее.

Мидхат
источник
5
libc (стандартная библиотека C) - это интерфейс к системным вызовам ОС. Это последнее (системные вызовы ОС) в Linux, что примерно переводится как Win32 в Windows. Вы не можете реально (или вообще?) Программировать для текущих версий Windows без какого-либо уровня, используя Win32 API, но вы можете программировать как для Windows, так и для Linux, не используя стандартную библиотеку C соответствующего компилятора, просто дублируя код to-syscalls. Это не рекомендуется, и это делает ваш код полностью переносимым на другие ОС, но это возможно.
CVn
Пользовательский интерфейс не является частью libc - если вы не думаете о printf / scanf и т. П. Как о пользовательском интерфейсе ... libc - это просто стандартная библиотека языка Си. И это не совсем интерфейс к системным вызовам ОС. Он предоставляет функции для ввода-вывода файлов, управления памятью, обработки строк и т. Д. И использует системные вызовы для внутреннего использования. Для того, чтобы делать системные вызовы, как ioctlвы, вы должны включить что-то из sys/.
Аксель
Вопрос не всегда указывает «GUI».
jv110
Может быть, вы говорите о Xlibнет libc.
i486
1

Графические операции ядра Linux находятся в /include/linux/fb.h как struct fb_ops. В конце концов, это то, на что ссылаются надстройки, такие как X11, Wayland или DRM. Так как эти операции предназначены только для видеокарт, а не для векторных или растровых копий или для терминальных устройств, ориентированных на tty, их полезность в качестве графического интерфейса ограничена; просто не совсем верно, что вам нужны эти дополнения для получения графического вывода, если вы не возражаете против использования ассемблера для обхода syscall по мере необходимости.

М. Зигаст
источник
0

GUI - это абстракция возможностей высокого уровня, поэтому практически все, от сервера XOrg до OpenGL, портировано кроссплатформенно, в том числе для платформы Windows. Но если под GUI API вы имеете в виду * nix graphics API, то вы можете бродить вокруг «инфраструктуры прямого рендеринга».

Chawathe Vipul S
источник
0

Wayland

Как вы, возможно, слышали, в наши дни Wayland является популярным выбором многих дистрибутивов, поскольку его протокол проще, чем X.

Инструментарий Wayland

Наборы инструментов или графические библиотеки, которые предлагает Wayland :

  • QT 5
  • GTK +
  • ЛСД
  • беспорядок
  • EFL
Амир Фо
источник