Как сделать графический интерфейс для Linux?

Мой основной опыт связан с C && C++, поэтому я бы предпочел остаться с ними. Я не хочу использовать ничего вроде QT, GTK, wxWidgets или каких-либо наборов инструментов. Я хотел бы изучить нативное программирование, но это не дает цели. Имея это в виду, я бы также хотел избежать Java.

Я понимаю gnome, xfce и KDE, и это все среды рабочего стола для Linux, и обычно устанавливается база X (Xorg). При кодировании для Linux вы пишете для X или для среды рабочего стола? Есть ли для этого стандартный заголовок Linux (например, win32 имеет windows.h) для Linux? или это разные методы кодирования для каждой среды рабочего стола?

любая помощь приветствуется.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
26
0
14 593
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Я предполагаю, что вы могли бы написать код C непосредственно против Xlib, но в конечном итоге вы бы воссоздали все функции, которые GTK + или QT предоставляют, но X не один.

Соглашаться; Я думаю, что в мире Linux все по-другому.

Sydius 12.12.2008 04:47

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

John T 12.12.2008 04:49

@Mike, чувствуете ли вы "взломы", когда играете в игры DirectX с драйверами NVidia? Это стороннее программное обеспечение.

paxdiablo 12.12.2008 04:51

@Mike: в философии unix есть один инструмент для каждой работы. Xlib находится на более низком уровне, чем вы ожидаете, он позволяет вам отображать вещи. Кнопки и прочее есть в наборах инструментов, поэтому вам нужно выбрать одну ...

Piotr Lesnicki 12.12.2008 04:57

GTK, QT и wx - это наборы инструментов, основанные на X, чтобы предоставить более удобный API.

Если вы не используете существующий инструментарий, вам нужно будет писать вещи на очень низком уровне - напрямую обрабатывая события мыши и клавиатуры. Если вам нужна кнопка или текстовое поле, вам придется написать их самостоятельно, используя низкоуровневые примитивы xlib.

Прежде чем попробовать это, вам, вероятно, лучше выбрать набор инструментов для предпочитаемой вами среды рабочего стола и начать с нее.

Ответ принят как подходящий

X - ужасный уровень для программирования, и, несмотря на ваше намерение избегать Java, QT или любого из отличных уровней абстракции пользовательского интерфейса, вы окажете себе медвежью услугу, написав код до этого уровня. Я сделал это (очень давно, когда Motif только зарождался на платформе, которую мы использовали), и я бы сделал это снова нет, если бы был более простой способ.

Ваше использование фразы «родное программирование» меня немного смущает. Если вы хотите изучить собственное программирование, то обращайтесь к API, которые вы выбираете для вызова. Используя аналогичные рассуждения, вы также не должны кодировать на C, вместо этого выбирая ассемблер (или прямой машинный код), поскольку C предоставляет абстракцию для оборудования.

Если вы хотите изучить X-программирование, ничего страшного. В конечном итоге вы получите гораздо больший контроль над своим интерфейсом, но почти все остальные будут превосходить вас с точки зрения доставки программного обеспечения. Лично я бы предпочел кодировать API более высокого уровня, который я могу использовать на многих платформах - это дает мне как более быстрое время доставки, так и больший рыночный потенциал.

Вы не строите дом из атомов, вы строите его из кирпичей. Я предлагаю использовать инструменты, вот для чего они нужны.

Мне пришлось использовать motif напрямую (только потому, что wm, который мы используем, разработан внутри компании), и это непросто. Я бы предпочел использовать один из свободно доступных уровней абстракции пользовательского интерфейса

hhafez 12.12.2008 07:19

Написание пользовательского интерфейса в Xlib не похоже на создание пользовательского интерфейса на простом Win32, это больше похоже на создание пользовательского интерфейса в DirectDraw; он намного более низкоуровневый, чем Win32

Ana Betts 12.12.2008 07:32

Если вы не хотите проходить через полдюжины уровней абстракции, разработка под Linux не для вас. ;)

jalf 16.02.2009 21:15

@jalf: На самом деле, сейчас большая часть разработки.

Joey 16.04.2010 19:19

Понятия «родной» в данном случае просто не существует. У Windows и OS X просто есть официальная опция, а у X нет.

Что ж, у X есть официальная опция, просто это очень низкий (уродливый) уровень.

paxdiablo 12.12.2008 04:52

Я не хочу использовать ничего вроде QT, GTK, wxWidgets или каких-либо наборов инструментов. Я хотел бы изучить нативное программирование, но это не дает цели.

Нет, не знаешь. Еще в ранней версии X11, такой как R1 или R2, я написал полную программу «Hello, world» только на Xlib.

Примерно 700 строк C.

Ты не хочешь туда идти.

этот комментарий рассмешил меня

matchew 22.05.2011 04:38

