Как работает графический интерфейс *NIX?

Я хотел бы узнать больше о том, что заставляет работать графический интерфейс в системах *NIX, но не совсем уверен, с чего начать исследование. Насколько я понимаю, именно X-сервер делает возможными все визуальные эффекты, а поверх него существуют различные среды пользовательского интерфейса, такие как KDE, Gnome и другие.

Но, например, я всегда думал, что работа в определенных средах пользовательского интерфейса ограничивает вас программами, использующими эту среду, пока я не понял, что могу использовать утилиты и программное обеспечение KDE под Gnome и наоборот, которые сохраняют внешний вид своих родных. Окружающая среда.

С чего было бы хорошо начать изучение этой темы?


person dmkc    schedule 27.10.2010    source источник


Ответы (2)


По сути, биты GUI — это отдельные библиотеки, которые включают в себя хром (вещи вокруг окна вашей программы) и обычно включают в себя кучу других вещей, таких как панели инструментов рабочего стола и так далее. GNOME и KDE являются примерами среды рабочего стола.

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

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

Над вашими оконными менеджерами у вас есть ваши настоящие программы. Каждый из них обращается к диспетчеру окон, чтобы сделать общие вещи, такие как «дайте мне окно 50x50 с кнопкой закрытия».

Фактические виджеты, нарисованные программой, обычно используют набор графических инструментов, подобный тому, который входит в состав GNOME. KDE включает набор инструментов Qt.

Здесь есть хороший выбор wm http://xwinman.org/

person Paul McMillan    schedule 27.10.2010
comment
Небольшая неточность на уровне X, но в остальном правильно. - person Ignacio Vazquez-Abrams; 27.10.2010
comment
Пожалуйста, исправьте это тогда. У вас есть представитель, чтобы сделать это :) - person Paul McMillan; 28.10.2010

Я чувствую, что ответ Пола может быть немного жаргонным, так что вот моя попытка.

Существует множество устройств отображения (мониторы VGA, композитное видео, HDMI и т. д.), и они, как правило, обрабатываются непосредственно аппаратно, например. в специальном графическом процессоре (GPU).

Вместо того, чтобы наши приложения взаимодействовали с этим оборудованием напрямую, мы используем драйверы (которые находятся внутри нашего ядра операционной системы). Разному оборудованию нужны разные драйверы, но всем драйверам можно дать инструкции, используя один и тот же интерфейс, например OpenGL:

App --OpenGL--> Driver --> Hardware --VGA--> Screen

Конечно, как и большинство стандартов, на самом деле существует целая куча разных! OpenGL поддерживается большинством драйверов в большинстве операционных систем; его подмножество «OpenGL ES» хорошо работает на мобильных телефонах, и существуют «программные драйверы», которые могут создавать изображения на основе инструкций OpenGL (и все драйверы могут рисовать изображения, хотя это намного медленнее, чем использование реальная поддержка OpenGL). Крупным конкурентом OpenGL является DirectX, но он работает только на Windows и XBox.

Рендеринг в OpenGL подходит для чего-то вроде полноэкранной 3D-игры, но графическая система *NIX (известная как "X") предлагает две основные функции: рисование нескольких приложений на одном и том же экран и рисование по сети. Для этого на экран выводится серверный процесс, и приложения («клиенты») взаимодействуют с этим сервером, используя «протокол X11» («11» — это просто номер версии):

App A ----------OpenGL-------+
                             |
App B --+                    |
        |                    |
        +--X11--> X server --+----> Driver --> Hardware --> Screen
        |
App C --+
        |
  ...network ...
        |
App D --+

X, как правило, имеет прямой доступ к драйверам, поскольку существует дольше, чем OpenGL, но это не так уж важно.

Протокол X11 работает, когда приложения создают окна, в которых им разрешено рисовать. X может размещать эти окна на экране, в том числе перекрывать их. Приложения, использующие OpenGL, могут «пропускать» свои команды через X прямо в драйвер, и X по-прежнему упорядочивает окно так же, как и любое другое (это не будет работать по сети, поскольку оно обходит сетевые возможности X11).

