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

<p>надеюсь, это не глупый вопрос, но я всегда удивляюсь этому. и windows (win32 api), и os x (какао) имеют свои собственные api для обработки окон, событий и других вещей ос. я никогда не получал четкого ответа относительно эквивалента linux.</p><p>я слышал, что некоторые люди говорят, что gtk +, но gtk +, будучи кроссплатформенным, как это может быть нативным?</p>

<p>в linux графический интерфейс пользователя не является частью операционной системы. графический интерфейс пользователя, присутствующий на большинстве настольных систем linux, обеспечивается программным обеспечением, называемым <a href="http://en.wikipedia.org/wiki/x\_window\_system">x window system</a> , которое определяет независимый от устройства способ работы с экранами, клавиатурами и указательными устройствами.</p><p>x window определяет сетевой протокол для связи, и любая программа, которая знает, как «говорить» по этому протоколу, может использовать его. существует библиотека c под названием <a href="http://en.wikipedia.org/wiki/xlib">xlib</a> , которая упрощает использование этого протокола, поэтому xlib является своего рода <em></em> родным api gui. xlib - не единственный способ получить доступ к серверу x window; есть также <a href="http://en.wikipedia.org/wiki/xcb">xcb</a> .</p><p>библиотеки инструментария, такие как <a href="http://www.gtk.org/">gtk +</a> (используется <a href="http://www.gnome.org/">gnome</a> ) и <a href="http://www.qt.io/">qt</a> (используется <a href="http://www.kde.org/">kde</a> ), построенные поверх xlib используются потому, что с ними легче программировать. например, они обеспечивают единообразный внешний вид приложений, упрощают использование перетаскивания, предоставляют компоненты, стандартные для современной среды рабочего стола, и т.д.</p><p>то, как x рисует на экране, зависит от реализации. <a href="http://www.x.org">x.org</a> имеет независимую от устройства часть и зависимую от устройства часть. первый управляет ресурсами экрана, такими как windows, а второй связывается с драйвером графической карты, обычно с модулем ядра. связь может происходить через ядро через <a href="http://en.wikipedia.org/wiki/direct\_memory\_access">прямой доступ к памяти</a> или через <a href="http://en.wikipedia.org/wiki/system\_call">системные вызовы</a> . драйвер переводит команды в форму, понятную аппаратному обеспечению на карте.</p><p>с 2013 года новая оконная система под названием <a href="http://wayland.freedesktop.org/">wayland</a> начинает использоваться, и многие дистрибутивы заявили, что в какой-то момент перейдут на нее, хотя пока нет четкого графика. эта система основана на opengl/es api, что означает, что в будущем opengl будет «родным gui api» в linux. ведется работа по переносу gtk + и qt на wayland, поэтому современные популярные приложения и настольные системы потребуют минимальных изменений. приложения, которые нельзя перенести, будут поддерживаться через сервер x11, так же как os x поддерживает приложения x11 через xquartz. порт gtk + является <a href="https://live.gnome.org/wayland">ожидается, что он будет завершен в течение года</a> , в то время как qt 5 уже имеет полную поддержку wayland.</p><p>чтобы еще больше усложнить ситуацию, ubuntu объявила, что разрабатывает новую систему под названием <a href="https://wiki.ubuntu.com/mir">mir</a> из-за проблем, которые они испытывают с wayland. эта оконная система также основана на api opengl/es.</p>

<p>linux - это ядро, а не полноценная операционная система. существуют разные оконные системы и графические интерфейсы, которые работают поверх linux для обеспечения оконного управления. обычно <a href="http://en.wikipedia.org/wiki/x11">x11</a> - это оконная система, используемая дистрибутивами linux.</p>

<p> <a href="http://wayland.freedesktop.org/">wayland</a> также стоит упомянуть, так как его в основном называют «будущим убийцей x11».</p><p>также обратите внимание, что android и некоторые другие мобильные операционные системы не включают x11, хотя они имеют ядро linux, поэтому в этом смысле x11 не является родным для всех систем linux.</p><p>кроссплатформенность не имеет ничего общего с тем, чтобы быть нативным. какао также было портировано на другие платформы через <a href="http://www.gnustep.org/">gnustep</a> , но все еще является родным для os x/macos.</p>

