LINUX.ORG.RU

Состоялся релиз Nuklear — библиотеки для построения пользовательских интерфейсов, написанной на ANSI C

 , ,


15

8

11 апреля 2016 года состоялся релиз Nuklear — небольшой библиотеки для построения GUI, написанной на ANSI C.

Это минималистичный тулкит, построенный на принципах immediate mode и переданный в общественное достояние. Библиотека была спроектирована как простой встраиваемый интерфейс и не имеет никаких дополнительных зависимостей. Для рендеринга и обработки пользовательского ввода используются платформозависимые бэкенды, поверх которых построена модульная система, позволяющая спроектировать интерфейс основываясь на концепциях ввода/вывода.

Особенности

  • immediate mode
  • header only (можно использовать и как обычную библиотеку, с разделением на реализацию и заголовки)
  • написан на C89 (ANSI C)
  • небольшая кодовая база (~15kLOC)
  • ориентирован на портабельность, эффективность и простоту
  • нет зависимостей (не требуется даже стандартная библиотека)
  • настраиваемый внешний вид
  • занимает мало места в памяти, предоставляет полный контроль за потребляемыми ресурсами
  • поддержка UTF-8
  • не имеет глобального или скрытого состояния
  • модульность: вы можете скомпилировать и использовать только ту часть библиотеки, которую собираетесь использовать

Несколько примеров пользовательского интерфейса, реализованного с помощью nuklear: раз, два, три.

>>> Подробности

★★★

Проверено: tailgunner ()

Ответ на: комментарий от cvs-255

шел 2016 год

а едро Линупса всё ещё было на C89 (GNU) :3

mkam ()
Ответ на: комментарий от German_1984

Обычный тулкит требует от тебя создавать объекты-контролы и задавать их расположение и прочие атрибуты. Он же взаимодействует с оконно-графической системой и встраивается в ранлуп, чтобы отвечать на события, например движение курсора или нажатия кнопок. В итоге все отрисовывается/ресайзится/свистит-пердит как бы само, а ты только получаешь колбэки, в которых был заинтересован на этапе создания иерархии контролов (ну и тех, что подключил по ходу дела). GTK, Qt, MFC, HTML.

В непосредственном рисовальщике нет никаких объектов-контролов, очередей сообщений, и ты просто каждый фрейм перерисовываешь весь интерфейс командами отрисовки контролов. Стейт — тексты, состояния on-/off, цвета, etc — хранишь сам, тулкит стейта не имеет. Это полностью повторяет событийный цикл динамичных игрушек, где каждый фрейм что-то меняется, и цикл выглядит как «посмотрел сколько время и что *прямо сейчас* нажато — нарисовал соответственную картинку».

--# a normal button
local button = { text = 'This is a button!', x = 1, y = 1 }
if imgui.button(button) then
   button.text = 'I was clicked!'
end

--# a red button
local red = { text = 'This button is red!', x = 1, y = 1, bgColor = colors.red }
if imgui.button(red) then
   --# turns into a blue button
   red.bgColor = blue
end

imgui.clear(colors.black)
imgui.draw()

Хитрость в том, что imgui.button(...) временно запоминает параметры отрисовки и возвращает статус нажатости в указанном прямоугольнике. А imgui.draw() уже конкретно рисует контролы на поверхность. И все, фрейм кончился, проехали.

На русском не видел, пример собран отсюда, там еще есть:

http://www.computercraft.info/forums2/index.php?/topic/16426-immediate-mode-gui/

arturpub ★★ ()

Несколько примеров пользовательского интерфейса, реализованного с помощью nuklear: раз, два, три.

бгггг...а таскать стили у qt/gtk оно не умеет?

Deleted ()
Ответ на: комментарий от arturpub

Как-то печально. А по жручести процессорного времени это разве не оверхед?

someoneelsenotme ()
Ответ на: комментарий от someoneelsenotme

В динамике все равно либо vsync, либо есть чем заняться. Это совершенно другой подход.

arturpub ★★ ()
Ответ на: комментарий от anonymous

Затем, кретин, что vs не умеет в с90.

Расскажи, кретин, как часто в эмбеде используется vs.

anonymous ()
Ответ на: комментарий от anonymous

Эта либа не для эмбеддеда, быдло. Она жрет 32 метра памяти.

А под эмбеддед нормальные дядьки пишут в Кейл, где даже полная поддержка с89 - редкость.

anonymous ()

