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


441

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

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


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.


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.


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


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


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, то вы можете бродить вокруг «инфраструктуры прямого рендеринга».


0

Wayland

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

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

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

  • QT 5
  • GTK +
  • ЛСД
  • беспорядок
  • EFL

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.