Обычно у нас есть приложение, предназначенное для упорядочивания, скрытия/отображения и закрытия окон, называемое менеджером окон. При желании оконный менеджер может создать несколько тонких окон по краям других, чтобы он мог рисовать заголовки, изменять размеры ручек и т. д.

Протокол X11 включает команды для рисования фигур, рендеринга шрифтов и т. д., и есть приложения, которые используют их напрямую, например, программа xterm и оконный менеджер twm:

xterm --+
        |
        +--X11--> X --> Driver --> ...
        |
twm   --+

Однако большинство современных приложений считают необработанный X11 слишком утомительным; вместо того, чтобы рисовать линии и фигуры, мы бы предпочли рисовать целые виджеты (кнопки, меню, значки и т. д.). Для этого были созданы наборы инструментов. Два наиболее известных из них называются Qt и GTK+ (набор инструментов GIMP, поскольку он изначально был создан для GIMP); другие включают Motif, Lesstif, ETK, Tk и FLTK. Мы можем попросить инструментарий нарисовать кнопку, и он отправит все необходимые команды X11 для рисования кнопки, а также позаботится о размере и положении, обновляя рисунок, если что-то перекрывает его. уходит, сообщая нашему коду, когда кнопка была нажата, а некоторые инструменты даже позволяют изменять внешний вид виджетов с помощью темы. Некоторые наборы инструментов также являются кроссплатформенными, поэтому они будут отправлять команды X11 в Linux, разные команды в Windows, OSX и т. д.

Rhythmbox --> GTK+ --+
                     |
GIMP      --> GTK+ --+
                     |
Amarok    --> Qt   --+--X11--> X --> Driver --> ...
                     |
Skype     --> Qt   --+
                     |
aMSN      --> Tk   --+

Некоторые наборы инструментов предлагают функции поверх других; например, wxWidgets заставляет Qt выполнять отрисовку (в Linux; Windows и OSX являются "родными"), XUL используется Firefox и использует GTK+ для отрисовки:

Audacity --> wxWidgets --> Qt   --+
                                  |
Firefox  --> XUL       --> GTK+ --+--X11--> X --> Driver --> ...
                                  |
GIMP     ----------------> GTK+ --+

Важно отметить, что команды X11 для рисования фигур и текста на самом деле используются не очень часто, поскольку они очень примитивны. Многие наборы инструментов на самом деле отображают свои виджеты как изображения, а затем заставляют X рисовать эти изображения. Новая система Wayland пытается заменить X, отказываясь от команд рисования и позволяя приложениям и наборам инструментов напрямую использовать OpenGL, что должно сделать работу намного быстрее.

Вы упомянули разные среды рабочего стола, такие как GNOME и KDE, и то, работают ли они вместе. В основном это большие наборы приложений, написанных для совместной работы. Так получилось, что все приложения GNOME написаны на GTK+, а приложения KDE — на Qt.

Если вы посмотрите на стрелки на моих диаграммах выше, вы заметите, что каждое приложение Qt взаимодействует с X отдельно, каждое приложение GTK+ взаимодействует с X отдельно и т. д.; не только приложение Qt и приложение GTK+ могут работать бок о бок, что касается X, это то же самое, что два приложения Qt или два приложения GTK+!

Единственное, о чем следует беспокоиться при смешивании рабочих столов, — это о том, конкурируют ли два приложения за выполнение одной и той же работы, например, если вы пытаетесь запустить два оконных менеджера или две панели рабочего стола. Обратите внимание, что это не проблема графики, наборов инструментов и т. д., поскольку у меня возникнут те же проблемы, если я буду использовать два рабочих стола, созданных на основе одного и того же набора инструментов (например, lxpanel и gnome-panel написаны на GTK+, но они все равно будут мешать друг другу!)

person Community    schedule 29.11.2014