На убанте не компилируется:

~/Проекты/test/vertun/nuklear/example$ gcc calculator.c -o calculator.exe
calculator.c:14:24: fatal error: GLFW/glfw3.h: Нет такого файла или каталога
 #include <GLFW/glfw3.h>
                        ^
compilation terminated.
~/Проекты/test/vertun/nuklear/example$ gcc extended.c -o extended.exe
extended.c:14:24: fatal error: GLFW/glfw3.h: Нет такого файла или каталога
 #include <GLFW/glfw3.h>

В репах есть только glfw2

someoneelsenotme ()

Какие ОС и графические системы сейчас там поддерживаются?

Quasar ★★★★★ ()

на сколько я понял автор пишет больше для фана чем для реальной пользы

я-то мечтал увидеть нормальную либу-тулкит на C, которая поддерживала бы в качестве бекенда иксы, wayland, ведро, и подхватывала системную тему

думал - вот оно, свершилось! ан нет, мимо

reprimand ★★★★★ ()

Диаблостиль выглядит неплохо.

Myau ★★★★ ()
Ответ на: комментарий от RazrFalcon

500LOC для примитивного калькулятора, который на Qt можно в 100-200 реализовать...

Сколько килобайт будет весить calc на этой либе вместе с ней и сколько на жирнокультях?

EXL ★★★★★ ()

Голое ядро виджет тулкита без иерархий классов и автоматических бекендов - незаменимая вещь в необычных условиях, таких как игры или vst плагины (в которых у тебя есть только винапевский HWND окна и нестандартный калбек нажатия клавиш и мыши). Или когда хочешь писать гуй на скриптовом языке без костылей в виде параллельных деревьев объектов гуя и скриптового языка. Однако мучают сомнения, а стоит ли связываться с тем что осталось от тулкита, если оно такое маленькое, что проще было бы переписать его 1 в 1 на тот язык, на котором я буду писать гуй. И есть ли доки о том как писать бекенды, а то примеров маловато, например в glfw версии не понятно как происходит выполнение команд рисования. Не могли чтоли готового бекенда хотяб для winapi забацать.

q0tw4 ★★★★ ()
Ответ на: комментарий от anonymous

Эта либа не для эмбеддеда

Учись читать, убогий:

simple embeddable user interface

Ты ниасилил собрать или авторы ниасилили нормально сделать - мне пох. Всё равно, с такими возможностями кроме эмбеда она никогда ни для чего не сгодится.

где даже полная поддержка с89 - редкость

Твои дядьки тебя обманули:

The compiler compiles the following different varieties of C and C++ source code into ARM and Thumb® code:
ISO Standard C:1990 source.
ISO Standard C:1999 source.

Под армы есть даже с99, под всякую узкоспециализированную мелочёвку гуйня всё равно никогда не понадобится. В следующий раз кукарекнешь - сразу приводи пруфцы, балабол.

anonymous ()
Ответ на: комментарий от anonymous

авторы ниасилили нормально сделать
Учись читать

И хуле читать если неосилили? На заборе тоже написано.

Твои дядьки тебя обманули:

Никто не будет покупать новый кейл на это поделие, он стоит как паровоз. А старые версии даже флоат не поддерживали.

anonymous ()

Вырви глаз «раз», «два», «три». В этом и заключается фишка тулкита?

vada ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

Я хочу что-то, что было таким же крутым, как GTK2.

А чем GTK2 не устроил? Или GTK3?

Deleted ()

Давно искал такую штуку, я находил несколько но этот лучше. Подход https://github.com/nothings/stb кидаешь инклудник и поехал, зависимостей нет или почти нет. Зависимости что приводили в топике - это к экзамплам, так что все норм, описание почти не врет, сама штука 600кб 19к строк, но там комментов много. Бэкэнд opengl тоже крохотный, инициализация окна и gl функций для которых нужно glfw итд обычно уже в гл приложении есть.

Подход stb действительно проще некуда, прописать линковку для linux\macos\винда это уже отвлекаться надо, винда самое геморное.

По поводу nana/fltk/iup. Когда искал я их тоже находил, но они больше, ни о каких кинул инклудник и поехал и без зависимостей и гемора тут речи не идет. Так что вопрос простых кроссплатфоренных интерфейсов для небольших утилит типа yuvplay, экзампл к рейтрейс рендеру,... итп для меня все еще актуален. Буду пробовать эту штуку.