<p>строго говоря, api linux состоит из <em>системных вызовов</em>. это все функции ядра, которые могут вызываться программой пользовательского режима (не ядра). это очень низкоуровневый интерфейс, который позволяет программам делать такие вещи, как открывать и читать файлы. смотрите <a href="http://en.wikipedia.org/wiki/system\_call">http://en.wikipedia.org/wiki/system\_call</a> для общего ознакомления.</p><p>настоящая система linux также будет иметь целый «стек» другого программного обеспечения, работающего на ней, чтобы обеспечить графический интерфейс пользователя и другие функции. каждый элемент этого стека будет предлагать свой собственный api.</p>

<p>чтобы помочь в том, что уже было упомянуто, в этом блоге очень хороший обзор графического стека linux: <a href="http://blog.mecheye.net/2012/06/the-linux-graphics-stack/">http://blog.mecheye.net/2012/06/the-linux-graphics-stack/</a> </p><p>это объясняет x11/wayland и т.д. и как все это сочетается. в дополнение к тому, что уже было упомянуто, я думаю, что стоит добавить немного о следующих api, которые вы можете использовать для графики в linux:</p><p> <a href="http://en.wikipedia.org/wiki/mesa\_%28computer\_graphics%29">mesa</a> - «mesa - это много вещей, но одна из главных вещей, которые она обеспечивает, наиболее известна - это ее реализация opengl. это реализация opengl api с открытым исходным кодом».</p><p> <a href="http://en.wikipedia.org/wiki/cairo\_%28graphics%29">cairo</a> - «cairo - это библиотека для рисования, используемая либо приложениями, такими как firefox, напрямую, либо библиотеками, такими как gtk +, для рисования векторных фигур».</p><p> <a href="http://en.wikipedia.org/wiki/direct\_rendering\_infrastructure">drm (direct rendering manager)</a> - я понимаю это меньше всего, но в основном это драйверы ядра, которые позволяют записывать графику непосредственно в фрейм-буфер без прохождения x</p>

<p>я полагаю, что вопрос больше похож на «что такое родной api-интерфейс linux».</p><p>в большинстве случаев для этого будет использоваться x (он же x11): <a href="http://en.wikipedia.org/wiki/x\_window\_system">http://en.wikipedia.org/wiki/x\_window\_system</a> . </p><p>вы можете найти документацию по api <a href="http://xfree86.org/current/manindex3.html">здесь</a> </p>

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

<p>ближайшая вещь к win32 в linux - это libc, так как вы упоминаете не только пользовательский интерфейс, но и другие события и прочее.</p>

<p>gui - это высокоуровневая абстракция возможностей, поэтому практически все, от сервера xorg до opengl, портировано кроссплатформенно, в том числе для платформы windows. но если под gui api вы имеете в виду * nix graphics api, то вы можете бродить вокруг «инфраструктуры прямого рендеринга».</p>

<h2>wayland</h2><p>как вы, возможно, слышали, <strong> <a href="https://wayland.freedesktop.org/">wayland</a> </strong> является популярным выбором многих дистрибутивов в наши дни, поскольку его протокол проще, чем x.</p><h3>инструментарий wayland</h3><p>инструментарий или графические библиотеки, которые wayland <a href="https://wayland.freedesktop.org/toolkits.html">предлагает</a> являются:</p><ul> <li>qt 5</li> <li>gtk +</li> <li>лсд</li> <li>беспорядок</li> <li>efl</li> </ul>

<p>графические операции ядра linux находятся в /include/linux/fb.h как struct fb\_ops. в конце концов, это то, на что ссылаются надстройки, такие как x11, wayland или drm. поскольку эти операции предназначены только для видеокарт, а не для векторных или растровых копий или tty-ориентированных терминальных устройств, их полезность в качестве графического интерфейса ограничена; просто не совсем верно, что эти надстройки нужны для получения графического вывода, если вы не возражаете против использования ассемблера для обхода syscall по мере необходимости.</p>