-1. Типичная чушь, которую можно найти на сайтах вопросов и ответов - всякий раз, когда кто-то спрашивает «как делать азбуку?», Кто-то отвечает: «почему вы хотите делать азбуку?». Если вы не поймете, как писать код с использованием Xlib, вы никогда не сможете написать Xlib самостоятельно - возможно, для нового ядра ОС, которое еще не было изобретено. Конечно, если вы профессионально доставляете программное обеспечение в сжатые сроки, вы будете использовать хорошо поддерживаемую абстракцию высокого уровня. Но если вы слепо доверяете современным программистам, вы никогда не научитесь создавать примитивы, когда в этом возникнет необходимость.

Mozan Sykol 30.08.2013 10:15

Типичная педантическая чушь. Он явно новичок в этом. Если он хочет изучить внутреннее устройство, он может, но - опять же, сделав это, когда не было находится далеко за пределами Xlib - только дурак пытается сделать это только для того, чтобы научиться писать X GUI.

Charlie Martin 31.08.2013 11:52

Я бы также предложил lesstif / motif. Он также построен на основе X, и, на мой взгляд, кривая обучения не такая крутая, как GTK или Qt. Однако пользовательский интерфейс, который вы создаете с его помощью, не будет таким сложным, как те, которые вы могли бы создать с помощью GTK или Qt. Более подробную информацию можно найти здесь.

Как уже упоминали другие, вы, вероятно, не хотите X, это боль.

«Родным» интерфейсом для Linux и большинства других Unix-подобных ОС является Xlib, C API самого низкого уровня для X11.

GTK, Qt и другие (насколько мне известно) реализованы в терминах Xlib по своей сути. Как уже говорили другие, Xlib дает вам максимальный контроль, но вам придется работать над этим (и другие могут кружить вокруг вас с точки зрения доставки продукта).

В качестве ориентира я лично реализовал довольно многофункциональную и современную (т.е. текучую) кроссплатформенную (Win32 + X11) библиотеку графического интерфейса на C++. Общее количество составляет около 29 KLOC C++, из которых около 2500 строк требовалось для совмещения X11 и Win32. Остальное предназначено для реализации Widget, не зависящей от платформы. Если вы не готовы взять на себя подобное обязательство, я настоятельно рекомендую использовать одну из библиотек более высокого уровня (Qt, вероятно, был бы моим выбором, хотя я терпеть не могу подход препроцессора).

Кстати, большим плюсом Xlib является его простая переносимость - он будет в любом Unix-устройстве с экраном, и его также можно заставить работать в Windows и OS X.

Unix (и, соответственно, Linux) на самом деле не определяет ничего общего с графическим интерфейсом пользователя. X, который обычно используется, не определяет ничего общего с виджетами, стилями или чем-либо в этом роде - он в основном связан с рисованием примитивов и обработкой событий. По сути, если вы хотите писать на чистом X, вы должны определять форму и поведение каждого элемента на экране. Если бы вы были достаточно сумасшедшими, чтобы отказаться от X, вы бы работали на уровне графического буфера кадра ...

Вам лучше использовать набор инструментов некоторый - если вы ищете легкий вес, почему бы не попробовать ФЛТК?

Считаю необходимым противопоставить единодушие других ответов здесь. X11 действительно низкий уровень. Но чтобы «по-настоящему» понять, что происходит, вы должны иметь некоторое представление о том, как работает X11. Поскольку все инструменты работают поверх X, вы используете его, нравится вам это или нет. Где-то в Интернете есть хороший учебник, который мне лень искать. Он проведет вас через создание простого Hello World. Для этого вам нужно научиться создавать окно, запрашивать события, отображать окно и обрабатывать события в цикле. Вы можете даже пойти дальше и заказать на Amazon подержанные книги. Томы 1 и 2 О'Рейли (на данный момент выбирайте самые дешевые версии, но не ранее X11R4) необходимы для справки и получения полной информации о том, как эти части работают вместе. Однако для обучения лучше всего подходит книга Эрика Джонсона и Кевина Райхарда "Программирование приложений X Window".

В какой-то момент на этом пути, как говорят все остальные, вы обнаружите, что с вас достаточно. Две страницы кода только для выбора визуального элемента, а затем вам все равно нужно заполнить цветовую карту, прежде чем вы сможете рисовать свое собственное растровое изображение. А потом два дня переписывания и отладки, чтобы понять, что все это делает работает; Вы просто забыли XFlush()!

Борьба важна, потому что вы оцените инструментарий больше, когда найдете тот, который вам нравится.

Почему бы не выбрать один из, скажем, Qt, wxWidgets и GTK и изучить его внутреннее устройство, а не его API? Я имею в виду не просто ради этого, но с целью внести свой вклад в те части, которые вы считаете наиболее привлекательными. Таким образом вы достигнете своей цели и сможете сделать что-то полезное как для себя, так и для других. Я думаю, что это было бы более полезным, чем возлагать на себя довольно искусственную задачу создания приложения с определенным количеством неправильных инструментов.

ах да, есть такие "родные" вещи:

FBUI, svgalib, directfb, exa (kdrive), SDL, Allegro .. + Wayland, хотя и не мейнстрим.

http://home.comcast.net/~fbui/

http://www.svgalib.org/

http://directfb.org/

http://xorg.freedesktop.org/wiki/ExaStatus

+ http://wayland.freedesktop.org/

Другие вопросы по теме