anonymous ()
Ответ на: комментарий от anonymous

На заборе тоже написано.

Про 32 метра тоже не в научном журнале написано.

Никто не будет покупать новый кейл на это поделие

И вижуалку не будут.

Да и особым любителям некрофилии ничего не мешает перетащить имплементацию в сишник, собрать статическую либу гэсисёй и линковать любым говном мамонта.

anonymous ()

На stm32 (микроконтроллеры такие) заведётся? Что там вообще по требованиями памяти? Я могу 50-100кб выделить под GUI. А то я неспешно подыскиваю библиотеку для GUI, серьёзно вопросом ещё не занимался.

true_admin ★★★★★ ()
Ответ на: комментарий от someoneelsenotme

В репах есть только glfw2

glfw3 есть в 15.04 и старше.

anonymous ()
Ответ на: комментарий от true_admin

В этой либе нет реализации гуя. Пишешь функции типа «линия» «окно» и пр. сам, подключаешь либу и типа с ней работаешь. Занимает сама по себе 14-15 килобайт на окно + в среднем кило на виджет + накладные расходы собственно реализаций что ты написал.

someoneelsenotme ()
Ответ на: комментарий от true_admin

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

anonymous ()
Ответ на: комментарий от someoneelsenotme

Т.е. текущий ЛТС идет лесом?

В чём проблема собрать себе в local новую версию?

anonymous ()
Ответ на: комментарий от anonymous

Да не проблема даже сторонний ппа подключить, но это как устанавливать динозавру дизельный привод из 21го века.

someoneelsenotme ()
Ответ на: комментарий от registrant

И при чём тут системные темы? Системные темы нужны что-бы разные программы писанные разными авторами выглядели одинаково на целевой системе, и что-бы админ целевой системы мог сам менять вид всех программ.
В ембидеде нет зоопарка гуёвых программ. И нет как такового админа, есть разраб и пользователь.

MrClon ★★★★★ ()
Ответ на: комментарий от anonymous

Росходимся, поцаны.

Однако демки не тормозят. «preclude» значит что double-buffering возможен.

Мне больше интересно сравнение этой либы с конкурентами. ‎µGFX, например.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Демки на опенжл, там нечему тормозить. Единственная демка которая у меня собралась жрет 2% процессора константно. Остальные сказали что моя видеокарта чего-то там не умеет в опенжл и послали при запуске. Предполагаю что они не тормозят - чему там тормозить в опенжл в статичном приложении?

someoneelsenotme ()
Ответ на: комментарий от someoneelsenotme

Т.е. текущий ЛТС идет лесом?

Подожди неделю - будет тебе новый текущий LTS.

anonymous ()
Ответ на: комментарий от true_admin

‎µGFX, например.

онож закрытое. или я проспал что-то?

anonymous ()
Ответ на: комментарий от anonymous

Подожди неделю - будет тебе новый текущий LTS.

Завтра будет.

mkam ()
Ответ на: комментарий от true_admin

«Free for non-commercial uses». Вот сырцы: https://bitbucket.org/Tectu/ugfx/src

Для эмбебеда эта либа явно лучше заточена. Однако кода больше, для простого написания линь\мак\вин\мобилки - лучше либа из топика.

anonymous ()
Ответ на: комментарий от anonymous

Не увидел в когда. Юзаются стандартные strXXX

utf8 и задумывался для того, чтобы его могли стандартные strXXX.

anonymous ()

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

mahalaka ★★ ()

О каком embedded может идти речь, когда по коду жирно размазано:

buf = (char*)calloc(*siz, 1);
...
ret = (char*)malloc(len+1);

и так далее.
Такое к встройке и близко подпускать нельзя. А «just for fun» можно посмотреть.

Tujh ()
Ответ на: комментарий от Tujh

В чем проблема с malloc? Если нет стандартной библиотеки, можно свой написать за 15минут на ассемблере.

anonymous ()
Ответ на: комментарий от anonymous

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

someoneelsenotme ()
Ответ на: комментарий от Tujh

О каком embedded может идти речь, когда по коду жирно размазано:

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

anonymous ()
Ответ на: комментарий от Quasar

по ходу - никакие. это что-то дополнительное.

дополнение к уже существующим библиотекам для отрисовки гуя.

и примеры использования.

т.е. не хочешь ты на SDL, например, городить свои диалоги и т.п. берёшь и используешь эту библиотеку.

samy_volosaty ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.